aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files')
-rw-r--r--apps/files/.l10nignore2
-rw-r--r--apps/files/ajax/download.php77
-rw-r--r--apps/files/ajax/list.php108
-rw-r--r--apps/files/appinfo/info.xml35
-rw-r--r--apps/files/appinfo/routes.php343
-rw-r--r--apps/files/composer/autoload.php17
-rw-r--r--apps/files/composer/composer/ClassLoader.php137
-rw-r--r--apps/files/composer/composer/InstalledVersions.php31
-rw-r--r--apps/files/composer/composer/autoload_classmap.php41
-rw-r--r--apps/files/composer/composer/autoload_static.php41
-rw-r--r--apps/files/composer/composer/installed.php6
-rw-r--r--apps/files/css/detailsView.scss129
-rw-r--r--apps/files/css/files.scss1256
-rw-r--r--apps/files/css/merged.scss5
-rw-r--r--apps/files/css/mobile.scss88
-rw-r--r--apps/files/css/upload.scss211
-rw-r--r--apps/files/img/add-color.svg2
-rw-r--r--apps/files/img/app-dark.svg1
-rw-r--r--apps/files/img/app.svg2
-rw-r--r--apps/files/img/change.pngbin560 -> 1861 bytes
-rw-r--r--apps/files/img/change.svg2
-rw-r--r--apps/files/img/delete-color.svg2
-rw-r--r--apps/files/img/delete.svg1
-rw-r--r--apps/files/img/external.svg1
-rw-r--r--apps/files/img/folder-move.svg1
-rw-r--r--apps/files/img/folder.svg2
-rw-r--r--apps/files/img/public.svg1
-rw-r--r--apps/files/img/recent.svg1
-rw-r--r--apps/files/img/share.svg1
-rw-r--r--apps/files/img/star.svg1
-rw-r--r--apps/files/img/unshare.svg1
-rw-r--r--apps/files/js/app.js407
-rw-r--r--apps/files/js/breadcrumb.js382
-rw-r--r--apps/files/js/detailfileinfoview.js56
-rw-r--r--apps/files/js/detailsview.js288
-rw-r--r--apps/files/js/detailtabview.js141
-rw-r--r--apps/files/js/favoritesfilelist.js102
-rw-r--r--apps/files/js/favoritesplugin.js120
-rw-r--r--apps/files/js/file-upload.js1392
-rw-r--r--apps/files/js/fileactions.js867
-rw-r--r--apps/files/js/fileactionsmenu.js143
-rw-r--r--apps/files/js/fileinfomodel.js128
-rw-r--r--apps/files/js/filelist.js4024
-rw-r--r--apps/files/js/filemultiselectmenu.js97
-rw-r--r--apps/files/js/files.js542
-rw-r--r--apps/files/js/filesummary.js280
-rw-r--r--apps/files/js/gotoplugin.js64
-rw-r--r--apps/files/js/jquery-visibility.js88
-rw-r--r--apps/files/js/jquery.fileupload.js1499
-rw-r--r--apps/files/js/keyboardshortcuts.js169
-rw-r--r--apps/files/js/mainfileinfodetailview.js206
-rw-r--r--apps/files/js/merged-index.json32
-rw-r--r--apps/files/js/navigation.js340
-rw-r--r--apps/files/js/newfilemenu.js254
-rwxr-xr-xapps/files/js/operationprogressbar.js83
-rw-r--r--apps/files/js/recentfilelist.js106
-rw-r--r--apps/files/js/recentplugin.js121
-rw-r--r--apps/files/js/semaphore.js41
-rw-r--r--apps/files/js/sidebarpreviewmanager.js135
-rw-r--r--apps/files/js/sidebarpreviewtext.js48
-rw-r--r--apps/files/js/tagsplugin.js336
-rw-r--r--apps/files/js/templates.js424
-rw-r--r--apps/files/js/templates/detailsview.handlebars13
-rw-r--r--apps/files/js/templates/favorite_mark.handlebars4
-rw-r--r--apps/files/js/templates/file_action_trigger.handlebars13
-rw-r--r--apps/files/js/templates/fileactionsmenu.handlebars17
-rw-r--r--apps/files/js/templates/filemultiselectmenu.handlebars14
-rw-r--r--apps/files/js/templates/filesummary.handlebars7
-rw-r--r--apps/files/js/templates/mainfileinfodetailsview.handlebars21
-rw-r--r--apps/files/js/templates/newfilemenu.handlebars10
-rw-r--r--apps/files/js/templates/newfilemenu_filename_form.handlebars4
-rw-r--r--apps/files/js/templates/operationprogressbar.handlebars6
-rw-r--r--apps/files/js/templates/operationprogressbarlabel.handlebars4
-rw-r--r--apps/files/js/templates/template_addbutton.handlebars4
-rw-r--r--apps/files/js/upload.js18
-rw-r--r--apps/files/l10n/ach.js9
-rw-r--r--apps/files/l10n/ach.json7
-rw-r--r--apps/files/l10n/ady.js9
-rw-r--r--apps/files/l10n/ady.json7
-rw-r--r--apps/files/l10n/af.js139
-rw-r--r--apps/files/l10n/af.json137
-rw-r--r--apps/files/l10n/ak.js9
-rw-r--r--apps/files/l10n/ak.json7
-rw-r--r--apps/files/l10n/am_ET.js9
-rw-r--r--apps/files/l10n/am_ET.json7
-rw-r--r--apps/files/l10n/ar.js568
-rw-r--r--apps/files/l10n/ar.json568
-rw-r--r--apps/files/l10n/ast.js429
-rw-r--r--apps/files/l10n/ast.json429
-rw-r--r--apps/files/l10n/az.js104
-rw-r--r--apps/files/l10n/az.json102
-rw-r--r--apps/files/l10n/be.js254
-rw-r--r--apps/files/l10n/be.json254
-rw-r--r--apps/files/l10n/bg.js357
-rw-r--r--apps/files/l10n/bg.json357
-rw-r--r--apps/files/l10n/bn_BD.js65
-rw-r--r--apps/files/l10n/bn_BD.json63
-rw-r--r--apps/files/l10n/br.js192
-rw-r--r--apps/files/l10n/br.json190
-rw-r--r--apps/files/l10n/bs.js75
-rw-r--r--apps/files/l10n/bs.json73
-rw-r--r--apps/files/l10n/ca.js550
-rw-r--r--apps/files/l10n/ca.json550
-rw-r--r--apps/files/l10n/cs.js556
-rw-r--r--apps/files/l10n/cs.json556
-rw-r--r--apps/files/l10n/cy_GB.js45
-rw-r--r--apps/files/l10n/cy_GB.json43
-rw-r--r--apps/files/l10n/da.js535
-rw-r--r--apps/files/l10n/da.json535
-rw-r--r--apps/files/l10n/de.js586
-rw-r--r--apps/files/l10n/de.json586
-rw-r--r--apps/files/l10n/de_DE.js578
-rw-r--r--apps/files/l10n/de_DE.json578
-rw-r--r--apps/files/l10n/el.js435
-rw-r--r--apps/files/l10n/el.json435
-rw-r--r--apps/files/l10n/en_GB.js557
-rw-r--r--apps/files/l10n/en_GB.json557
-rw-r--r--apps/files/l10n/eo.js166
-rw-r--r--apps/files/l10n/eo.json164
-rw-r--r--apps/files/l10n/es.js590
-rw-r--r--apps/files/l10n/es.json590
-rw-r--r--apps/files/l10n/es_419.js140
-rw-r--r--apps/files/l10n/es_419.json138
-rw-r--r--apps/files/l10n/es_AR.js146
-rw-r--r--apps/files/l10n/es_AR.json144
-rw-r--r--apps/files/l10n/es_CL.js150
-rw-r--r--apps/files/l10n/es_CL.json148
-rw-r--r--apps/files/l10n/es_CO.js150
-rw-r--r--apps/files/l10n/es_CO.json148
-rw-r--r--apps/files/l10n/es_CR.js149
-rw-r--r--apps/files/l10n/es_CR.json147
-rw-r--r--apps/files/l10n/es_DO.js149
-rw-r--r--apps/files/l10n/es_DO.json147
-rw-r--r--apps/files/l10n/es_EC.js323
-rw-r--r--apps/files/l10n/es_EC.json323
-rw-r--r--apps/files/l10n/es_GT.js149
-rw-r--r--apps/files/l10n/es_GT.json147
-rw-r--r--apps/files/l10n/es_HN.js140
-rw-r--r--apps/files/l10n/es_HN.json138
-rw-r--r--apps/files/l10n/es_MX.js460
-rw-r--r--apps/files/l10n/es_MX.json460
-rw-r--r--apps/files/l10n/es_NI.js140
-rw-r--r--apps/files/l10n/es_NI.json138
-rw-r--r--apps/files/l10n/es_PA.js140
-rw-r--r--apps/files/l10n/es_PA.json138
-rw-r--r--apps/files/l10n/es_PE.js140
-rw-r--r--apps/files/l10n/es_PE.json138
-rw-r--r--apps/files/l10n/es_PR.js140
-rw-r--r--apps/files/l10n/es_PR.json138
-rw-r--r--apps/files/l10n/es_PY.js155
-rw-r--r--apps/files/l10n/es_PY.json153
-rw-r--r--apps/files/l10n/es_SV.js149
-rw-r--r--apps/files/l10n/es_SV.json147
-rw-r--r--apps/files/l10n/es_UY.js140
-rw-r--r--apps/files/l10n/es_UY.json138
-rw-r--r--apps/files/l10n/et_EE.js561
-rw-r--r--apps/files/l10n/et_EE.json561
-rw-r--r--apps/files/l10n/eu.js523
-rw-r--r--apps/files/l10n/eu.json523
-rw-r--r--apps/files/l10n/fa.js528
-rw-r--r--apps/files/l10n/fa.json528
-rw-r--r--apps/files/l10n/fi.js498
-rw-r--r--apps/files/l10n/fi.json498
-rw-r--r--apps/files/l10n/fr.js559
-rw-r--r--apps/files/l10n/fr.json559
-rw-r--r--apps/files/l10n/fy_NL.js9
-rw-r--r--apps/files/l10n/fy_NL.json7
-rw-r--r--apps/files/l10n/ga.js481
-rw-r--r--apps/files/l10n/ga.json479
-rw-r--r--apps/files/l10n/gl.js553
-rw-r--r--apps/files/l10n/gl.json553
-rw-r--r--apps/files/l10n/gu.js9
-rw-r--r--apps/files/l10n/gu.json7
-rw-r--r--apps/files/l10n/he.js198
-rw-r--r--apps/files/l10n/he.json196
-rw-r--r--apps/files/l10n/hr.js218
-rw-r--r--apps/files/l10n/hr.json216
-rw-r--r--apps/files/l10n/hu.js548
-rw-r--r--apps/files/l10n/hu.json548
-rw-r--r--apps/files/l10n/hy.js40
-rw-r--r--apps/files/l10n/hy.json38
-rw-r--r--apps/files/l10n/ia.js126
-rw-r--r--apps/files/l10n/ia.json124
-rw-r--r--apps/files/l10n/id.js187
-rw-r--r--apps/files/l10n/id.json185
-rw-r--r--apps/files/l10n/io.js9
-rw-r--r--apps/files/l10n/io.json7
-rw-r--r--apps/files/l10n/is.js504
-rw-r--r--apps/files/l10n/is.json504
-rw-r--r--apps/files/l10n/it.js580
-rw-r--r--apps/files/l10n/it.json580
-rw-r--r--apps/files/l10n/ja.js556
-rw-r--r--apps/files/l10n/ja.json556
-rw-r--r--apps/files/l10n/ka.js301
-rw-r--r--apps/files/l10n/ka.json299
-rw-r--r--apps/files/l10n/ka_GE.js149
-rw-r--r--apps/files/l10n/ka_GE.json147
-rw-r--r--apps/files/l10n/km.js38
-rw-r--r--apps/files/l10n/km.json36
-rw-r--r--apps/files/l10n/kn.js61
-rw-r--r--apps/files/l10n/kn.json59
-rw-r--r--apps/files/l10n/ko.js536
-rw-r--r--apps/files/l10n/ko.json536
-rw-r--r--apps/files/l10n/lb.js120
-rw-r--r--apps/files/l10n/lb.json118
-rw-r--r--apps/files/l10n/lo.js9
-rw-r--r--apps/files/l10n/lo.json7
-rw-r--r--apps/files/l10n/lt_LT.js387
-rw-r--r--apps/files/l10n/lt_LT.json387
-rw-r--r--apps/files/l10n/lv.js144
-rw-r--r--apps/files/l10n/lv.json142
-rw-r--r--apps/files/l10n/mg.js9
-rw-r--r--apps/files/l10n/mg.json7
-rw-r--r--apps/files/l10n/mk.js494
-rw-r--r--apps/files/l10n/mk.json494
-rw-r--r--apps/files/l10n/ml.js9
-rw-r--r--apps/files/l10n/ml.json7
-rw-r--r--apps/files/l10n/mn.js137
-rw-r--r--apps/files/l10n/mn.json135
-rw-r--r--apps/files/l10n/mr.js9
-rw-r--r--apps/files/l10n/mr.json7
-rw-r--r--apps/files/l10n/ms_MY.js37
-rw-r--r--apps/files/l10n/ms_MY.json35
-rw-r--r--apps/files/l10n/mt_MT.js9
-rw-r--r--apps/files/l10n/mt_MT.json7
-rw-r--r--apps/files/l10n/nb.js496
-rw-r--r--apps/files/l10n/nb.json496
-rw-r--r--apps/files/l10n/nl.js567
-rw-r--r--apps/files/l10n/nl.json567
-rw-r--r--apps/files/l10n/nn_NO.js71
-rw-r--r--apps/files/l10n/nn_NO.json69
-rw-r--r--apps/files/l10n/nqo.js9
-rw-r--r--apps/files/l10n/nqo.json7
-rw-r--r--apps/files/l10n/oc.js121
-rw-r--r--apps/files/l10n/oc.json119
-rw-r--r--apps/files/l10n/pl.js582
-rw-r--r--apps/files/l10n/pl.json582
-rw-r--r--apps/files/l10n/ps.js140
-rw-r--r--apps/files/l10n/ps.json138
-rw-r--r--apps/files/l10n/pt_BR.js590
-rw-r--r--apps/files/l10n/pt_BR.json590
-rw-r--r--apps/files/l10n/pt_PT.js327
-rw-r--r--apps/files/l10n/pt_PT.json327
-rw-r--r--apps/files/l10n/ro.js345
-rw-r--r--apps/files/l10n/ro.json345
-rw-r--r--apps/files/l10n/ru.js561
-rw-r--r--apps/files/l10n/ru.json561
-rw-r--r--apps/files/l10n/sc.js376
-rw-r--r--apps/files/l10n/sc.json376
-rw-r--r--apps/files/l10n/sk.js541
-rw-r--r--apps/files/l10n/sk.json541
-rw-r--r--apps/files/l10n/sl.js539
-rw-r--r--apps/files/l10n/sl.json539
-rw-r--r--apps/files/l10n/sq.js133
-rw-r--r--apps/files/l10n/sq.json131
-rw-r--r--apps/files/l10n/sr.js573
-rw-r--r--apps/files/l10n/sr.json573
-rw-r--r--apps/files/l10n/sr@latin.js95
-rw-r--r--apps/files/l10n/sr@latin.json93
-rw-r--r--apps/files/l10n/su.js9
-rw-r--r--apps/files/l10n/su.json7
-rw-r--r--apps/files/l10n/sv.js561
-rw-r--r--apps/files/l10n/sv.json561
-rw-r--r--apps/files/l10n/sw.js480
-rw-r--r--apps/files/l10n/sw.json478
-rw-r--r--apps/files/l10n/sw_KE.js9
-rw-r--r--apps/files/l10n/sw_KE.json7
-rw-r--r--apps/files/l10n/tg_TJ.js9
-rw-r--r--apps/files/l10n/tg_TJ.json7
-rw-r--r--apps/files/l10n/th.js220
-rw-r--r--apps/files/l10n/th.json218
-rw-r--r--apps/files/l10n/tl_PH.js9
-rw-r--r--apps/files/l10n/tl_PH.json7
-rw-r--r--apps/files/l10n/tr.js558
-rw-r--r--apps/files/l10n/tr.json558
-rw-r--r--apps/files/l10n/tzm.js9
-rw-r--r--apps/files/l10n/tzm.json7
-rw-r--r--apps/files/l10n/ug.js393
-rw-r--r--apps/files/l10n/ug.json393
-rw-r--r--apps/files/l10n/uk.js620
-rw-r--r--apps/files/l10n/uk.json620
-rw-r--r--apps/files/l10n/ur_PK.js13
-rw-r--r--apps/files/l10n/ur_PK.json11
-rw-r--r--apps/files/l10n/vi.js495
-rw-r--r--apps/files/l10n/vi.json495
-rw-r--r--apps/files/l10n/zh_CN.js594
-rw-r--r--apps/files/l10n/zh_CN.json594
-rw-r--r--apps/files/l10n/zh_HK.js578
-rw-r--r--apps/files/l10n/zh_HK.json578
-rw-r--r--apps/files/l10n/zh_TW.js610
-rw-r--r--apps/files/l10n/zh_TW.json610
-rw-r--r--apps/files/lib/Activity/FavoriteProvider.php72
-rw-r--r--apps/files/lib/Activity/Filter/Favorites.php50
-rw-r--r--apps/files/lib/Activity/Filter/FileChanges.php36
-rw-r--r--apps/files/lib/Activity/Helper.php89
-rw-r--r--apps/files/lib/Activity/Provider.php150
-rw-r--r--apps/files/lib/Activity/Settings/FavoriteAction.php27
-rw-r--r--apps/files/lib/Activity/Settings/FileActivitySettings.php29
-rw-r--r--apps/files/lib/Activity/Settings/FileChanged.php27
-rw-r--r--apps/files/lib/Activity/Settings/FileFavoriteChanged.php27
-rw-r--r--apps/files/lib/AdvancedCapabilities.php38
-rw-r--r--apps/files/lib/App.php68
-rw-r--r--apps/files/lib/AppInfo/Application.php126
-rw-r--r--apps/files/lib/BackgroundJob/CleanupDirectEditingTokens.php44
-rw-r--r--apps/files/lib/BackgroundJob/CleanupFileLocks.php44
-rw-r--r--apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php39
-rw-r--r--apps/files/lib/BackgroundJob/DeleteOrphanedItems.php141
-rw-r--r--apps/files/lib/BackgroundJob/ScanFiles.php117
-rw-r--r--apps/files/lib/BackgroundJob/TransferOwnership.php78
-rw-r--r--apps/files/lib/Capabilities.php84
-rw-r--r--apps/files/lib/Collaboration/Resources/Listener.php39
-rw-r--r--apps/files/lib/Collaboration/Resources/ResourceProvider.php64
-rw-r--r--apps/files/lib/Command/Copy.php116
-rw-r--r--apps/files/lib/Command/Delete.php99
-rw-r--r--apps/files/lib/Command/DeleteOrphanedFiles.php162
-rw-r--r--apps/files/lib/Command/Get.php71
-rw-r--r--apps/files/lib/Command/Move.php106
-rw-r--r--apps/files/lib/Command/Object/Delete.php60
-rw-r--r--apps/files/lib/Command/Object/Get.php63
-rw-r--r--apps/files/lib/Command/Object/Info.php80
-rw-r--r--apps/files/lib/Command/Object/ListObject.php50
-rw-r--r--apps/files/lib/Command/Object/Multi/Rename.php108
-rw-r--r--apps/files/lib/Command/Object/Multi/Users.php98
-rw-r--r--apps/files/lib/Command/Object/ObjectUtil.php115
-rw-r--r--apps/files/lib/Command/Object/Orphans.php79
-rw-r--r--apps/files/lib/Command/Object/Put.php68
-rw-r--r--apps/files/lib/Command/Put.php67
-rw-r--r--apps/files/lib/Command/RepairTree.php41
-rw-r--r--apps/files/lib/Command/SanitizeFilenames.php151
-rw-r--r--apps/files/lib/Command/Scan.php274
-rw-r--r--apps/files/lib/Command/ScanAppData.php114
-rw-r--r--apps/files/lib/Command/TransferOwnership.php139
-rw-r--r--apps/files/lib/Command/WindowsCompatibleFilenames.php52
-rw-r--r--apps/files/lib/Controller/AjaxController.php57
-rw-r--r--apps/files/lib/Controller/ApiController.php408
-rw-r--r--apps/files/lib/Controller/ConversionApiController.php109
-rw-r--r--apps/files/lib/Controller/DirectEditingController.php129
-rw-r--r--apps/files/lib/Controller/DirectEditingViewController.php59
-rw-r--r--apps/files/lib/Controller/OpenLocalEditorController.php128
-rw-r--r--apps/files/lib/Controller/TemplateController.php115
-rw-r--r--apps/files/lib/Controller/TransferOwnershipController.php133
-rw-r--r--apps/files/lib/Controller/ViewController.php494
-rw-r--r--apps/files/lib/Dashboard/FavoriteWidget.php141
-rw-r--r--apps/files/lib/Db/OpenLocalEditor.php43
-rw-r--r--apps/files/lib/Db/OpenLocalEditorMapper.php51
-rw-r--r--apps/files/lib/Db/TransferOwnership.php21
-rw-r--r--apps/files/lib/Db/TransferOwnershipMapper.php25
-rw-r--r--apps/files/lib/DirectEditingCapabilities.php36
-rw-r--r--apps/files/lib/Event/LoadAdditionalScriptsEvent.php33
-rw-r--r--apps/files/lib/Event/LoadSearchPlugins.php14
-rw-r--r--apps/files/lib/Event/LoadSidebar.php21
-rw-r--r--apps/files/lib/Exception/TransferOwnershipException.php21
-rw-r--r--apps/files/lib/Helper.php189
-rw-r--r--apps/files/lib/Listener/LegacyLoadAdditionalScriptsAdapter.php57
-rw-r--r--apps/files/lib/Listener/LoadSearchPluginsListener.php25
-rw-r--r--apps/files/lib/Listener/LoadSidebarListener.php25
-rw-r--r--apps/files/lib/Listener/NodeAddedToFavoriteListener.php43
-rw-r--r--apps/files/lib/Listener/NodeRemovedFromFavoriteListener.php43
-rw-r--r--apps/files/lib/Listener/RenderReferenceEventListener.php25
-rw-r--r--apps/files/lib/Listener/SyncLivePhotosListener.php254
-rw-r--r--apps/files/lib/Migration/Version11301Date20191205150729.php22
-rw-r--r--apps/files/lib/Migration/Version12101Date20221011153334.php52
-rw-r--r--apps/files/lib/Migration/Version2003Date20241021095629.php36
-rw-r--r--apps/files/lib/Notification/Notifier.php164
-rw-r--r--apps/files/lib/ResponseDefinitions.php75
-rw-r--r--apps/files/lib/Search/FilesSearchProvider.php169
-rw-r--r--apps/files/lib/Service/ChunkedUploadConfig.php30
-rw-r--r--apps/files/lib/Service/DirectEditingService.php35
-rw-r--r--apps/files/lib/Service/LivePhotosService.php36
-rw-r--r--apps/files/lib/Service/OwnershipTransferService.php478
-rw-r--r--apps/files/lib/Service/SettingsService.php63
-rw-r--r--apps/files/lib/Service/TagService.php115
-rw-r--r--apps/files/lib/Service/UserConfig.php182
-rw-r--r--apps/files/lib/Service/ViewConfig.php168
-rw-r--r--apps/files/lib/Settings/DeclarativeAdminSettings.php67
-rw-r--r--apps/files/lib/Settings/PersonalSettings.php23
-rw-r--r--apps/files/list.php42
-rw-r--r--apps/files/openapi.json2469
-rw-r--r--apps/files/openapi.json.license2
-rw-r--r--apps/files/recentlist.php37
-rw-r--r--apps/files/simplelist.php35
-rw-r--r--apps/files/src/FilesApp.vue40
-rw-r--r--apps/files/src/actions/convertAction.ts81
-rw-r--r--apps/files/src/actions/convertUtils.ts139
-rw-r--r--apps/files/src/actions/deleteAction.spec.ts449
-rw-r--r--apps/files/src/actions/deleteAction.ts113
-rw-r--r--apps/files/src/actions/deleteUtils.ts141
-rw-r--r--apps/files/src/actions/downloadAction.spec.ts191
-rw-r--r--apps/files/src/actions/downloadAction.ts114
-rw-r--r--apps/files/src/actions/favoriteAction.spec.ts381
-rw-r--r--apps/files/src/actions/favoriteAction.ts119
-rw-r--r--apps/files/src/actions/moveOrCopyAction.ts373
-rw-r--r--apps/files/src/actions/moveOrCopyActionUtils.ts71
-rw-r--r--apps/files/src/actions/openFolderAction.spec.ts147
-rw-r--r--apps/files/src/actions/openFolderAction.ts50
-rw-r--r--apps/files/src/actions/openInFilesAction.spec.ts86
-rw-r--r--apps/files/src/actions/openInFilesAction.ts38
-rw-r--r--apps/files/src/actions/openLocallyAction.spec.ts170
-rw-r--r--apps/files/src/actions/openLocallyAction.ts114
-rw-r--r--apps/files/src/actions/renameAction.spec.ts100
-rw-r--r--apps/files/src/actions/renameAction.ts50
-rw-r--r--apps/files/src/actions/sidebarAction.spec.ts185
-rw-r--r--apps/files/src/actions/sidebarAction.ts74
-rw-r--r--apps/files/src/actions/viewInFolderAction.spec.ts193
-rw-r--r--apps/files/src/actions/viewInFolderAction.ts68
-rw-r--r--apps/files/src/components/BreadCrumbs.vue310
-rw-r--r--apps/files/src/components/CustomElementRender.vue54
-rw-r--r--apps/files/src/components/DragAndDropNotice.vue262
-rw-r--r--apps/files/src/components/DragAndDropPreview.vue165
-rw-r--r--apps/files/src/components/FileEntry.vue276
-rw-r--r--apps/files/src/components/FileEntry/CollectivesIcon.vue45
-rw-r--r--apps/files/src/components/FileEntry/FavoriteIcon.vue76
-rw-r--r--apps/files/src/components/FileEntry/FileEntryActions.vue399
-rw-r--r--apps/files/src/components/FileEntry/FileEntryCheckbox.vue173
-rw-r--r--apps/files/src/components/FileEntry/FileEntryName.vue288
-rw-r--r--apps/files/src/components/FileEntry/FileEntryPreview.vue300
-rw-r--r--apps/files/src/components/FileEntryGrid.vue135
-rw-r--r--apps/files/src/components/FileEntryMixin.ts509
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilter.vue53
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilterModified.vue107
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilterToSearch.vue47
-rw-r--r--apps/files/src/components/FileListFilter/FileListFilterType.vue122
-rw-r--r--apps/files/src/components/FileListFilters.vue74
-rw-r--r--apps/files/src/components/FilesListHeader.vue100
-rw-r--r--apps/files/src/components/FilesListTableFooter.vue164
-rw-r--r--apps/files/src/components/FilesListTableHeader.vue237
-rw-r--r--apps/files/src/components/FilesListTableHeaderActions.vue337
-rw-r--r--apps/files/src/components/FilesListTableHeaderButton.vue91
-rw-r--r--apps/files/src/components/FilesListVirtual.vue1035
-rw-r--r--apps/files/src/components/FilesNavigationItem.vue182
-rw-r--r--apps/files/src/components/FilesNavigationSearch.vue86
-rw-r--r--apps/files/src/components/LegacyView.vue27
-rw-r--r--apps/files/src/components/NavigationQuota.vue184
-rw-r--r--apps/files/src/components/NewNodeDialog.vue168
-rw-r--r--apps/files/src/components/PersonalSettings.vue24
-rw-r--r--apps/files/src/components/Setting.vue25
-rw-r--r--apps/files/src/components/SidebarTab.vue43
-rw-r--r--apps/files/src/components/TemplateFiller.vue122
-rw-r--r--apps/files/src/components/TemplateFiller/TemplateCheckboxField.vue68
-rw-r--r--apps/files/src/components/TemplateFiller/TemplateRichTextField.vue77
-rw-r--r--apps/files/src/components/TemplatePreview.vue49
-rw-r--r--apps/files/src/components/TransferOwnershipDialogue.vue100
-rw-r--r--apps/files/src/components/VirtualList.vue424
-rw-r--r--apps/files/src/composables/useBeforeNavigation.ts20
-rw-r--r--apps/files/src/composables/useFileListHeaders.spec.ts41
-rw-r--r--apps/files/src/composables/useFileListHeaders.ts19
-rw-r--r--apps/files/src/composables/useFileListWidth.cy.ts56
-rw-r--r--apps/files/src/composables/useFileListWidth.ts50
-rw-r--r--apps/files/src/composables/useHotKeys.spec.ts213
-rw-r--r--apps/files/src/composables/useHotKeys.ts86
-rw-r--r--apps/files/src/composables/useNavigation.spec.ts106
-rw-r--r--apps/files/src/composables/useNavigation.ts53
-rw-r--r--apps/files/src/composables/useRouteParameters.ts58
-rw-r--r--apps/files/src/eventbus.d.ts36
-rw-r--r--apps/files/src/files-app-settings.js57
-rw-r--r--apps/files/src/filters/FilenameFilter.ts75
-rw-r--r--apps/files/src/filters/HiddenFilesFilter.ts42
-rw-r--r--apps/files/src/filters/ModifiedFilter.ts114
-rw-r--r--apps/files/src/filters/SearchFilter.ts49
-rw-r--r--apps/files/src/filters/TypeFilter.ts192
-rw-r--r--apps/files/src/init.ts83
-rw-r--r--apps/files/src/legacy/filelistSearch.js42
-rw-r--r--apps/files/src/logger.js39
-rw-r--r--apps/files/src/logger.ts10
-rw-r--r--apps/files/src/main-personal-settings.js37
-rw-r--r--apps/files/src/main.js3
-rw-r--r--apps/files/src/main.ts51
-rw-r--r--apps/files/src/mixins/actionsMixin.ts65
-rw-r--r--apps/files/src/mixins/filesSorting.ts52
-rw-r--r--apps/files/src/models/Setting.js43
-rw-r--r--apps/files/src/models/Tab.js52
-rw-r--r--apps/files/src/newMenu/newFolder.ts91
-rw-r--r--apps/files/src/newMenu/newFromTemplate.ts77
-rw-r--r--apps/files/src/newMenu/newTemplatesFolder.ts83
-rw-r--r--apps/files/src/plugins/search/folderSearch.ts61
-rw-r--r--apps/files/src/reference-files.ts43
-rw-r--r--apps/files/src/router/router.ts145
-rw-r--r--apps/files/src/services/DropService.ts198
-rw-r--r--apps/files/src/services/DropServiceUtils.spec.ts143
-rw-r--r--apps/files/src/services/DropServiceUtils.ts178
-rw-r--r--apps/files/src/services/Favorites.ts40
-rw-r--r--apps/files/src/services/FileInfo.js70
-rw-r--r--apps/files/src/services/FileInfo.ts36
-rw-r--r--apps/files/src/services/Files.ts110
-rw-r--r--apps/files/src/services/FolderTree.ts95
-rw-r--r--apps/files/src/services/LivePhotos.ts19
-rw-r--r--apps/files/src/services/PersonalFiles.ts39
-rw-r--r--apps/files/src/services/PreviewService.ts21
-rw-r--r--apps/files/src/services/Recent.ts74
-rw-r--r--apps/files/src/services/RouterService.ts75
-rw-r--r--apps/files/src/services/Search.spec.ts61
-rw-r--r--apps/files/src/services/Search.ts43
-rw-r--r--apps/files/src/services/ServiceWorker.js31
-rw-r--r--apps/files/src/services/Settings.js21
-rw-r--r--apps/files/src/services/Sidebar.js21
-rw-r--r--apps/files/src/services/Templates.js30
-rw-r--r--apps/files/src/services/WebDavSearch.ts83
-rw-r--r--apps/files/src/services/WebdavClient.ts19
-rw-r--r--apps/files/src/sidebar.ts (renamed from apps/files/src/sidebar.js)40
-rw-r--r--apps/files/src/store/actionsmenu.ts12
-rw-r--r--apps/files/src/store/active.ts86
-rw-r--r--apps/files/src/store/dragging.ts31
-rw-r--r--apps/files/src/store/files.ts198
-rw-r--r--apps/files/src/store/filters.ts133
-rw-r--r--apps/files/src/store/index.ts15
-rw-r--r--apps/files/src/store/keyboard.ts47
-rw-r--r--apps/files/src/store/paths.spec.ts166
-rw-r--r--apps/files/src/store/paths.ts165
-rw-r--r--apps/files/src/store/renaming.ts175
-rw-r--r--apps/files/src/store/search.ts153
-rw-r--r--apps/files/src/store/selection.ts44
-rw-r--r--apps/files/src/store/uploader.ts24
-rw-r--r--apps/files/src/store/userconfig.ts62
-rw-r--r--apps/files/src/store/viewConfig.ts96
-rw-r--r--apps/files/src/templates.js144
-rw-r--r--apps/files/src/types.ts148
-rw-r--r--apps/files/src/utils/actionUtils.ts74
-rw-r--r--apps/files/src/utils/davUtils.js53
-rw-r--r--apps/files/src/utils/davUtils.ts41
-rw-r--r--apps/files/src/utils/dragUtils.ts25
-rw-r--r--apps/files/src/utils/fileUtils.js47
-rw-r--r--apps/files/src/utils/fileUtils.ts47
-rw-r--r--apps/files/src/utils/filenameValidity.ts41
-rw-r--r--apps/files/src/utils/filesViews.spec.ts73
-rw-r--r--apps/files/src/utils/filesViews.ts30
-rw-r--r--apps/files/src/utils/hashUtils.ts17
-rw-r--r--apps/files/src/utils/newNodeDialog.ts40
-rw-r--r--apps/files/src/utils/permissions.ts37
-rw-r--r--apps/files/src/views/DialogConfirmFileExtension.cy.ts161
-rw-r--r--apps/files/src/views/DialogConfirmFileExtension.vue92
-rw-r--r--apps/files/src/views/FileReferencePickerElement.vue86
-rw-r--r--apps/files/src/views/FilesList.vue909
-rw-r--r--apps/files/src/views/Navigation.cy.ts257
-rw-r--r--apps/files/src/views/Navigation.vue228
-rw-r--r--apps/files/src/views/ReferenceFileWidget.vue306
-rw-r--r--apps/files/src/views/SearchEmptyView.vue53
-rw-r--r--apps/files/src/views/Settings.vue450
-rw-r--r--apps/files/src/views/Sidebar.vue423
-rw-r--r--apps/files/src/views/TemplatePicker.vue234
-rw-r--r--apps/files/src/views/favorites.spec.ts261
-rw-r--r--apps/files/src/views/favorites.ts183
-rw-r--r--apps/files/src/views/files.ts65
-rw-r--r--apps/files/src/views/folderTree.ts176
-rw-r--r--apps/files/src/views/personal-files.ts38
-rw-r--r--apps/files/src/views/recent.ts28
-rw-r--r--apps/files/src/views/search.ts51
-rw-r--r--apps/files/templates/appnavigation.php138
-rw-r--r--apps/files/templates/fileexists.html31
-rw-r--r--apps/files/templates/index.php40
-rw-r--r--apps/files/templates/list.php47
-rw-r--r--apps/files/templates/recentlist.php44
-rw-r--r--apps/files/templates/settings-personal.php24
-rw-r--r--apps/files/templates/simplelist.php43
-rw-r--r--apps/files/tests/Activity/Filter/GenericTest.php90
-rw-r--r--apps/files/tests/Activity/ProviderTest.php93
-rw-r--r--apps/files/tests/Activity/Setting/GenericTest.php100
-rw-r--r--apps/files/tests/AdvancedCapabilitiesTest.php46
-rw-r--r--apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php103
-rw-r--r--apps/files/tests/BackgroundJob/ScanFilesTest.php52
-rw-r--r--apps/files/tests/Command/DeleteOrphanedFilesTest.php107
-rw-r--r--apps/files/tests/Controller/ApiControllerTest.php250
-rw-r--r--apps/files/tests/Controller/ConversionApiControllerTest.php96
-rw-r--r--apps/files/tests/Controller/ViewControllerTest.php633
-rw-r--r--apps/files/tests/HelperTest.php83
-rw-r--r--apps/files/tests/Service/TagServiceTest.php124
-rw-r--r--apps/files/tests/js/appSpec.js244
-rw-r--r--apps/files/tests/js/breadcrumbSpec.js669
-rw-r--r--apps/files/tests/js/detailsviewSpec.js257
-rw-r--r--apps/files/tests/js/favoritesfilelistspec.js117
-rw-r--r--apps/files/tests/js/favoritespluginspec.js119
-rw-r--r--apps/files/tests/js/fileUploadSpec.js303
-rw-r--r--apps/files/tests/js/fileactionsSpec.js759
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js365
-rw-r--r--apps/files/tests/js/filelistSpec.js3459
-rw-r--r--apps/files/tests/js/filesSpec.js147
-rw-r--r--apps/files/tests/js/filesummarySpec.js243
-rw-r--r--apps/files/tests/js/mainfileinfodetailviewSpec.js292
-rw-r--r--apps/files/tests/js/newfilemenuSpec.js151
-rw-r--r--apps/files/tests/js/tagspluginspec.js171
579 files changed, 65066 insertions, 50980 deletions
diff --git a/apps/files/.l10nignore b/apps/files/.l10nignore
index 04ae88c227d..72628395d42 100644
--- a/apps/files/.l10nignore
+++ b/apps/files/.l10nignore
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
# compiled vue templates
js/templates.js
js/dist/
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
deleted file mode 100644
index d71d8442733..00000000000
--- a/apps/files/ajax/download.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Piotr Filiciak <piotr@filiciak.pl>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-// Check if we are a user
-OC_Util::checkLoggedIn();
-\OC::$server->getSession()->close();
-
-$files = isset($_GET['files']) ? (string)$_GET['files'] : '';
-$dir = isset($_GET['dir']) ? (string)$_GET['dir'] : '';
-
-$files_list = json_decode($files);
-// in case we get only a single file
-if (!is_array($files_list)) {
- $files_list = [$files];
-}
-
-/**
- * @psalm-taint-escape cookie
- */
-function cleanCookieInput(string $value): string {
- if (strlen($value) > 32) {
- return '';
- }
- if (preg_match('!^[a-zA-Z0-9]+$!', $_GET['downloadStartSecret']) !== 1) {
- return '';
- }
- return $value;
-}
-
-/**
- * this sets a cookie to be able to recognize the start of the download
- * the content must not be longer than 32 characters and must only contain
- * alphanumeric characters
- */
-if (isset($_GET['downloadStartSecret'])) {
- $value = cleanCookieInput($_GET['downloadStartSecret']);
- if ($value !== '') {
- setcookie('ocDownloadStarted', $value, time() + 20, '/');
- }
-}
-
-$server_params = [ 'head' => \OC::$server->getRequest()->getMethod() === 'HEAD' ];
-
-/**
- * Http range requests support
- */
-if (isset($_SERVER['HTTP_RANGE'])) {
- $server_params['range'] = \OC::$server->getRequest()->getHeader('Range');
-}
-
-OC_Files::get($dir, $files_list, $server_params);
diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php
deleted file mode 100644
index 8a48d4fbe1f..00000000000
--- a/apps/files/ajax/list.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-use OCP\Files\StorageNotAvailableException;
-use OCP\Files\StorageInvalidException;
-
-\OC_JSON::checkLoggedIn();
-\OC::$server->getSession()->close();
-$l = \OC::$server->getL10N('files');
-
-// Load the files
-$dir = isset($_GET['dir']) ? (string)$_GET['dir'] : '';
-$dir = \OC\Files\Filesystem::normalizePath($dir);
-
-try {
- $dirInfo = \OC\Files\Filesystem::getFileInfo($dir);
- if (!$dirInfo || $dirInfo->getType() !== 'dir') {
- http_response_code(404);
- exit();
- }
-
- $data = [];
- $baseUrl = \OC::$server->getURLGenerator()->linkTo('files', 'index.php') . '?dir=';
-
- $permissions = $dirInfo->getPermissions();
-
- $sortAttribute = isset($_GET['sort']) ? (string)$_GET['sort'] : 'name';
- $sortDirection = isset($_GET['sortdirection']) ? ($_GET['sortdirection'] === 'desc') : false;
- $mimetypeFilters = isset($_GET['mimetypes']) ? json_decode($_GET['mimetypes']) : '';
-
- $files = [];
- // Clean up duplicates from array
- if (is_array($mimetypeFilters) && count($mimetypeFilters)) {
- $mimetypeFilters = array_unique($mimetypeFilters);
-
- if (!in_array('httpd/unix-directory', $mimetypeFilters)) {
- // append folder filter to be able to browse folders
- $mimetypeFilters[] = 'httpd/unix-directory';
- }
-
- // create filelist with mimetype filter - as getFiles only supports on
- // mimetype filter at once we will filter this folder for each
- // mimetypeFilter
- foreach ($mimetypeFilters as $mimetypeFilter) {
- $files = array_merge($files, \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection, $mimetypeFilter));
- }
-
- // sort the files accordingly
- $files = \OCA\Files\Helper::sortFiles($files, $sortAttribute, $sortDirection);
- } else {
- // create file list without mimetype filter
- $files = \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection);
- }
-
- $data['directory'] = $dir;
- $data['files'] = \OCA\Files\Helper::formatFileInfos($files);
- $data['permissions'] = $permissions;
-
- \OC_JSON::success(['data' => $data]);
-} catch (\OCP\Files\StorageNotAvailableException $e) {
- \OC::$server->getLogger()->logException($e, ['app' => 'files']);
- \OC_JSON::error([
- 'data' => [
- 'exception' => StorageNotAvailableException::class,
- 'message' => $l->t('Storage is temporarily not available')
- ]
- ]);
-} catch (\OCP\Files\StorageInvalidException $e) {
- \OC::$server->getLogger()->logException($e, ['app' => 'files']);
- \OC_JSON::error([
- 'data' => [
- 'exception' => StorageInvalidException::class,
- 'message' => $l->t('Storage invalid')
- ]
- ]);
-} catch (\Exception $e) {
- \OC::$server->getLogger()->logException($e, ['app' => 'files']);
- \OC_JSON::error([
- 'data' => [
- 'exception' => \Exception::class,
- 'message' => $l->t('Unknown error')
- ]
- ]);
-}
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index f62a913e8f4..fb53cef79b8 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -1,15 +1,20 @@
<?xml version="1.0"?>
+<!--
+ - SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-FileCopyrightText: 2012-2016 ownCloud, Inc.
+ - SPDX-License-Identifier: AGPL-3.0-only
+ -->
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files</id>
<name>Files</name>
<summary>File Management</summary>
<description>File Management</description>
- <version>1.20.0</version>
+ <version>2.4.0</version>
<licence>agpl</licence>
+ <author>John Molakvoæ</author>
<author>Robin Appelman</author>
<author>Vincent Petry</author>
- <default_enable/>
<types>
<filesystem/>
</types>
@@ -19,7 +24,7 @@
<category>files</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
- <nextcloud min-version="25" max-version="25"/>
+ <nextcloud min-version="32" max-version="32"/>
</dependencies>
<background-jobs>
@@ -27,6 +32,7 @@
<job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
<job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
<job>OCA\Files\BackgroundJob\CleanupDirectEditingTokens</job>
+ <job>OCA\Files\BackgroundJob\DeleteExpiredOpenLocalEditor</job>
</background-jobs>
<commands>
@@ -35,8 +41,27 @@
<command>OCA\Files\Command\TransferOwnership</command>
<command>OCA\Files\Command\ScanAppData</command>
<command>OCA\Files\Command\RepairTree</command>
+ <command>OCA\Files\Command\Get</command>
+ <command>OCA\Files\Command\Put</command>
+ <command>OCA\Files\Command\Delete</command>
+ <command>OCA\Files\Command\Copy</command>
+ <command>OCA\Files\Command\Move</command>
+ <command>OCA\Files\Command\SanitizeFilenames</command>
+ <command>OCA\Files\Command\Object\Delete</command>
+ <command>OCA\Files\Command\Object\Get</command>
+ <command>OCA\Files\Command\Object\Put</command>
+ <command>OCA\Files\Command\Object\Info</command>
+ <command>OCA\Files\Command\Object\ListObject</command>
+ <command>OCA\Files\Command\Object\Orphans</command>
+ <command>OCA\Files\Command\Object\Multi\Users</command>
+ <command>OCA\Files\Command\Object\Multi\Rename</command>
+ <command>OCA\Files\Command\WindowsCompatibleFilenames</command>
</commands>
+ <settings>
+ <personal>OCA\Files\Settings\PersonalSettings</personal>
+ </settings>
+
<activity>
<settings>
<setting>OCA\Files\Activity\Settings\FavoriteAction</setting>
@@ -63,8 +88,4 @@
</navigation>
</navigations>
- <settings>
- <personal>OCA\Files\Settings\PersonalSettings</personal>
- </settings>
-
</info>
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index a98170363e9..04afe578c47 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -3,179 +3,180 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Felix Nüsse <Felix.nuesse@t-online.de>
- * @author fnuesse <felix.nuesse@t-online.de>
- * @author fnuesse <fnuesse@techfak.uni-bielefeld.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\AppInfo;
-/** @var Application $application */
-$application = \OC::$server->query(Application::class);
-$application->registerRoutes(
- $this,
- [
- 'routes' => [
- [
- 'name' => 'View#showFile',
- 'url' => '/f/{fileid}',
- 'verb' => 'GET',
- 'root' => '',
- ],
-
- [
- 'name' => 'API#getThumbnail',
- 'url' => '/api/v1/thumbnail/{x}/{y}/{file}',
- 'verb' => 'GET',
- 'requirements' => ['file' => '.+']
- ],
- [
- 'name' => 'API#updateFileTags',
- 'url' => '/api/v1/files/{path}',
- 'verb' => 'POST',
- 'requirements' => ['path' => '.+'],
- ],
- [
- 'name' => 'API#getRecentFiles',
- 'url' => '/api/v1/recent/',
- 'verb' => 'GET'
- ],
- [
- 'name' => 'API#updateFileSorting',
- 'url' => '/api/v1/sorting',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'API#showHiddenFiles',
- 'url' => '/api/v1/showhidden',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'API#cropImagePreviews',
- 'url' => '/api/v1/cropimagepreviews',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'API#showGridView',
- 'url' => '/api/v1/showgridview',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'API#getGridView',
- 'url' => '/api/v1/showgridview',
- 'verb' => 'GET'
- ],
- [
- 'name' => 'view#index',
- 'url' => '/',
- 'verb' => 'GET',
- ],
- [
- 'name' => 'ajax#getStorageStats',
- 'url' => '/ajax/getstoragestats.php',
- 'verb' => 'GET',
- ],
- [
- 'name' => 'API#toggleShowFolder',
- 'url' => '/api/v1/toggleShowFolder/{key}',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'API#getNodeType',
- 'url' => '/api/v1/quickaccess/get/NodeType',
- 'verb' => 'GET',
- ],
- [
- 'name' => 'DirectEditingView#edit',
- 'url' => '/directEditing/{token}',
- 'verb' => 'GET'
- ],
- ],
- 'ocs' => [
- [
- 'name' => 'DirectEditing#info',
- 'url' => '/api/v1/directEditing',
- 'verb' => 'GET'
- ],
- [
- 'name' => 'DirectEditing#templates',
- 'url' => '/api/v1/directEditing/templates/{editorId}/{creatorId}',
- 'verb' => 'GET'
- ],
- [
- 'name' => 'DirectEditing#open',
- 'url' => '/api/v1/directEditing/open',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'DirectEditing#create',
- 'url' => '/api/v1/directEditing/create',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'Template#list',
- 'url' => '/api/v1/templates',
- 'verb' => 'GET'
- ],
- [
- 'name' => 'Template#create',
- 'url' => '/api/v1/templates/create',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'Template#path',
- 'url' => '/api/v1/templates/path',
- 'verb' => 'POST'
- ],
- [
- 'name' => 'TransferOwnership#transfer',
- 'url' => '/api/v1/transferownership',
- 'verb' => 'POST',
- ],
- [
- 'name' => 'TransferOwnership#accept',
- 'url' => '/api/v1/transferownership/{id}',
- 'verb' => 'POST',
- ],
- [
- 'name' => 'TransferOwnership#reject',
- 'url' => '/api/v1/transferownership/{id}',
- 'verb' => 'DELETE',
- ],
+return [
+ 'routes' => [
+ [
+ 'name' => 'view#index',
+ 'url' => '/',
+ 'verb' => 'GET',
+ ],
+ [
+ 'name' => 'View#showFile',
+ 'url' => '/f/{fileid}',
+ 'verb' => 'GET',
+ 'root' => '',
+ ],
+ [
+ 'name' => 'Api#getThumbnail',
+ 'url' => '/api/v1/thumbnail/{x}/{y}/{file}',
+ 'verb' => 'GET',
+ 'requirements' => ['file' => '.+']
+ ],
+ [
+ 'name' => 'Api#updateFileTags',
+ 'url' => '/api/v1/files/{path}',
+ 'verb' => 'POST',
+ 'requirements' => ['path' => '.+'],
+ ],
+ [
+ 'name' => 'Api#getRecentFiles',
+ 'url' => '/api/v1/recent/',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Api#getStorageStats',
+ 'url' => '/api/v1/stats',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Api#setViewConfig',
+ 'url' => '/api/v1/views/{view}/{key}',
+ 'verb' => 'PUT'
+ ],
+ [
+ 'name' => 'Api#setViewConfig',
+ 'url' => '/api/v1/views',
+ 'verb' => 'PUT'
+ ],
+ [
+ 'name' => 'Api#getViewConfigs',
+ 'url' => '/api/v1/views',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Api#setConfig',
+ 'url' => '/api/v1/config/{key}',
+ 'verb' => 'PUT'
+ ],
+ [
+ 'name' => 'Api#getConfigs',
+ 'url' => '/api/v1/configs',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Api#showHiddenFiles',
+ 'url' => '/api/v1/showhidden',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Api#cropImagePreviews',
+ 'url' => '/api/v1/cropimagepreviews',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Api#showGridView',
+ 'url' => '/api/v1/showgridview',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Api#getGridView',
+ 'url' => '/api/v1/showgridview',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'DirectEditingView#edit',
+ 'url' => '/directEditing/{token}',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Api#serviceWorker',
+ 'url' => '/preview-service-worker.js',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'view#indexView',
+ 'url' => '/{view}',
+ 'verb' => 'GET',
+ ],
+ [
+ 'name' => 'view#indexViewFileid',
+ 'url' => '/{view}/{fileid}',
+ 'verb' => 'GET',
+ ],
+ ],
+ 'ocs' => [
+ [
+ 'name' => 'DirectEditing#info',
+ 'url' => '/api/v1/directEditing',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'DirectEditing#templates',
+ 'url' => '/api/v1/directEditing/templates/{editorId}/{creatorId}',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'DirectEditing#open',
+ 'url' => '/api/v1/directEditing/open',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'DirectEditing#create',
+ 'url' => '/api/v1/directEditing/create',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Template#list',
+ 'url' => '/api/v1/templates',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Template#listTemplateFields',
+ 'url' => '/api/v1/templates/fields/{fileId}',
+ 'verb' => 'GET'
+ ],
+ [
+ 'name' => 'Template#create',
+ 'url' => '/api/v1/templates/create',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Template#path',
+ 'url' => '/api/v1/templates/path',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'TransferOwnership#transfer',
+ 'url' => '/api/v1/transferownership',
+ 'verb' => 'POST',
+ ],
+ [
+ 'name' => 'TransferOwnership#accept',
+ 'url' => '/api/v1/transferownership/{id}',
+ 'verb' => 'POST',
+ ],
+ [
+ 'name' => 'TransferOwnership#reject',
+ 'url' => '/api/v1/transferownership/{id}',
+ 'verb' => 'DELETE',
+ ],
+ [
+ /** @see OpenLocalEditorController::create() */
+ 'name' => 'OpenLocalEditor#create',
+ 'url' => '/api/v1/openlocaleditor',
+ 'verb' => 'POST',
+ ],
+ [
+ /** @see OpenLocalEditorController::validate() */
+ 'name' => 'OpenLocalEditor#validate',
+ 'url' => '/api/v1/openlocaleditor/{token}',
+ 'verb' => 'POST',
],
]
-);
-
-/** @var $this \OC\Route\Router */
-
-$this->create('files_ajax_download', 'apps/files/ajax/download.php')
- ->actionInclude('files/ajax/download.php');
-$this->create('files_ajax_list', 'apps/files/ajax/list.php')
- ->actionInclude('files/ajax/list.php');
+];
diff --git a/apps/files/composer/autoload.php b/apps/files/composer/autoload.php
index cbac9333296..b43b6f6d2dc 100644
--- a/apps/files/composer/autoload.php
+++ b/apps/files/composer/autoload.php
@@ -3,8 +3,21 @@
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
- echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
- exit(1);
+ if (!headers_sent()) {
+ header('HTTP/1.1 500 Internal Server Error');
+ }
+ $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+ if (!ini_get('display_errors')) {
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+ fwrite(STDERR, $err);
+ } elseif (!headers_sent()) {
+ echo $err;
+ }
+ }
+ trigger_error(
+ $err,
+ E_USER_ERROR
+ );
}
require_once __DIR__ . '/composer/autoload_real.php';
diff --git a/apps/files/composer/composer/ClassLoader.php b/apps/files/composer/composer/ClassLoader.php
index afef3fa2ad8..7824d8f7eaf 100644
--- a/apps/files/composer/composer/ClassLoader.php
+++ b/apps/files/composer/composer/ClassLoader.php
@@ -42,35 +42,37 @@ namespace Composer\Autoload;
*/
class ClassLoader
{
- /** @var ?string */
+ /** @var \Closure(string):void */
+ private static $includeFile;
+
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
+ * @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
+ * @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array<string, string>
+ * @var list<string>
*/
private $fallbackDirsPsr0 = array();
@@ -78,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array<string, string>
+ * @var array<string, string>
*/
private $classMap = array();
@@ -87,29 +88,29 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array<string, bool>
+ * @var array<string, bool>
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array<string, self>
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
+ self::initializeIncludeClosure();
}
/**
- * @return string[]
+ * @return array<string, list<string>>
*/
public function getPrefixes()
{
@@ -121,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
+ * @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
@@ -130,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirs()
{
@@ -139,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array<string, string>
+ * @return list<string>
*/
public function getFallbackDirsPsr4()
{
@@ -148,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array<string, string>
+ * @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
@@ -157,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
+ * @param array<string, string> $classMap Class to filename map
*
* @return void
*/
@@ -175,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -201,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -222,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -232,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -252,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -272,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -290,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -425,7 +423,8 @@ class ClassLoader
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
- includeFile($file);
+ $includeFile = self::$includeFile;
+ $includeFile($file);
return true;
}
@@ -476,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array<string, self>
*/
public static function getRegisteredLoaders()
{
@@ -555,18 +554,26 @@ class ClassLoader
return false;
}
-}
-/**
- * Scope isolated include.
- *
- * Prevents access to $this/self from included files.
- *
- * @param string $file
- * @return void
- * @private
- */
-function includeFile($file)
-{
- include $file;
+ /**
+ * @return void
+ */
+ private static function initializeIncludeClosure()
+ {
+ if (self::$includeFile !== null) {
+ return;
+ }
+
+ /**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param string $file
+ * @return void
+ */
+ self::$includeFile = \Closure::bind(static function($file) {
+ include $file;
+ }, null, null);
+ }
}
diff --git a/apps/files/composer/composer/InstalledVersions.php b/apps/files/composer/composer/InstalledVersions.php
index 41bc143c114..51e734a774b 100644
--- a/apps/files/composer/composer/InstalledVersions.php
+++ b/apps/files/composer/composer/InstalledVersions.php
@@ -28,7 +28,7 @@ class InstalledVersions
{
/**
* @var mixed[]|null
- * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
+ * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
@@ -39,7 +39,7 @@ class InstalledVersions
/**
* @var array[]
- * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+ * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
@@ -98,7 +98,7 @@ class InstalledVersions
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
- return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}
@@ -119,7 +119,7 @@ class InstalledVersions
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
- $constraint = $parser->parseConstraints($constraint);
+ $constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
@@ -243,7 +243,7 @@ class InstalledVersions
/**
* @return array
- * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+ * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/
public static function getRootPackage()
{
@@ -257,7 +257,7 @@ class InstalledVersions
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
- * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+ * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/
public static function getRawData()
{
@@ -280,7 +280,7 @@ class InstalledVersions
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
- * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
@@ -303,7 +303,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
- * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+ * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/
public static function reload($data)
{
@@ -313,7 +313,7 @@ class InstalledVersions
/**
* @return array[]
- * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
@@ -328,7 +328,9 @@ class InstalledVersions
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
- $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+ /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+ $required = require $vendorDir.'/composer/installed.php';
+ $installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
@@ -340,12 +342,17 @@ class InstalledVersions
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
- self::$installed = require __DIR__ . '/installed.php';
+ /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+ $required = require __DIR__ . '/installed.php';
+ self::$installed = $required;
} else {
self::$installed = array();
}
}
- $installed[] = self::$installed;
+
+ if (self::$installed !== array()) {
+ $installed[] = self::$installed;
+ }
return $installed;
}
diff --git a/apps/files/composer/composer/autoload_classmap.php b/apps/files/composer/composer/autoload_classmap.php
index 05ea0a46ca1..0c0f734251f 100644
--- a/apps/files/composer/composer/autoload_classmap.php
+++ b/apps/files/composer/composer/autoload_classmap.php
@@ -16,41 +16,78 @@ return array(
'OCA\\Files\\Activity\\Settings\\FileActivitySettings' => $baseDir . '/../lib/Activity/Settings/FileActivitySettings.php',
'OCA\\Files\\Activity\\Settings\\FileChanged' => $baseDir . '/../lib/Activity/Settings/FileChanged.php',
'OCA\\Files\\Activity\\Settings\\FileFavoriteChanged' => $baseDir . '/../lib/Activity/Settings/FileFavoriteChanged.php',
+ 'OCA\\Files\\AdvancedCapabilities' => $baseDir . '/../lib/AdvancedCapabilities.php',
'OCA\\Files\\App' => $baseDir . '/../lib/App.php',
'OCA\\Files\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => $baseDir . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php',
'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => $baseDir . '/../lib/BackgroundJob/CleanupFileLocks.php',
+ 'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => $baseDir . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php',
'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => $baseDir . '/../lib/BackgroundJob/DeleteOrphanedItems.php',
'OCA\\Files\\BackgroundJob\\ScanFiles' => $baseDir . '/../lib/BackgroundJob/ScanFiles.php',
'OCA\\Files\\BackgroundJob\\TransferOwnership' => $baseDir . '/../lib/BackgroundJob/TransferOwnership.php',
'OCA\\Files\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => $baseDir . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => $baseDir . '/../lib/Collaboration/Resources/ResourceProvider.php',
+ 'OCA\\Files\\Command\\Copy' => $baseDir . '/../lib/Command/Copy.php',
+ 'OCA\\Files\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => $baseDir . '/../lib/Command/DeleteOrphanedFiles.php',
+ 'OCA\\Files\\Command\\Get' => $baseDir . '/../lib/Command/Get.php',
+ 'OCA\\Files\\Command\\Move' => $baseDir . '/../lib/Command/Move.php',
+ 'OCA\\Files\\Command\\Object\\Delete' => $baseDir . '/../lib/Command/Object/Delete.php',
+ 'OCA\\Files\\Command\\Object\\Get' => $baseDir . '/../lib/Command/Object/Get.php',
+ 'OCA\\Files\\Command\\Object\\Info' => $baseDir . '/../lib/Command/Object/Info.php',
+ 'OCA\\Files\\Command\\Object\\ListObject' => $baseDir . '/../lib/Command/Object/ListObject.php',
+ 'OCA\\Files\\Command\\Object\\Multi\\Rename' => $baseDir . '/../lib/Command/Object/Multi/Rename.php',
+ 'OCA\\Files\\Command\\Object\\Multi\\Users' => $baseDir . '/../lib/Command/Object/Multi/Users.php',
+ 'OCA\\Files\\Command\\Object\\ObjectUtil' => $baseDir . '/../lib/Command/Object/ObjectUtil.php',
+ 'OCA\\Files\\Command\\Object\\Orphans' => $baseDir . '/../lib/Command/Object/Orphans.php',
+ 'OCA\\Files\\Command\\Object\\Put' => $baseDir . '/../lib/Command/Object/Put.php',
+ 'OCA\\Files\\Command\\Put' => $baseDir . '/../lib/Command/Put.php',
'OCA\\Files\\Command\\RepairTree' => $baseDir . '/../lib/Command/RepairTree.php',
+ 'OCA\\Files\\Command\\SanitizeFilenames' => $baseDir . '/../lib/Command/SanitizeFilenames.php',
'OCA\\Files\\Command\\Scan' => $baseDir . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => $baseDir . '/../lib/Command/ScanAppData.php',
'OCA\\Files\\Command\\TransferOwnership' => $baseDir . '/../lib/Command/TransferOwnership.php',
- 'OCA\\Files\\Controller\\AjaxController' => $baseDir . '/../lib/Controller/AjaxController.php',
+ 'OCA\\Files\\Command\\WindowsCompatibleFilenames' => $baseDir . '/../lib/Command/WindowsCompatibleFilenames.php',
'OCA\\Files\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php',
+ 'OCA\\Files\\Controller\\ConversionApiController' => $baseDir . '/../lib/Controller/ConversionApiController.php',
'OCA\\Files\\Controller\\DirectEditingController' => $baseDir . '/../lib/Controller/DirectEditingController.php',
'OCA\\Files\\Controller\\DirectEditingViewController' => $baseDir . '/../lib/Controller/DirectEditingViewController.php',
+ 'OCA\\Files\\Controller\\OpenLocalEditorController' => $baseDir . '/../lib/Controller/OpenLocalEditorController.php',
'OCA\\Files\\Controller\\TemplateController' => $baseDir . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => $baseDir . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => $baseDir . '/../lib/Controller/ViewController.php',
+ 'OCA\\Files\\Dashboard\\FavoriteWidget' => $baseDir . '/../lib/Dashboard/FavoriteWidget.php',
+ 'OCA\\Files\\Db\\OpenLocalEditor' => $baseDir . '/../lib/Db/OpenLocalEditor.php',
+ 'OCA\\Files\\Db\\OpenLocalEditorMapper' => $baseDir . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => $baseDir . '/../lib/Db/TransferOwnership.php',
'OCA\\Files\\Db\\TransferOwnershipMapper' => $baseDir . '/../lib/Db/TransferOwnershipMapper.php',
+ 'OCA\\Files\\DirectEditingCapabilities' => $baseDir . '/../lib/DirectEditingCapabilities.php',
'OCA\\Files\\Event\\LoadAdditionalScriptsEvent' => $baseDir . '/../lib/Event/LoadAdditionalScriptsEvent.php',
+ 'OCA\\Files\\Event\\LoadSearchPlugins' => $baseDir . '/../lib/Event/LoadSearchPlugins.php',
'OCA\\Files\\Event\\LoadSidebar' => $baseDir . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => $baseDir . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => $baseDir . '/../lib/Helper.php',
- 'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => $baseDir . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php',
+ 'OCA\\Files\\Listener\\LoadSearchPluginsListener' => $baseDir . '/../lib/Listener/LoadSearchPluginsListener.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
+ 'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => $baseDir . '/../lib/Listener/NodeAddedToFavoriteListener.php',
+ 'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => $baseDir . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
+ 'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
+ 'OCA\\Files\\Listener\\SyncLivePhotosListener' => $baseDir . '/../lib/Listener/SyncLivePhotosListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php',
+ 'OCA\\Files\\Migration\\Version12101Date20221011153334' => $baseDir . '/../lib/Migration/Version12101Date20221011153334.php',
+ 'OCA\\Files\\Migration\\Version2003Date20241021095629' => $baseDir . '/../lib/Migration/Version2003Date20241021095629.php',
'OCA\\Files\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
+ 'OCA\\Files\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => $baseDir . '/../lib/Search/FilesSearchProvider.php',
+ 'OCA\\Files\\Service\\ChunkedUploadConfig' => $baseDir . '/../lib/Service/ChunkedUploadConfig.php',
'OCA\\Files\\Service\\DirectEditingService' => $baseDir . '/../lib/Service/DirectEditingService.php',
+ 'OCA\\Files\\Service\\LivePhotosService' => $baseDir . '/../lib/Service/LivePhotosService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => $baseDir . '/../lib/Service/OwnershipTransferService.php',
+ 'OCA\\Files\\Service\\SettingsService' => $baseDir . '/../lib/Service/SettingsService.php',
'OCA\\Files\\Service\\TagService' => $baseDir . '/../lib/Service/TagService.php',
+ 'OCA\\Files\\Service\\UserConfig' => $baseDir . '/../lib/Service/UserConfig.php',
+ 'OCA\\Files\\Service\\ViewConfig' => $baseDir . '/../lib/Service/ViewConfig.php',
+ 'OCA\\Files\\Settings\\DeclarativeAdminSettings' => $baseDir . '/../lib/Settings/DeclarativeAdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => $baseDir . '/../lib/Settings/PersonalSettings.php',
);
diff --git a/apps/files/composer/composer/autoload_static.php b/apps/files/composer/composer/autoload_static.php
index ba39b2c5707..19310ed4e92 100644
--- a/apps/files/composer/composer/autoload_static.php
+++ b/apps/files/composer/composer/autoload_static.php
@@ -31,42 +31,79 @@ class ComposerStaticInitFiles
'OCA\\Files\\Activity\\Settings\\FileActivitySettings' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileActivitySettings.php',
'OCA\\Files\\Activity\\Settings\\FileChanged' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileChanged.php',
'OCA\\Files\\Activity\\Settings\\FileFavoriteChanged' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileFavoriteChanged.php',
+ 'OCA\\Files\\AdvancedCapabilities' => __DIR__ . '/..' . '/../lib/AdvancedCapabilities.php',
'OCA\\Files\\App' => __DIR__ . '/..' . '/../lib/App.php',
'OCA\\Files\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php',
'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupFileLocks.php',
+ 'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php',
'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteOrphanedItems.php',
'OCA\\Files\\BackgroundJob\\ScanFiles' => __DIR__ . '/..' . '/../lib/BackgroundJob/ScanFiles.php',
'OCA\\Files\\BackgroundJob\\TransferOwnership' => __DIR__ . '/..' . '/../lib/BackgroundJob/TransferOwnership.php',
'OCA\\Files\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/ResourceProvider.php',
+ 'OCA\\Files\\Command\\Copy' => __DIR__ . '/..' . '/../lib/Command/Copy.php',
+ 'OCA\\Files\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => __DIR__ . '/..' . '/../lib/Command/DeleteOrphanedFiles.php',
+ 'OCA\\Files\\Command\\Get' => __DIR__ . '/..' . '/../lib/Command/Get.php',
+ 'OCA\\Files\\Command\\Move' => __DIR__ . '/..' . '/../lib/Command/Move.php',
+ 'OCA\\Files\\Command\\Object\\Delete' => __DIR__ . '/..' . '/../lib/Command/Object/Delete.php',
+ 'OCA\\Files\\Command\\Object\\Get' => __DIR__ . '/..' . '/../lib/Command/Object/Get.php',
+ 'OCA\\Files\\Command\\Object\\Info' => __DIR__ . '/..' . '/../lib/Command/Object/Info.php',
+ 'OCA\\Files\\Command\\Object\\ListObject' => __DIR__ . '/..' . '/../lib/Command/Object/ListObject.php',
+ 'OCA\\Files\\Command\\Object\\Multi\\Rename' => __DIR__ . '/..' . '/../lib/Command/Object/Multi/Rename.php',
+ 'OCA\\Files\\Command\\Object\\Multi\\Users' => __DIR__ . '/..' . '/../lib/Command/Object/Multi/Users.php',
+ 'OCA\\Files\\Command\\Object\\ObjectUtil' => __DIR__ . '/..' . '/../lib/Command/Object/ObjectUtil.php',
+ 'OCA\\Files\\Command\\Object\\Orphans' => __DIR__ . '/..' . '/../lib/Command/Object/Orphans.php',
+ 'OCA\\Files\\Command\\Object\\Put' => __DIR__ . '/..' . '/../lib/Command/Object/Put.php',
+ 'OCA\\Files\\Command\\Put' => __DIR__ . '/..' . '/../lib/Command/Put.php',
'OCA\\Files\\Command\\RepairTree' => __DIR__ . '/..' . '/../lib/Command/RepairTree.php',
+ 'OCA\\Files\\Command\\SanitizeFilenames' => __DIR__ . '/..' . '/../lib/Command/SanitizeFilenames.php',
'OCA\\Files\\Command\\Scan' => __DIR__ . '/..' . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => __DIR__ . '/..' . '/../lib/Command/ScanAppData.php',
'OCA\\Files\\Command\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Command/TransferOwnership.php',
- 'OCA\\Files\\Controller\\AjaxController' => __DIR__ . '/..' . '/../lib/Controller/AjaxController.php',
+ 'OCA\\Files\\Command\\WindowsCompatibleFilenames' => __DIR__ . '/..' . '/../lib/Command/WindowsCompatibleFilenames.php',
'OCA\\Files\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php',
+ 'OCA\\Files\\Controller\\ConversionApiController' => __DIR__ . '/..' . '/../lib/Controller/ConversionApiController.php',
'OCA\\Files\\Controller\\DirectEditingController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingController.php',
'OCA\\Files\\Controller\\DirectEditingViewController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingViewController.php',
+ 'OCA\\Files\\Controller\\OpenLocalEditorController' => __DIR__ . '/..' . '/../lib/Controller/OpenLocalEditorController.php',
'OCA\\Files\\Controller\\TemplateController' => __DIR__ . '/..' . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => __DIR__ . '/..' . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => __DIR__ . '/..' . '/../lib/Controller/ViewController.php',
+ 'OCA\\Files\\Dashboard\\FavoriteWidget' => __DIR__ . '/..' . '/../lib/Dashboard/FavoriteWidget.php',
+ 'OCA\\Files\\Db\\OpenLocalEditor' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditor.php',
+ 'OCA\\Files\\Db\\OpenLocalEditorMapper' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Db/TransferOwnership.php',
'OCA\\Files\\Db\\TransferOwnershipMapper' => __DIR__ . '/..' . '/../lib/Db/TransferOwnershipMapper.php',
+ 'OCA\\Files\\DirectEditingCapabilities' => __DIR__ . '/..' . '/../lib/DirectEditingCapabilities.php',
'OCA\\Files\\Event\\LoadAdditionalScriptsEvent' => __DIR__ . '/..' . '/../lib/Event/LoadAdditionalScriptsEvent.php',
+ 'OCA\\Files\\Event\\LoadSearchPlugins' => __DIR__ . '/..' . '/../lib/Event/LoadSearchPlugins.php',
'OCA\\Files\\Event\\LoadSidebar' => __DIR__ . '/..' . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => __DIR__ . '/..' . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
- 'OCA\\Files\\Listener\\LegacyLoadAdditionalScriptsAdapter' => __DIR__ . '/..' . '/../lib/Listener/LegacyLoadAdditionalScriptsAdapter.php',
+ 'OCA\\Files\\Listener\\LoadSearchPluginsListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSearchPluginsListener.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
+ 'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeAddedToFavoriteListener.php',
+ 'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
+ 'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
+ 'OCA\\Files\\Listener\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listener/SyncLivePhotosListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',
+ 'OCA\\Files\\Migration\\Version12101Date20221011153334' => __DIR__ . '/..' . '/../lib/Migration/Version12101Date20221011153334.php',
+ 'OCA\\Files\\Migration\\Version2003Date20241021095629' => __DIR__ . '/..' . '/../lib/Migration/Version2003Date20241021095629.php',
'OCA\\Files\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
+ 'OCA\\Files\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => __DIR__ . '/..' . '/../lib/Search/FilesSearchProvider.php',
+ 'OCA\\Files\\Service\\ChunkedUploadConfig' => __DIR__ . '/..' . '/../lib/Service/ChunkedUploadConfig.php',
'OCA\\Files\\Service\\DirectEditingService' => __DIR__ . '/..' . '/../lib/Service/DirectEditingService.php',
+ 'OCA\\Files\\Service\\LivePhotosService' => __DIR__ . '/..' . '/../lib/Service/LivePhotosService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => __DIR__ . '/..' . '/../lib/Service/OwnershipTransferService.php',
+ 'OCA\\Files\\Service\\SettingsService' => __DIR__ . '/..' . '/../lib/Service/SettingsService.php',
'OCA\\Files\\Service\\TagService' => __DIR__ . '/..' . '/../lib/Service/TagService.php',
+ 'OCA\\Files\\Service\\UserConfig' => __DIR__ . '/..' . '/../lib/Service/UserConfig.php',
+ 'OCA\\Files\\Service\\ViewConfig' => __DIR__ . '/..' . '/../lib/Service/ViewConfig.php',
+ 'OCA\\Files\\Settings\\DeclarativeAdminSettings' => __DIR__ . '/..' . '/../lib/Settings/DeclarativeAdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => __DIR__ . '/..' . '/../lib/Settings/PersonalSettings.php',
);
diff --git a/apps/files/composer/composer/installed.php b/apps/files/composer/composer/installed.php
index 5440719fa40..72c0cd0596f 100644
--- a/apps/files/composer/composer/installed.php
+++ b/apps/files/composer/composer/installed.php
@@ -1,22 +1,22 @@
<?php return array(
'root' => array(
+ 'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
+ 'reference' => '696a068b89cffe10c6c4eb8db9eba9ad66e342f7',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
- 'reference' => 'c6429e6cd19c57582364338362e543580821cf99',
- 'name' => '__root__',
'dev' => false,
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
+ 'reference' => '696a068b89cffe10c6c4eb8db9eba9ad66e342f7',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
- 'reference' => 'c6429e6cd19c57582364338362e543580821cf99',
'dev_requirement' => false,
),
),
diff --git a/apps/files/css/detailsView.scss b/apps/files/css/detailsView.scss
deleted file mode 100644
index d035b24de92..00000000000
--- a/apps/files/css/detailsView.scss
+++ /dev/null
@@ -1,129 +0,0 @@
-.app-sidebar .detailFileInfoContainer {
- min-height: 50px;
- padding: 15px;
-}
-
-.app-sidebar .detailFileInfoContainer > div {
- clear: both;
-}
-
-
-.app-sidebar .mainFileInfoView .icon {
- display: inline-block;
- background-size: 16px 16px;
-}
-
-.app-sidebar .mainFileInfoView .permalink {
- padding: 6px 10px;
- vertical-align: top;
- opacity: .6;
-
- &:hover,
- &:focus {
- opacity: 1;
- }
-}
-.app-sidebar .mainFileInfoView .permalink-field>input {
- clear: both;
- width: 90%;
-}
-
-.app-sidebar .thumbnailContainer.large {
- margin-left: -15px;
- margin-right: -35px; /* 15 + 20 for the close button */
- margin-top: -15px;
-}
-
-.app-sidebar .thumbnailContainer.large.portrait {
- margin: 0; /* if we don't fit the image anyway we give it back the margin */
-}
-
-.app-sidebar .large .thumbnail {
- width:100%;
- display:block;
- background-repeat: no-repeat;
- background-position: center;
- background-size: 100%;
- float: none;
- margin: 0;
- height: auto;
-}
-
-.app-sidebar .large .thumbnail .stretcher {
- content: '';
- display: block;
- padding-bottom: 56.25%; /* sets height of .thumbnail to 9/16 of the width */
-}
-
-.app-sidebar .large.portrait .thumbnail {
- background-position: 50% top;
-}
-
-.app-sidebar .large.portrait .thumbnail {
- background-size: contain;
-}
-
-.app-sidebar .large.text {
- overflow-y: scroll;
- overflow-x: hidden;
- padding-top: 14px;
- font-size: 80%;
- margin-left: 0;
-}
-
-.app-sidebar .thumbnail {
- width: 100%;
- min-height: 75px;
- display: inline-block;
- float: left;
- margin-right: 10px;
- background-size: contain;
- background-repeat: no-repeat;
-}
-
-.app-sidebar .ellipsis {
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.app-sidebar .fileName {
- font-size: 16px;
- padding-top: 13px;
- padding-bottom: 3px;
-}
-
-.app-sidebar .fileName h3 {
- width: calc(100% - 42px); /* 36px is the with of the copy link icon, but this breaks so we add some more to be sure */
- display: inline-block;
- padding: 5px 0;
- margin: -5px 0;
-}
-
-.app-sidebar .file-details {
- color: var(--color-text-maxcontrast);
-}
-
-.app-sidebar .action-favorite {
- vertical-align: sub;
- padding: 10px;
- margin: -10px;
-}
-
-.app-sidebar .action-favorite > span{
- opacity: .7 !important;
-}
-
-.app-sidebar .detailList {
- float: left;
-}
-
-.app-sidebar .close {
- position: absolute;
- top: 0;
- right: 0;
- opacity: .5;
- z-index: 1;
- width: 44px;
- height: 44px;
-}
diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss
deleted file mode 100644
index 2c9be4ef3fe..00000000000
--- a/apps/files/css/files.scss
+++ /dev/null
@@ -1,1256 +0,0 @@
-/**
- * Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
- * @copyright Copyright (c) 2019, Fabian Dreßler <nudelsalat@clouz.de>
- *
- * This file is licensed under the Affero General Public License version 3 or later.
- * See the COPYING-README file.
- */
-
-/* FILE MENU */
-.actions {
- padding: 5px;
- height: 100%;
- display: inline-block;
- float: left;
-}
-.actions input, .actions button, .actions .button { margin:0; float:left; }
-.actions .button a { color: #555; }
-.actions .button a:hover,
-.actions .button a:focus {
- background-color: var(--color-background-hover);
-}
-.actions .button a:active {
- background-color: var(--color-primary-light);
-}
-
-.actions.creatable {
- position: relative;
- display: flex;
- flex: 1 1;
- .button:not(:last-child) {
- margin-right: 3px;
- }
-}
-
-.actions.hidden {
- display: none;
-}
-
-#trash {
- margin-right: 8px;
- float: right;
- z-index: 1010;
- padding: 10px;
- font-weight: normal;
-}
-
-.newFileMenu .error,
-.newFileMenu .error + .icon-confirm,
-#fileList .error {
- color: var(--color-error);
- border-color: var(--color-error);
-}
-
-/* FILE TABLE */
-#filestable {
- position: relative;
- width: 100%;
- min-width: 250px;
- display: block;
- flex-direction: column;
- // hide table if emptycontent is not hidden
- #emptycontent:not(.hidden) ~ & {
- display: none;
- }
- // floating header
- thead {
- position: -webkit-sticky;
- position: sticky;
- @include position('sticky');
- // header + breadcrumbs
- top: $header-height;
- // under breadcrumbs, over file list
- z-index: 60;
- display: block;
- background-color: var(--color-main-background-translucent);
- }
-
- /**
- * This is a dirty hack as the sticky header requires us to use a different display type on the table element
- */
- tbody {
- display: table;
- width: 100%;
-
- tr[data-permissions="0"],
- tr[data-permissions="16"] {
- background-color: var(--color-background-dark);
-
- td.filename .nametext .innernametext {
- color: var(--color-text-maxcontrast);
- }
- }
- }
-}
-
-#filestable.hidden {
- display: none;
-}
-
-/* fit app list view heights */
-.app-files #app-content > .viewcontainer {
- min-height: 0%;
- width: 100%;
-}
-
-.app-files #app-content {
- // force the width to be the full width to not go bigger than the screen
- // flex will grow for the mobile view if necessary
- width: calc(100% - 300px);
-}
-
-.file-drag, .file-drag #filestable tbody tr, .file-drag #filestable tbody tr:hover {
- background-color: var(--color-primary-light) !important;
-}
-
-.app-files #app-content.dir-drop {
- background-color: var(--color-main-background) !important;
-}
-
-.file-drag #filestable tbody tr, .file-drag #filestable tbody tr:hover{
- background-color: transparent !important;
-}
-
-.app-files #app-content.dir-drop #filestable tbody tr.dropping-to-dir{
- background-color: var(--color-primary-light) !important;
-}
-
-/* icons for sidebar */
-.nav-icon-files {
- @include icon-color('folder', 'files', $color-black);
-}
-.nav-icon-recent {
- @include icon-color('recent', 'files', $color-black);
-}
-.nav-icon-favorites {
- @include icon-color('star-dark', 'actions', $color-black, 2, true);
-}
-.nav-icon-sharingin,
-.nav-icon-sharingout,
-.nav-icon-pendingshares,
-.nav-icon-shareoverview {
- @include icon-color('share', 'files', $color-black);
-}
-.nav-icon-sharinglinks {
- @include icon-color('public', 'files', $color-black);
-}
-.nav-icon-extstoragemounts {
- @include icon-color('external', 'files', $color-black);
-}
-.nav-icon-trashbin {
- @include icon-color('delete', 'files', $color-black);
-}
-.nav-icon-trashbin-starred {
- @include icon-color('delete', 'files', #ff0000);
-}
-.nav-icon-deletedshares {
- @include icon-color('unshare', 'files', $color-black);
-}
-.nav-icon-favorites-starred {
- @include icon-color('star-dark', 'actions', $color-yellow, 2, true);
-}
-
-#app-navigation .nav-files a.nav-icon-files {
- width: auto;
-}
-/* button needs overrides due to navigation styles */
-#app-navigation .nav-files a.new {
- width: 40px;
- height: 32px;
- padding: 0 10px;
- margin: 0;
- cursor: pointer;
-}
-
-#app-navigation .nav-files a.new.hidden {
- display: none;
-}
-
-#app-navigation .nav-files a.new.disabled {
- opacity: 0.3;
-}
-
-#filestable tbody tr {
- height: 51px;
-}
-#filestable tbody tr:hover,
-#filestable tbody tr:focus,
-#filestable tbody .name:focus,
-#filestable tbody tr:hover .filename form,
-table tr.mouseOver td {
- background-color: var(--color-background-hover);
-}
-#filestable tbody tr:active,
-#filestable tbody tr.highlighted,
-#filestable tbody tr.highlighted .name:focus,
-#filestable tbody tr.selected,
-#filestable tbody tr.searchresult {
- background-color: var(--color-primary-light);
-}
-
-tbody a { color: var(--color-main-text); }
-
-span.conflict-path, span.extension, span.uploading, td.date {
- color: var(--color-text-maxcontrast);
-}
-span.conflict-path, span.extension {
- -webkit-transition: opacity 300ms;
- -moz-transition: opacity 300ms;
- -o-transition: opacity 300ms;
- transition: opacity 300ms;
- vertical-align: top;
-}
-tr:hover span.conflict-path,
-tr:focus span.conflict-path,
-tr:hover span.extension,
-tr:focus span.extension {
- opacity: 1;
- color: var(--color-text-maxcontrast);
-}
-
-table th, table th a {
- color: var(--color-text-maxcontrast);
-}
-table.multiselect th a {
- color: var(--color-main-text);
-}
-table th .columntitle {
- display: block;
- padding: 15px;
- height: 50px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- vertical-align: middle;
-}
-table.multiselect th .columntitle {
- display: inline-block;
- margin-right: -20px;
-}
-table th .columntitle.name {
- padding-left: 0;
- margin-left: 44px;
-}
-
-table.multiselect th .columntitle.name {
- margin-left: 0;
-}
-
-table th .sort-indicator {
- width: 10px;
- height: 8px;
- margin-left: 5px;
- display: inline-block;
- vertical-align: text-bottom;
- opacity: .3;
-}
-.sort-indicator.hidden,
-.multiselect .sort-indicator,
-table.multiselect th:hover .sort-indicator.hidden,
-table.multiselect th:focus .sort-indicator.hidden {
- visibility: hidden;
-}
-.multiselect .sort, .multiselect .sort span {
- cursor: default;
-}
-table th:hover .sort-indicator.hidden,
-table th:focus .sort-indicator.hidden {
- visibility: visible;
-}
-
-table th,
-table td {
- border-bottom: 1px solid var(--color-border);
- text-align: left;
- font-weight: normal;
-}
-table td {
- padding: 0 15px;
- font-style: normal;
- background-position: 8px center;
- background-repeat: no-repeat;
-}
-table th#headerName {
- position: relative;
- width: 9999px; /* not really sure why this works better than 100% … table styling */
- padding: 0;
-}
-
-#headerName-container {
- position: relative;
- height: 50px;
-}
-
-table th#headerSelection {
- padding-top: 2px;
-}
-table th#headerSize, table td.filesize {
- text-align: right;
-}
-table th#headerDate, table td.date,
-table th.column-last, table td.column-last {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- position: relative;
- /* this can not be just width, both need to be set … table styling */
- min-width: 130px;
- max-width: 130px;
-}
-
-#app-content-files thead,
-#app-content-trashbin thead {
- top: 94px;
-}
-
-#app-content-recent,
-#app-content-favorites,
-#app-content-shareoverview,
-#app-content-sharingout,
-#app-content-sharingin,
-#app-content-sharinglinks,
-#app-content-deletedshares,
-#app-content-pendingshares {
- margin-top: 22px;
-}
-
-table.multiselect thead th {
- background-color: var(--color-main-background-translucent);
- font-weight: bold;
-}
-
-#app-content.with-app-sidebar table.multiselect thead{
- margin-right: 27%;
-}
-
-table.multiselect #headerName {
- position: relative;
- width: 9999px; /* when we use 100%, the styling breaks on mobile … table styling */
-}
-table.multiselect #modified {
- display: none;
-}
-
-table td.selection,
-table th.selection,
-table td.fileaction {
- width: 32px;
- text-align: center;
-}
-table td.filename a.name,
-table td.filename p.name {
- display: flex;
- position:relative; /* Firefox needs to explicitly have this default set … */
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- height: 50px;
- line-height: 50px;
- padding: 0;
-}
-table td.filename .thumbnail-wrapper {
- /* we need this to make sure flex is working inside a table cell */
- width: 0;
- min-width: 50px;
- max-width: 50px;
- height: 50px;
-}
-table td.filename .thumbnail-wrapper.icon-loading-small {
- &:after {
- z-index: 10;
- }
- .thumbnail {
- opacity: 0.2;
- }
-}
-table td.filename .thumbnail {
- display: inline-block;
- width: 32px;
- height: 32px;
- background-size: 32px;
- margin-left: 9px;
- margin-top: 9px;
- border-radius: var(--border-radius);
- cursor: pointer;
- position: absolute;
- z-index: 4;
-}
-table td.filename p.name .thumbnail {
- cursor: default;
-}
-
-// Show slight border around previews for images, txt, etc.
-table tr[data-has-preview='true'] .thumbnail {
- border: 1px solid var(--color-border);
-}
-
-table td.filename input.filename {
- width: 70%;
- margin-left: 48px;
- cursor: text;
-}
-table td.filename form {
- margin-top: -40px;
- position: relative;
- top: -6px;
-}
-
-table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:3px 8px 8px 3px; }
-table td.filename .nametext, .modified, .column-last>span:first-child { float:left; padding:15px 0; }
-
-.modified, .column-last>span:first-child {
- position: relative;
- overflow: hidden;
- text-overflow: ellipsis;
- width: 110px;
-}
-
-/* TODO fix usability bug (accidental file/folder selection) */
-table {
- td.filename {
- max-width: 0;
- .nametext {
- width: 0;
- flex-grow: 1;
- display: flex;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- height: 100%;
- z-index: 10;
- padding: 0 20px 0 0;
- }
- }
-}
-
-.hide-hidden-files #filestable #fileList tr.hidden-file,
-.hide-hidden-files #filestable #fileList tr.hidden-file.dragging {
- display: none;
-}
-
-#fileList tr.animate-opacity {
- -webkit-transition:opacity 250ms;
- -moz-transition:opacity 250ms;
- -o-transition:opacity 250ms;
- transition:opacity 250ms;
-}
-#fileList tr.dragging {
- opacity: 0.2;
-}
-
-table td.filename .nametext .innernametext {
- text-overflow: ellipsis;
- overflow: hidden;
- position: relative;
- vertical-align: top;
-}
-
-/* for smaller resolutions - see mobile.css */
-
-table td.filename .uploadtext {
- position: absolute;
- font-weight: normal;
- // checkbox width
- margin-left: 50px;
- left: 0;
- bottom: 0;
- height: 20px;
- padding: 0 4px;
- // align with file name
- padding-left: 1px;
- font-size: 11px;
- // double the font size
- line-height: 22px;
- color: var(--color-text-maxcontrast);
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-table td.selection {
- padding: 0;
-}
-
-/* File checkboxes */
-#fileList tr td.selection>.selectCheckBox + label:before {
- opacity: 0.3;
- margin-right: 0;
-}
-
-/* Show checkbox with full opacity when hovering, checked, or selected */
-#fileList tr:hover td.selection>.selectCheckBox + label:before,
-#fileList tr:focus td.selection>.selectCheckBox + label:before,
-#fileList tr td.selection>.selectCheckBox:checked + label:before,
-#fileList tr.selected td.selection>.selectCheckBox + label:before {
- opacity: 1;
-}
-
-/* Show checkbox with half opacity when selecting range */
-#fileList tr.halfselected td.selection>.selectCheckBox + label:before {
- opacity: 0.5;
-}
-
-/* Use label to have bigger clickable size for checkbox */
-#fileList tr td.selection>.selectCheckBox,
-.select-all {
- & + label {
- padding: 16px;
- }
-
- &:focus + label {
- background-color: var(--color-background-hover);
- border-radius: var(--border-radius-pill);
- }
-}
-
-#fileList tr td.selection>.selectCheckBox:focus-visible + label,
-.select-all:focus-visible + label {
- outline-offset: 0px;
-}
-
-#fileList tr td.filename {
- position: relative;
- width: 100%;
- padding-left: 0;
- padding-right:0;
- -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
-}
-
-#fileList tr td.filename a.name label,
-#fileList tr td.filename p.name label {
- position: absolute;
- width: 80%;
- height: 50px;
-}
-
-#fileList tr td.filename .favorite {
- display: inline-block;
- float: left;
-}
-#fileList tr td.filename .favorite-mark {
- position: absolute;
- display: block;
- top: -6px;
- right: -6px;
- line-height: 100%;
- text-align: center;
-}
-
-#uploadsize-message,#delete-confirm { display:none; }
-
-/* File actions */
-.fileactions {
- z-index: 50;
-}
-
-.busy .fileactions, .busy .action {
- visibility: hidden;
-}
-
-/* fix position of bubble pointer for Files app */
-.bubble,
-#app-navigation .app-navigation-entry-menu {
- border-top-right-radius: 3px;
- min-width: 100px;
-}
-
-/* force show the loading icon, not only on hover */
-#fileList .icon-loading-small {
- opacity: 1 !important;
- display: inline !important;
-}
-
-#fileList .action.action-share-notification span, #fileList a.name {
- cursor: default !important;
-}
-
-/*
- * Make the disabled link look not like a link in file list rows
- */
-#fileList a.name.disabled {
- * {
- cursor: default;
- }
-
- a, a * {
- cursor: pointer;
- }
-
- &:focus {
- background: none;
- }
-}
-
-a.action > img {
- height: 16px;
- width: 16px;
- vertical-align: text-bottom;
-}
-
-/* Actions for selected files */
-.selectedActions {
- position: relative;
- display: inline-block;
- vertical-align: middle;
-}
-.selectedActions.hidden {
- display: none;
-}
-.selectedActions a {
- display: inline;
- line-height: 50px;
- padding: 16px 5px;
-}
-
-.selectedActions a.hidden {
- display: none;
-}
-.selectedActions a img {
- position:relative;
- vertical-align: text-bottom;
- margin-bottom: -1px;
-}
-
-.selectedActions .actions-selected .icon-more {
- margin-top: -3px;
-}
-
-#fileList td a {
- a.action {
- display: inline;
- padding: 17px 8px;
- line-height: 50px;
- opacity: .3;
- &.action-share {
- padding: 17px 14px;
- &.permanent:not(.shared-style) .icon-shared + span {
- /* hide text of the share action */
- /* .hidden-visually for accessbility */
- position: absolute;
- left:-10000px;
- top: auto;
- width: 1px;
- height: 1px;
- overflow: hidden;
- }
- .avatar {
- display: inline-block;
- vertical-align: middle;
- }
- }
- &.action-menu {
- padding-top: 17px;
- padding-bottom: 17px;
- padding-left: 14px;
- padding-right: 14px;
- }
- &.no-permission {
- &:hover, &:focus {
- opacity: .3;
- }
- }
- &.disabled {
- &:hover, &:focus,
- img {
- opacity: .3;
- }
- &.action-download {
- opacity: .7;
- &:hover, &:focus {
- opacity: .7;
- }
- }
- }
- &:hover, &:focus {
- opacity: 1;
- }
- &:focus {
- background-color: var(--color-background-hover);
- border-radius: var(--border-radius-pill);
- }
- }
- .fileActionsMenu a.action, a.action.action-share.shared-style {
- opacity: .7;
- }
- .fileActionsMenu .action.permanent {
- opacity: 1;
- }
-}
-
-// Ellipsize long sharer names
-#fileList .action.action-share.permanent.shared-style span:not(.icon) {
- display: inline-block;
- max-width: 70px;
- overflow: hidden;
- text-overflow: ellipsis;
- vertical-align: middle;
- margin-left: 6px;
-}
-
-#fileList .remoteAddress .userDomain {
- margin-left: 0 !important;
-}
-
-#fileList .favorite-mark.permanent {
- opacity: 1;
-}
-
-#fileList .fileActionsMenu a.action:hover,
-#fileList .fileActionsMenu a.action:focus,
-/* show share action of shared items darker to distinguish from non-shared */
-#fileList a.action.action-share.shared-style:hover,
-#fileList a.action.action-share.shared-style:focus {
- opacity: 1;
-}
-
-#fileList tr a.action.disabled {
- background: none;
-}
-
-#selectedActionsList a.download.disabled,
-#fileList tr a.action.action-download.disabled {
- color: #000000;
-}
-
-#fileList tr:hover a.action.disabled:hover * {
- cursor: default;
-}
-
-.summary {
- color: var(--color-text-maxcontrast);
- /* add whitespace to bottom of files list to correctly show dropdowns */
- $action-menu-items-count: 7; // list view has currently max 7 items in its action menu
- height: 44px * ($action-menu-items-count + 0.5); // 0.5 is added to show some whitespace below
-}
-#filestable .filesummary {
- width: 100%;
- /* Width of checkbox and file preview */
- padding-left: 101px;
-}
-/* Less whitespace needed on link share page
- * as there is a footer and action menus have fewer entries.
- */
-#body-public .summary {
- height: 180px;
-}
-.summary:hover,
-.summary:focus,
-.summary,
-table tr.summary td {
- background-color: transparent;
-}
-.summary td {
- border-bottom: none;
- vertical-align: top;
- padding-top: 20px;
-}
-.summary td:first-child {
- padding: 0;
-}
-.hiddeninfo {
- white-space: pre-line;
-}
-
-table.dragshadow {
- width:auto;
- z-index: 2000;
-}
-table.dragshadow td.filename {
- padding-left:60px;
- padding-right:16px;
- height: 36px;
-
- /* Override "max-width: 0" to prevent file name and size from overlapping */
- max-width: unset;
-}
-table.dragshadow td.size {
- padding-right:8px;
-}
-.mask {
- z-index: 50;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: var(--color-main-background);
- background-repeat: no-repeat no-repeat;
- background-position: 50%;
- opacity: 0.7;
- transition: opacity 100ms;
- -moz-transition: opacity 100ms;
- -o-transition: opacity 100ms;
- -ms-transition: opacity 100ms;
- -webkit-transition: opacity 100ms;
-}
-.mask.transparent{
- opacity: 0;
-}
-
-.newFileMenu {
- font-weight: 300;
- top: 100%;
- left: -48px !important;
- margin-top: 4px;
- min-width: 100px;
- z-index: 1001;
-
- /* Center triangle */
- &::after {
- left: 57px !important;
- }
-}
-
-#filestable .filename .action .icon,
-#filestable .selectedActions a .icon,
-#filestable .filename .favorite-mark .icon,
-#controls .actions .button .icon {
- display: inline-block;
- vertical-align: middle;
- background-size: 16px 16px;
-}
-
-#filestable .filename .favorite-mark {
- // Override default icons to always hide the star icon and always show the
- // starred icon even when hovered or focused.
- & .icon-star {
- background-image: none;
- }
- & .icon-starred {
- @include icon-color('star-dark', 'actions', $color-yellow, 1, true);
- }
-}
-
-#filestable .filename .action .icon.hidden,
-#filestable .selectedActions a .icon.hidden,
-#controls .actions .button .icon.hidden {
- display: none;
-}
-
-#filestable .filename .action .icon.loading,
-#filestable .selectedActions a .icon.loading,
-#controls .actions .button .icon.loading {
- width: 15px;
- height: 15px;
-}
-
-.app-files .actions .button.new {
- position: relative;
-}
-
-.breadcrumb .canDrop > a,
-#filestable tbody tr.canDrop {
- background-color: rgba( $color-primary, .3 );
-}
-.dropzone-background {
- background-color: rgba( $color-primary, .3 );
- :hover{
- box-shadow: none !important;
- }
-}
-
-.notCreatable {
- margin-left: 12px;
- margin-right: 44px;
- margin-top: 12px;
- color: var(--color-main-text);
- overflow: auto;
- min-width: 160px;
- height: 54px;
-
- &:not(.hidden) {
- display: flex;
- }
-
- .icon-alert-outline {
- top: -15px;
- position: relative;
- margin-right: 4px;
- }
-}
-
-#quota {
- margin: 0 !important;
- border: none;
- border-radius: 0;
- background-color: transparent;
- z-index:1;
-
- > a[href='#'] {
- // if no link is set, no mouse feedback
- box-shadow: none !important;
- &, * {
- cursor: default !important;
- }
- }
-
- .quota-container {
- height: 5px;
- border-radius: var(--border-radius);
-
- div {
- height: 100%;
- background-color: var(--color-primary);
- }
- }
-}
-
-#quotatext {
- padding: 0;
- height: 30px;
- line-height: 30px;
-}
-
-/* GRID */
-#filestable.view-grid:not(.hidden) {
- $grid-size: 160px;
- $grid-pad: 14px;
-
- /* HEADER and MULTISELECT */
- thead {
- tr {
- display: block;
- border-bottom: 1px solid var(--color-border);
- background-color: var(--color-main-background-translucent);
- th {
- width: auto;
- border: none;
- }
- }
- }
-
- /* MAIN FILE LIST */
- tbody {
- display: grid;
- grid-template-columns: repeat(auto-fill, $grid-size);
- justify-content: space-around;
- row-gap: 15px;
- margin: 15px 0;
-
- // ensure search still filters tr with .hidden
- tr:not(.hidden) {
- display: block;
- position: relative;
- height: $grid-size + 44px - $grid-pad;
- border-radius: var(--border-radius);
-
- &:hover, &:focus, &:active,
- &.selected,
- &.searchresult,
- .name:focus,
- &.highlighted {
- background-color: transparent;
-
- .thumbnail-wrapper,
- .nametext,
- .fileactions {
- background-color: var(--color-background-hover);
- }
- }
- }
-
- td {
- display: inline;
- border-bottom: none;
-
- &.filename {
- .thumbnail-wrapper {
- min-width: 0;
- max-width: none;
- position: absolute;
- width: $grid-size;
- height: $grid-size;
- padding: $grid-pad; // same as action icon bottom and right padding
- top: 0;
- left: 0;
- z-index: -1; // make sure the default click is the link
-
- .thumbnail {
- width: calc(100% - 2 * #{$grid-pad});
- height: calc(100% - 2 * #{$grid-pad}); //action icon padding
- background-size: contain;
- margin: 0;
- border-radius: var(--border-radius);
- background-repeat: no-repeat;
- background-position: center;
-
- /* Position favorite star related to checkbox to left and 3-dot menu below
- * Position is inherited from the selection while in grid view
- */
- .favorite-mark {
- padding: $grid-pad;
- left: auto;
- top: -22px; // center in corner of thumbnail
- right: -22px; // center in corner of thumbnail
- }
- }
- }
-
- .uploadtext {
- width: 100%;
- margin: 0;
- top: 0;
- bottom: auto;
- // checkbox align
- height: 28px;
- padding-top: 4px;
- // checkbox margins
- padding-left: calc(44px - 16px);
- }
-
- .name {
- height: 100%;
- border-radius: var(--border-radius);
- // since we're using thumbnail, name and actions bg
- // we need to hide the overflow for the radius to show
- // luckily the popovermenu is outside .name
- overflow: hidden;
- // we but the thumbnail in background to ensure
- // the name is the default click handler
- // force back the cursor which have been overrided
- // and disabled for some reason...
- cursor: pointer !important;
-
- .nametext {
- display: flex;
- height: 44px;
- margin-top: $grid-size - $grid-pad;
- text-align: center;
- line-height: 44px;
- padding: 0;
-
- .innernametext {
- display: inline-block;
- text-align: center;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- &:before {
- content: '';
- flex: 1;
- min-width: 14px;
- }
- &:after {
- content: '';
- flex: 1;
- min-width: 44px;
- }
-
- /* No space for extension in grid view */
- .extension {
- display: none;
- }
- }
-
- .fileactions {
- height: initial;
- margin-top: $grid-size - $grid-pad;
- display: flex;
- align-items: center;
- position: absolute;
- right: 0;
-
- .action {
- padding: $grid-pad;
- width: 44px;
- height: 44px;
- display: flex;
- align-items: center;
- justify-content: center;
-
- // hide all actions in grid view that are not the menu
- &:not(.action-menu) {
- display: none;
- }
- }
- }
- }
-
- .fileActionsMenu {
- // force show the sharing entry in the dropdown menu
- .action-share-container.hidden {
- display: block !important;
- // avatar in shared by user dropdown menu
- .action-share img {
- padding: 6px;
- border-radius: 50%;
- }
- }
- // force show the sharing entry in the dropdown menu
- .action-restore-container.hidden {
- display: block !important;
- }
- // force show the sharing entry in the dropdown menu
- .action-comment-container.hidden {
- display: block !important;
- }
- }
-
- form {
- padding: 3px 14px;
- border-radius: var(--border-radius);
-
- input.filename {
- width: 100%;
- margin-left: 0;
- }
- }
- }
-
- /* No space for filesize and date in grid view */
- &.filesize,
- &.date {
- display: none;
- }
-
- &.selection,
- &.filename .favorite-mark {
- position: absolute;
- top: -8px; // half the checkbox width, center on corner of thumbnail
- left: -8px; // half the checkbox width, center on corner of thumbnail
- display: flex;
- width: 44px;
- height: 44px;
- z-index: 10;
- background: transparent;
-
- label {
- width: 44px;
- height: 44px;
- display: inline-flex;
- padding: $grid-pad; // like any action icon
- &::before {
- margin: 0;
- width: $grid-pad; // 16px - border
- height: $grid-pad; // 16px - border
- }
- }
- }
-
- /* Position actions menu below file */
- .popovermenu {
- left: 0;
- width: $grid-size - 10px; // 2 * margin
- margin: 0 5px;
-
- /* Ellipsize long entries, normally menu width is adjusted but for grid we use fixed width. */
- .menuitem span:not(.icon) {
- overflow: hidden;
- text-overflow: ellipsis;
- }
- }
- }
- }
-
- tr.hidden-file td.filename .name .nametext .extension {
- display: block;
- }
-
- /* Center align the footer file number & size summary */
- tfoot {
- display: grid;
-
- .summary:not(.hidden) {
- display: inline-block;
- margin: 0 auto;
- $action-menu-items-count: 9; // grid view has currently max 9 items in its action menu
- height: 44px * ($action-menu-items-count + 0.5); // 0.5 is added to show some whitespace below
-
- td {
- padding-top: 50px;
-
- &:first-child,
- &.date {
- display: none;
- }
-
- .info {
- margin-left: 0;
- }
- }
- }
- }
-}
-
-/* Grid view toggle */
-#view-toggle {
- background-color: transparent;
- border: none;
- margin: 0;
- padding: 22px;
- opacity: .5;
- position: fixed;
- right: 0;
- z-index: 100;
-
- &:hover,
- &:focus,
- #showgridview:focus + & {
- opacity: 1;
- }
-}
-
-/**
- * Make sure the hidden input is always
- * on the visible scrolled area of the
- * page to avoid scrolling to top when focusing
- */
-#showgridview {
- position: fixed;
- top: 0;
-}
-
-/* Adjustments for link share page */
-#body-public {
- #filestable.view-grid:not(.hidden) tbody td {
- /* More space for filename since there is no share icon */
- &.filename .name .nametext .innernametext {
- max-width: 124px;
- }
-
- /* Position actions menu correctly below 3-dot-menu */
- .popovermenu {
- left: -80px;
- }
- }
-
- /* Right-align view toggle on link share page */
- #view-toggle {
- position: absolute;
- right: 0;
- }
-}
-
-/* Hide legacy Gallery toggle */
-#gallery-button {
- display: none;
-}
-
-#tag_multiple_files_container {
- overflow: hidden;
- background-color: #fff;
- border-radius: 3px;
- position: relative;
- display: flex;
- flex-wrap: wrap;
- margin-bottom: 10px;
-
- h3 {
- width: 100%;
- padding: 0 18px;
- }
-
- .systemTagsInputFieldContainer {
- flex: 1 1 80%;
- min-width: 0;
- margin: 0 12px;
- }
-}
-
diff --git a/apps/files/css/merged.scss b/apps/files/css/merged.scss
deleted file mode 100644
index 8a11e55c269..00000000000
--- a/apps/files/css/merged.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-@import 'files.scss';
-@import 'upload.scss';
-@import 'mobile.scss';
-@import 'detailsView.scss';
-@import '../../../core/css/whatsnew.scss';
diff --git a/apps/files/css/mobile.scss b/apps/files/css/mobile.scss
deleted file mode 100644
index da6fdd25f28..00000000000
--- a/apps/files/css/mobile.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-/* 938 = table min-width(688) + app-navigation width: 250\
- $breakpoint-mobile +1 = size where app-navigation is hidden +1
- 688 = table min-width */
-$min-table-width: 688px;
-@media only screen and (max-width: $min-table-width + $navigation-width) and (min-width: $breakpoint-mobile + 1), only screen and (max-width: $min-table-width) {
-
-.app-files #app-content.dir-drop{
- background-color: rgba(255, 255, 255, 1)!important;
-}
-
-table th#headerSize,
-table td.filesize,
-table th#headerDate,
-table td.date {
- display: none;
-}
-
-/* remove padding to let border bottom fill the whole width*/
-table td {
- padding: 0;
-}
-
-/* remove shift for multiselect bar to account for missing navigation */
-table.multiselect thead {
- padding-left: 0;
-}
-
-#fileList a.action.action-menu img {
- padding-left: 0;
-}
-
-#fileList .fileActionsMenu {
- margin-right: 6px;
-}
-/* hide text of the share action on mobile */
-/* .hidden-visually for accessbility */
-#fileList a.action-share span:not(.icon):not(.avatar) {
- position: absolute;
- left:-10000px;
- top: auto;
- width: 1px;
- height: 1px;
- overflow: hidden;
-}
-
-
-/* proper notification area for multi line messages */
-#notification-container {
- display: flex;
-}
-
-/* shorten elements for mobile */
-#uploadprogressbar, #uploadprogressbar .label.inner {
- width: 50px;
-}
-/* hide desktop-only parts */
-#uploadprogressbar .desktop {
- display: none !important;
-}
-#uploadprogressbar .mobile {
- display: block !important;
-}
-
-/* ensure that it is visible over #app-content */
-table.dragshadow {
- z-index: 1000;
-}
-
-}
-@media only screen and (max-width: 480px) {
- /* Only show icons */
- table th .selectedActions {
- float: right;
- }
- table th .selectedActions > a span:not(.icon) {
- display: none;
- }
-
- /* Increase touch area for the icons */
- table th .selectedActions a {
- padding: 17px 14px;
- }
-
- /* Remove the margin to reduce the overlap between the name and the icons */
- table.multiselect th .columntitle.name {
- margin-left: 0;
- }
-}
diff --git a/apps/files/css/upload.scss b/apps/files/css/upload.scss
deleted file mode 100644
index e7c1e9442e2..00000000000
--- a/apps/files/css/upload.scss
+++ /dev/null
@@ -1,211 +0,0 @@
-#upload {
- box-sizing: border-box;
- height: 36px;
- width: 39px;
- padding: 0 !important; /* override default control bar button padding */
- margin-left: 3px;
- overflow: hidden;
- vertical-align: top;
- position: relative;
- z-index: -20;
-}
-#upload .icon-upload {
- position: relative;
- display: block;
- width: 100%;
- height: 44px;
- width: 44px;
- margin: -5px -3px;
- cursor: pointer;
- z-index: 10;
- opacity: .65;
-}
-.file_upload_target { display:none; }
-.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
-
-#uploadprogresswrapper, #uploadprogresswrapper * {
- box-sizing: border-box;
-}
-
-#uploadprogresswrapper {
- display: inline-block;
- vertical-align: top;
- height: 36px;
- margin-left: 3px;
-}
-#uploadprogresswrapper > input[type='button'] {
- height: 36px;
- margin-left: 3px;
-}
-#uploadprogressbar {
- border-color: var(--color-border-dark);
- border-radius: 18px 0 0 18px;
- border-right: 0;
- position:relative;
- float: left;
- width: 200px;
- height: 36px;
- display:inline-block;
- text-align: center;
-
- .ui-progressbar-value {
- margin: 0;
- }
-}
-#uploadprogressbar .ui-progressbar-value.ui-widget-header.ui-corner-left {
- height: calc(100% + 2px);
- top: -1px;
- left: -1px;
- position: absolute;
- overflow: hidden;
- background-color: var(--color-primary);
-}
-#uploadprogressbar .label {
- top: 8px;
- opacity: 1;
- overflow: hidden;
- white-space: nowrap;
- font-weight: normal;
-}
-#uploadprogressbar .label.inner {
- color: var(--color-primary-text);
- position: absolute;
- display: block;
- width: 200px;
-}
-#uploadprogressbar .label.outer {
- position: relative;
- color: var(--color-main-text);
-}
-#uploadprogressbar .desktop {
- display: block;
-}
-#uploadprogressbar .mobile {
- display: none;
-}
-
-#uploadprogressbar + .stop {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.oc-dialog .fileexists {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- margin-bottom: 30px;
-}
-
-.oc-dialog .fileexists .conflict .filename,
-.oc-dialog .fileexists .conflict .mtime,
-.oc-dialog .fileexists .conflict .size {
- -webkit-touch-callout: initial;
- -webkit-user-select: initial;
- -khtml-user-select: initial;
- -moz-user-select: initial;
- -ms-user-select: initial;
- user-select: initial;
-}
-.oc-dialog .fileexists .conflict .message {
- color: #e9322d;
-}
-.oc-dialog .fileexists table {
- width: 100%;
-}
-.oc-dialog .fileexists th {
- padding-left: 0;
- padding-right: 0;
-}
-.oc-dialog .fileexists th input[type='checkbox'] {
- margin-right: 3px;
-}
-.oc-dialog .fileexists th:first-child {
- width: 225px;
-}
-.oc-dialog .fileexists th label {
- font-weight: normal;
- color: var(--color-main-text);
-}
-.oc-dialog .fileexists th .count {
- margin-left: 3px;
-}
-.oc-dialog .fileexists .conflicts .template {
- display: none;
-}
-.oc-dialog .fileexists .conflict {
- width: 100%;
- height: 85px;
-}
-.oc-dialog .fileexists .conflict .filename {
- color:#777;
- word-break: break-all;
- clear: left;
-}
-.oc-dialog .fileexists .icon {
- width: 64px;
- height: 64px;
- margin: 0px 5px 5px 5px;
- background-repeat: no-repeat;
- background-size: 64px 64px;
- float: left;
-}
-
-.oc-dialog .fileexists .original,
-.oc-dialog .fileexists .replacement {
- float: left;
- width: 225px;
-}
-.oc-dialog .fileexists .conflicts {
- overflow-y: auto;
- max-height: 225px;
-}
-.oc-dialog .fileexists .conflict input[type='checkbox'] {
- float: left;
-}
-.oc-dialog .fileexists #allfileslabel {
- float:right;
-}
-.oc-dialog .fileexists #allfiles {
- vertical-align: bottom;
- position: relative;
- top: -3px;
-}
-.oc-dialog .fileexists #allfiles + span{
- vertical-align: bottom;
-}
-
-.oc-dialog .oc-dialog-buttonrow {
- width:100%;
- text-align:right;
-
- .cancel {
- float:left;
- }
-}
-
-.highlightUploaded {
- -webkit-animation: highlightAnimation 2s 1;
- -moz-animation: highlightAnimation 2s 1;
- -o-animation: highlightAnimation 2s 1;
- animation: highlightAnimation 2s 1;
-}
-
-@-webkit-keyframes highlightAnimation {
- 0% { background-color: rgba(255, 255, 140, 1); }
- 100% { background-color: rgba(0, 0, 0, 0); }
-}
-@-moz-keyframes highlightAnimation {
- 0% { background-color: rgba(255, 255, 140, 1); }
- 100% { background-color: rgba(0, 0, 0, 0); }
-}
-@-o-keyframes highlightAnimation {
- 0% { background-color: rgba(255, 255, 140, 1); }
- 100% { background-color: rgba(0, 0, 0, 0); }
-}
-@keyframes highlightAnimation {
- 0% { background-color: rgba(255, 255, 140, 1); }
- 100% { background-color: rgba(0, 0, 0, 0); }
-}
diff --git a/apps/files/img/add-color.svg b/apps/files/img/add-color.svg
index cb4596ac1e5..84e633271d0 100644
--- a/apps/files/img/add-color.svg
+++ b/apps/files/img/add-color.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewbox="0 0 16 16"><path fill="#00d400" d="M9.02 13.98h-2v-5h-5v-2h5v-5h2v5l5-.028V8.98h-5z"/></svg>
+<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M11 13H5v-2h6V5h2v6h6v2h-6v6h-2v-6Z" style="fill:#00d400;fill-rule:nonzero" transform="matrix(.85714 0 0 .85714 -2.286 -2.286)"/></svg> \ No newline at end of file
diff --git a/apps/files/img/app-dark.svg b/apps/files/img/app-dark.svg
new file mode 100644
index 00000000000..8eb925d52f9
--- /dev/null
+++ b/apps/files/img/app-dark.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"><path d="M168-192q-29 0-50.5-21.5T96-264v-432q0-30 21.5-51t50.5-21h216l96 96h312q30 0 51 21t21 51v336q0 29-21 50.5T792-192H168Z"/></svg> \ No newline at end of file
diff --git a/apps/files/img/app.svg b/apps/files/img/app.svg
index 38cefae2e84..8bb5a002ac7 100644
--- a/apps/files/img/app.svg
+++ b/apps/files/img/app.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 0 32 32" width="32" version="1.1"><path fill="#fff" d="m3 4c-0.5 0-1 0.5-1 1v22c0 0.52 0.48 1 1 1h26c0.52 0 1-0.482 1-1v-18c0-0.5-0.5-1-1-1h-13l-4-4z"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#fff"><path d="M168-192q-29 0-50.5-21.5T96-264v-432q0-30 21.5-51t50.5-21h216l96 96h312q30 0 51 21t21 51v336q0 29-21 50.5T792-192H168Z"/></svg> \ No newline at end of file
diff --git a/apps/files/img/change.png b/apps/files/img/change.png
index ca77a8844f6..583085cf449 100644
--- a/apps/files/img/change.png
+++ b/apps/files/img/change.png
Binary files differ
diff --git a/apps/files/img/change.svg b/apps/files/img/change.svg
index 12071422b7f..c1b9d6df04b 100644
--- a/apps/files/img/change.svg
+++ b/apps/files/img/change.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>
+<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M12.05 20c-2.233 0-4.133-.775-5.7-2.325C4.783 16.125 4 14.233 4 12v-.175l-1.6 1.6-1.4-1.4 4-4 4 4-1.4 1.4-1.6-1.6V12c0 1.667.588 3.083 1.763 4.25C8.938 17.417 10.367 18 12.05 18c.433 0 .858-.05 1.275-.15.417-.1.825-.25 1.225-.45l1.5 1.5a8.212 8.212 0 0 1-1.95.825 7.711 7.711 0 0 1-2.05.275ZM19 15.975l-4-4 1.4-1.4 1.6 1.6V12c0-1.667-.587-3.083-1.762-4.25C15.063 6.583 13.633 6 11.95 6c-.433 0-.858.05-1.275.15-.417.1-.825.25-1.225.45l-1.5-1.5a8.212 8.212 0 0 1 1.95-.825A7.711 7.711 0 0 1 11.95 4c2.233 0 4.133.775 5.7 2.325C19.217 7.875 20 9.767 20 12v.175l1.6-1.6 1.4 1.4-4 4Z" style="fill-rule:nonzero" transform="matrix(.63636 0 0 .63636 .364 .355)"/></svg> \ No newline at end of file
diff --git a/apps/files/img/delete-color.svg b/apps/files/img/delete-color.svg
index 72aed6b937d..05817bb38a2 100644
--- a/apps/files/img/delete-color.svg
+++ b/apps/files/img/delete-color.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"><path d="m3.0503 4.4645 3.5355 3.5355-3.5355 3.536 1.4142 1.414 3.5355-3.5358 3.536 3.5358 1.414-1.414-3.5358-3.536 3.5358-3.5355-1.414-1.4142-3.536 3.5355-3.5355-3.5355-1.4142 1.4142z" fill="#d40000"/></svg>
+<svg viewBox="0 0 16 16" height="16" width="16" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5l5.6 5.6L17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19Z" style="fill:#d40000;fill-rule:nonzero" transform="matrix(.71429 0 0 .71429 -.571 -.571)"/></svg> \ No newline at end of file
diff --git a/apps/files/img/delete.svg b/apps/files/img/delete.svg
deleted file mode 100644
index 53f0b020eb9..00000000000
--- a/apps/files/img/delete.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewbox="0 0 16 16" width="16" height="16"><path d="M6.5 1L6 2H3c-.554 0-1 .446-1 1v1h12V3c0-.554-.446-1-1-1h-3l-.5-1zM3 5l.875 9c.06.55.573 1 1.125 1h6c.552 0 1.064-.45 1.125-1L13 5z"/></svg>
diff --git a/apps/files/img/external.svg b/apps/files/img/external.svg
deleted file mode 100644
index 7a28d53f7a7..00000000000
--- a/apps/files/img/external.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" height="16" width="16" version="1.1"><path d="m8 1 2.4 2.44-3.46 3.5 2.12 2.12 3.5-3.5 2.44 2.44v-7zm-5.25 1.5c-0.68 0-1.25 0.57-1.25 1.25v9.5c0 0.68 0.57 1.25 1.25 1.25h9.5c0.68 0 1.25-0.57 1.25-1.25v-4.25l-1.5-1.5v5.5h-9v-9h5.5l-1.5-1.5z"/></svg>
diff --git a/apps/files/img/folder-move.svg b/apps/files/img/folder-move.svg
new file mode 100644
index 00000000000..349106f4cd9
--- /dev/null
+++ b/apps/files/img/folder-move.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder-move" viewBox="0 0 24 24"><path d="M14,18V15H10V11H14V8L19,13M20,6H12L10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6Z" /></svg> \ No newline at end of file
diff --git a/apps/files/img/folder.svg b/apps/files/img/folder.svg
index 15365027902..9b7d771861e 100644
--- a/apps/files/img/folder.svg
+++ b/apps/files/img/folder.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m1.5 2c-0.25 0-0.5 0.25-0.5 0.5v11c0 0.26 0.24 0.5 0.5 0.5h13c0.26 0 0.5-0.241 0.5-0.5v-9c0-0.25-0.25-0.5-0.5-0.5h-6.5l-2-2z"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg> \ No newline at end of file
diff --git a/apps/files/img/public.svg b/apps/files/img/public.svg
deleted file mode 100644
index 6ed1ade02dd..00000000000
--- a/apps/files/img/public.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 16" height="16" width="16"><path d="m9.2363 2.166-3.1816 3.1836c-0.7071 0.7072-1.0378 1.6182-0.9883 2.457 0.05 0.8389 0.4333 1.5841 0.9883 2.1387l1.4121-1.416c-0.5672-0.5672-0.5444-1.2192 0.002-1.7656l3.1812-3.1817c0.52536-0.52536 1.2507-0.52318 1.772-0.002 0.48245 0.5556 0.52732 1.2382-0.004 1.7695l-0.82 0.8203c0.555 0.785 0.645 1.3663 0.593 2.2344l1.641-1.6406c1.2374-1.2374 1.2371-3.3645 0-4.6016-1.236-1.2361-3.342-1.2113-4.5957 0.004zm0.7071 3.8848-1.4141 1.418c0 0 0.003-00 0.004 0 0.55 0.55 0.50736 1.2582-0.004 1.7695l-3.1816 3.1817c-0.696 0.59192-1.2985 0.47105-1.7696 0-0.62636-0.62636-0.5-1.2681 0-1.768l0.85-0.8473c-0.556-0.7835-0.6484-1.365-0.5976-2.2324l-1.666 1.666c-1.2393 1.2393-1.2357 3.36 0 4.5957 1.2353 1.2353 3.362 1.2356 4.5976 0l3.1817-3.182c0.7086-0.7083 1.0396-1.6184 0.9906-2.4586-0.048-0.8401-0.432-1.5864-0.9887-2.1407z"/></svg>
diff --git a/apps/files/img/recent.svg b/apps/files/img/recent.svg
deleted file mode 100644
index 8021bc4bb71..00000000000
--- a/apps/files/img/recent.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" height="16" width="16" version="1.1"><circle stroke-width="2" stroke="#000" cy="8" cx="8" r="7" fill="none"/><path stroke-linejoin="round" d="m8 3.5-1 5 3.5 2-2-2z" stroke="#000" stroke-linecap="round" stroke-width="1.5"/></svg>
diff --git a/apps/files/img/share.svg b/apps/files/img/share.svg
deleted file mode 100644
index 014392d5a57..00000000000
--- a/apps/files/img/share.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"><circle cx="3.5" cy="8" r="2.5"/><circle cy="12.5" cx="12.5" r="2.5"/><circle cx="12.5" cy="3.5" r="2.5"/><path d="m3.5 8 9 4.5m-9-4.5 9-4.5" stroke="#000" stroke-width="2" fill="none"/></svg>
diff --git a/apps/files/img/star.svg b/apps/files/img/star.svg
deleted file mode 100644
index 16a7ac53ba7..00000000000
--- a/apps/files/img/star.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 16" width="16" height="16"><path d="m8 0.5 2.2 5.3 5.8 0.45-4.5 3.75 1.5 5.5-5-3.1-5 3.1 1.5-5.5-4.5-3.75 5.8-0.45z"/></svg>
diff --git a/apps/files/img/unshare.svg b/apps/files/img/unshare.svg
deleted file mode 100644
index 0c22ca64057..00000000000
--- a/apps/files/img/unshare.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m12.5 1a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 0.003906 0.12891l-4.9023 2.4512a2.5 2.5 0 0 0-1.6016-0.58008 2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 0.30469-0.021484l3.4395-1.7246-1.25-0.625a2.5 2.5 0 0 0 0.0058594-0.12891 2.5 2.5 0 0 0-0.0039062-0.12891l4.9023-2.4512a2.5 2.5 0 0 0 1.6016 0.58008 2.5 2.5 0 0 0 0.26562-0.013672l1.5625-0.7832a2.5 2.5 0 0 0 0.67188-1.7031 2.5 2.5 0 0 0-2.5-2.5zm0.25391 9.0156-3.7246 1.8672 0.97656 0.48828a2.5 2.5 0 0 0-0.005859 0.12891 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.2461-2.4844z"/><rect transform="rotate(-26.63)" x="-1.0586" y="11.891" width="11.687" height="2.0029" ry="0" style="paint-order:normal"/></svg>
diff --git a/apps/files/js/app.js b/apps/files/js/app.js
deleted file mode 100644
index f7863de09be..00000000000
--- a/apps/files/js/app.js
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * @author Vincent Petry
- * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* global dragOptions, folderDropOptions, OC */
-(function() {
-
- if (!OCA.Files) {
- /**
- * Namespace for the files app
- * @namespace OCA.Files
- */
- OCA.Files = {};
- }
-
- /**
- * @namespace OCA.Files.App
- */
- OCA.Files.App = {
- /**
- * Navigation control
- *
- * @member {OCA.Files.Navigation}
- */
- navigation: null,
-
- /**
- * File list for the "All files" section.
- *
- * @member {OCA.Files.FileList}
- */
- fileList: null,
-
- currentFileList: null,
-
- /**
- * Backbone model for storing files preferences
- */
- _filesConfig: null,
-
- /**
- * Initializes the files app
- */
- initialize: function() {
- this.navigation = new OCA.Files.Navigation($('#app-navigation'));
- this.$showHiddenFiles = $('input#showhiddenfilesToggle');
- var showHidden = $('#showHiddenFiles').val() === "1";
- this.$showHiddenFiles.prop('checked', showHidden);
-
- // crop image previews
- this.$cropImagePreviews = $('input#cropimagepreviewsToggle');
- var cropImagePreviews = $('#cropImagePreviews').val() === "1";
- this.$cropImagePreviews.prop('checked', cropImagePreviews);
-
- if ($('#fileNotFound').val() === "1") {
- OC.Notification.show(t('files', 'File could not be found'), {type: 'error'});
- }
-
- this._filesConfig = new OC.Backbone.Model({
- showhidden: showHidden,
- cropimagepreviews: cropImagePreviews,
- });
-
- var urlParams = OC.Util.History.parseUrlQuery();
- var fileActions = new OCA.Files.FileActions();
- // default actions
- fileActions.registerDefaultActions();
- // regular actions
- fileActions.merge(OCA.Files.fileActions);
-
- this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
- OCA.Files.fileActions.on('setDefault.app-files', this._onActionsUpdated);
- OCA.Files.fileActions.on('registerAction.app-files', this._onActionsUpdated);
-
- this.files = OCA.Files.Files;
-
- // TODO: ideally these should be in a separate class / app (the embedded "all files" app)
- this.fileList = new OCA.Files.FileList(
- $('#app-content-files'), {
- dragOptions: dragOptions,
- folderDropOptions: folderDropOptions,
- fileActions: fileActions,
- allowLegacyActions: true,
- scrollTo: urlParams.scrollto,
- openFile: urlParams.openfile,
- filesClient: OC.Files.getClient(),
- multiSelectMenu: [
- {
- name: 'copyMove',
- displayName: t('files', 'Move or copy'),
- iconClass: 'icon-external',
- order: 10,
- },
- {
- name: 'download',
- displayName: t('files', 'Download'),
- iconClass: 'icon-download',
- order: 10,
- },
- OCA.Files.FileList.MultiSelectMenuActions.ToggleSelectionModeAction,
- {
- name: 'delete',
- displayName: t('files', 'Delete'),
- iconClass: 'icon-delete',
- order: 99,
- },
- {
- name: 'tags',
- displayName: 'Tags',
- iconClass: 'icon-tag',
- order: 100,
- },
- ],
- sorting: {
- mode: $('#defaultFileSorting').val(),
- direction: $('#defaultFileSortingDirection').val()
- },
- config: this._filesConfig,
- enableUpload: true,
- maxChunkSize: OC.appConfig.files && OC.appConfig.files.max_chunk_size
- }
- );
- this.updateCurrentFileList(this.fileList)
- this.files.initialize();
-
- // for backward compatibility, the global FileList will
- // refer to the one of the "files" view
- window.FileList = this.fileList;
-
- OC.Plugins.attach('OCA.Files.App', this);
-
- this._setupEvents();
- // trigger URL change event handlers
- this._onPopState(urlParams);
-
- $('#quota.has-tooltip').tooltip({
- placement: 'top'
- });
-
- this._debouncedPersistShowHiddenFilesState = _.debounce(this._persistShowHiddenFilesState, 1200);
- this._debouncedPersistCropImagePreviewsState = _.debounce(this._persistCropImagePreviewsState, 1200);
-
- if (sessionStorage.getItem('WhatsNewServerCheck') < (Date.now() - 3600*1000)) {
- OCP.WhatsNew.query(); // for Nextcloud server
- sessionStorage.setItem('WhatsNewServerCheck', Date.now());
- }
- },
-
- /**
- * Destroy the app
- */
- destroy: function() {
- this.navigation = null;
- this.fileList.destroy();
- this.fileList = null;
- this.files = null;
- OCA.Files.fileActions.off('setDefault.app-files', this._onActionsUpdated);
- OCA.Files.fileActions.off('registerAction.app-files', this._onActionsUpdated);
- },
-
- _onActionsUpdated: function(ev) {
- // forward new action to the file list
- if (ev.action) {
- this.fileList.fileActions.registerAction(ev.action);
- } else if (ev.defaultAction) {
- this.fileList.fileActions.setDefault(
- ev.defaultAction.mime,
- ev.defaultAction.name
- );
- }
- },
-
- /**
- * Set the currently active file list
- *
- * Due to the file list implementations being registered after clicking the
- * navigation item for the first time, OCA.Files.App is not aware of those until
- * they have initialized themselves. Therefore the files list needs to call this
- * method manually
- *
- * @param {OCA.Files.FileList} newFileList -
- */
- updateCurrentFileList: function(newFileList) {
- this.currentFileList = newFileList;
- },
-
- /**
- * Return the currently active file list
- * @return {?OCA.Files.FileList}
- */
- getCurrentFileList: function () {
- return this.currentFileList;
- },
-
- /**
- * Returns the container of the currently visible app.
- *
- * @return app container
- */
- getCurrentAppContainer: function() {
- return this.navigation.getActiveContainer();
- },
-
- /**
- * Sets the currently active view
- * @param viewId view id
- */
- setActiveView: function(viewId, options) {
- this.navigation.setActiveItem(viewId, options);
- },
-
- /**
- * Returns the view id of the currently active view
- * @return view id
- */
- getActiveView: function() {
- return this.navigation.getActiveItem();
- },
-
- /**
- *
- * @returns {Backbone.Model}
- */
- getFilesConfig: function() {
- return this._filesConfig;
- },
-
- /**
- * Setup events based on URL changes
- */
- _setupEvents: function() {
- OC.Util.History.addOnPopStateHandler(_.bind(this._onPopState, this));
-
- // detect when app changed their current directory
- $('#app-content').delegate('>div', 'changeDirectory', _.bind(this._onDirectoryChanged, this));
- $('#app-content').delegate('>div', 'afterChangeDirectory', _.bind(this._onAfterDirectoryChanged, this));
- $('#app-content').delegate('>div', 'changeViewerMode', _.bind(this._onChangeViewerMode, this));
-
- $('#app-navigation').on('itemChanged', _.bind(this._onNavigationChanged, this));
- this.$showHiddenFiles.on('change', _.bind(this._onShowHiddenFilesChange, this));
- this.$cropImagePreviews.on('change', _.bind(this._onCropImagePreviewsChange, this));
- },
-
- /**
- * Toggle showing hidden files according to the settings checkbox
- *
- * @returns {undefined}
- */
- _onShowHiddenFilesChange: function() {
- var show = this.$showHiddenFiles.is(':checked');
- this._filesConfig.set('showhidden', show);
- this._debouncedPersistShowHiddenFilesState();
- },
-
- /**
- * Persist show hidden preference on the server
- *
- * @returns {undefined}
- */
- _persistShowHiddenFilesState: function() {
- var show = this._filesConfig.get('showhidden');
- $.post(OC.generateUrl('/apps/files/api/v1/showhidden'), {
- show: show
- });
- },
-
- /**
- * Toggle cropping image previews according to the settings checkbox
- *
- * @returns void
- */
- _onCropImagePreviewsChange: function() {
- var crop = this.$cropImagePreviews.is(':checked');
- this._filesConfig.set('cropimagepreviews', crop);
- this._debouncedPersistCropImagePreviewsState();
- },
-
- /**
- * Persist crop image previews preference on the server
- *
- * @returns void
- */
- _persistCropImagePreviewsState: function() {
- var crop = this._filesConfig.get('cropimagepreviews');
- $.post(OC.generateUrl('/apps/files/api/v1/cropimagepreviews'), {
- crop: crop
- });
- },
-
- /**
- * Event handler for when the current navigation item has changed
- */
- _onNavigationChanged: function(e) {
- var params;
- if (e && e.itemId) {
- params = {
- view: typeof e.view === 'string' && e.view !== '' ? e.view : e.itemId,
- dir: e.dir ? e.dir : '/'
- };
- this._changeUrl(params.view, params.dir);
- OC.Apps.hideAppSidebar($('.detailsView'));
- this.navigation.getActiveContainer().trigger(new $.Event('urlChanged', params));
- }
- },
-
- /**
- * Event handler for when an app notified that its directory changed
- */
- _onDirectoryChanged: function(e) {
- if (e.dir && !e.changedThroughUrl) {
- this._changeUrl(this.navigation.getActiveItem(), e.dir, e.fileId);
- }
- },
-
- /**
- * Event handler for when an app notified that its directory changed
- */
- _onAfterDirectoryChanged: function(e) {
- if (e.dir && e.fileId) {
- this._changeUrl(this.navigation.getActiveItem(), e.dir, e.fileId);
- }
- },
-
- /**
- * Event handler for when an app notifies that it needs space
- * for viewer mode.
- */
- _onChangeViewerMode: function(e) {
- var state = !!e.viewerModeEnabled;
- if (e.viewerModeEnabled) {
- OC.Apps.hideAppSidebar($('.detailsView'));
- }
- $('#app-navigation').toggleClass('hidden', state);
- $('.app-files').toggleClass('viewer-mode no-sidebar', state);
- },
-
- /**
- * Event handler for when the URL changed
- */
- _onPopState: function(params) {
- params = _.extend({
- dir: '/',
- view: 'files'
- }, params);
- var lastId = this.navigation.getActiveItem();
- if (!this.navigation.itemExists(params.view)) {
- params.view = 'files';
- }
- this.navigation.setActiveItem(params.view, {silent: true});
- if (lastId !== this.navigation.getActiveItem()) {
- this.navigation.getActiveContainer().trigger(new $.Event('show'));
- }
- this.navigation.getActiveContainer().trigger(new $.Event('urlChanged', params));
- },
-
- /**
- * Encode URL params into a string, except for the "dir" attribute
- * that gets encoded as path where "/" is not encoded
- *
- * @param {Object.<string>} params
- * @return {string} encoded params
- */
- _makeUrlParams: function(params) {
- var dir = params.dir;
- delete params.dir;
- return 'dir=' + OC.encodePath(dir) + '&' + OC.buildQueryString(params);
- },
-
- /**
- * Change the URL to point to the given dir and view
- */
- _changeUrl: function(view, dir, fileId) {
- var params = {dir: dir};
- if (view !== 'files') {
- params.view = view;
- } else if (fileId) {
- params.fileid = fileId;
- }
- var currentParams = OC.Util.History.parseUrlQuery();
- if (currentParams.dir === params.dir && currentParams.view === params.view) {
- if (currentParams.fileid !== params.fileid) {
- // if only fileid changed or was added, replace instead of push
- OC.Util.History.replaceState(this._makeUrlParams(params));
- }
- } else {
- OC.Util.History.pushState(this._makeUrlParams(params));
- }
- }
- };
-})();
-
-window.addEventListener('DOMContentLoaded', function() {
- // wait for other apps/extensions to register their event handlers and file actions
- // in the "ready" clause
- _.defer(function() {
- OCA.Files.App.initialize();
- });
-});
diff --git a/apps/files/js/breadcrumb.js b/apps/files/js/breadcrumb.js
deleted file mode 100644
index 8a5d42bd975..00000000000
--- a/apps/files/js/breadcrumb.js
+++ /dev/null
@@ -1,382 +0,0 @@
-/**
-* ownCloud
-*
-* @author Vincent Petry
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-(function() {
- /**
- * @class BreadCrumb
- * @memberof OCA.Files
- * @classdesc Breadcrumbs that represent the current path.
- *
- * @param {Object} [options] options
- * @param {Function} [options.onClick] click event handler
- * @param {Function} [options.onDrop] drop event handler
- * @param {Function} [options.getCrumbUrl] callback that returns
- * the URL of a given breadcrumb
- */
- var BreadCrumb = function(options){
- this.$el = $('<div class="breadcrumb"></div>');
- this.$menu = $('<div class="popovermenu menu-center"><ul></ul></div>');
-
- this.crumbSelector = '.crumb:not(.hidden):not(.crumbhome):not(.crumbmenu)';
- this.hiddenCrumbSelector = '.crumb.hidden:not(.crumbhome):not(.crumbmenu)';
- options = options || {};
- if (options.onClick) {
- this.onClick = options.onClick;
- }
- if (options.onDrop) {
- this.onDrop = options.onDrop;
- this.onOver = options.onOver;
- this.onOut = options.onOut;
- }
- if (options.getCrumbUrl) {
- this.getCrumbUrl = options.getCrumbUrl;
- }
- this._detailViews = [];
- };
-
- /**
- * @memberof OCA.Files
- */
- BreadCrumb.prototype = {
- $el: null,
- dir: null,
- maxDepthDir: null,
- dirInfo: null,
- activeItemIndex: 0,
-
- /**
- * Total width of all breadcrumbs
- * @type int
- * @private
- */
- totalWidth: 0,
- breadcrumbs: [],
- onClick: null,
- onDrop: null,
- onOver: null,
- onOut: null,
-
- /**
- * Sets the directory to be displayed as breadcrumb.
- * This will re-render the breadcrumb.
- * @param dir path to be displayed as breadcrumb
- */
- setDirectory: function(dir) {
- dir = dir.replace(/\\/g, '/');
- dir = dir || '/';
- if (dir !== this.dir) {
- if ((this.maxDepthDir || "").search(dir) !== 0) {
- this.maxDepthDir = dir;
- }
- this.dir = dir;
- this.render();
- }
- },
-
- setDirectoryInfo: function(dirInfo) {
- if (dirInfo !== this.dirInfo) {
- this.dirInfo = dirInfo;
- this.render();
- }
- },
-
- /**
- * @param {Backbone.View} detailView
- */
- addDetailView: function(detailView) {
- this._detailViews.push(detailView);
- },
-
- /**
- * Returns the full URL to the given directory
- *
- * @param {Object.<String, String>} part crumb data as map
- * @param {number} index crumb index
- * @return full URL
- */
- getCrumbUrl: function(part, index) {
- return '#';
- },
-
- /**
- * Renders the breadcrumb elements
- */
- render: function() {
- // Menu is destroyed on every change, we need to init it
- OC.unregisterMenu($('.crumbmenu > .icon-more'), $('.crumbmenu > .popovermenu'));
-
- var parts = this._makeCrumbs(this.maxDepthDir || '/');
- var $crumb;
- var $menuItem;
- this.$el.empty();
- this.breadcrumbs = [];
-
- for (var i = 0; i < parts.length; i++) {
- var part = parts[i];
- var $image;
- var $link = $('<a></a>');
- $crumb = $('<div class="crumb svg"></div>');
- if(part.dir) {
- $link.attr('href', this.getCrumbUrl(part, i));
- }
- if(part.name) {
- $link.text(part.name);
- }
- $link.addClass(part.linkclass);
- $crumb.append($link);
- $crumb.data('dir', part.dir);
- // Ignore menu button
- $crumb.data('crumb-id', i - 1);
- $crumb.addClass(part.class);
-
- if (part.img) {
- $image = $('<img class="svg"></img>');
- $image.attr('src', part.img);
- $image.attr('alt', part.alt);
- $link.append($image);
- }
- this.breadcrumbs.push($crumb);
- this.$el.append($crumb);
- // Only add feedback if not menu
- if (this.onClick && i !== 0) {
- $link.on('click', this.onClick);
- }
- }
-
- // Menu creation
- this._createMenu();
- for (var j = 0; j < parts.length; j++) {
- var menuPart = parts[j];
- if(menuPart.dir) {
- $menuItem = $('<li class="crumblist"><a><span class="icon-folder"></span><span></span></a></li>');
- $menuItem.data('dir', menuPart.dir);
- $menuItem.find('a').attr('href', this.getCrumbUrl(menuPart, j));
- $menuItem.find('span:eq(1)').text(menuPart.name);
- this.$menu.children('ul').append($menuItem);
- if (this.onClick) {
- $menuItem.on('click', this.onClick);
- }
- }
- }
-
- _.each(this._detailViews, function(view) {
- view.render({
- dirInfo: this.dirInfo
- });
-
- if (this.breadcrumbs.length > 2) {
- this.breadcrumbs[this.activeItemIndex + 2].append(view.$el);
- }
-
- $menuItem.append(view.$el.clone(true));
- }, this);
-
- // setup drag and drop
- if (this.onDrop) {
- this.$el.find('.crumb:not(:last-child):not(.crumbmenu), .crumblist:not(:last-child)').droppable({
- drop: this.onDrop,
- over: this.onOver,
- out: this.onOut,
- tolerance: 'pointer',
- hoverClass: 'canDrop',
- greedy: true
- });
- }
-
- // Menu is destroyed on every change, we need to init it
- OC.registerMenu($('.crumbmenu > .icon-more'), $('.crumbmenu > .popovermenu'));
-
- this._resize();
- },
-
- /**
- * Makes a breadcrumb structure based on the given path
- *
- * @param {String} dir path to split into a breadcrumb structure
- * @param {String} [rootIcon=icon-home] icon to use for root
- * @return {Object.<String, String>} map of {dir: path, name: displayName}
- */
- _makeCrumbs: function(dir, rootIcon) {
- var crumbs = [];
- var pathToHere = '';
- // trim leading and trailing slashes
- dir = dir.replace(/^\/+|\/+$/g, '');
- var parts = dir.split('/');
- if (dir === '') {
- parts = [];
- }
- // menu part
- crumbs.push({
- class: 'crumbmenu hidden',
- linkclass: 'icon-more menutoggle'
- });
- // root part
- crumbs.push({
- name: t('core', 'Home'),
- dir: '/',
- class: 'crumbhome',
- linkclass: rootIcon || 'icon-home'
- });
- for (var i = 0; i < parts.length; i++) {
- var part = parts[i];
- pathToHere = pathToHere + '/' + part;
-
- let classes = "";
- if (pathToHere === this.dir) {
- this.activeItemIndex = i;
- classes = "active";
- }
- crumbs.push({
- dir: pathToHere,
- class: classes,
- name: part
- });
- }
- return crumbs;
- },
-
- /**
- * Calculate real width based on individual crumbs
- *
- * @param {boolean} ignoreHidden ignore hidden crumbs
- */
- getTotalWidth: function(ignoreHidden) {
- // The width has to be calculated by adding up the width of all the
- // crumbs; getting the width of the breadcrumb element is not a
- // valid approach, as the returned value could be clamped to its
- // parent width.
- var totalWidth = 0;
- for (var i = 0; i < this.breadcrumbs.length; i++ ) {
- var $crumb = $(this.breadcrumbs[i]);
- if(!$crumb.hasClass('hidden') || ignoreHidden === true) {
- totalWidth += $crumb.outerWidth(true);
- }
- }
- return totalWidth;
- },
-
- /**
- * Hide the middle crumb
- */
- _hideCrumb: function() {
- var length = this.$el.find(this.crumbSelector).length;
- // Get the middle one floored down
- var elmt = Math.floor(length / 2 - 0.5);
- this.$el.find(this.crumbSelector+':eq('+elmt+')').addClass('hidden');
- },
-
- /**
- * Get the crumb to show
- */
- _getCrumbElement: function() {
- var hidden = this.$el.find(this.hiddenCrumbSelector).length;
- var shown = this.$el.find(this.crumbSelector).length;
- // Get the outer one with priority to the highest
- var elmt = (1 - shown % 2) * (hidden - 1);
- return this.$el.find(this.hiddenCrumbSelector + ':eq('+elmt+')');
- },
-
- /**
- * Show the middle crumb
- */
- _showCrumb: function() {
- if(this.$el.find(this.hiddenCrumbSelector).length === 1) {
- this.$el.find(this.hiddenCrumbSelector).removeClass('hidden');
- }
- this._getCrumbElement().removeClass('hidden');
- },
-
- /**
- * Create and append the popovermenu
- */
- _createMenu: function() {
- this.$el.find('.crumbmenu').append(this.$menu);
- this.$menu.children('ul').empty();
- },
-
- /**
- * Update the popovermenu
- */
- _updateMenu: function() {
- var menuItems = this.$el.find(this.hiddenCrumbSelector);
-
- this.$menu.find('li').addClass('in-breadcrumb');
- for (var i = 0; i < menuItems.length; i++) {
- var crumbId = $(menuItems[i]).data('crumb-id');
- this.$menu.find('li:eq('+crumbId+')').removeClass('in-breadcrumb');
- }
- },
-
- _resize: function() {
-
- if (this.breadcrumbs.length <= 2) {
- // home & menu
- return;
- }
-
- // Always hide the menu to ensure that it does not interfere with
- // the width calculations; otherwise, the result could be different
- // depending on whether the menu was previously being shown or not.
- this.$el.find('.crumbmenu').addClass('hidden');
-
- // Show the crumbs to compress the siblings before hidding again the
- // crumbs. This is needed when the siblings expand to fill all the
- // available width, as in that case their old width would limit the
- // available width for the crumbs.
- // Note that the crumbs shown always overflow the parent width
- // (except, of course, when they all fit in).
- while (this.$el.find(this.hiddenCrumbSelector).length > 0
- && Math.round(this.getTotalWidth()) <= Math.round(this.$el.parent().width())) {
- this._showCrumb();
- }
-
- var siblingsWidth = 0;
- this.$el.prevAll(':visible').each(function () {
- siblingsWidth += $(this).outerWidth(true);
- });
- this.$el.nextAll(':visible').each(function () {
- siblingsWidth += $(this).outerWidth(true);
- });
-
- var availableWidth = this.$el.parent().width() - siblingsWidth;
-
- // If container is smaller than content
- // AND if there are crumbs left to hide
- while (Math.round(this.getTotalWidth()) > Math.round(availableWidth)
- && this.$el.find(this.crumbSelector).length > 0) {
- // As soon as one of the crumbs is hidden the menu will be
- // shown. This is needed for proper results in further width
- // checks.
- // Note that the menu is not shown only when all the crumbs were
- // being shown and they all fit the available space; if any of
- // the crumbs was not being shown then those shown would
- // overflow the available width, so at least one will be hidden
- // and thus the menu will be shown.
- this.$el.find('.crumbmenu').removeClass('hidden');
- this._hideCrumb();
- }
-
- this._updateMenu();
- }
- };
-
- OCA.Files.BreadCrumb = BreadCrumb;
-})();
diff --git a/apps/files/js/detailfileinfoview.js b/apps/files/js/detailfileinfoview.js
deleted file mode 100644
index 43595001212..00000000000
--- a/apps/files/js/detailfileinfoview.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
- /**
- * @class OCA.Files.DetailFileInfoView
- * @classdesc
- *
- * Displays a block of details about the file info.
- *
- */
- var DetailFileInfoView = OC.Backbone.View.extend({
- tagName: 'div',
- className: 'detailFileInfoView',
-
- _template: null,
-
- /**
- * returns the jQuery object for HTML output
- *
- * @returns {jQuery}
- */
- get$: function() {
- return this.$el;
- },
-
- /**
- * Sets the file info to be displayed in the view
- *
- * @param {OCA.Files.FileInfo} fileInfo file info to set
- */
- setFileInfo: function(fileInfo) {
- this.model = fileInfo;
- this.render();
- },
-
- /**
- * Returns the file info.
- *
- * @return {OCA.Files.FileInfo} file info
- */
- getFileInfo: function() {
- return this.model;
- }
- });
-
- OCA.Files.DetailFileInfoView = DetailFileInfoView;
-})();
-
diff --git a/apps/files/js/detailsview.js b/apps/files/js/detailsview.js
deleted file mode 100644
index 699f884ba24..00000000000
--- a/apps/files/js/detailsview.js
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
- /**
- * @class OCA.Files.DetailsView
- * @classdesc
- *
- * The details view show details about a selected file.
- *
- */
- var DetailsView = OC.Backbone.View.extend({
- id: 'app-sidebar',
- tabName: 'div',
- className: 'detailsView scroll-container',
-
- /**
- * List of detail tab views
- *
- * @type Array<OCA.Files.DetailTabView>
- */
- _tabViews: [],
-
- /**
- * List of detail file info views
- *
- * @type Array<OCA.Files.DetailFileInfoView>
- */
- _detailFileInfoViews: [],
-
- /**
- * Id of the currently selected tab
- *
- * @type string
- */
- _currentTabId: null,
-
- /**
- * Dirty flag, whether the view needs to be rerendered
- */
- _dirty: false,
-
- events: {
- 'click a.close': '_onClose',
- 'click .tabHeaders .tabHeader': '_onClickTab',
- 'keyup .tabHeaders .tabHeader': '_onKeyboardActivateTab'
- },
-
- /**
- * Initialize the details view
- */
- initialize: function() {
- this._tabViews = [];
- this._detailFileInfoViews = [];
-
- this._dirty = true;
- },
-
- _onClose: function(event) {
- OC.Apps.hideAppSidebar(this.$el);
- event.preventDefault();
- },
-
- _onClickTab: function(e) {
- var $target = $(e.target);
- e.preventDefault();
- if (!$target.hasClass('tabHeader')) {
- $target = $target.closest('.tabHeader');
- }
- var tabId = $target.attr('data-tabid');
- if (_.isUndefined(tabId)) {
- return;
- }
-
- this.selectTab(tabId);
- },
-
- _onKeyboardActivateTab: function (event) {
- if (event.key === " " || event.key === "Enter") {
- this._onClickTab(event);
- }
- },
-
- template: function(vars) {
- return OCA.Files.Templates['detailsview'](vars);
- },
-
- /**
- * Renders this details view
- */
- render: function() {
- var templateVars = {
- closeLabel: t('files', 'Close')
- };
-
- this._tabViews = this._tabViews.sort(function(tabA, tabB) {
- var orderA = tabA.order || 0;
- var orderB = tabB.order || 0;
- if (orderA === orderB) {
- return OC.Util.naturalSortCompare(tabA.getLabel(), tabB.getLabel());
- }
- return orderA - orderB;
- });
-
- templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) {
- return {
- tabId: tabView.id,
- label: tabView.getLabel(),
- tabIcon: tabView.getIcon()
- };
- });
-
- this.$el.html(this.template(templateVars));
-
- var $detailsContainer = this.$el.find('.detailFileInfoContainer');
-
- // render details
- _.each(this._detailFileInfoViews, function(detailView) {
- $detailsContainer.append(detailView.get$());
- });
-
- if (!this._currentTabId && this._tabViews.length > 0) {
- this._currentTabId = this._tabViews[0].id;
- }
-
- this.selectTab(this._currentTabId);
-
- this._updateTabVisibilities();
-
- this._dirty = false;
- },
-
- /**
- * Selects the given tab by id
- *
- * @param {string} tabId tab id
- */
- selectTab: function(tabId) {
- if (!tabId) {
- return;
- }
-
- var tabView = _.find(this._tabViews, function(tab) {
- return tab.id === tabId;
- });
-
- if (!tabView) {
- console.warn('Details view tab with id "' + tabId + '" not found');
- return;
- }
-
- this._currentTabId = tabId;
-
- var $tabsContainer = this.$el.find('.tabsContainer');
- var $tabEl = $tabsContainer.find('#' + tabId);
-
- // hide other tabs
- $tabsContainer.find('.tab').addClass('hidden');
-
- $tabsContainer.attr('class', 'tabsContainer');
- $tabsContainer.addClass(tabView.getTabsContainerExtraClasses());
-
- // tab already rendered ?
- if (!$tabEl.length) {
- // render tab
- $tabsContainer.append(tabView.$el);
- $tabEl = tabView.$el;
- }
-
- // this should trigger tab rendering
- tabView.setFileInfo(this.model);
-
- $tabEl.removeClass('hidden');
-
- // update tab headers
- var $tabHeaders = this.$el.find('.tabHeaders li');
- $tabHeaders.removeClass('selected');
- $tabHeaders.filterAttr('data-tabid', tabView.id).addClass('selected');
- },
-
- /**
- * Sets the file info to be displayed in the view
- *
- * @param {OCA.Files.FileInfoModel} fileInfo file info to set
- */
- setFileInfo: function(fileInfo) {
- this.model = fileInfo;
-
- if (this._dirty) {
- this.render();
- } else {
- this._updateTabVisibilities();
- }
-
- if (this._currentTabId) {
- // only update current tab, others will be updated on-demand
- var tabId = this._currentTabId;
- var tabView = _.find(this._tabViews, function(tab) {
- return tab.id === tabId;
- });
- tabView.setFileInfo(fileInfo);
- }
-
- _.each(this._detailFileInfoViews, function(detailView) {
- detailView.setFileInfo(fileInfo);
- });
- },
-
- /**
- * Update tab headers based on the current model
- */
- _updateTabVisibilities: function() {
- // update tab header visibilities
- var self = this;
- var deselect = false;
- var countVisible = 0;
- var $tabHeaders = this.$el.find('.tabHeaders li');
- _.each(this._tabViews, function(tabView) {
- var isVisible = tabView.canDisplay(self.model);
- if (isVisible) {
- countVisible += 1;
- }
- if (!isVisible && self._currentTabId === tabView.id) {
- deselect = true;
- }
- $tabHeaders.filterAttr('data-tabid', tabView.id).toggleClass('hidden', !isVisible);
- });
-
- // hide the whole container if there is only one tab
- this.$el.find('.tabHeaders').toggleClass('hidden', countVisible <= 1);
-
- if (deselect) {
- // select the first visible tab instead
- var visibleTabId = this.$el.find('.tabHeader:not(.hidden):first').attr('data-tabid');
- this.selectTab(visibleTabId);
- }
-
- },
-
- /**
- * Returns the file info.
- *
- * @return {OCA.Files.FileInfoModel} file info
- */
- getFileInfo: function() {
- return this.model;
- },
-
- /**
- * Adds a tab in the tab view
- *
- * @param {OCA.Files.DetailTabView} tab view
- */
- addTabView: function(tabView) {
- this._tabViews.push(tabView);
- this._dirty = true;
- },
-
- /**
- * Adds a detail view for file info.
- *
- * @param {OCA.Files.DetailFileInfoView} detail view
- */
- addDetailView: function(detailView) {
- this._detailFileInfoViews.push(detailView);
- this._dirty = true;
- },
-
- /**
- * Returns an array with the added DetailFileInfoViews.
- *
- * @return Array<OCA.Files.DetailFileInfoView> an array with the added
- * DetailFileInfoViews.
- */
- getDetailViews: function() {
- return [].concat(this._detailFileInfoViews);
- }
- });
-
- OCA.Files.DetailsView = DetailsView;
-})();
diff --git a/apps/files/js/detailtabview.js b/apps/files/js/detailtabview.js
deleted file mode 100644
index dcb25190003..00000000000
--- a/apps/files/js/detailtabview.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
-
- /**
- * @class OCA.Files.DetailTabView
- * @classdesc
- *
- * Base class for tab views to display file information.
- *
- */
- var DetailTabView = OC.Backbone.View.extend({
- tag: 'div',
-
- className: 'tab',
-
- /**
- * Tab label
- */
- _label: null,
-
- _template: null,
-
- initialize: function(options) {
- options = options || {};
- if (!this.id) {
- this.id = 'detailTabView' + DetailTabView._TAB_COUNT;
- DetailTabView._TAB_COUNT++;
- }
- if (options.order) {
- this.order = options.order || 0;
- }
- },
-
- /**
- * Returns the extra CSS classes used by the tabs container when this
- * tab is the selected one.
- *
- * In general you should not extend this method, as tabs should not
- * modify the classes of its container; this is reserved as a last
- * resort for very specific cases in which there is no other way to get
- * the proper style or behaviour.
- *
- * @return {String} space-separated CSS classes
- */
- getTabsContainerExtraClasses: function() {
- return '';
- },
-
- /**
- * Returns the tab label
- *
- * @return {String} label
- */
- getLabel: function() {
- return 'Tab ' + this.id;
- },
-
- /**
- * Returns the tab label
- *
- * @return {String}|{null} icon class
- */
- getIcon: function() {
- return null
- },
-
- /**
- * returns the jQuery object for HTML output
- *
- * @returns {jQuery}
- */
- get$: function() {
- return this.$el;
- },
-
- /**
- * Renders this details view
- *
- * @abstract
- */
- render: function() {
- // to be implemented in subclass
- // FIXME: code is only for testing
- this.$el.html('<div>Hello ' + this.id + '</div>');
- },
-
- /**
- * Sets the file info to be displayed in the view
- *
- * @param {OCA.Files.FileInfoModel} fileInfo file info to set
- */
- setFileInfo: function(fileInfo) {
- if (this.model !== fileInfo) {
- this.model = fileInfo;
- this.render();
- }
- },
-
- /**
- * Returns the file info.
- *
- * @return {OCA.Files.FileInfoModel} file info
- */
- getFileInfo: function() {
- return this.model;
- },
-
- /**
- * Load the next page of results
- */
- nextPage: function() {
- // load the next page, if applicable
- },
-
- /**
- * Returns whether the current tab is able to display
- * the given file info, for example based on mime type.
- *
- * @param {OCA.Files.FileInfoModel} fileInfo file info model
- * @return {boolean} whether to display this tab
- */
- canDisplay: function(fileInfo) {
- return true;
- }
- });
- DetailTabView._TAB_COUNT = 0;
-
- OCA.Files = OCA.Files || {};
-
- OCA.Files.DetailTabView = DetailTabView;
-})();
-
diff --git a/apps/files/js/favoritesfilelist.js b/apps/files/js/favoritesfilelist.js
deleted file mode 100644
index 737f2fd6e96..00000000000
--- a/apps/files/js/favoritesfilelist.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-// HACK: this piece needs to be loaded AFTER the files app (for unit tests)
-window.addEventListener('DOMContentLoaded', function() {
- (function(OCA) {
- /**
- * @class OCA.Files.FavoritesFileList
- * @augments OCA.Files.FavoritesFileList
- *
- * @classdesc Favorites file list.
- * Displays the list of files marked as favorites
- *
- * @param $el container element with existing markup for the #controls
- * and a table
- * @param [options] map of options, see other parameters
- */
- var FavoritesFileList = function($el, options) {
- this.initialize($el, options);
- };
- FavoritesFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
- /** @lends OCA.Files.FavoritesFileList.prototype */ {
- id: 'favorites',
- appName: t('files','Favorites'),
-
- _clientSideSort: true,
- _allowSelection: false,
-
- /**
- * @private
- */
- initialize: function($el, options) {
- OCA.Files.FileList.prototype.initialize.apply(this, arguments);
- if (this.initialized) {
- return;
- }
- OC.Plugins.attach('OCA.Files.FavoritesFileList', this);
- },
-
- updateEmptyContent: function() {
- var dir = this.getCurrentDirectory();
- if (dir === '/') {
- // root has special permissions
- this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
- this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
- }
- else {
- OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments);
- }
- },
-
- getDirectoryPermissions: function() {
- return OC.PERMISSION_READ | OC.PERMISSION_DELETE;
- },
-
- updateStorageStatistics: function() {
- // no op because it doesn't have
- // storage info like free space / used space
- },
-
- reload: function() {
- this.showMask();
- if (this._reloadCall) {
- this._reloadCall.abort();
- }
-
- // there is only root
- this._setCurrentDir('/', false);
-
- this._reloadCall = this.filesClient.getFilteredFiles(
- {
- favorite: true
- },
- {
- properties: this._getWebdavProperties()
- }
- );
- var callBack = this.reloadCallback.bind(this);
- return this._reloadCall.then(callBack, callBack);
- },
-
- reloadCallback: function(status, result) {
- if (result) {
- // prepend empty dir info because original handler
- result.unshift({});
- }
-
- return OCA.Files.FileList.prototype.reloadCallback.call(this, status, result);
- },
- });
-
- OCA.Files.FavoritesFileList = FavoritesFileList;
- })(OCA);
-});
-
diff --git a/apps/files/js/favoritesplugin.js b/apps/files/js/favoritesplugin.js
deleted file mode 100644
index 5964d71a469..00000000000
--- a/apps/files/js/favoritesplugin.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function(OCA) {
- /**
- * Registers the favorites file list from the files app sidebar.
- *
- * @namespace OCA.Files.FavoritesPlugin
- */
- OCA.Files.FavoritesPlugin = {
- name: 'Favorites',
-
- /**
- * @type OCA.Files.FavoritesFileList
- */
- favoritesFileList: null,
-
- attach: function() {
- var self = this;
- $('#app-content-favorites').on('show.plugin-favorites', function(e) {
- self.showFileList($(e.target));
- });
- $('#app-content-favorites').on('hide.plugin-favorites', function() {
- self.hideFileList();
- });
- },
-
- detach: function() {
- if (this.favoritesFileList) {
- this.favoritesFileList.destroy();
- OCA.Files.fileActions.off('setDefault.plugin-favorites', this._onActionsUpdated);
- OCA.Files.fileActions.off('registerAction.plugin-favorites', this._onActionsUpdated);
- $('#app-content-favorites').off('.plugin-favorites');
- this.favoritesFileList = null;
- }
- },
-
- showFileList: function($el) {
- if (!this.favoritesFileList) {
- this.favoritesFileList = this._createFavoritesFileList($el);
- }
- return this.favoritesFileList;
- },
-
- hideFileList: function() {
- if (this.favoritesFileList) {
- this.favoritesFileList.$fileList.empty();
- }
- },
-
- /**
- * Creates the favorites file list.
- *
- * @param $el container for the file list
- * @return {OCA.Files.FavoritesFileList} file list
- */
- _createFavoritesFileList: function($el) {
- var fileActions = this._createFileActions();
- // register favorite list for sidebar section
- return new OCA.Files.FavoritesFileList(
- $el, {
- fileActions: fileActions,
- // The file list is created when a "show" event is handled,
- // so it should be marked as "shown" like it would have been
- // done if handling the event with the file list already
- // created.
- shown: true
- }
- );
- },
-
- _createFileActions: function() {
- // inherit file actions from the files app
- var fileActions = new OCA.Files.FileActions();
- // note: not merging the legacy actions because legacy apps are not
- // compatible with the sharing overview and need to be adapted first
- fileActions.registerDefaultActions();
- fileActions.merge(OCA.Files.fileActions);
-
- if (!this._globalActionsInitialized) {
- // in case actions are registered later
- this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
- OCA.Files.fileActions.on('setDefault.plugin-favorites', this._onActionsUpdated);
- OCA.Files.fileActions.on('registerAction.plugin-favorites', this._onActionsUpdated);
- this._globalActionsInitialized = true;
- }
-
- // when the user clicks on a folder, redirect to the corresponding
- // folder in the files app instead of opening it directly
- fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
- OCA.Files.App.setActiveView('files', {silent: true});
- OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
- });
- fileActions.setDefault('dir', 'Open');
- return fileActions;
- },
-
- _onActionsUpdated: function(ev) {
- if (ev.action) {
- this.favoritesFileList.fileActions.registerAction(ev.action);
- } else if (ev.defaultAction) {
- this.favoritesFileList.fileActions.setDefault(
- ev.defaultAction.mime,
- ev.defaultAction.name
- );
- }
- }
- };
-
-})(OCA);
-
-OC.Plugins.register('OCA.Files.App', OCA.Files.FavoritesPlugin);
-
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
deleted file mode 100644
index 793c9672c3f..00000000000
--- a/apps/files/js/file-upload.js
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/**
- * The file upload code uses several hooks to interact with blueimps jQuery file upload library:
- * 1. the core upload handling hooks are added when initializing the plugin,
- * 2. if the browser supports progress events they are added in a separate set after the initialization
- * 3. every app can add it's own triggers for fileupload
- * - files adds d'n'd handlers and also reacts to done events to add new rows to the filelist
- * - TODO pictures upload button
- * - TODO music upload button
- */
-
-/* global jQuery, md5 */
-
-/**
- * File upload object
- *
- * @class OC.FileUpload
- * @classdesc
- *
- * Represents a file upload
- *
- * @param {OC.Uploader} uploader uploader
- * @param {Object} data blueimp data
- */
-OC.FileUpload = function(uploader, data) {
- this.uploader = uploader;
- this.data = data;
- var basePath = '';
- if (this.uploader.fileList) {
- basePath = this.uploader.fileList.getCurrentDirectory();
- }
- var path = OC.joinPaths(basePath, this.getFile().relativePath || '', this.getFile().name);
- this.id = 'web-file-upload-' + md5(path) + '-' + (new Date()).getTime();
-};
-OC.FileUpload.CONFLICT_MODE_DETECT = 0;
-OC.FileUpload.CONFLICT_MODE_OVERWRITE = 1;
-OC.FileUpload.CONFLICT_MODE_AUTORENAME = 2;
-
-// IE11 polyfill
-// TODO: nuke out of orbit as well as this legacy code
-if (!FileReader.prototype.readAsBinaryString) {
- FileReader.prototype.readAsBinaryString = function(fileData) {
- var binary = ''
- var pt = this
- var reader = new FileReader()
- reader.onload = function (e) {
- var bytes = new Uint8Array(reader.result)
- var length = bytes.byteLength
- for (var i = 0; i < length; i++) {
- binary += String.fromCharCode(bytes[i])
- }
- // pt.result - readonly so assign binary
- pt.content = binary
- $(pt).trigger('onload')
- }
- reader.readAsArrayBuffer(fileData)
- }
-}
-
-OC.FileUpload.prototype = {
-
- /**
- * Unique upload id
- *
- * @type string
- */
- id: null,
-
- /**
- * Upload element
- *
- * @type Object
- */
- $uploadEl: null,
-
- /**
- * Target folder
- *
- * @type string
- */
- _targetFolder: '',
-
- /**
- * @type int
- */
- _conflictMode: OC.FileUpload.CONFLICT_MODE_DETECT,
-
- /**
- * New name from server after autorename
- *
- * @type String
- */
- _newName: null,
-
- /**
- * Returns the unique upload id
- *
- * @return string
- */
- getId: function() {
- return this.id;
- },
-
- /**
- * Returns the file to be uploaded
- *
- * @return {File} file
- */
- getFile: function() {
- return this.data.files[0];
- },
-
- /**
- * Return the final filename.
- *
- * @return {String} file name
- */
- getFileName: function() {
- // autorenamed name
- if (this._newName) {
- return this._newName;
- }
- return this.getFile().name;
- },
-
- setTargetFolder: function(targetFolder) {
- this._targetFolder = targetFolder;
- },
-
- getTargetFolder: function() {
- return this._targetFolder;
- },
-
- /**
- * Get full path for the target file, including relative path,
- * without the file name.
- *
- * @return {String} full path
- */
- getFullPath: function() {
- return OC.joinPaths(this._targetFolder, this.getFile().relativePath || '');
- },
-
- /**
- * Get full path for the target file,
- * including relative path and file name.
- *
- * @return {String} full path
- */
- getFullFilePath: function() {
- return OC.joinPaths(this.getFullPath(), this.getFile().name);
- },
-
- /**
- * Returns conflict resolution mode.
- *
- * @return {number} conflict mode
- */
- getConflictMode: function() {
- return this._conflictMode || OC.FileUpload.CONFLICT_MODE_DETECT;
- },
-
- /**
- * Set conflict resolution mode.
- * See CONFLICT_MODE_* constants.
- *
- * @param {number} mode conflict mode
- */
- setConflictMode: function(mode) {
- this._conflictMode = mode;
- },
-
- deleteUpload: function() {
- delete this.data.jqXHR;
- },
-
- /**
- * Trigger autorename and append "(2)".
- * Multiple calls will increment the appended number.
- */
- autoRename: function() {
- var name = this.getFile().name;
- if (!this._renameAttempt) {
- this._renameAttempt = 1;
- }
-
- var dotPos = name.lastIndexOf('.');
- var extPart = '';
- if (dotPos > 0) {
- this._newName = name.substr(0, dotPos);
- extPart = name.substr(dotPos);
- } else {
- this._newName = name;
- }
-
- // generate new name
- this._renameAttempt++;
- this._newName = this._newName + ' (' + this._renameAttempt + ')' + extPart;
- },
-
- /**
- * Submit the upload
- */
- submit: function() {
- var self = this;
- var data = this.data;
- var file = this.getFile();
-
- // if file is a directory, just create it
- // files are handled separately
- if (file.isDirectory) {
- return this.uploader.ensureFolderExists(OC.joinPaths(this._targetFolder, file.fullPath));
- }
-
- if (self.aborted === true) {
- return $.Deferred().resolve().promise();
- }
- // it was a folder upload, so make sure the parent directory exists already
- var folderPromise;
- if (file.relativePath) {
- folderPromise = this.uploader.ensureFolderExists(this.getFullPath());
- } else {
- folderPromise = $.Deferred().resolve().promise();
- }
-
- if (this.uploader.fileList) {
- this.data.url = this.uploader.fileList.getUploadUrl(this.getFileName(), this.getFullPath());
- }
-
- if (!this.data.headers) {
- this.data.headers = {};
- }
-
- // webdav without multipart
- this.data.multipart = false;
- this.data.type = 'PUT';
-
- delete this.data.headers['If-None-Match'];
- if (this._conflictMode === OC.FileUpload.CONFLICT_MODE_DETECT
- || this._conflictMode === OC.FileUpload.CONFLICT_MODE_AUTORENAME) {
- this.data.headers['If-None-Match'] = '*';
- }
-
- var userName = this.uploader.davClient.getUserName();
- var password = this.uploader.davClient.getPassword();
- if (userName) {
- // copy username/password from DAV client
- this.data.headers['Authorization'] =
- 'Basic ' + btoa(userName + ':' + (password || ''));
- }
-
- var chunkFolderPromise;
- if ($.support.blobSlice
- && this.uploader.fileUploadParam.maxChunkSize
- && this.getFile().size > this.uploader.fileUploadParam.maxChunkSize
- ) {
- data.isChunked = true;
- chunkFolderPromise = this.uploader.davClient.createDirectory(
- 'uploads/' + OC.getCurrentUser().uid + '/' + this.getId()
- );
- // TODO: if fails, it means same id already existed, need to retry
- } else {
- chunkFolderPromise = $.Deferred().resolve().promise();
- var mtime = this.getFile().lastModified;
- if (mtime) {
- data.headers['X-OC-Mtime'] = mtime / 1000;
- }
- }
-
- // wait for creation of the required directory before uploading
- return Promise.all([folderPromise, chunkFolderPromise]).then(function() {
- if (self.aborted !== true) {
- data.submit();
- }
- }, function() {
- self.abort();
- });
-
- },
-
- /**
- * Process end of transfer
- */
- done: function() {
- if (!this.data.isChunked) {
- return $.Deferred().resolve().promise();
- }
-
- var uid = OC.getCurrentUser().uid;
- var mtime = this.getFile().lastModified;
- var size = this.getFile().size;
- var headers = {};
- if (mtime) {
- headers['X-OC-Mtime'] = mtime / 1000;
- }
- if (size) {
- headers['OC-Total-Length'] = size;
-
- }
-
- return this.uploader.davClient.move(
- 'uploads/' + uid + '/' + this.getId() + '/.file',
- 'files/' + uid + '/' + OC.joinPaths(this.getFullPath(), this.getFileName()),
- true,
- headers
- );
- },
-
- _deleteChunkFolder: function() {
- // delete transfer directory for this upload
- this.uploader.davClient.remove(
- 'uploads/' + OC.getCurrentUser().uid + '/' + this.getId()
- );
- },
-
- _delete: function() {
- if (this.data.isChunked) {
- this._deleteChunkFolder()
- }
- this.deleteUpload();
- },
-
- /**
- * Abort the upload
- */
- abort: function() {
- if (this.aborted) {
- return
- }
- this.aborted = true;
- this._delete();
- },
-
- /**
- * Fail the upload
- */
- fail: function() {
- if (this.aborted) {
- return
- }
- this._delete();
- },
-
- /**
- * Returns the server response
- *
- * @return {Object} response
- */
- getResponse: function() {
- var response = this.data.response();
- if (response.errorThrown || response.textStatus === 'error') {
- // attempt parsing Sabre exception is available
- var xml = response.jqXHR.responseXML;
- if (xml && xml.documentElement.localName === 'error' && xml.documentElement.namespaceURI === 'DAV:') {
- var messages = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'message');
- var exceptions = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'exception');
- if (messages.length) {
- response.message = messages[0].textContent;
- }
- if (exceptions.length) {
- response.exception = exceptions[0].textContent;
- }
- return response;
- }
- }
-
- if (typeof response.result !== 'string' && response.result) {
- //fetch response from iframe
- response = $.parseJSON(response.result[0].body.innerText);
- if (!response) {
- // likely due to internal server error
- response = {status: 500};
- }
- } else {
- response = response.result;
- }
- return response;
- },
-
- /**
- * Returns the status code from the response
- *
- * @return {number} status code
- */
- getResponseStatus: function() {
- if (this.uploader.isXHRUpload()) {
- var xhr = this.data.response().jqXHR;
- if (xhr) {
- return xhr.status;
- }
- return null;
- }
- return this.getResponse().status;
- },
-
- /**
- * Returns the response header by name
- *
- * @param {String} headerName header name
- * @return {Array|String} response header value(s)
- */
- getResponseHeader: function(headerName) {
- headerName = headerName.toLowerCase();
- if (this.uploader.isXHRUpload()) {
- return this.data.response().jqXHR.getResponseHeader(headerName);
- }
-
- var headers = this.getResponse().headers;
- if (!headers) {
- return null;
- }
-
- var value = _.find(headers, function(value, key) {
- return key.toLowerCase() === headerName;
- });
- if (_.isArray(value) && value.length === 1) {
- return value[0];
- }
- return value;
- }
-};
-
-/**
- * keeps track of uploads in progress and implements callbacks for the conflicts dialog
- * @namespace
- */
-
-OC.Uploader = function() {
- this.init.apply(this, arguments);
-};
-
-OC.Uploader.prototype = _.extend({
- /**
- * @type Array<OC.FileUpload>
- */
- _uploads: {},
-
- /**
- * Count of upload done promises that have not finished yet.
- *
- * @type int
- */
- _pendingUploadDoneCount: 0,
-
- /**
- * Is it currently uploading?
- *
- * @type boolean
- */
- _uploading: false,
-
- /**
- * List of directories known to exist.
- *
- * Key is the fullpath and value is boolean, true meaning that the directory
- * was already created so no need to create it again.
- */
- _knownDirs: {},
-
- /**
- * @type OCA.Files.FileList
- */
- fileList: null,
-
- /**
- * @type OCA.Files.OperationProgressBar
- */
- progressBar: null,
-
- /**
- * @type OC.Files.Client
- */
- filesClient: null,
-
- /**
- * Webdav client pointing at the root "dav" endpoint
- *
- * @type OC.Files.Client
- */
- davClient: null,
-
- /**
- * Function that will allow us to know if Ajax uploads are supported
- * @link https://github.com/New-Bamboo/example-ajax-upload/blob/master/public/index.html
- * also see article @link http://blog.new-bamboo.co.uk/2012/01/10/ridiculously-simple-ajax-uploads-with-formdata
- */
- _supportAjaxUploadWithProgress: function() {
- if (window.TESTING) {
- return true;
- }
- return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData();
-
- // Is the File API supported?
- function supportFileAPI() {
- var fi = document.createElement('INPUT');
- fi.type = 'file';
- return 'files' in fi;
- }
-
- // Are progress events supported?
- function supportAjaxUploadProgressEvents() {
- var xhr = new XMLHttpRequest();
- return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));
- }
-
- // Is FormData supported?
- function supportFormData() {
- return !! window.FormData;
- }
- },
-
- /**
- * Returns whether an XHR upload will be used
- *
- * @return {boolean} true if XHR upload will be used,
- * false for iframe upload
- */
- isXHRUpload: function () {
- return !this.fileUploadParam.forceIframeTransport &&
- ((!this.fileUploadParam.multipart && $.support.xhrFileUpload) ||
- $.support.xhrFormDataFileUpload);
- },
-
- /**
- * Makes sure that the upload folder and its parents exists
- *
- * @param {String} fullPath full path
- * @return {Promise} promise that resolves when all parent folders
- * were created
- */
- ensureFolderExists: function(fullPath) {
- if (!fullPath || fullPath === '/') {
- return $.Deferred().resolve().promise();
- }
-
- // remove trailing slash
- if (fullPath.charAt(fullPath.length - 1) === '/') {
- fullPath = fullPath.substr(0, fullPath.length - 1);
- }
-
- var self = this;
- var promise = this._knownDirs[fullPath];
-
- if (this.fileList) {
- // assume the current folder exists
- this._knownDirs[this.fileList.getCurrentDirectory()] = $.Deferred().resolve().promise();
- }
-
- if (!promise) {
- var deferred = new $.Deferred();
- promise = deferred.promise();
- this._knownDirs[fullPath] = promise;
-
- // make sure all parents already exist
- var parentPath = OC.dirname(fullPath);
- var parentPromise = this._knownDirs[parentPath];
- if (!parentPromise) {
- parentPromise = this.ensureFolderExists(parentPath);
- }
-
- parentPromise.then(function() {
- self.filesClient.createDirectory(fullPath).always(function(status) {
- // 405 is expected if the folder already exists
- if ((status >= 200 && status < 300) || status === 405) {
- if (status !== 405) {
- self.trigger('createdfolder', fullPath);
- }
- deferred.resolve();
- return;
- }
- OC.Notification.show(t('files', 'Could not create folder "{dir}"', {dir: fullPath}), {type: 'error'});
- deferred.reject();
- });
- }, function() {
- deferred.reject();
- });
- }
-
- return promise;
- },
-
- /**
- * Submit the given uploads
- *
- * @param {Array} array of uploads to start
- */
- submitUploads: function(uploads) {
- var self = this;
- _.each(uploads, function(upload) {
- self._uploads[upload.data.uploadId] = upload;
- });
- if (!self._uploading) {
- self.totalToUpload = 0;
- }
- self.totalToUpload += _.reduce(uploads, function(memo, upload) { return memo+upload.getFile().size; }, 0);
- var semaphore = new OCA.Files.Semaphore(5);
- var promises = _.map(uploads, function(upload) {
- return semaphore.acquire().then(function(){
- return upload.submit().then(function(){
- semaphore.release();
- });
- });
- });
- },
-
- confirmBeforeUnload: function() {
- if (this._uploading) {
- return t('files', 'This will stop your current uploads.')
- }
- },
-
- /**
- * Show conflict for the given file object
- *
- * @param {OC.FileUpload} file upload object
- */
- showConflict: function(fileUpload) {
- //show "file already exists" dialog
- var self = this;
- var file = fileUpload.getFile();
- // already attempted autorename but the server said the file exists ? (concurrently added)
- if (fileUpload.getConflictMode() === OC.FileUpload.CONFLICT_MODE_AUTORENAME) {
- // attempt another autorename, defer to let the current callback finish
- _.defer(function() {
- self.onAutorename(fileUpload);
- });
- return;
- }
- // retrieve more info about this file
- this.filesClient.getFileInfo(fileUpload.getFullFilePath()).then(function(status, fileInfo) {
- var original = fileInfo;
- var replacement = file;
- original.directory = original.path;
- OC.dialogs.fileexists(fileUpload, original, replacement, self);
- });
- },
- /**
- * cancels all uploads
- */
- cancelUploads:function() {
- this.log('canceling uploads');
- jQuery.each(this._uploads, function(i, upload) {
- upload.abort();
- });
- this.clear();
- },
- /**
- * Clear uploads
- */
- clear: function() {
- this._knownDirs = {};
- },
- /**
- * Returns an upload by id
- *
- * @param {number} data uploadId
- * @return {OC.FileUpload} file upload
- */
- getUpload: function(data) {
- if (_.isString(data)) {
- return this._uploads[data];
- } else if (data.uploadId && this._uploads[data.uploadId]) {
- this._uploads[data.uploadId].data = data;
- return this._uploads[data.uploadId];
- }
- return null;
- },
-
- /**
- * Removes an upload from the list of known uploads.
- *
- * @param {OC.FileUpload} upload the upload to remove.
- */
- removeUpload: function(upload) {
- if (!upload || !upload.data || !upload.data.uploadId) {
- return;
- }
-
- // defer as some calls/chunks might still be busy failing, so we need
- // the upload info there still
- var self = this;
- var uploadId = upload.data.uploadId;
- // mark as deleted for the progress bar
- this._uploads[uploadId].deleted = true;
- window.setTimeout(function() {
- delete self._uploads[uploadId];
- }, 5000)
- },
-
- _activeUploadCount: function() {
- var count = 0;
- for (var key in this._uploads) {
- if (!this._uploads[key].deleted) {
- count++;
- }
- }
-
- return count;
- },
-
- showUploadCancelMessage: _.debounce(function() {
- OC.Notification.show(t('files', 'Upload cancelled.'), {timeout : 7, type: 'error'});
- }, 500),
- /**
- * callback for the conflicts dialog
- */
- onCancel:function() {
- this.cancelUploads();
- },
- /**
- * callback for the conflicts dialog
- * calls onSkip, onReplace or onAutorename for each conflict
- * @param {object} conflicts - list of conflict elements
- */
- onContinue:function(conflicts) {
- var self = this;
- //iterate over all conflicts
- jQuery.each(conflicts, function (i, conflict) {
- conflict = $(conflict);
- var keepOriginal = conflict.find('.original input[type="checkbox"]:checked').length === 1;
- var keepReplacement = conflict.find('.replacement input[type="checkbox"]:checked').length === 1;
- if (keepOriginal && keepReplacement) {
- // when both selected -> autorename
- self.onAutorename(conflict.data('data'));
- } else if (keepReplacement) {
- // when only replacement selected -> overwrite
- self.onReplace(conflict.data('data'));
- } else {
- // when only original selected -> skip
- // when none selected -> skip
- self.onSkip(conflict.data('data'));
- }
- });
- },
- /**
- * handle skipping an upload
- * @param {OC.FileUpload} upload
- */
- onSkip:function(upload) {
- this.log('skip', null, upload);
- upload.deleteUpload();
- },
- /**
- * handle replacing a file on the server with an uploaded file
- * @param {FileUpload} data
- */
- onReplace:function(upload) {
- this.log('replace', null, upload);
- upload.setConflictMode(OC.FileUpload.CONFLICT_MODE_OVERWRITE);
- this.submitUploads([upload]);
- },
- /**
- * handle uploading a file and letting the server decide a new name
- * @param {object} upload
- */
- onAutorename:function(upload) {
- this.log('autorename', null, upload);
- upload.setConflictMode(OC.FileUpload.CONFLICT_MODE_AUTORENAME);
-
- do {
- upload.autoRename();
- // if file known to exist on the client side, retry
- } while (this.fileList && this.fileList.inList(upload.getFileName()));
-
- // resubmit upload
- this.submitUploads([upload]);
- },
- _trace: false, //TODO implement log handler for JS per class?
- log: function(caption, e, data) {
- if (this._trace) {
- console.log(caption);
- console.log(data);
- }
- },
- /**
- * checks the list of existing files prior to uploading and shows a simple dialog to choose
- * skip all, replace all or choose which files to keep
- *
- * @param {array} selection of files to upload
- * @param {object} callbacks - object with several callback methods
- * @param {Function} callbacks.onNoConflicts
- * @param {Function} callbacks.onSkipConflicts
- * @param {Function} callbacks.onReplaceConflicts
- * @param {Function} callbacks.onChooseConflicts
- * @param {Function} callbacks.onCancel
- */
- checkExistingFiles: function (selection, callbacks) {
- var fileList = this.fileList;
- var conflicts = [];
- // only keep non-conflicting uploads
- selection.uploads = _.filter(selection.uploads, function(upload) {
- var file = upload.getFile();
- if (file.relativePath) {
- // can't check in subfolder contents
- return true;
- }
- if (!fileList) {
- // no list to check against
- return true;
- }
- if (upload.getTargetFolder() !== fileList.getCurrentDirectory()) {
- // not uploading to the current folder
- return true;
- }
- var fileInfo = fileList.findFile(file.name);
- if (fileInfo) {
- conflicts.push([
- // original
- _.extend(fileInfo, {
- directory: fileInfo.directory || fileInfo.path || fileList.getCurrentDirectory()
- }),
- // replacement (File object)
- upload
- ]);
- return false;
- }
- return true;
- });
- if (conflicts.length) {
- // wait for template loading
- OC.dialogs.fileexists(null, null, null, this).done(function() {
- _.each(conflicts, function(conflictData) {
- OC.dialogs.fileexists(conflictData[1], conflictData[0], conflictData[1].getFile(), this);
- });
- });
- }
-
- // upload non-conflicting files
- // note: when reaching the server they might still meet conflicts
- // if the folder was concurrently modified, these will get added
- // to the already visible dialog, if applicable
- callbacks.onNoConflicts(selection);
- },
-
- _updateProgressBarOnUploadStop: function() {
- if (this._pendingUploadDoneCount === 0) {
- // All the uploads ended and there is no pending operation, so hide
- // the progress bar.
- // Note that this happens here only with non-chunked uploads; if the
- // upload was chunked then this will have been executed after all
- // the uploads ended but before the upload done handler that reduces
- // the pending operation count was executed.
- this._hideProgressBar();
-
- return;
- }
-
- this._setProgressBarText(t('files', 'Processing files …'), t('files', '…'));
-
- // Nothing is being uploaded at this point, and the pending operations
- // can not be cancelled, so the cancel button should be hidden.
- this._hideCancelButton();
- },
-
- _hideProgressBar: function() {
- this.progressBar.hideProgressBar();
- },
-
- _hideCancelButton: function() {
- this.progressBar.hideCancelButton();
- },
-
- _showProgressBar: function() {
- this.progressBar.showProgressBar();
- },
-
- _setProgressBarValue: function(value) {
- this.progressBar.setProgressBarValue(value);
- },
-
- _setProgressBarText: function(textDesktop, textMobile, title) {
- this.progressBar.setProgressBarText(textDesktop, textMobile, title);
- },
-
- /**
- * Returns whether the given file is known to be a received shared file
- *
- * @param {Object} file file
- * @return {boolean} true if the file is a shared file
- */
- _isReceivedSharedFile: function(file) {
- if (!window.FileList) {
- return false;
- }
- var $tr = window.FileList.findFileEl(file.name);
- if (!$tr.length) {
- return false;
- }
-
- return ($tr.attr('data-mounttype') === 'shared-root' && $tr.attr('data-mime') !== 'httpd/unix-directory');
- },
-
- /**
- * Initialize the upload object
- *
- * @param {Object} $uploadEl upload element
- * @param {Object} options
- * @param {OCA.Files.FileList} [options.fileList] file list object
- * @param {OC.Files.Client} [options.filesClient] files client object
- * @param {Object} [options.dropZone] drop zone for drag and drop upload
- */
- init: function($uploadEl, options) {
- var self = this;
-
- options = options || {};
-
- this.fileList = options.fileList;
- this.progressBar = options.progressBar;
- this.filesClient = options.filesClient || OC.Files.getClient();
- this.davClient = new OC.Files.Client({
- host: this.filesClient.getHost(),
- root: OC.linkToRemoteBase('dav'),
- useHTTPS: OC.getProtocol() === 'https',
- userName: this.filesClient.getUserName(),
- password: this.filesClient.getPassword()
- });
-
- $uploadEl = $($uploadEl);
- this.$uploadEl = $uploadEl;
-
- if ($uploadEl.exists()) {
- this.progressBar.on('cancel', function() {
- self.cancelUploads();
- self.showUploadCancelMessage();
- });
-
- this.fileUploadParam = {
- type: 'PUT',
- dropZone: options.dropZone, // restrict dropZone to content div
- autoUpload: false,
- sequentialUploads: false,
- limitConcurrentUploads: 4,
- /**
- * on first add of every selection
- * - check all files of originalFiles array with files in dir
- * - on conflict show dialog
- * - skip all -> remember as single skip action for all conflicting files
- * - replace all -> remember as single replace action for all conflicting files
- * - choose -> show choose dialog
- * - mark files to keep
- * - when only existing -> remember as single skip action
- * - when only new -> remember as single replace action
- * - when both -> remember as single autorename action
- * - start uploading selection
- * @param {object} e
- * @param {object} data
- * @returns {boolean}
- */
- add: function(e, data) {
- self.log('add', e, data);
- var that = $(this), freeSpace = 0;
-
- var upload = new OC.FileUpload(self, data);
- // can't link directly due to jQuery not liking cyclic deps on its ajax object
- data.uploadId = upload.getId();
-
- // create a container where we can store the data objects
- if ( ! data.originalFiles.selection ) {
- // initialize selection and remember number of files to upload
- data.originalFiles.selection = {
- uploads: [],
- filesToUpload: data.originalFiles.length,
- totalBytes: 0
- };
- }
- // TODO: move originalFiles to a separate container, maybe inside OC.Upload
- var selection = data.originalFiles.selection;
-
- // add uploads
- if ( selection.uploads.length < selection.filesToUpload ) {
- // remember upload
- selection.uploads.push(upload);
- }
-
- //examine file
- var file = upload.getFile();
- try {
- // FIXME: not so elegant... need to refactor that method to return a value
- Files.isFileNameValid(file.name);
- }
- catch (errorMessage) {
- data.textStatus = 'invalidcharacters';
- data.errorThrown = errorMessage;
- }
-
- if (data.targetDir) {
- upload.setTargetFolder(data.targetDir);
- delete data.targetDir;
- }
-
- // in case folder drag and drop is not supported file will point to a directory
- // http://stackoverflow.com/a/20448357
- if ( !file.type && file.size % 4096 === 0 && file.size <= 102400) {
- var dirUploadFailure = false;
- try {
- var reader = new FileReader();
- reader.readAsBinaryString(file);
- } catch (error) {
- console.log(reader, error)
- //file is a directory
- dirUploadFailure = true;
- }
-
- if (dirUploadFailure) {
- data.textStatus = 'dirorzero';
- data.errorThrown = t('files',
- 'Unable to upload {filename} as it is a directory or has 0 bytes',
- {filename: file.name}
- );
- }
- }
-
- // only count if we're not overwriting an existing shared file
- if (self._isReceivedSharedFile(file)) {
- file.isReceivedShare = true;
- } else {
- // add size
- selection.totalBytes += file.size;
- }
-
- // check free space
- if (!self.fileList || upload.getTargetFolder() === self.fileList.getCurrentDirectory()) {
- // Use global free space if there is no file list to check or the current directory is the target
- freeSpace = $('#free_space').val()
- } else if (upload.getTargetFolder().indexOf(self.fileList.getCurrentDirectory()) === 0) {
- // Check subdirectory free space if file is uploaded there
- // Retrieve the folder destination name
- var targetSubdir = upload._targetFolder.split('/').pop()
- freeSpace = parseInt(upload.uploader.fileList.getModelForFile(targetSubdir).get('quotaAvailableBytes'))
- }
- if (freeSpace >= 0 && selection.totalBytes > freeSpace) {
- data.textStatus = 'notenoughspace';
- data.errorThrown = t('files',
- 'Not enough free space, you are uploading {size1} but only {size2} is left', {
- 'size1': OC.Util.humanFileSize(selection.totalBytes),
- 'size2': OC.Util.humanFileSize(freeSpace)
- });
- }
-
- // end upload for whole selection on error
- if (data.errorThrown) {
- // trigger fileupload fail handler
- var fu = that.data('blueimp-fileupload') || that.data('fileupload');
- fu._trigger('fail', e, data);
- return false; //don't upload anything
- }
-
- // check existing files when all is collected
- if ( selection.uploads.length >= selection.filesToUpload ) {
-
- //remove our selection hack:
- delete data.originalFiles.selection;
-
- var callbacks = {
-
- onNoConflicts: function (selection) {
- self.submitUploads(selection.uploads);
- },
- onSkipConflicts: function (selection) {
- //TODO mark conflicting files as toskip
- },
- onReplaceConflicts: function (selection) {
- //TODO mark conflicting files as toreplace
- },
- onChooseConflicts: function (selection) {
- //TODO mark conflicting files as chosen
- },
- onCancel: function (selection) {
- $.each(selection.uploads, function(i, upload) {
- upload.abort();
- });
- }
- };
-
- self.checkExistingFiles(selection, callbacks);
-
- }
-
- return true; // continue adding files
- },
- /**
- * called after the first add, does NOT have the data param
- * @param {object} e
- */
- start: function(e) {
- self.log('start', e, null);
- //hide the tooltip otherwise it covers the progress bar
- $('#upload').tooltip('hide');
- self._uploading = true;
- },
- fail: function(e, data) {
- var upload = self.getUpload(data);
- var status = null;
- if (upload) {
- if (upload.aborted) {
- // uploads might fail with errors from the server when aborted
- return
- }
- status = upload.getResponseStatus();
- }
- self.log('fail', e, upload);
-
- self.removeUpload(upload);
-
- if (data.textStatus === 'abort' || data.errorThrown === 'abort') {
- return
- } else if (status === 412) {
- // file already exists
- self.showConflict(upload);
- } else if (status === 404) {
- // target folder does not exist any more
- OC.Notification.show(t('files', 'Target folder "{dir}" does not exist any more', {dir: upload.getFullPath()} ), {type: 'error'});
- self.cancelUploads();
- } else if (data.textStatus === 'notenoughspace') {
- // not enough space
- OC.Notification.show(t('files', 'Not enough free space'), {type: 'error'});
- self.cancelUploads();
- } else {
- // HTTP connection problem or other error
- var message = t('files', 'An unknown error has occurred');
- if (upload) {
- var response = upload.getResponse();
- if (response) {
- message = response.message;
- }
- }
- console.error(e, data, response)
- OC.Notification.show(message || data.errorThrown, {type: 'error'});
- }
-
- if (upload) {
- upload.fail();
- }
- },
- /**
- * called for every successful upload
- * @param {object} e
- * @param {object} data
- */
- done:function(e, data) {
- var upload = self.getUpload(data);
- var that = $(this);
- self.log('done', e, upload);
-
- self.removeUpload(upload);
-
- var status = upload.getResponseStatus();
- if (status < 200 || status >= 300) {
- // trigger fail handler
- var fu = that.data('blueimp-fileupload') || that.data('fileupload');
- fu._trigger('fail', e, data);
- return;
- }
- },
- /**
- * called after last upload
- * @param {object} e
- * @param {object} data
- */
- stop: function(e, data) {
- self.log('stop', e, data);
- self._uploading = false;
- }
- };
-
- if (options.maxChunkSize) {
- this.fileUploadParam.maxChunkSize = options.maxChunkSize;
- }
-
- // initialize jquery fileupload (blueimp)
- var fileupload = this.$uploadEl.fileupload(this.fileUploadParam);
-
- if (this._supportAjaxUploadWithProgress()) {
- //remaining time
- var lastUpdate, lastSize, bufferSize, buffer, bufferIndex, bufferIndex2, bufferTotal;
-
- var dragging = false;
-
- // add progress handlers
- fileupload.on('fileuploadadd', function(e, data) {
- self.log('progress handle fileuploadadd', e, data);
- self.trigger('add', e, data);
- });
- // add progress handlers
- fileupload.on('fileuploadstart', function(e, data) {
- self.log('progress handle fileuploadstart', e, data);
- self._setProgressBarText(t('files', 'Uploading …'), t('files', '…'));
- self._setProgressBarValue(0);
- self._showProgressBar();
- // initial remaining time variables
- lastUpdate = new Date().getTime();
- lastSize = 0;
- bufferSize = 20;
- buffer = [];
- bufferIndex = 0;
- bufferIndex2 = 0;
- bufferTotal = 0;
- for(var i = 0; i < bufferSize; i++){
- buffer[i] = 0;
- }
- self.trigger('start', e, data);
- });
- fileupload.on('fileuploadprogress', function(e, data) {
- self.log('progress handle fileuploadprogress', e, data);
- //TODO progressbar in row
- self.trigger('progress', e, data);
- });
- fileupload.on('fileuploadprogressall', function(e, data) {
- self.log('progress handle fileuploadprogressall', e, data);
- var total = self.totalToUpload;
- var progress = (data.loaded / total) * 100;
- var thisUpdate = new Date().getTime();
- var diffUpdate = (thisUpdate - lastUpdate)/1000; // eg. 2s
- lastUpdate = thisUpdate;
- var diffSize = data.loaded - lastSize;
- lastSize = data.loaded;
- diffSize = diffSize / diffUpdate; // apply timing factor, eg. 1MiB/2s = 0.5MiB/s, unit is byte per second
- var remainingSeconds = ((total - data.loaded) / diffSize);
- if(remainingSeconds >= 0) {
- bufferTotal = bufferTotal - (buffer[bufferIndex]) + remainingSeconds;
- buffer[bufferIndex] = remainingSeconds; //buffer to make it smoother
- bufferIndex = (bufferIndex + 1) % bufferSize;
- bufferIndex2++;
- }
- var smoothRemainingSeconds;
- if (bufferIndex2 > 0 && bufferIndex2 < 20) {
- smoothRemainingSeconds = bufferTotal / bufferIndex2;
- } else if (bufferSize > 0) {
- smoothRemainingSeconds = bufferTotal / bufferSize;
- } else {
- smoothRemainingSeconds = 1;
- }
-
- var h = moment.duration(smoothRemainingSeconds, "seconds").humanize();
- if (!(smoothRemainingSeconds >= 0 && smoothRemainingSeconds < 14400)) {
- // show "Uploading ..." for durations longer than 4 hours
- h = t('files', 'Uploading …');
- }
- self._setProgressBarText(h, h, t('files', '{loadedSize} of {totalSize} ({bitrate})' , {
- loadedSize: OC.Util.humanFileSize(data.loaded),
- totalSize: OC.Util.humanFileSize(total),
- bitrate: OC.Util.humanFileSize(data.bitrate / 8) + '/s'
- }));
- self._setProgressBarValue(progress);
- self.trigger('progressall', e, data);
- });
- fileupload.on('fileuploadstop', function(e, data) {
- self.log('progress handle fileuploadstop', e, data);
-
- self.clear();
- self._updateProgressBarOnUploadStop();
- self.trigger('stop', e, data);
- });
- fileupload.on('fileuploadfail', function(e, data) {
- self.log('progress handle fileuploadfail', e, data);
- self.trigger('fail', e, data);
- });
- fileupload.on('fileuploaddragover', function(e){
- $('#app-content').addClass('file-drag');
- $('#emptycontent .icon-folder').addClass('icon-filetype-folder-drag-accept');
-
- var filerow = $(e.delegatedEvent.target).closest('tr');
-
- if(!filerow.hasClass('dropping-to-dir')){
- $('.dropping-to-dir .icon-filetype-folder-drag-accept').removeClass('icon-filetype-folder-drag-accept');
- $('.dropping-to-dir').removeClass('dropping-to-dir');
- $('.dir-drop').removeClass('dir-drop');
- }
-
- if(filerow.attr('data-type') === 'dir'){
- $('#app-content').addClass('dir-drop');
- filerow.addClass('dropping-to-dir');
- filerow.find('.thumbnail').addClass('icon-filetype-folder-drag-accept');
- }
-
- dragging = true;
- });
-
- var disableDropState = function() {
- $('#app-content').removeClass('file-drag');
- $('.dropping-to-dir').removeClass('dropping-to-dir');
- $('.dir-drop').removeClass('dir-drop');
- $('.icon-filetype-folder-drag-accept').removeClass('icon-filetype-folder-drag-accept');
-
- dragging = false;
- };
-
- fileupload.on('fileuploaddragleave fileuploaddrop', disableDropState);
-
- // In some browsers the "drop" event can be triggered with no
- // files even if the "dragover" event seemed to suggest that a
- // file was being dragged (and thus caused "fileuploaddragover"
- // to be triggered).
- fileupload.on('fileuploaddropnofiles', function() {
- if (!dragging) {
- return;
- }
-
- disableDropState();
-
- OC.Notification.show(t('files', 'Uploading that item is not supported'), {type: 'error'});
- });
-
- fileupload.on('fileuploadchunksend', function(e, data) {
- // modify the request to adjust it to our own chunking
- var upload = self.getUpload(data);
- if (!upload) {
- // likely cancelled
- return
- }
- var range = data.contentRange.split(' ')[1];
- var chunkId = range.split('/')[0].split('-')[0];
- data.url = OC.getRootPath() +
- '/remote.php/dav/uploads' +
- '/' + OC.getCurrentUser().uid +
- '/' + upload.getId() +
- '/' + chunkId;
- delete data.contentRange;
- delete data.headers['Content-Range'];
- });
- fileupload.on('fileuploaddone', function(e, data) {
- var upload = self.getUpload(data);
-
- self._pendingUploadDoneCount++;
-
- upload.done().always(function() {
- self._pendingUploadDoneCount--;
- if (self._activeUploadCount() === 0 && self._pendingUploadDoneCount === 0) {
- // All the uploads ended and there is no pending
- // operation, so hide the progress bar.
- // Note that this happens here only with chunked
- // uploads; if the upload was non-chunked then this
- // handler is immediately executed, before the
- // jQuery upload done handler that removes the
- // upload from the list, and thus at this point
- // there is still at least one upload that has not
- // ended (although the upload stop handler is always
- // executed after all the uploads have ended, which
- // hides the progress bar in that case).
- self._hideProgressBar();
- }
- }).done(function() {
- self.trigger('done', e, upload);
- }).fail(function(status, response) {
- if (upload.aborted) {
- return
- }
-
- var message = response.message;
- if (status === 507) {
- // not enough space
- OC.Notification.show(message || t('files', 'Not enough free space'), {type: 'error'});
- self.cancelUploads();
- } else if (status === 409) {
- OC.Notification.show(message || t('files', 'Target folder does not exist any more'), {type: 'error'});
- } else if (status === 403) {
- OC.Notification.show(message || t('files', 'Operation is blocked by access control'), {type: 'error'});
- } else {
- OC.Notification.show(message || t('files', 'Error when assembling chunks, status code {status}', {status: status}), {type: 'error'});
- }
- self.trigger('fail', e, data);
- });
- });
- fileupload.on('fileuploaddrop', function(e, data) {
- self.trigger('drop', e, data);
- if (e.isPropagationStopped()) {
- return false;
- }
- });
- }
- window.onbeforeunload = function() {
- return self.confirmBeforeUnload();
- }
- }
-
- //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
- if (navigator.userAgent.search(/konqueror/i) === -1) {
- this.$uploadEl.attr('multiple', 'multiple');
- }
-
- return this.fileUploadParam;
- }
-}, OC.Backbone.Events);
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
deleted file mode 100644
index 8790eae9c98..00000000000
--- a/apps/files/js/fileactions.js
+++ /dev/null
@@ -1,867 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
-
- /**
- * Construct a new FileActions instance
- * @constructs FileActions
- * @memberof OCA.Files
- */
- var FileActions = function() {
- this.initialize();
- };
- FileActions.TYPE_DROPDOWN = 0;
- FileActions.TYPE_INLINE = 1;
- FileActions.prototype = {
- /** @lends FileActions.prototype */
- actions: {},
- defaults: {},
- icons: {},
-
- /**
- * @deprecated
- */
- currentFile: null,
-
- /**
- * Dummy jquery element, for events
- */
- $el: null,
-
- _fileActionTriggerTemplate: null,
-
- /**
- * @private
- */
- initialize: function() {
- this.clear();
- // abusing jquery for events until we get a real event lib
- this.$el = $('<div class="dummy-fileactions hidden"></div>');
- $('body').append(this.$el);
-
- this._showMenuClosure = _.bind(this._showMenu, this);
- },
-
- /**
- * Adds an event handler
- *
- * @param {String} eventName event name
- * @param {Function} callback
- */
- on: function(eventName, callback) {
- this.$el.on(eventName, callback);
- },
-
- /**
- * Removes an event handler
- *
- * @param {String} eventName event name
- * @param {Function} callback
- */
- off: function(eventName, callback) {
- this.$el.off(eventName, callback);
- },
-
- /**
- * Notifies the event handlers
- *
- * @param {String} eventName event name
- * @param {Object} data data
- */
- _notifyUpdateListeners: function(eventName, data) {
- this.$el.trigger(new $.Event(eventName, data));
- },
-
- /**
- * Merges the actions from the given fileActions into
- * this instance.
- *
- * @param {OCA.Files.FileActions} fileActions instance of OCA.Files.FileActions
- */
- merge: function(fileActions) {
- var self = this;
- // merge first level to avoid unintended overwriting
- _.each(fileActions.actions, function(sourceMimeData, mime) {
- var targetMimeData = self.actions[mime];
- if (!targetMimeData) {
- targetMimeData = {};
- }
- self.actions[mime] = _.extend(targetMimeData, sourceMimeData);
- });
-
- this.defaults = _.extend(this.defaults, fileActions.defaults);
- this.icons = _.extend(this.icons, fileActions.icons);
- },
- /**
- * @deprecated use #registerAction() instead
- */
- register: function(mime, name, permissions, icon, action, displayName) {
- return this.registerAction({
- name: name,
- mime: mime,
- permissions: permissions,
- icon: icon,
- actionHandler: action,
- displayName: displayName || name
- });
- },
-
- /**
- * Register action
- *
- * @param {OCA.Files.FileAction} action object
- */
- registerAction: function (action) {
- var mime = action.mime;
- var name = action.name;
- var actionSpec = {
- action: function(fileName, context) {
- // Actions registered in one FileAction may be executed on a
- // different one (for example, due to the "merge" function),
- // so the listeners have to be updated on the FileActions
- // from the context instead of on the one in which it was
- // originally registered.
- if (context && context.fileActions) {
- context.fileActions._notifyUpdateListeners('beforeTriggerAction', {action: actionSpec, fileName: fileName, context: context});
- }
-
- action.actionHandler(fileName, context);
-
- if (context && context.fileActions) {
- context.fileActions._notifyUpdateListeners('afterTriggerAction', {action: actionSpec, fileName: fileName, context: context});
- }
- },
- name: name,
- displayName: action.displayName,
- mime: mime,
- filename: action.filename,
- order: action.order || 0,
- icon: action.icon,
- iconClass: action.iconClass,
- permissions: action.permissions,
- type: action.type || FileActions.TYPE_DROPDOWN,
- altText: action.altText || ''
- };
- if (_.isUndefined(action.displayName)) {
- actionSpec.displayName = t('files', name);
- }
- if (_.isFunction(action.render)) {
- actionSpec.render = action.render;
- }
- if (_.isFunction(action.shouldRender)) {
- actionSpec.shouldRender = action.shouldRender;
- }
- if (!this.actions[mime]) {
- this.actions[mime] = {};
- }
- this.actions[mime][name] = actionSpec;
- this.icons[name] = action.icon;
- this._notifyUpdateListeners('registerAction', {action: action});
- },
- /**
- * Clears all registered file actions.
- */
- clear: function() {
- this.actions = {};
- this.defaults = {};
- this.icons = {};
- this.currentFile = null;
- },
- /**
- * Sets the default action for a given mime type.
- *
- * @param {String} mime mime type
- * @param {String} name action name
- */
- setDefault: function (mime, name) {
- this.defaults[mime] = name;
- this._notifyUpdateListeners('setDefault', {defaultAction: {mime: mime, name: name}});
- },
-
- /**
- * Returns a map of file actions handlers matching the given conditions
- *
- * @param {string} mime mime type
- * @param {string} type "dir" or "file"
- * @param {number} permissions permissions
- * @param {string} filename filename
- *
- * @return {Object.<string,OCA.Files.FileActions~actionHandler>} map of action name to action spec
- */
- get: function(mime, type, permissions, filename) {
- var actions = this.getActions(mime, type, permissions, filename);
- var filteredActions = {};
- $.each(actions, function (name, action) {
- filteredActions[name] = action.action;
- });
- return filteredActions;
- },
-
- /**
- * Returns an array of file actions matching the given conditions
- *
- * @param {string} mime mime type
- * @param {string} type "dir" or "file"
- * @param {number} permissions permissions
- * @param {string} filename filename
- *
- * @return {Array.<OCA.Files.FileAction>} array of action specs
- */
- getActions: function(mime, type, permissions, filename) {
- var actions = {};
- if (this.actions.all) {
- actions = $.extend(actions, this.actions.all);
- }
- if (type) {//type is 'dir' or 'file'
- if (this.actions[type]) {
- actions = $.extend(actions, this.actions[type]);
- }
- }
- if (mime) {
- var mimePart = mime.substr(0, mime.indexOf('/'));
- if (this.actions[mimePart]) {
- actions = $.extend(actions, this.actions[mimePart]);
- }
- if (this.actions[mime]) {
- actions = $.extend(actions, this.actions[mime]);
- }
- }
-
- var filteredActions = {};
- var self = this;
- $.each(actions, function(name, action) {
- if (self.allowedPermissions(action.permissions, permissions) &&
- self.allowedFilename(action.filename, filename)) {
- filteredActions[name] = action;
- }
- });
-
- return filteredActions;
- },
-
-
- allowedPermissions: function(actionPermissions, permissions) {
- return (actionPermissions === OC.PERMISSION_NONE || (actionPermissions & permissions));
- },
-
- allowedFilename: function(actionFilename, filename) {
- return (!filename || filename === '' || !actionFilename
- || actionFilename === '' || actionFilename === filename);
- },
-
- /**
- * Returns the default file action handler for the given conditions
- *
- * @param {string} mime mime type
- * @param {string} type "dir" or "file"
- * @param {number} permissions permissions
- *
- * @return {OCA.Files.FileActions~actionHandler} action handler
- *
- * @deprecated use getDefaultFileAction instead
- */
- getDefault: function (mime, type, permissions) {
- var defaultActionSpec = this.getDefaultFileAction(mime, type, permissions);
- if (defaultActionSpec) {
- return defaultActionSpec.action;
- }
- return undefined;
- },
-
- /**
- * Returns the default file action handler for the current file
- *
- * @return {OCA.Files.FileActions~actionSpec} action spec
- * @since 8.2
- */
- getCurrentDefaultFileAction: function() {
- var mime = this.getCurrentMimeType();
- var type = this.getCurrentType();
- var permissions = this.getCurrentPermissions();
- return this.getDefaultFileAction(mime, type, permissions);
- },
-
- /**
- * Returns the default file action handler for the given conditions
- *
- * @param {string} mime mime type
- * @param {string} type "dir" or "file"
- * @param {number} permissions permissions
- *
- * @return {OCA.Files.FileActions~actionSpec} action spec
- * @since 8.2
- */
- getDefaultFileAction: function(mime, type, permissions) {
- var mimePart;
- if (mime) {
- mimePart = mime.substr(0, mime.indexOf('/'));
- }
- var name = false;
- if (mime && this.defaults[mime]) {
- name = this.defaults[mime];
- } else if (mime && this.defaults[mimePart]) {
- name = this.defaults[mimePart];
- } else if (type && this.defaults[type]) {
- name = this.defaults[type];
- } else {
- name = this.defaults.all;
- }
- var actions = this.getActions(mime, type, permissions);
- return actions[name];
- },
-
- /**
- * Default function to render actions
- *
- * @param {OCA.Files.FileAction} actionSpec file action spec
- * @param {boolean} isDefault true if the action is a default one,
- * false otherwise
- * @param {OCA.Files.FileActionContext} context action context
- */
- _defaultRenderAction: function(actionSpec, isDefault, context) {
- if (!isDefault) {
- var params = {
- name: actionSpec.name,
- nameLowerCase: actionSpec.name.toLowerCase(),
- displayName: actionSpec.displayName,
- icon: actionSpec.icon,
- iconClass: actionSpec.iconClass,
- altText: actionSpec.altText,
- hasDisplayName: !!actionSpec.displayName
- };
- if (_.isFunction(actionSpec.icon)) {
- params.icon = actionSpec.icon(context.$file.attr('data-file'), context);
- }
- if (_.isFunction(actionSpec.iconClass)) {
- params.iconClass = actionSpec.iconClass(context.$file.attr('data-file'), context);
- }
-
- var $actionLink = this._makeActionLink(params, context);
- context.$file.find('a.name>span.fileactions').append($actionLink);
- $actionLink.addClass('permanent');
- return $actionLink;
- }
- },
-
- /**
- * Renders the action link element
- *
- * @param {Object} params action params
- */
- _makeActionLink: function(params) {
- return $(OCA.Files.Templates['file_action_trigger'](params));
- },
-
- /**
- * Displays the file actions dropdown menu
- *
- * @param {string} fileName file name
- * @param {OCA.Files.FileActionContext} context rendering context
- */
- _showMenu: function(fileName, context) {
- var menu;
- var $trigger = context.$file.closest('tr').find('.fileactions .action-menu');
- $trigger.addClass('open');
-
- menu = new OCA.Files.FileActionsMenu();
-
- context.$file.find('td.filename').append(menu.$el);
-
- menu.$el.on('afterHide', function() {
- context.$file.removeClass('mouseOver');
- $trigger.removeClass('open');
- menu.remove();
- });
-
- context.$file.addClass('mouseOver');
- menu.show(context);
- },
-
- /**
- * Renders the menu trigger on the given file list row
- *
- * @param {Object} $tr file list row element
- * @param {OCA.Files.FileActionContext} context rendering context
- */
- _renderMenuTrigger: function($tr, context) {
- // remove previous
- $tr.find('.action-menu').remove();
-
- var $el = this._renderInlineAction({
- name: 'menu',
- displayName: '',
- iconClass: 'icon-more',
- altText: t('files', 'Actions'),
- action: this._showMenuClosure
- }, false, context);
-
- $el.addClass('permanent');
-
- },
-
- /**
- * Renders the action element by calling actionSpec.render() and
- * registers the click event to process the action.
- *
- * @param {OCA.Files.FileAction} actionSpec file action to render
- * @param {boolean} isDefault true if the action is a default action,
- * false otherwise
- * @param {OCA.Files.FileActionContext} context rendering context
- */
- _renderInlineAction: function(actionSpec, isDefault, context) {
- if (actionSpec.shouldRender) {
- if (!actionSpec.shouldRender(context)) {
- return;
- }
- }
- var renderFunc = actionSpec.render || _.bind(this._defaultRenderAction, this);
- var $actionEl = renderFunc(actionSpec, isDefault, context);
- if (!$actionEl || !$actionEl.length) {
- return;
- }
- $actionEl.on(
- 'click', {
- a: null
- },
- function(event) {
- event.stopPropagation();
- event.preventDefault();
-
- if ($actionEl.hasClass('open')) {
- return;
- }
-
- var $file = $(event.target).closest('tr');
- if ($file.hasClass('busy')) {
- return;
- }
- var currentFile = $file.find('td.filename');
- var fileName = $file.attr('data-file');
-
- context.fileActions.currentFile = currentFile;
-
- var callContext = _.extend({}, context);
-
- if (!context.dir && context.fileList) {
- callContext.dir = $file.attr('data-path') || context.fileList.getCurrentDirectory();
- }
-
- if (!context.fileInfoModel && context.fileList) {
- callContext.fileInfoModel = context.fileList.getModelForFile(fileName);
- if (!callContext.fileInfoModel) {
- console.warn('No file info model found for file "' + fileName + '"');
- }
- }
-
- actionSpec.action(
- fileName,
- callContext
- );
- }
- );
- $actionEl.tooltip({placement:'top'});
- return $actionEl;
- },
-
- /**
- * Trigger the given action on the given file.
- *
- * @param {string} actionName action name
- * @param {OCA.Files.FileInfoModel} fileInfoModel file info model
- * @param {OCA.Files.FileList} [fileList] file list, for compatibility with older action handlers [DEPRECATED]
- *
- * @return {boolean} true if the action handler was called, false otherwise
- *
- * @since 8.2
- */
- triggerAction: function(actionName, fileInfoModel, fileList) {
- var actionFunc;
- var actions = this.get(
- fileInfoModel.get('mimetype'),
- fileInfoModel.isDirectory() ? 'dir' : 'file',
- fileInfoModel.get('permissions'),
- fileInfoModel.get('name')
- );
-
- if (actionName) {
- actionFunc = actions[actionName];
- } else {
- actionFunc = this.getDefault(
- fileInfoModel.get('mimetype'),
- fileInfoModel.isDirectory() ? 'dir' : 'file',
- fileInfoModel.get('permissions')
- );
- }
-
- if (!actionFunc) {
- actionFunc = actions['Download'];
- }
-
- if (!actionFunc) {
- return false;
- }
-
- var context = {
- fileActions: this,
- fileInfoModel: fileInfoModel,
- dir: fileInfoModel.get('path')
- };
-
- var fileName = fileInfoModel.get('name');
- this.currentFile = fileName;
-
- if (fileList) {
- // compatibility with action handlers that expect these
- context.fileList = fileList;
- context.$file = fileList.findFileEl(fileName);
- }
-
- actionFunc(fileName, context);
- },
-
- /**
- * Display file actions for the given element
- * @param parent "td" element of the file for which to display actions
- * @param triggerEvent if true, triggers the fileActionsReady on the file
- * list afterwards (false by default)
- * @param fileList OCA.Files.FileList instance on which the action is
- * done, defaults to OCA.Files.App.fileList
- */
- display: function (parent, triggerEvent, fileList) {
- if (!fileList) {
- console.warn('FileActions.display() MUST be called with a OCA.Files.FileList instance');
- return;
- }
- this.currentFile = parent;
- var self = this;
- var $tr = parent.closest('tr');
- var actions = this.getActions(
- this.getCurrentMimeType(),
- this.getCurrentType(),
- this.getCurrentPermissions(),
- this.getCurrentFile()
- );
- var nameLinks;
- if ($tr.data('renaming')) {
- return;
- }
-
- // recreate fileactions container
- nameLinks = parent.children('a.name');
- nameLinks.find('.fileactions, .nametext .action').remove();
- nameLinks.append('<span class="fileactions"></span>');
- var defaultAction = this.getDefaultFileAction(
- this.getCurrentMimeType(),
- this.getCurrentType(),
- this.getCurrentPermissions()
- );
-
- var context = {
- $file: $tr,
- fileActions: this,
- fileList: fileList
- };
-
- $.each(actions, function (name, actionSpec) {
- if (actionSpec.type === FileActions.TYPE_INLINE) {
- self._renderInlineAction(
- actionSpec,
- defaultAction && actionSpec.name === defaultAction.name,
- context
- );
- }
- });
-
- function objectValues(obj) {
- var res = [];
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- res.push(obj[i]);
- }
- }
- return res;
- }
- // polyfill
- if (!Object.values) {
- Object.values = objectValues;
- }
-
- var menuActions = Object.values(this.actions.all).filter(function (action) {
- return action.type !== OCA.Files.FileActions.TYPE_INLINE;
- });
- // do not render the menu if nothing is in it
- if (menuActions.length > 0) {
- this._renderMenuTrigger($tr, context);
- }
-
- if (triggerEvent){
- fileList.$fileList.trigger(jQuery.Event("fileActionsReady", {fileList: fileList, $files: $tr}));
- }
- },
- getCurrentFile: function () {
- return this.currentFile.parent().attr('data-file');
- },
- getCurrentMimeType: function () {
- return this.currentFile.parent().attr('data-mime');
- },
- getCurrentType: function () {
- return this.currentFile.parent().attr('data-type');
- },
- getCurrentPermissions: function () {
- return this.currentFile.parent().data('permissions');
- },
-
- /**
- * Register the actions that are used by default for the files app.
- */
- registerDefaultActions: function() {
- this.registerAction({
- name: 'Download',
- displayName: t('files', 'Download'),
- order: -20,
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- iconClass: 'icon-download',
- actionHandler: function (filename, context) {
- var dir = context.dir || context.fileList.getCurrentDirectory();
- var isDir = context.$file.attr('data-type') === 'dir';
- var url = context.fileList.getDownloadUrl(filename, dir, isDir);
-
- var downloadFileaction = $(context.$file).find('.fileactions .action-download');
-
- // don't allow a second click on the download action
- if(downloadFileaction.hasClass('disabled')) {
- return;
- }
-
- if (url) {
- var disableLoadingState = function() {
- context.fileList.showFileBusyState(filename, false);
- };
-
- context.fileList.showFileBusyState(filename, true);
- OCA.Files.Files.handleDownload(url, disableLoadingState);
- }
- }
- });
-
- this.registerAction({
- name: 'Rename',
- displayName: t('files', 'Rename'),
- mime: 'all',
- order: -30,
- permissions: OC.PERMISSION_UPDATE,
- iconClass: 'icon-rename',
- actionHandler: function (filename, context) {
- context.fileList.rename(filename);
- }
- });
-
- this.registerAction({
- name: 'MoveCopy',
- displayName: function(context) {
- var permissions = context.fileInfoModel.attributes.permissions;
- if (permissions & OC.PERMISSION_UPDATE) {
- return t('files', 'Move or copy');
- }
- return t('files', 'Copy');
- },
- mime: 'all',
- order: -25,
- permissions: $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ,
- iconClass: 'icon-external',
- actionHandler: function (filename, context) {
- var permissions = context.fileInfoModel.attributes.permissions;
- var actions = OC.dialogs.FILEPICKER_TYPE_COPY;
- if (permissions & OC.PERMISSION_UPDATE) {
- actions = OC.dialogs.FILEPICKER_TYPE_COPY_MOVE;
- }
- var dialogDir = context.dir;
- if (typeof context.fileList.dirInfo.dirLastCopiedTo !== 'undefined') {
- dialogDir = context.fileList.dirInfo.dirLastCopiedTo;
- }
- OC.dialogs.filepicker(t('files', 'Choose target folder'), function(targetPath, type) {
- if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
- context.fileList.copy(filename, targetPath, false, context.dir);
- }
- if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
- context.fileList.move(filename, targetPath, false, context.dir);
- }
- context.fileList.dirInfo.dirLastCopiedTo = targetPath;
- }, false, "httpd/unix-directory", true, actions, dialogDir);
- }
- });
-
- this.registerAction({
- name: 'Open',
- mime: 'dir',
- permissions: OC.PERMISSION_READ,
- icon: '',
- actionHandler: function (filename, context) {
- let dir, id
- if (context.$file) {
- dir = context.$file.attr('data-path')
- id = context.$file.attr('data-id')
- } else {
- dir = context.fileList.getCurrentDirectory()
- id = context.fileId
- }
- if (OCA.Files.App && OCA.Files.App.getActiveView() !== 'files') {
- OCA.Files.App.setActiveView('files', {silent: true});
- OCA.Files.App.fileList.changeDirectory(OC.joinPaths(dir, filename), true, true);
- } else {
- context.fileList.changeDirectory(OC.joinPaths(dir, filename), true, false, parseInt(id, 10));
- }
- },
- displayName: t('files', 'Open')
- });
-
- this.registerAction({
- name: 'Delete',
- displayName: function(context) {
- var mountType = context.$file.attr('data-mounttype');
- var type = context.$file.attr('data-type');
- var deleteTitle = (type && type === 'file')
- ? t('files', 'Delete file')
- : t('files', 'Delete folder')
- if (mountType === 'external-root') {
- deleteTitle = t('files', 'Disconnect storage');
- } else if (mountType === 'shared-root') {
- deleteTitle = t('files', 'Leave this share');
- }
- return deleteTitle;
- },
- mime: 'all',
- order: 1000,
- // permission is READ because we show a hint instead if there is no permission
- permissions: OC.PERMISSION_DELETE,
- iconClass: 'icon-delete',
- actionHandler: function(fileName, context) {
- // if there is no permission to delete do nothing
- if((context.$file.data('permissions') & OC.PERMISSION_DELETE) === 0) {
- return;
- }
- context.fileList.do_delete(fileName, context.dir);
- $('.tipsy').remove();
-
- // close sidebar on delete
- const path = context.dir + '/' + fileName
- if (OCA.Files.Sidebar && OCA.Files.Sidebar.file === path) {
- OCA.Files.Sidebar.close()
- }
- }
- });
-
- this.setDefault('dir', 'Open');
- }
- };
-
- OCA.Files.FileActions = FileActions;
-
- /**
- * Replaces the button icon with a loading spinner and vice versa
- * - also adds the class disabled to the passed in element
- *
- * @param {jQuery} $buttonElement The button element
- * @param {boolean} showIt whether to show the spinner(true) or to hide it(false)
- */
- OCA.Files.FileActions.updateFileActionSpinner = function($buttonElement, showIt) {
- var $icon = $buttonElement.find('.icon');
- if (showIt) {
- var $loadingIcon = $('<span class="icon icon-loading-small"></span>');
- $icon.after($loadingIcon);
- $icon.addClass('hidden');
- } else {
- $buttonElement.find('.icon-loading-small').remove();
- $buttonElement.find('.icon').removeClass('hidden');
- }
- };
-
- /**
- * File action attributes.
- *
- * @todo make this a real class in the future
- * @typedef {Object} OCA.Files.FileAction
- *
- * @property {String} name identifier of the action
- * @property {(String|OCA.Files.FileActions~displayNameFunction)} displayName
- * display name string for the action, or function that returns the display name.
- * Defaults to the name given in name property
- * @property {String} mime mime type
- * @property {String} filename filename
- * @property {number} permissions permissions
- * @property {(Function|String)} icon icon path to the icon or function that returns it (deprecated, use iconClass instead)
- * @property {(String|OCA.Files.FileActions~iconClassFunction)} iconClass class name of the icon (recommended for theming)
- * @property {OCA.Files.FileActions~renderActionFunction} [render] optional rendering function
- * @property {OCA.Files.FileActions~actionHandler} actionHandler action handler function
- */
-
- /**
- * File action context attributes.
- *
- * @typedef {Object} OCA.Files.FileActionContext
- *
- * @property {Object} $file jQuery file row element
- * @property {OCA.Files.FileActions} fileActions file actions object
- * @property {OCA.Files.FileList} fileList file list object
- */
-
- /**
- * Render function for actions.
- * The function must render a link element somewhere in the DOM
- * and return it. The function should NOT register the event handler
- * as this will be done after the link was returned.
- *
- * @callback OCA.Files.FileActions~renderActionFunction
- * @param {OCA.Files.FileAction} actionSpec action definition
- * @param {Object} $row row container
- * @param {boolean} isDefault true if the action is the default one,
- * false otherwise
- * @return {Object} jQuery link object
- */
-
- /**
- * Display name function for actions.
- * The function returns the display name of the action using
- * the given context information..
- *
- * @callback OCA.Files.FileActions~displayNameFunction
- * @param {OCA.Files.FileActionContext} context action context
- * @return {String} display name
- */
-
- /**
- * Icon class function for actions.
- * The function returns the icon class of the action using
- * the given context information.
- *
- * @callback OCA.Files.FileActions~iconClassFunction
- * @param {String} fileName name of the file on which the action must be performed
- * @param {OCA.Files.FileActionContext} context action context
- * @return {String} icon class
- */
-
- /**
- * Action handler function for file actions
- *
- * @callback OCA.Files.FileActions~actionHandler
- * @param {String} fileName name of the file on which the action must be performed
- * @param context context
- * @param {String} context.dir directory of the file
- * @param {OCA.Files.FileInfoModel} fileInfoModel file info model
- * @param {Object} [context.$file] jQuery element of the file [DEPRECATED]
- * @param {OCA.Files.FileList} [context.fileList] the FileList instance on which the action occurred [DEPRECATED]
- * @param {OCA.Files.FileActions} context.fileActions the FileActions instance on which the action occurred
- */
-
- // global file actions to be used by all lists
- OCA.Files.fileActions = new OCA.Files.FileActions();
-})();
diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js
deleted file mode 100644
index c252ffa96b0..00000000000
--- a/apps/files/js/fileactionsmenu.js
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
-
- /**
- * Construct a new FileActionsMenu instance
- * @constructs FileActionsMenu
- * @memberof OCA.Files
- */
- var FileActionsMenu = OC.Backbone.View.extend({
- tagName: 'div',
- className: 'fileActionsMenu popovermenu bubble hidden open menu',
-
- /**
- * Current context
- *
- * @type OCA.Files.FileActionContext
- */
- _context: null,
-
- events: {
- 'click a.action': '_onClickAction'
- },
-
- template: function(data) {
- return OCA.Files.Templates['fileactionsmenu'](data);
- },
-
- /**
- * Event handler whenever an action has been clicked within the menu
- *
- * @param {Object} event event object
- */
- _onClickAction: function(event) {
- var $target = $(event.target);
- if (!$target.is('a')) {
- $target = $target.closest('a');
- }
- var fileActions = this._context.fileActions;
- var actionName = $target.attr('data-action');
- var actions = fileActions.getActions(
- fileActions.getCurrentMimeType(),
- fileActions.getCurrentType(),
- fileActions.getCurrentPermissions(),
- fileActions.getCurrentFile()
- );
- var actionSpec = actions[actionName];
- var fileName = this._context.$file.attr('data-file');
-
- event.stopPropagation();
- event.preventDefault();
-
- OC.hideMenus();
-
- actionSpec.action(
- fileName,
- this._context
- );
- },
-
- /**
- * Renders the menu with the currently set items
- */
- render: function() {
- var self = this;
- var fileActions = this._context.fileActions;
- var actions = fileActions.getActions(
- fileActions.getCurrentMimeType(),
- fileActions.getCurrentType(),
- fileActions.getCurrentPermissions(),
- fileActions.getCurrentFile()
- );
-
- var defaultAction = fileActions.getCurrentDefaultFileAction();
-
- var items = _.filter(actions, function(actionSpec) {
- return !defaultAction || actionSpec.name !== defaultAction.name;
- });
- items = _.map(items, function(item) {
- if (_.isFunction(item.displayName)) {
- item = _.extend({}, item);
- item.displayName = item.displayName(self._context);
- }
- if (_.isFunction(item.iconClass)) {
- var fileName = self._context.$file.attr('data-file');
- item = _.extend({}, item);
- item.iconClass = item.iconClass(fileName, self._context);
- }
- if (_.isFunction(item.icon)) {
- var fileName = self._context.$file.attr('data-file');
- item = _.extend({}, item);
- item.icon = item.icon(fileName, self._context);
- }
- item.inline = item.type === OCA.Files.FileActions.TYPE_INLINE
- return item;
- });
- items = items.sort(function(actionA, actionB) {
- var orderA = actionA.order || 0;
- var orderB = actionB.order || 0;
- if (orderB === orderA) {
- return OC.Util.naturalSortCompare(actionA.displayName, actionB.displayName);
- }
- return orderA - orderB;
- });
-
- items = _.map(items, function(item) {
- item.nameLowerCase = item.name.toLowerCase();
- return item;
- });
-
- this.$el.html(this.template({
- items: items
- }));
- },
-
- /**
- * Displays the menu under the given element
- *
- * @param {OCA.Files.FileActionContext} context context
- * @param {Object} $trigger trigger element
- */
- show: function(context) {
- this._context = context;
-
- this.render();
- this.$el.removeClass('hidden');
-
- OC.showMenu(null, this.$el);
- }
- });
-
- OCA.Files.FileActionsMenu = FileActionsMenu;
-
-})();
-
diff --git a/apps/files/js/fileinfomodel.js b/apps/files/js/fileinfomodel.js
deleted file mode 100644
index 8e7b399544c..00000000000
--- a/apps/files/js/fileinfomodel.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function(OC, OCA) {
-
- /**
- * @class OC.Files.FileInfo
- * @classdesc File information
- *
- * @param {Object} attributes file data
- * @param {number} attributes.id file id
- * @param {string} attributes.name file name
- * @param {string} attributes.path path leading to the file,
- * without the file name and with a leading slash
- * @param {number} attributes.size size
- * @param {string} attributes.mimetype mime type
- * @param {string} attributes.icon icon URL
- * @param {number} attributes.permissions permissions
- * @param {Date} attributes.mtime modification time
- * @param {string} attributes.etag etag
- * @param {string} mountType mount type
- *
- * @since 8.2
- */
- var FileInfoModel = OC.Backbone.Model.extend({
-
- defaults: {
- mimetype: 'application/octet-stream',
- path: ''
- },
-
- _filesClient: null,
-
- initialize: function(data, options) {
- if (!_.isUndefined(data.id)) {
- data.id = parseInt(data.id, 10);
- }
-
- if( options ){
- if (options.filesClient) {
- this._filesClient = options.filesClient;
- }
- }
- },
-
- /**
- * Returns whether this file is a directory
- *
- * @return {boolean} true if this is a directory, false otherwise
- */
- isDirectory: function() {
- return this.get('mimetype') === 'httpd/unix-directory';
- },
-
- /**
- * Returns whether this file is an image
- *
- * @return {boolean} true if this is an image, false otherwise
- */
- isImage: function() {
- if (!this.has('mimetype')) {
- return false;
- }
- return this.get('mimetype').substr(0, 6) === 'image/'
- || this.get('mimetype') === 'application/postscript'
- || this.get('mimetype') === 'application/illustrator'
- || this.get('mimetype') === 'application/x-photoshop';
- },
-
- /**
- * Returns the full path to this file
- *
- * @return {string} full path
- */
- getFullPath: function() {
- return OC.joinPaths(this.get('path'), this.get('name'));
- },
-
- /**
- * Reloads missing properties from server and set them in the model.
- * @param properties array of properties to be reloaded
- * @return ajax call object
- */
- reloadProperties: function(properties) {
- if( !this._filesClient ){
- return;
- }
-
- var self = this;
- var deferred = $.Deferred();
-
- var targetPath = OC.joinPaths(this.get('path') + '/', this.get('name'));
-
- this._filesClient.getFileInfo(targetPath, {
- properties: properties
- })
- .then(function(status, data) {
- // the following lines should be extracted to a mapper
-
- if( properties.indexOf(OC.Files.Client.PROPERTY_GETCONTENTLENGTH) !== -1
- || properties.indexOf(OC.Files.Client.PROPERTY_SIZE) !== -1 ) {
- self.set('size', data.size);
- }
-
- deferred.resolve(status, data);
- })
- .fail(function(status) {
- OC.Notification.show(t('files', 'Could not load info for file "{file}"', {file: self.get('name')}), {type: 'error'});
- deferred.reject(status);
- });
-
- return deferred.promise();
- }
- });
-
- if (!OCA.Files) {
- OCA.Files = {};
- }
- OCA.Files.FileInfoModel = FileInfoModel;
-
-})(OC, OCA);
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
deleted file mode 100644
index 85b9e883ac6..00000000000
--- a/apps/files/js/filelist.js
+++ /dev/null
@@ -1,4024 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
-
- /**
- * @class OCA.Files.FileList
- * @classdesc
- *
- * The FileList class manages a file list view.
- * A file list view consists of a controls bar and
- * a file list table.
- *
- * @param $el container element with existing markup for the #controls
- * and a table
- * @param {Object} [options] map of options, see other parameters
- * @param {Object} [options.scrollContainer] scrollable container, defaults to $(window)
- * @param {Object} [options.dragOptions] drag options, disabled by default
- * @param {Object} [options.folderDropOptions] folder drop options, disabled by default
- * @param {boolean} [options.detailsViewEnabled=true] whether to enable details view
- * @param {boolean} [options.enableUpload=false] whether to enable uploader
- * @param {OC.Files.Client} [options.filesClient] files client to use
- */
- var FileList = function($el, options) {
- this.initialize($el, options);
- };
- /**
- * @memberof OCA.Files
- */
- FileList.prototype = {
- SORT_INDICATOR_ASC_CLASS: 'icon-triangle-n',
- SORT_INDICATOR_DESC_CLASS: 'icon-triangle-s',
-
- id: 'files',
- appName: t('files', 'Files'),
- isEmpty: true,
- useUndo:true,
-
- /**
- * Top-level container with controls and file list
- */
- $el: null,
-
- /**
- * Files table
- */
- $table: null,
-
- /**
- * List of rows (table tbody)
- */
- $fileList: null,
-
- $header: null,
- headers: [],
-
- $footer: null,
- footers: [],
-
- /**
- * @type OCA.Files.BreadCrumb
- */
- breadcrumb: null,
-
- /**
- * @type OCA.Files.FileSummary
- */
- fileSummary: null,
-
- /**
- * @type OCA.Files.DetailsView
- */
- _detailsView: null,
-
- /**
- * Files client instance
- *
- * @type OC.Files.Client
- */
- filesClient: null,
-
- /**
- * Whether the file list was initialized already.
- * @type boolean
- */
- initialized: false,
-
- /**
- * Wheater the file list was already shown once
- * @type boolean
- */
- shown: false,
-
- /**
- * Number of files per page
- * Always show a minimum of 1
- *
- * @return {number} page size
- */
- pageSize: function() {
- var isGridView = this.$showGridView.is(':checked');
- var columns = 1;
- var rows = Math.ceil(this.$container.height() / 50);
- if (isGridView) {
- columns = Math.ceil(this.$container.width() / 160);
- rows = Math.ceil(this.$container.height() / 160);
- }
- return Math.max(columns*rows, columns);
- },
-
- /**
- * Array of files in the current folder.
- * The entries are of file data.
- *
- * @type Array.<OC.Files.FileInfo>
- */
- files: [],
-
- /**
- * Current directory entry
- *
- * @type OC.Files.FileInfo
- */
- dirInfo: null,
-
- /**
- * Whether to prevent or to execute the default file actions when the
- * file name is clicked.
- *
- * @type boolean
- */
- _defaultFileActionsDisabled: false,
-
- /**
- * File actions handler, defaults to OCA.Files.FileActions
- * @type OCA.Files.FileActions
- */
- fileActions: null,
- /**
- * File selection menu, defaults to OCA.Files.FileSelectionMenu
- * @type OCA.Files.FileSelectionMenu
- */
- fileMultiSelectMenu: null,
- /**
- * Whether selection is allowed, checkboxes and selection overlay will
- * be rendered
- */
- _allowSelection: true,
-
- /**
- * Map of file id to file data
- * @type Object.<int, Object>
- */
- _selectedFiles: {},
-
- /**
- * Summary of selected files.
- * @type OCA.Files.FileSummary
- */
- _selectionSummary: null,
-
- /**
- * If not empty, only files containing this string will be shown
- * @type String
- */
- _filter: '',
-
- /**
- * @type Backbone.Model
- */
- _filesConfig: undefined,
-
- /**
- * Sort attribute
- * @type String
- */
- _sort: 'name',
-
- /**
- * Sort direction: 'asc' or 'desc'
- * @type String
- */
- _sortDirection: 'asc',
-
- /**
- * Sort comparator function for the current sort
- * @type Function
- */
- _sortComparator: null,
-
- /**
- * Whether to do a client side sort.
- * When false, clicking on a table header will call reload().
- * When true, clicking on a table header will simply resort the list.
- */
- _clientSideSort: true,
-
- /**
- * Whether or not users can change the sort attribute or direction
- */
- _allowSorting: true,
-
- /**
- * Current directory
- * @type String
- */
- _currentDirectory: null,
-
- _dragOptions: null,
- _folderDropOptions: null,
-
- /**
- * @type OC.Uploader
- */
- _uploader: null,
-
- /**
- * Initialize the file list and its components
- *
- * @param $el container element with existing markup for the #controls
- * and a table
- * @param options map of options, see other parameters
- * @param options.scrollContainer scrollable container, defaults to $(window)
- * @param options.dragOptions drag options, disabled by default
- * @param options.folderDropOptions folder drop options, disabled by default
- * @param options.scrollTo name of file to scroll to after the first load
- * @param {OC.Files.Client} [options.filesClient] files API client
- * @param {OC.Backbone.Model} [options.filesConfig] files app configuration
- * @private
- */
- initialize: function($el, options) {
- var self = this;
- options = options || {};
- if (this.initialized) {
- return;
- }
-
- if (options.shown) {
- this.shown = options.shown;
- }
-
- if (options.config) {
- this._filesConfig = options.config;
- } else if (!_.isUndefined(OCA.Files) && !_.isUndefined(OCA.Files.App)) {
- this._filesConfig = OCA.Files.App.getFilesConfig();
- } else {
- this._filesConfig = new OC.Backbone.Model({
- 'showhidden': false,
- 'cropimagepreviews': true
- });
- }
-
- if (options.dragOptions) {
- this._dragOptions = options.dragOptions;
- }
- if (options.folderDropOptions) {
- this._folderDropOptions = options.folderDropOptions;
- }
- if (options.filesClient) {
- this.filesClient = options.filesClient;
- } else {
- // default client if not specified
- this.filesClient = OC.Files.getClient();
- }
-
- this.$el = $el;
- if (options.id) {
- this.id = options.id;
- }
- this.$container = options.scrollContainer || $(window);
- this.$table = $el.find('table:first');
- this.$fileList = $el.find('#fileList');
- this.$header = $el.find('#filelist-header');
- this.$footer = $el.find('#filelist-footer');
-
- if (!_.isUndefined(this._filesConfig)) {
- this._filesConfig.on('change:showhidden', function() {
- var showHidden = this.get('showhidden');
- self.$el.toggleClass('hide-hidden-files', !showHidden);
- self.updateSelectionSummary();
-
- if (!showHidden) {
- // hiding files could make the page too small, need to try rendering next page
- self._onScroll();
- }
- });
-
- this._filesConfig.on('change:cropimagepreviews', function() {
- self.reload();
- });
-
- this.$el.toggleClass('hide-hidden-files', !this._filesConfig.get('showhidden'));
- }
-
-
- if (_.isUndefined(options.detailsViewEnabled) || options.detailsViewEnabled) {
- this._detailsView = new OCA.Files.DetailsView();
- this._detailsView.$el.addClass('disappear');
- }
-
- if (options && options.defaultFileActionsDisabled) {
- this._defaultFileActionsDisabled = options.defaultFileActionsDisabled
- }
-
- this._initFileActions(options.fileActions);
-
- if (this._detailsView) {
- this._detailsView.addDetailView(new OCA.Files.MainFileInfoDetailView({fileList: this, fileActions: this.fileActions}));
- }
-
- this.files = [];
- this._selectedFiles = {};
- this._selectionSummary = new OCA.Files.FileSummary(undefined, {config: this._filesConfig});
- // dummy root dir info
- this.dirInfo = new OC.Files.FileInfo({});
-
- this.fileSummary = this._createSummary();
-
- if (options.multiSelectMenu) {
- this.multiSelectMenuItems = options.multiSelectMenu;
- for (var i=0; i<this.multiSelectMenuItems.length; i++) {
- if (_.isFunction(this.multiSelectMenuItems[i])) {
- this.multiSelectMenuItems[i] = this.multiSelectMenuItems[i](this);
- }
- }
- this._updateMultiSelectFileActions()
- }
-
- if (options.sorting) {
- this.setSort(options.sorting.mode, options.sorting.direction, false, false);
- } else {
- this.setSort('name', 'asc', false, false);
- }
-
- var breadcrumbOptions = {
- onClick: _.bind(this._onClickBreadCrumb, this),
- getCrumbUrl: function(part) {
- return self.linkTo(part.dir);
- }
- };
- // if dropping on folders is allowed, then also allow on breadcrumbs
- if (this._folderDropOptions) {
- breadcrumbOptions.onDrop = _.bind(this._onDropOnBreadCrumb, this);
- breadcrumbOptions.onOver = function() {
- self.$el.find('td.filename.ui-droppable').droppable('disable');
- };
- breadcrumbOptions.onOut = function() {
- self.$el.find('td.filename.ui-droppable').droppable('enable');
- };
- }
- this.breadcrumb = new OCA.Files.BreadCrumb(breadcrumbOptions);
-
- var $controls = this.$el.find('#controls');
- if ($controls.length > 0) {
- $controls.prepend(this.breadcrumb.$el);
- this.$table.addClass('has-controls');
- }
-
- this._renderNewButton();
-
- this.$el.find('thead th .columntitle').click(_.bind(this._onClickHeader, this));
-
- // Toggle for grid view, only register once
- this.$showGridView = $('input#showgridview:not(.registered)');
- this.$showGridView.on('change', _.bind(this._onGridviewChange, this));
- this.$showGridView.addClass('registered');
- $('#view-toggle').tooltip({placement: 'bottom', trigger: 'hover'});
-
- this._onResize = _.debounce(_.bind(this._onResize, this), 250);
- $('#app-content').on('appresized', this._onResize);
- $(window).resize(this._onResize);
-
- this.$el.on('show', this._onResize);
-
- // reload files list on share accept
- $('body').on('OCA.Notification.Action', function(eventObject) {
- if (eventObject.notification.app === 'files_sharing' && eventObject.action.type === 'POST') {
- self.reload()
- }
- });
-
- this.$fileList.on('click','td.filename>a.name, td.filesize, td.date', _.bind(this._onClickFile, this));
-
- this.$fileList.on("droppedOnFavorites", function (event, file) {
- self.fileActions.triggerAction('Favorite', self.getModelForFile(file), self);
- });
-
- this.$fileList.on('droppedOnTrash', function (event, filename, directory) {
- self.do_delete(filename, directory);
- });
-
- this.$fileList.on('change', 'td.selection>.selectCheckBox', _.bind(this._onClickFileCheckbox, this));
- this.$fileList.on('mouseover', 'td.selection', _.bind(this._onMouseOverCheckbox, this));
- this.$el.on('show', _.bind(this._onShow, this));
- this.$el.on('urlChanged', _.bind(this._onUrlChanged, this));
- this.$el.find('.select-all').click(_.bind(this._onClickSelectAll, this));
- this.$el.find('.actions-selected').click(function () {
- self.fileMultiSelectMenu.show(self);
- return false;
- });
-
- this.$container.on('scroll', _.bind(this._onScroll, this));
-
- if (options.scrollTo) {
- this.$fileList.one('updated', function() {
- self.scrollTo(options.scrollTo);
- });
- }
-
- if(options.openFile) {
- // Wait for some initialisation process to be over before triggering the default action.
- _.defer(() => {
- try {
- var fileInfo = JSON.parse(atob($('#initial-state-files-openFileInfo').val()))
- var spec = this.fileActions.getDefaultFileAction(fileInfo.mime, fileInfo.type, fileInfo.permissions)
- if (spec && spec.action) {
- spec.action(fileInfo.name, {
- fileId: fileInfo.id,
- fileList: this,
- fileActions: this.fileActions,
- dir: fileInfo.directory
- });
- } else {
- var url = this.getDownloadUrl(fileInfo.name, fileInfo.dir, true);
- OCA.Files.Files.handleDownload(url);
- }
-
- OCA.Files.Sidebar.open(fileInfo.path);
- } catch (error) {
- console.error(`Failed to trigger default action on the file for URL: ${location.href}`, error)
- }
- })
- }
-
- this._operationProgressBar = new OCA.Files.OperationProgressBar();
- this._operationProgressBar.render();
- this.$el.find('#uploadprogresswrapper').replaceWith(this._operationProgressBar.$el);
-
- if (options.enableUpload) {
- // TODO: auto-create this element
- var $uploadEl = this.$el.find('#file_upload_start');
- if ($uploadEl.exists()) {
- this._uploader = new OC.Uploader($uploadEl, {
- progressBar: this._operationProgressBar,
- fileList: this,
- filesClient: this.filesClient,
- dropZone: $('#content'),
- maxChunkSize: options.maxChunkSize
- });
-
- this.setupUploadEvents(this._uploader);
- }
- }
- this.triedActionOnce = false;
-
- OC.Plugins.attach('OCA.Files.FileList', this);
-
- OCA.Files.App && OCA.Files.App.updateCurrentFileList(this);
-
- this.initHeadersAndFooters()
- },
-
- initHeadersAndFooters: function() {
- this.headers.sort(function(a, b) {
- return a.order - b.order;
- })
- this.footers.sort(function(a, b) {
- return a.order - b.order;
- })
- var uniqueIds = [];
- var self = this;
- this.headers.forEach(function(header) {
- if (header.id) {
- if (uniqueIds.indexOf(header.id) !== -1) {
- return
- }
- uniqueIds.push(header.id)
- }
- self.$header.append(header.el)
-
- setTimeout(function() {
- header.render(self)
- }, 0)
- })
-
- uniqueIds = [];
- this.footers.forEach(function(footer) {
- if (footer.id) {
- if (uniqueIds.indexOf(footer.id) !== -1) {
- return
- }
- uniqueIds.push(footer.id)
- }
- self.$footer.append(footer.el)
- setTimeout(function() {
- footer.render(self)
- }, 0)
- })
- },
-
- /**
- * Destroy / uninitialize this instance.
- */
- destroy: function() {
- if (this._newFileMenu) {
- this._newFileMenu.remove();
- }
- if (this._newButton) {
- this._newButton.remove();
- }
- if (this._detailsView) {
- this._detailsView.remove();
- }
- // TODO: also unregister other event handlers
- this.fileActions.off('registerAction', this._onFileActionsUpdated);
- this.fileActions.off('setDefault', this._onFileActionsUpdated);
- OC.Plugins.detach('OCA.Files.FileList', this);
- $('#app-content').off('appresized', this._onResize);
- },
-
- _selectionMode: 'single',
- _getCurrentSelectionMode: function () {
- return this._selectionMode;
- },
- _onClickToggleSelectionMode: function () {
- this._selectionMode = (this._selectionMode === 'range') ? 'single' : 'range';
- if (this._selectionMode === 'single') {
- this._removeHalfSelection();
- }
- },
-
- multiSelectMenuClick: function (ev, action) {
- var actionFunction = _.find(this.multiSelectMenuItems, function (item) {return item.name === action;}).action;
- if (actionFunction) {
- actionFunction(this.getSelectedFiles());
- return;
- }
- switch (action) {
- case 'delete':
- this._onClickDeleteSelected(ev)
- break;
- case 'download':
- this._onClickDownloadSelected(ev);
- break;
- case 'copyMove':
- this._onClickCopyMoveSelected(ev);
- break;
- case 'restore':
- this._onClickRestoreSelected(ev);
- break;
- case 'tags':
- this._onClickTagSelected(ev);
- break;
- }
- },
- /**
- * Initializes the file actions, set up listeners.
- *
- * @param {OCA.Files.FileActions} fileActions file actions
- */
- _initFileActions: function(fileActions) {
- var self = this;
- this.fileActions = fileActions;
- if (!this.fileActions) {
- this.fileActions = new OCA.Files.FileActions();
- this.fileActions.registerDefaultActions();
- }
-
- if (this._detailsView) {
- this.fileActions.registerAction({
- name: 'Details',
- displayName: t('files', 'Details'),
- mime: 'all',
- order: -50,
- iconClass: 'icon-details',
- permissions: OC.PERMISSION_NONE,
- actionHandler: function(fileName, context) {
- self._updateDetailsView(fileName);
- }
- });
- }
-
- this._onFileActionsUpdated = _.debounce(_.bind(this._onFileActionsUpdated, this), 100);
- this.fileActions.on('registerAction', this._onFileActionsUpdated);
- this.fileActions.on('setDefault', this._onFileActionsUpdated);
- },
-
- /**
- * Returns a unique model for the given file name.
- *
- * @param {string|object} fileName file name or jquery row
- * @return {OCA.Files.FileInfoModel} file info model
- */
- getModelForFile: function(fileName) {
- var self = this;
- var $tr;
- // jQuery object ?
- if (fileName.is) {
- $tr = fileName;
- fileName = $tr.attr('data-file');
- } else {
- $tr = this.findFileEl(fileName);
- }
-
- if (!$tr || !$tr.length) {
- return null;
- }
-
- // if requesting the selected model, return it
- if (this._currentFileModel && this._currentFileModel.get('name') === fileName) {
- return this._currentFileModel;
- }
-
- // TODO: note, this is a temporary model required for synchronising
- // state between different views.
- // In the future the FileList should work with Backbone.Collection
- // and contain existing models that can be used.
- // This method would in the future simply retrieve the matching model from the collection.
- var model = new OCA.Files.FileInfoModel(this.elementToFile($tr), {
- filesClient: this.filesClient
- });
- if (!model.get('path')) {
- model.set('path', this.getCurrentDirectory(), {silent: true});
- }
-
- model.on('change', function(model) {
- // re-render row
- var highlightState = $tr.hasClass('highlighted');
- $tr = self.updateRow(
- $tr,
- model.toJSON(),
- {updateSummary: true, silent: false, animate: true}
- );
-
- // restore selection state
- var selected = !!self._selectedFiles[$tr.data('id')];
- self._selectFileEl($tr, selected);
-
- $tr.toggleClass('highlighted', highlightState);
- });
- model.on('busy', function(model, state) {
- self.showFileBusyState($tr, state);
- });
-
- return model;
- },
-
- /**
- * Displays the details view for the given file and
- * selects the given tab
- *
- * @param {string|OCA.Files.FileInfoModel} fileName file name or FileInfoModel for which to show details
- * @param {string} [tabId] optional tab id to select
- */
- showDetailsView: function(fileName, tabId) {
- console.warn('showDetailsView is deprecated! Use OCA.Files.Sidebar.activeTab. It will be removed in nextcloud 20.');
- this._updateDetailsView(fileName);
- if (tabId) {
- OCA.Files.Sidebar.setActiveTab(tabId);
- }
- },
-
- /**
- * Update the details view to display the given file
- *
- * @param {string|OCA.Files.FileInfoModel} fileName file name from the current list or a FileInfoModel object
- * @param {boolean} [show=true] whether to open the sidebar if it was closed
- */
- _updateDetailsView: function(fileName, show) {
- if (!(OCA.Files && OCA.Files.Sidebar)) {
- console.error('No sidebar available');
- return;
- }
-
- if (!fileName && OCA.Files.Sidebar.close) {
- OCA.Files.Sidebar.close()
- return
- } else if (typeof fileName !== 'string') {
- fileName = ''
- }
-
- // this is the old (terrible) way of getting the context.
- // don't use it anywhere else. Just provide the full path
- // of the file to the sidebar service
- var tr = this.findFileEl(fileName)
- var model = this.getModelForFile(tr)
- var path = model.attributes.path + '/' + model.attributes.name
-
- // make sure the file list has the correct context available
- if (this._currentFileModel) {
- this._currentFileModel.off();
- }
- this.$fileList.children().removeClass('highlighted');
- tr.addClass('highlighted');
- this._currentFileModel = model;
-
- // open sidebar and set file
- if (typeof show === 'undefined' || !!show || (OCA.Files.Sidebar.file !== '')) {
- OCA.Files.Sidebar.open(path.replace('//', '/'))
- }
- },
-
- /**
- * Replaces the current details view element with the details view
- * element of this file list.
- *
- * Each file list has its own DetailsView object, and each one has its
- * own root element, but there can be just one details view/sidebar
- * element in the document. This helper method replaces the current
- * details view/sidebar element in the document with the element from
- * the DetailsView object of this file list.
- */
- _replaceDetailsViewElementIfNeeded: function() {
- var $appSidebar = $('#app-sidebar');
- if ($appSidebar.length === 0) {
- this._detailsView.$el.insertAfter($('#app-content'));
- } else if ($appSidebar[0] !== this._detailsView.el) {
- // "replaceWith()" can not be used here, as it removes the old
- // element instead of just detaching it.
- this._detailsView.$el.insertBefore($appSidebar);
- $appSidebar.detach();
- }
- },
-
- /**
- * Event handler for when the window size changed
- */
- _onResize: function() {
- var containerWidth = this.$el.width();
- var actionsWidth = 0;
- $.each(this.$el.find('#controls .actions'), function(index, action) {
- actionsWidth += $(action).outerWidth();
- });
-
- this.breadcrumb._resize();
- },
-
- /**
- * Toggle showing gridview by default or not
- *
- * @returns {undefined}
- */
- _onGridviewChange: function() {
- var show = this.$showGridView.is(':checked');
- // only save state if user is logged in
- if (OC.currentUser) {
- $.post(OC.generateUrl('/apps/files/api/v1/showgridview'), {
- show: show
- });
- }
- this.$showGridView.next('#view-toggle')
- .removeClass('icon-toggle-filelist icon-toggle-pictures')
- .addClass(show ? 'icon-toggle-filelist' : 'icon-toggle-pictures')
-
- $('.list-container').toggleClass('view-grid', show);
- if (show) {
- // If switching into grid view from list view, too few files might be displayed
- // Try rendering the next page
- this._onScroll();
- }
- },
-
- /**
- * Event handler when leaving previously hidden state
- */
- _onShow: function(e) {
- OCA.Files.App && OCA.Files.App.updateCurrentFileList(this);
- if (this.shown) {
- if (e.itemId === this.id) {
- this._setCurrentDir('/', false);
- }
- // Only reload if we don't navigate to a different directory
- if (typeof e.dir === 'undefined' || e.dir === this.getCurrentDirectory()) {
- this.reload();
- }
- }
- this.shown = true;
- },
-
- /**
- * Event handler for when the URL changed
- */
- _onUrlChanged: function(e) {
- if (e && _.isString(e.dir)) {
- var currentDir = this.getCurrentDirectory();
- // this._currentDirectory is NULL when fileList is first initialised
- if(this._currentDirectory && currentDir === e.dir) {
- return;
- }
- this.changeDirectory(e.dir, true, true, undefined, true);
- }
- },
-
- /**
- * Selected/deselects the given file element and updated
- * the internal selection cache.
- *
- * @param {Object} $tr single file row element
- * @param {boolean} state true to select, false to deselect
- */
- _selectFileEl: function($tr, state) {
- var $checkbox = $tr.find('td.selection>.selectCheckBox');
- var oldData = !!this._selectedFiles[$tr.data('id')];
- var data;
- $checkbox.prop('checked', state);
- $tr.toggleClass('selected', state);
- // already selected ?
- if (state === oldData) {
- return;
- }
- data = this.elementToFile($tr);
- if (state) {
- this._selectedFiles[$tr.data('id')] = data;
- this._selectionSummary.add(data);
- }
- else {
- delete this._selectedFiles[$tr.data('id')];
- this._selectionSummary.remove(data);
- }
- if (this._detailsView && !this._detailsView.$el.hasClass('disappear')) {
- // hide sidebar
- this._updateDetailsView(null);
- }
- this.$el.find('.select-all').prop('checked', this._selectionSummary.getTotal() === this.files.length);
- },
-
- _selectRange: function($tr) {
- var checked = $tr.hasClass('selected');
- var $lastTr = $(this._lastChecked);
- var lastIndex = $lastTr.index();
- var currentIndex = $tr.index();
- var $rows = this.$fileList.children('tr');
-
- // last clicked checkbox below current one ?
- if (lastIndex > currentIndex) {
- var aux = lastIndex;
- lastIndex = currentIndex;
- currentIndex = aux;
- }
-
- // auto-select everything in-between
- for (var i = lastIndex; i <= currentIndex; i++) {
- this._selectFileEl($rows.eq(i), !checked);
- }
- this._removeHalfSelection();
- this._selectionMode = 'single';
- },
-
- _selectSingle: function($tr) {
- var state = !$tr.hasClass('selected');
- this._selectFileEl($tr, state);
- },
-
- _onMouseOverCheckbox: function(e) {
- if (this._getCurrentSelectionMode() !== 'range') {
- return;
- }
- var $currentTr = $(e.target).closest('tr');
-
- var $lastTr = $(this._lastChecked);
- var lastIndex = $lastTr.index();
- var currentIndex = $currentTr.index();
- var $rows = this.$fileList.children('tr');
-
- // last clicked checkbox below current one ?
- if (lastIndex > currentIndex) {
- var aux = lastIndex;
- lastIndex = currentIndex;
- currentIndex = aux;
- }
-
- // auto-select everything in-between
- this._removeHalfSelection();
- for (var i = 0; i <= $rows.length; i++) {
- var $tr = $rows.eq(i);
- var $checkbox = $tr.find('td.selection>.selectCheckBox');
- if(lastIndex <= i && i <= currentIndex) {
- $tr.addClass('halfselected');
- $checkbox.prop('checked', true);
- }
- }
- },
-
- _removeHalfSelection: function() {
- var $rows = this.$fileList.children('tr');
- for (var i = 0; i <= $rows.length; i++) {
- var $tr = $rows.eq(i);
- $tr.removeClass('halfselected');
- var $checkbox = $tr.find('td.selection>.selectCheckBox');
- $checkbox.prop('checked', !!this._selectedFiles[$tr.data('id')]);
- }
- },
-
- /**
- * Event handler for when clicking on files to select them
- */
- _onClickFile: function(event) {
- var $tr = $(event.target).closest('tr');
- if ($tr.hasClass('dragging')) {
- return;
- }
- if (this._allowSelection && event.shiftKey) {
- event.preventDefault();
- this._selectRange($tr);
- this._lastChecked = $tr;
- this.updateSelectionSummary();
- } else if (!event.ctrlKey) {
- // clicked directly on the name
- if (!this._detailsView || $(event.target).is('.nametext, .name, .thumbnail') || $(event.target).closest('.nametext').length) {
- var filename = $tr.attr('data-file');
- var renaming = $tr.data('renaming');
- if (this._defaultFileActionsDisabled) {
- event.preventDefault();
- } else if (!renaming) {
- this.fileActions.currentFile = $tr.find('td');
- var spec = this.fileActions.getCurrentDefaultFileAction();
- if (spec && spec.action) {
- event.preventDefault();
- spec.action(filename, {
- $file: $tr,
- fileList: this,
- fileActions: this.fileActions,
- dir: $tr.attr('data-path') || this.getCurrentDirectory()
- });
- }
- // deselect row
- $(event.target).closest('a').blur();
- }
- } else {
- // Even if there is no Details action the default event
- // handler is prevented for consistency (although there
- // should always be a Details action); otherwise the link
- // would be downloaded by the browser when the user expected
- // the details to be shown.
- event.preventDefault();
- var filename = $tr.attr('data-file');
- this.fileActions.currentFile = $tr.find('td');
- var mime = this.fileActions.getCurrentMimeType();
- var type = this.fileActions.getCurrentType();
- var permissions = this.fileActions.getCurrentPermissions();
- var action = this.fileActions.get(mime, type, permissions, filename)['Details'];
- if (action) {
- action(filename, {
- $file: $tr,
- fileList: this,
- fileActions: this.fileActions,
- dir: $tr.attr('data-path') || this.getCurrentDirectory()
- });
- }
- }
- }
- },
-
- /**
- * Event handler for when clicking on a file's checkbox
- */
- _onClickFileCheckbox: function(e) {
- var $tr = $(e.target).closest('tr');
- if(this._getCurrentSelectionMode() === 'range') {
- this._selectRange($tr);
- } else {
- this._selectSingle($tr);
- }
- this._lastChecked = $tr;
- this.updateSelectionSummary();
- if (this._detailsView && !this._detailsView.$el.hasClass('disappear')) {
- // hide sidebar
- this._updateDetailsView(null);
- }
- },
-
- /**
- * Event handler for when selecting/deselecting all files
- */
- _onClickSelectAll: function(e) {
- var hiddenFiles = this.$fileList.find('tr.hidden');
- var checked = e.target.checked;
-
- if (hiddenFiles.length > 0) {
- // set indeterminate alongside checked
- e.target.indeterminate = checked;
- } else {
- e.target.indeterminate = false
- }
-
- // Select only visible checkboxes to filter out unmatched file in search
- this.$fileList.find('td.selection > .selectCheckBox:visible').prop('checked', checked)
- .closest('tr').toggleClass('selected', checked);
-
- if (checked) {
- for (var i = 0; i < this.files.length; i++) {
- // a search will automatically hide the unwanted rows
- // let's only select the matches
- var fileData = this.files[i];
- var fileRow = this.$fileList.find('tr[data-id=' + fileData.id + ']');
- // do not select already selected ones
- if (!fileRow.hasClass('hidden') && _.isUndefined(this._selectedFiles[fileData.id])) {
- this._selectedFiles[fileData.id] = fileData;
- this._selectionSummary.add(fileData);
- }
- }
- } else {
- // if we have some hidden row, then we're in a search
- // Let's only deselect the visible ones
- if (hiddenFiles.length > 0) {
- var visibleFiles = this.$fileList.find('tr:not(.hidden)');
- var self = this;
- visibleFiles.each(function() {
- var id = parseInt($(this).data('id'));
- // do not deselect already deselected ones
- if (!_.isUndefined(self._selectedFiles[id])) {
- // a search will automatically hide the unwanted rows
- // let's only select the matches
- var fileData = self._selectedFiles[id];
- delete self._selectedFiles[fileData.id];
- self._selectionSummary.remove(fileData);
- }
- });
- } else {
- this._selectedFiles = {};
- this._selectionSummary.clear();
- }
- }
- this.updateSelectionSummary();
- if (this._detailsView && !this._detailsView.$el.hasClass('disappear')) {
- // hide sidebar
- this._updateDetailsView(null);
- }
- },
-
- /**
- * Event handler for when clicking on "Download" for the selected files
- */
- _onClickDownloadSelected: function(event) {
- var files;
- var self = this;
- var dir = this.getCurrentDirectory();
-
- if (this.isAllSelected() && this.getSelectedFiles().length > 1) {
- files = OC.basename(dir);
- dir = OC.dirname(dir) || '/';
- }
- else {
- files = _.pluck(this.getSelectedFiles(), 'name');
- }
-
- // don't allow a second click on the download action
- if(this.fileMultiSelectMenu.isDisabled('download')) {
- return false;
- }
-
- this.fileMultiSelectMenu.toggleLoading('download', true);
- var disableLoadingState = function(){
- self.fileMultiSelectMenu.toggleLoading('download', false);
- };
-
- if(this.getSelectedFiles().length > 1) {
- OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir, true), disableLoadingState);
- }
- else {
- var first = this.getSelectedFiles()[0];
- OCA.Files.Files.handleDownload(this.getDownloadUrl(first.name, dir, true), disableLoadingState);
- }
- event.preventDefault();
- },
-
- /**
- * Event handler for when clicking on "Move" for the selected files
- */
- _onClickCopyMoveSelected: function(event) {
- var files;
- var self = this;
-
- files = _.pluck(this.getSelectedFiles(), 'name');
-
- // don't allow a second click on the download action
- if(this.fileMultiSelectMenu.isDisabled('copyMove')) {
- return false;
- }
-
- var disableLoadingState = function(){
- self.fileMultiSelectMenu.toggleLoading('copyMove', false);
- };
-
- var actions = this.isSelectedMovable() ? OC.dialogs.FILEPICKER_TYPE_COPY_MOVE : OC.dialogs.FILEPICKER_TYPE_COPY;
- var dialogDir = self.getCurrentDirectory();
- if (typeof self.dirInfo.dirLastCopiedTo !== 'undefined') {
- dialogDir = self.dirInfo.dirLastCopiedTo;
- }
- OC.dialogs.filepicker(t('files', 'Choose target folder'), function(targetPath, type) {
- self.fileMultiSelectMenu.toggleLoading('copyMove', true);
- if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
- self.copy(files, targetPath, disableLoadingState);
- }
- if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
- self.move(files, targetPath, disableLoadingState);
- }
- self.dirInfo.dirLastCopiedTo = targetPath;
- }, false, "httpd/unix-directory", true, actions, dialogDir);
- event.preventDefault();
- },
-
- /**
- * Event handler for when clicking on "Delete" for the selected files
- */
- _onClickDeleteSelected: function(event) {
- var files = null;
- if (!this.isAllSelected()) {
- files = _.pluck(this.getSelectedFiles(), 'name');
- }
- this.do_delete(files);
- event.preventDefault();
- },
-
- /**
- * CUSTOM CODE
- * Event handler for when clicking on "Tags" for the selected files
- */
- _onClickTagSelected: function(event) {
- var self = this;
- event.preventDefault();
- var commonTags = [];
-
- var selectedFiles = _.pluck(this.getSelectedFiles(), 'id')
- var tagCollections = [];
- var fetchTagPromises = [];
-
-
- selectedFiles.forEach(function(fileId) {
- var deferred = new $.Deferred();
- var tagCollection = new OC.SystemTags.SystemTagsMappingCollection([], {
- objectType: 'files',
- objectId: fileId});
- tagCollections.push(tagCollection);
- tagCollection.fetch({
- success: function(){
- deferred.resolve('success');
- },
- error: function() {
- deferred.resolve('failed');
- }
- })
- fetchTagPromises.push(deferred);
- });
-
- if (!self._inputView) {
- self._inputView = new OC.SystemTags.SystemTagsInputField({
- multiple: true,
- allowActions: true,
- allowCreate: true,
- isAdmin: OC.isUserAdmin(),
- });
- self._inputView.on('select', self._onSelectTag, self);
- self._inputView.on('deselect', self._onDeselectTag, self);
- self._inputView.render();
-
- // Build dom
- self.tagsTitle = $('<h3>'+ t('files', 'Please select tag(s) to add to the selection') +'</h3>');
- self.tagsSubmit = $('<button>' + t('files', 'Apply tag(s) to selection') + '</button>');
- self.tagsContainer = $('<tr id="tag_multiple_files_container"></tr>');
- self.tagsTitle.appendTo(self.tagsContainer)
- self.tagsContainer.append(self._inputView.el);
- self.tagsSubmit.appendTo(self.tagsContainer)
-
- // Inject everything
- self.$table.find('thead').append(self.tagsContainer);
-
- self.tagsSubmit.on('click', function(ev){
- self._onClickDocument(ev);
- });
- }
-
- self._inputView.$el.addClass('icon-loading');
- self.tagsContainer.show();
-
- Promise.all(fetchTagPromises).then(function() {
- //find tags which are common to all selected files
- commonTags =_.intersection.apply(null, tagCollections.map(function (tagCollection) {return tagCollection.getTagIds();}));
- self._inputView.setValues(commonTags);
- self._inputView.$el.removeClass('icon-loading');
- $(document).on('click',function(ev){
- self._onClickDocument(ev);
- });
- });
- },
-
- _onClickDocument: function(ev) {
- if(!$(ev.target).closest('#editor_container').length) {
- this._inputView.setValues([]);
- this.tagsContainer.hide();
- $(document).off('click', this._onClickDocument);
- }
-
- },
-
- /**
- * Custom code
- * Set tag for all selected files
- * @param {any} tagModel -
- * @private
- */
- _onSelectTag: function(tagModel) {
- var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
- if (!_.isArray(selectedFiles)) {
- return;
- }
- selectedFiles.forEach(function(fileId) {
- $.ajax({
- url: OC.linkToRemote('dav') + '/systemtags-relations/files/' + fileId + '/'+ tagModel.attributes.id,
- type: 'PUT',
- });
- });
-
- },
- /**
- * remove tag from all selected files
- * @param {any} tagId -
- * @private
- */
- _onDeselectTag: function(tagId) {
- var selectedFiles = _.pluck(this.getSelectedFiles(),'id');
- if (!_.isArray(selectedFiles)) {
- return;
- }
- selectedFiles.forEach(function(fileId) {
- $.ajax({
- url: OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagId,
- type: 'DELETE'
- });
- });
- },
-
- /**
- * Event handler when clicking on a table header
- */
- _onClickHeader: function(e) {
- if (this.$table.hasClass('multiselect')) {
- return;
- }
- var $target = $(e.target);
- var sort;
- if (!$target.is('a')) {
- $target = $target.closest('a');
- }
- sort = $target.attr('data-sort');
- if (sort && this._allowSorting) {
- if (this._sort === sort) {
- this.setSort(sort, (this._sortDirection === 'desc')?'asc':'desc', true, true);
- }
- else {
- if ( sort === 'name' ) { //default sorting of name is opposite to size and mtime
- this.setSort(sort, 'asc', true, true);
- }
- else {
- this.setSort(sort, 'desc', true, true);
- }
- }
- }
- },
-
- /**
- * Event handler when clicking on a bread crumb
- */
- _onClickBreadCrumb: function(e) {
- // Select a crumb or a crumb in the menu
- var $el = $(e.target).closest('.crumb, .crumblist'),
- $targetDir = $el.data('dir');
-
- if ($targetDir !== undefined && e.which === 1) {
- e.preventDefault();
- this.changeDirectory($targetDir, true, true);
- }
- },
-
- /**
- * Event handler for when scrolling the list container.
- * This appends/renders the next page of entries when reaching the bottom.
- */
- _onScroll: function(e) {
- if (this.$container.scrollTop() + this.$container.height() > this.$el.height() - 300) {
- this._nextPage(true);
- }
- },
-
- /**
- * Event handler when dropping on a breadcrumb
- */
- _onDropOnBreadCrumb: function( event, ui ) {
- var self = this;
- var $target = $(event.target);
- if (!$target.is('.crumb, .crumblist')) {
- $target = $target.closest('.crumb, .crumblist');
- }
- var targetPath = $(event.target).data('dir');
- var dir = this.getCurrentDirectory();
- while (dir.substr(0,1) === '/') {//remove extra leading /'s
- dir = dir.substr(1);
- }
- dir = '/' + dir;
- if (dir.substr(-1,1) !== '/') {
- dir = dir + '/';
- }
- // do nothing if dragged on current dir
- if (targetPath === dir || targetPath + '/' === dir) {
- return;
- }
-
- var files = this.getSelectedFiles();
- if (files.length === 0) {
- // single one selected without checkbox?
- files = _.map(ui.helper.find('tr'), function(el) {
- return self.elementToFile($(el));
- });
- }
-
- var movePromise = this.move(_.pluck(files, 'name'), targetPath);
-
- // re-enable td elements to be droppable
- // sometimes the filename drop handler is still called after re-enable,
- // it seems that waiting for a short time before re-enabling solves the problem
- setTimeout(function() {
- self.$el.find('td.filename.ui-droppable').droppable('enable');
- }, 10);
-
- return movePromise;
- },
-
- /**
- * Sets a new page title
- */
- setPageTitle: function(title){
- if (title) {
- title += ' - ';
- } else {
- title = '';
- }
- title += this.appName;
- // Sets the page title with the " - Nextcloud" suffix as in templates
- window.document.title = title + ' - ' + OC.theme.title;
-
- return true;
- },
- /**
- * Returns the file info for the given file name from the internal collection.
- *
- * @param {string} fileName file name
- * @return {OCA.Files.FileInfo} file info or null if it was not found
- *
- * @since 8.2
- */
- findFile: function(fileName) {
- return _.find(this.files, function(aFile) {
- return (aFile.name === fileName);
- }) || null;
- },
- /**
- * Returns the tr element for a given file name, but only if it was already rendered.
- *
- * @param {string} fileName file name
- * @return {Object} jQuery object of the matching row
- */
- findFileEl: function(fileName){
- // use filterAttr to avoid escaping issues
- return this.$fileList.find('tr').filterAttr('data-file', fileName);
- },
-
- /**
- * Returns the file data from a given file element.
- * @param $el file tr element
- * @return file data
- */
- elementToFile: function($el){
- $el = $($el);
- var data = {
- id: parseInt($el.attr('data-id'), 10),
- name: $el.attr('data-file'),
- mimetype: $el.attr('data-mime'),
- mtime: parseInt($el.attr('data-mtime'), 10),
- type: $el.attr('data-type'),
- etag: $el.attr('data-etag'),
- quotaAvailableBytes: $el.attr('data-quota'),
- permissions: parseInt($el.attr('data-permissions'), 10),
- hasPreview: $el.attr('data-has-preview') === 'true',
- isEncrypted: $el.attr('data-e2eencrypted') === 'true'
- };
- var size = $el.attr('data-size');
- if (size) {
- data.size = parseInt(size, 10);
- }
- var icon = $el.attr('data-icon');
- if (icon) {
- data.icon = icon;
- }
- var mountType = $el.attr('data-mounttype');
- if (mountType) {
- data.mountType = mountType;
- }
- var path = $el.attr('data-path');
- if (path) {
- data.path = path;
- }
- return data;
- },
-
- /**
- * Appends the next page of files into the table
- * @param animate true to animate the new elements
- * @return array of DOM elements of the newly added files
- */
- _nextPage: function(animate) {
- var index = this.$fileList.children().length,
- count = this.pageSize(),
- hidden,
- tr,
- fileData,
- newTrs = [],
- isAllSelected = this.isAllSelected(),
- showHidden = this._filesConfig.get('showhidden');
-
- if (index >= this.files.length) {
- return false;
- }
-
- while (count > 0 && index < this.files.length) {
- fileData = this.files[index];
- if (this._filter) {
- hidden = fileData.name.toLowerCase().indexOf(this._filter.toLowerCase()) === -1;
- } else {
- hidden = false;
- }
- tr = this._renderRow(fileData, {updateSummary: false, silent: true, hidden: hidden});
- this.$fileList.append(tr);
- if (isAllSelected || this._selectedFiles[fileData.id]) {
- tr.addClass('selected');
- tr.find('.selectCheckBox').prop('checked', true);
- }
- if (animate) {
- tr.addClass('appear transparent');
- }
- newTrs.push(tr);
- index++;
- // only count visible rows
- if (showHidden || !tr.hasClass('hidden-file')) {
- count--;
- }
- }
-
- // trigger event for newly added rows
- if (newTrs.length > 0) {
- this.$fileList.trigger($.Event('fileActionsReady', {fileList: this, $files: newTrs}));
- }
-
- if (animate) {
- // defer, for animation
- window.setTimeout(function() {
- for (var i = 0; i < newTrs.length; i++ ) {
- newTrs[i].removeClass('transparent');
- }
- }, 0);
- }
-
- return newTrs;
- },
-
- /**
- * Event handler for when file actions were updated.
- * This will refresh the file actions on the list.
- */
- _onFileActionsUpdated: function() {
- var self = this;
- var $files = this.$fileList.find('tr');
- if (!$files.length) {
- return;
- }
-
- $files.each(function() {
- self.fileActions.display($(this).find('td.filename'), false, self);
- });
- this.$fileList.trigger($.Event('fileActionsReady', {fileList: this, $files: $files}));
-
- },
-
- /**
- * Register action for multiple selected files
- *
- * @param {OCA.Files.FileAction} fileAction object
- * The callback of FileAction will be called with an array of files that are currently selected
- */
- registerMultiSelectFileAction: function(fileAction) {
- if (typeof this.multiSelectMenuItems === 'undefined') {
- return;
- }
- this.multiSelectMenuItems.push(fileAction)
- this._updateMultiSelectFileActions()
- },
-
- _updateMultiSelectFileActions: function() {
- if (typeof this.multiSelectMenuItems === 'undefined') {
- return;
- }
- this.fileMultiSelectMenu = new OCA.Files.FileMultiSelectMenu(this.multiSelectMenuItems.sort(function(a, b) {
- return a.order - b.order
- }));
- this.fileMultiSelectMenu.render();
- this.$el.find('.selectedActions .filesSelectMenu').remove();
- this.$el.find('.selectedActions').append(this.fileMultiSelectMenu.$el);
- },
-
- /**
- * Sets the files to be displayed in the list.
- * This operation will re-render the list and update the summary.
- * @param filesArray array of file data (map)
- */
- setFiles: function(filesArray) {
- var self = this;
-
- // detach to make adding multiple rows faster
- this.files = filesArray;
-
- this.$fileList.empty();
-
- if (this._allowSelection) {
- // The results table, which has no selection column, checks
- // whether the main table has a selection column or not in order
- // to align its contents with those of the main table.
- this.$el.addClass('has-selection');
- }
-
- // clear "Select all" checkbox
- this.$el.find('.select-all').prop('checked', false);
-
- // Save full files list while rendering
-
- this.isEmpty = this.files.length === 0;
- this._nextPage();
-
- this.updateEmptyContent();
-
- this.fileSummary.calculate(this.files);
-
- this._selectedFiles = {};
- this._selectionSummary.clear();
- this.updateSelectionSummary();
- $(window).scrollTop(0);
-
- this.$fileList.trigger(jQuery.Event('updated'));
- _.defer(function() {
- self.$el.closest('#app-content').trigger(jQuery.Event('apprendered'));
- });
- },
-
- /**
- * Returns whether the given file info must be hidden
- *
- * @param {OC.Files.FileInfo} fileInfo file info
- *
- * @return {boolean} true if the file is a hidden file, false otherwise
- */
- _isHiddenFile: function(file) {
- return file.name && file.name.charAt(0) === '.';
- },
-
- /**
- * Returns the icon URL matching the given file info
- *
- * @param {OC.Files.FileInfo} fileInfo file info
- *
- * @return {string} icon URL
- */
- _getIconUrl: function(fileInfo) {
- var mimeType = fileInfo.mimetype || 'application/octet-stream';
- if (mimeType === 'httpd/unix-directory') {
- // use default folder icon
- if (fileInfo.mountType === 'shared' || fileInfo.mountType === 'shared-root') {
- return OC.MimeType.getIconUrl('dir-shared');
- } else if (fileInfo.mountType === 'external-root') {
- return OC.MimeType.getIconUrl('dir-external');
- } else if (fileInfo.mountType !== undefined && fileInfo.mountType !== '') {
- return OC.MimeType.getIconUrl('dir-' + fileInfo.mountType);
- } else if (fileInfo.shareTypes && (
- fileInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_LINK) > -1
- || fileInfo.shareTypes.indexOf(OC.Share.SHARE_TYPE_EMAIL) > -1)
- ) {
- return OC.MimeType.getIconUrl('dir-public')
- } else if (fileInfo.shareTypes && fileInfo.shareTypes.length > 0) {
- return OC.MimeType.getIconUrl('dir-shared')
- }
- return OC.MimeType.getIconUrl('dir');
- }
- return OC.MimeType.getIconUrl(mimeType);
- },
-
- /**
- * Creates a new table row element using the given file data.
- * @param {OC.Files.FileInfo} fileData file info attributes
- * @param options map of attributes
- * @return new tr element (not appended to the table)
- */
- _createRow: function(fileData, options) {
- var td, simpleSize, basename, extension, sizeColor,
- icon = fileData.icon || this._getIconUrl(fileData),
- name = fileData.name,
- // TODO: get rid of type, only use mime type
- type = fileData.type || 'file',
- mtime = parseInt(fileData.mtime, 10),
- mime = fileData.mimetype,
- path = fileData.path,
- dataIcon = null,
- linkUrl;
- options = options || {};
-
- if (isNaN(mtime)) {
- mtime = new Date().getTime();
- }
-
- if (type === 'dir') {
- mime = mime || 'httpd/unix-directory';
-
- if (fileData.isEncrypted) {
- icon = OC.MimeType.getIconUrl('dir-encrypted');
- dataIcon = icon;
- } else if (fileData.mountType && fileData.mountType.indexOf('external') === 0) {
- icon = OC.MimeType.getIconUrl('dir-external');
- dataIcon = icon;
- }
- }
-
- var permissions = fileData.permissions;
- if (permissions === undefined || permissions === null) {
- permissions = this.getDirectoryPermissions();
- }
-
- //containing tr
- var tr = $('<tr></tr>').attr({
- "data-id" : fileData.id,
- "data-type": type,
- "data-size": fileData.size,
- "data-file": name,
- "data-mime": mime,
- "data-mtime": mtime,
- "data-etag": fileData.etag,
- "data-quota": fileData.quotaAvailableBytes,
- "data-permissions": permissions,
- "data-has-preview": fileData.hasPreview !== false,
- "data-e2eencrypted": fileData.isEncrypted === true
- });
-
- if (dataIcon) {
- // icon override
- tr.attr('data-icon', dataIcon);
- }
-
- if (fileData.mountType) {
- // dirInfo (parent) only exist for the "real" file list
- if (this.dirInfo.id) {
- // FIXME: HACK: detect shared-root
- if (fileData.mountType === 'shared' && this.dirInfo.mountType !== 'shared' && this.dirInfo.mountType !== 'shared-root') {
- // if parent folder isn't share, assume the displayed folder is a share root
- fileData.mountType = 'shared-root';
- } else if (fileData.mountType === 'external' && this.dirInfo.mountType !== 'external' && this.dirInfo.mountType !== 'external-root') {
- // if parent folder isn't external, assume the displayed folder is the external storage root
- fileData.mountType = 'external-root';
- }
- }
- tr.attr('data-mounttype', fileData.mountType);
- }
-
- if (!_.isUndefined(path)) {
- tr.attr('data-path', path);
- }
- else {
- path = this.getCurrentDirectory();
- }
-
- // selection td
- if (this._allowSelection) {
- td = $('<td class="selection"></td>');
-
- td.append(
- '<input id="select-' + this.id + '-' + fileData.id +
- '" type="checkbox" class="selectCheckBox checkbox"/><label for="select-' + this.id + '-' + fileData.id + '">' +
- '<span class="hidden-visually">' + t('files', 'Select') + '</span>' +
- '</label>'
- );
-
- tr.append(td);
- }
-
- // filename td
- td = $('<td class="filename"></td>');
-
-
- var spec = this.fileActions.getDefaultFileAction(mime, type, permissions);
- // linkUrl
- if (mime === 'httpd/unix-directory') {
- linkUrl = this.linkTo(path + '/' + name);
- }
- else if (spec && spec.action) {
- linkUrl = this.getDefaultActionUrl(path, fileData.id);
- }
- else {
- linkUrl = this.getDownloadUrl(name, path, type === 'dir');
- }
- var linkElem = $('<a></a>').attr({
- "class": "name",
- "href": linkUrl
- });
- if (this._defaultFileActionsDisabled) {
- linkElem.addClass('disabled');
- }
-
- linkElem.append('<div class="thumbnail-wrapper"><div class="thumbnail" style="background-image:url(' + icon + ');"></div></div>');
-
- // from here work on the display name
- name = fileData.displayName || name;
-
- // show hidden files (starting with a dot) completely in gray
- if(name.indexOf('.') === 0) {
- basename = '';
- extension = name;
- // split extension from filename for non dirs
- } else if (mime !== 'httpd/unix-directory' && name.indexOf('.') !== -1) {
- basename = name.substr(0, name.lastIndexOf('.'));
- extension = name.substr(name.lastIndexOf('.'));
- } else {
- basename = name;
- extension = false;
- }
- var nameSpan=$('<span></span>').addClass('nametext');
- var innernameSpan = $('<span></span>').addClass('innernametext').text(basename);
-
-
- var conflictingItems = this.$fileList.find('tr[data-file="' + this._jqSelEscape(name) + '"]');
- if (conflictingItems.length !== 0) {
- if (conflictingItems.length === 1) {
- // Update the path on the first conflicting item
- var $firstConflict = $(conflictingItems[0]),
- firstConflictPath = $firstConflict.attr('data-path') + '/';
- if (firstConflictPath.charAt(0) === '/') {
- firstConflictPath = firstConflictPath.substr(1);
- }
- if (firstConflictPath && firstConflictPath !== '/') {
- $firstConflict.find('td.filename span.innernametext').prepend($('<span></span>').addClass('conflict-path').text(firstConflictPath));
- }
- }
-
- var conflictPath = path + '/';
- if (conflictPath.charAt(0) === '/') {
- conflictPath = conflictPath.substr(1);
- }
- if (path && path !== '/') {
- nameSpan.append($('<span></span>').addClass('conflict-path').text(conflictPath));
- }
- }
-
- nameSpan.append(innernameSpan);
- linkElem.append(nameSpan);
- if (extension) {
- nameSpan.append($('<span></span>').addClass('extension').text(extension));
- }
- if (fileData.extraData) {
- if (fileData.extraData.charAt(0) === '/') {
- fileData.extraData = fileData.extraData.substr(1);
- }
- nameSpan.addClass('extra-data').attr('title', fileData.extraData);
- }
- // dirs can show the number of uploaded files
- if (mime === 'httpd/unix-directory') {
- linkElem.append($('<span></span>').attr({
- 'class': 'uploadtext',
- 'currentUploads': 0
- }));
- }
- td.append(linkElem);
- tr.append(td);
-
- var enabledThemes = window.OCA?.Theming?.enabledThemes || []
- var isDarkTheme = enabledThemes.join('').indexOf('dark') !== -1
-
- try {
- var maxContrastHex = window.getComputedStyle(document.documentElement)
- .getPropertyValue('--color-text-maxcontrast').trim()
- if (maxContrastHex.length < 4) {
- throw Error();
- }
- var maxContrast = parseInt(maxContrastHex.substring(1, 3), 16)
- } catch(error) {
- var maxContrast = isDarkTheme ? 130 : 118
- }
-
- // size column
- if (typeof(fileData.size) !== 'undefined' && fileData.size >= 0) {
- simpleSize = OC.Util.humanFileSize(parseInt(fileData.size, 10), true);
- // rgb(118, 118, 118) / #767676
- // min. color contrast for normal text on white background according to WCAG AA
- sizeColor = Math.round(118-Math.pow((fileData.size/(1024*1024)), 2));
-
- // ensure that the brightest color is still readable
- // min. color contrast for normal text on white background according to WCAG AA
- if (sizeColor >= maxContrast) {
- sizeColor = maxContrast;
- }
-
- if (isDarkTheme) {
- sizeColor = Math.abs(sizeColor);
- // ensure that the dimmest color is still readable
- // min. color contrast for normal text on black background according to WCAG AA
- if (sizeColor < maxContrast) {
- sizeColor = maxContrast;
- }
- }
- } else {
- simpleSize = t('files', 'Pending');
- }
-
- td = $('<td></td>').attr({
- "class": "filesize",
- "style": 'color:rgb(' + sizeColor + ',' + sizeColor + ',' + sizeColor + ')'
- }).text(simpleSize);
- tr.append(td);
-
- // date column (1000 milliseconds to seconds, 60 seconds, 60 minutes, 24 hours)
- // difference in days multiplied by 5 - brightest shade for files older than 32 days (160/5)
- var modifiedColor = Math.round(((new Date()).getTime() - mtime )/1000/60/60/24*5 );
-
- // ensure that the brightest color is still readable
- // min. color contrast for normal text on white background according to WCAG AA
- if (modifiedColor >= maxContrast) {
- modifiedColor = maxContrast;
- }
-
- if (isDarkTheme) {
- modifiedColor = Math.abs(modifiedColor);
-
- // ensure that the dimmest color is still readable
- // min. color contrast for normal text on black background according to WCAG AA
- if (modifiedColor < maxContrast) {
- modifiedColor = maxContrast;
- }
- }
-
- var formatted;
- var text;
- if (mtime > 0) {
- formatted = OC.Util.formatDate(mtime);
- text = OC.Util.relativeModifiedDate(mtime);
- } else {
- formatted = t('files', 'Unable to determine date');
- text = '?';
- }
- td = $('<td></td>').attr({ "class": "date" });
- td.append($('<span></span>').attr({
- "class": "modified live-relative-timestamp",
- "title": formatted,
- "data-timestamp": mtime,
- "style": 'color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')'
- }).text(text)
- .tooltip({placement: 'top'})
- );
- tr.find('.filesize').text(simpleSize);
- tr.append(td);
- return tr;
- },
-
- /* escape a selector expression for jQuery */
- _jqSelEscape: function (expression) {
- if (expression) {
- return expression.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
- }
- return null;
- },
-
- /**
- * Adds an entry to the files array and also into the DOM
- * in a sorted manner.
- *
- * @param {OC.Files.FileInfo} fileData map of file attributes
- * @param {Object} [options] map of attributes
- * @param {boolean} [options.updateSummary] true to update the summary
- * after adding (default), false otherwise. Defaults to true.
- * @param {boolean} [options.silent] true to prevent firing events like "fileActionsReady",
- * defaults to false.
- * @param {boolean} [options.animate] true to animate the thumbnail image after load
- * defaults to true.
- * @return new tr element (not appended to the table)
- */
- add: function(fileData, options) {
- var index;
- var $tr;
- var $rows;
- var $insertionPoint;
- options = _.extend({animate: true}, options || {});
-
- // there are three situations to cover:
- // 1) insertion point is visible on the current page
- // 2) insertion point is on a not visible page (visible after scrolling)
- // 3) insertion point is at the end of the list
-
- $rows = this.$fileList.children();
- index = this._findInsertionIndex(fileData);
- if (index > this.files.length) {
- index = this.files.length;
- }
- else {
- $insertionPoint = $rows.eq(index);
- }
-
- // is the insertion point visible ?
- if ($insertionPoint.length) {
- // only render if it will really be inserted
- $tr = this._renderRow(fileData, options);
- $insertionPoint.before($tr);
- }
- else {
- // if insertion point is after the last visible
- // entry, append
- if (index === $rows.length) {
- $tr = this._renderRow(fileData, options);
- this.$fileList.append($tr);
- }
- }
-
- this.isEmpty = false;
- this.files.splice(index, 0, fileData);
-
- if ($tr && options.animate) {
- $tr.addClass('appear transparent');
- window.setTimeout(function() {
- $tr.removeClass('transparent');
- $("#fileList tr").removeClass('mouseOver');
- $tr.addClass('mouseOver');
- });
- }
-
- if (options.scrollTo) {
- this.scrollTo(fileData.name);
- }
-
- // defaults to true if not defined
- if (typeof(options.updateSummary) === 'undefined' || !!options.updateSummary) {
- this.fileSummary.add(fileData, true);
- this.updateEmptyContent();
- }
-
- return $tr;
- },
-
- /**
- * Creates a new row element based on the given attributes
- * and returns it.
- *
- * @param {OC.Files.FileInfo} fileData map of file attributes
- * @param {Object} [options] map of attributes
- * @param {number} [options.index] index at which to insert the element
- * @param {boolean} [options.updateSummary] true to update the summary
- * after adding (default), false otherwise. Defaults to true.
- * @param {boolean} [options.animate] true to animate the thumbnail image after load
- * defaults to true.
- * @return new tr element (not appended to the table)
- */
- _renderRow: function(fileData, options) {
- options = options || {};
- var type = fileData.type || 'file',
- mime = fileData.mimetype,
- path = fileData.path || this.getCurrentDirectory(),
- permissions = parseInt(fileData.permissions, 10) || 0;
-
- var isEndToEndEncrypted = (type === 'dir' && fileData.isEncrypted);
-
- if (!isEndToEndEncrypted && fileData.isShareMountPoint) {
- permissions = permissions | OC.PERMISSION_UPDATE;
- }
-
- if (type === 'dir') {
- mime = mime || 'httpd/unix-directory';
- }
- var tr = this._createRow(
- fileData,
- options
- );
- var filenameTd = tr.find('td.filename');
-
- // TODO: move dragging to FileActions ?
- // enable drag only for deletable files
- if (this._dragOptions && permissions & OC.PERMISSION_DELETE) {
- filenameTd.draggable(this._dragOptions);
- }
- // allow dropping on folders
- if (this._folderDropOptions && mime === 'httpd/unix-directory') {
- tr.droppable(this._folderDropOptions);
- }
-
- if (options.hidden) {
- tr.addClass('hidden');
- }
-
- if (this._isHiddenFile(fileData)) {
- tr.addClass('hidden-file');
- }
-
- // display actions
- this.fileActions.display(filenameTd, !options.silent, this);
-
- if (mime !== 'httpd/unix-directory' && fileData.hasPreview !== false) {
- var iconDiv = filenameTd.find('.thumbnail');
- // lazy load / newly inserted td ?
- // the typeof check ensures that the default value of animate is true
- if (typeof(options.animate) === 'undefined' || !!options.animate) {
- this.lazyLoadPreview({
- fileId: fileData.id,
- path: path + '/' + fileData.name,
- mime: mime,
- etag: fileData.etag,
- callback: function(url) {
- iconDiv.css('background-image', 'url("' + url + '")');
- }
- });
- }
- else {
- // set the preview URL directly
- var urlSpec = {
- file: path + '/' + fileData.name,
- c: fileData.etag
- };
- var previewUrl = this.generatePreviewUrl(urlSpec);
- previewUrl = previewUrl.replace(/\(/g, '%28').replace(/\)/g, '%29');
- iconDiv.css('background-image', 'url("' + previewUrl + '")');
- }
- }
- return tr;
- },
- /**
- * Returns the current directory
- * @method getCurrentDirectory
- * @return current directory
- */
- getCurrentDirectory: function(){
- return this._currentDirectory || this.$el.find('#dir').val() || '/';
- },
- /**
- * Returns the directory permissions
- * @return permission value as integer
- */
- getDirectoryPermissions: function() {
- return this && this.dirInfo && this.dirInfo.permissions ? this.dirInfo.permissions : parseInt(this.$el.find('#permissions').val(), 10);
- },
- /**
- * Changes the current directory and reload the file list.
- * @param {string} targetDir target directory (non URL encoded)
- * @param {boolean} [changeUrl=true] if the URL must not be changed (defaults to true)
- * @param {boolean} [force=false] set to true to force changing directory
- * @param {string} [fileId] optional file id, if known, to be appended in the URL
- * @param {bool} [changedThroughUrl=false] true if the dir was set through a URL change
- */
- changeDirectory: function(targetDir, changeUrl, force, fileId, changedThroughUrl) {
- var self = this;
- var currentDir = this.getCurrentDirectory();
- targetDir = targetDir || '/';
- if (!force && currentDir === targetDir) {
- return;
- }
- this._setCurrentDir(targetDir, changeUrl, fileId, changedThroughUrl);
-
- // discard finished uploads list, we'll get it through a regular reload
- this._uploads = {};
- return this.reload().then(function(success){
- if (!success) {
- self.changeDirectory(currentDir, true);
- }
- });
- },
- linkTo: function(dir) {
- return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
- },
-
- /**
- * @param {string} path
- * @returns {boolean}
- */
- _isValidPath: function(path) {
- var sections = path.split('/');
- for (var i = 0; i < sections.length; i++) {
- if (sections[i] === '..') {
- return false;
- }
- }
-
- return path.toLowerCase().indexOf(decodeURI('%0a')) === -1 &&
- path.toLowerCase().indexOf(decodeURI('%00')) === -1;
- },
-
- /**
- * Sets the current directory name and updates the breadcrumb.
- * @param targetDir directory to display
- * @param changeUrl true to also update the URL, false otherwise (default)
- * @param {string} [fileId] file id
- * @param {bool} changedThroughUrl true if the dir was set through a URL change
- */
- _setCurrentDir: function(targetDir, changeUrl, fileId, changedThroughUrl) {
- targetDir = targetDir.replace(/\\/g, '/');
- if (!this._isValidPath(targetDir)) {
- targetDir = '/';
- changeUrl = true;
- }
- var previousDir = this.getCurrentDirectory(),
- baseDir = OC.basename(targetDir);
-
- if (baseDir !== '') {
- this.setPageTitle(baseDir);
- }
- else {
- this.setPageTitle();
- }
-
- if (targetDir.length > 0 && targetDir[0] !== '/') {
- targetDir = '/' + targetDir;
- }
- this._currentDirectory = targetDir;
-
- // legacy stuff
- this.$el.find('#dir').val(targetDir);
-
- if (changeUrl !== false) {
- var params = {
- dir: targetDir,
- previousDir: previousDir
- };
- if (fileId) {
- params.fileId = fileId;
- }
- params.changedThroughUrl = changedThroughUrl
- this.$el.trigger(jQuery.Event('changeDirectory', params));
- }
- this.breadcrumb.setDirectory(this.getCurrentDirectory());
- },
- /**
- * Sets the current sorting and refreshes the list
- *
- * @param sort sort attribute name
- * @param direction sort direction, one of "asc" or "desc"
- * @param update true to update the list, false otherwise (default)
- * @param persist true to save changes in the database (default)
- */
- setSort: function(sort, direction, update, persist) {
- var comparator = FileList.Comparators[sort] || FileList.Comparators.name;
- this._sort = sort;
- this._sortDirection = (direction === 'desc')?'desc':'asc';
- this._sortComparator = function(fileInfo1, fileInfo2) {
- var isFavorite = function(fileInfo) {
- return fileInfo.tags && fileInfo.tags.indexOf(OC.TAG_FAVORITE) >= 0;
- };
-
- if (isFavorite(fileInfo1) && !isFavorite(fileInfo2)) {
- return -1;
- } else if (!isFavorite(fileInfo1) && isFavorite(fileInfo2)) {
- return 1;
- }
-
- return direction === 'asc' ? comparator(fileInfo1, fileInfo2) : -comparator(fileInfo1, fileInfo2);
- };
-
- this.$el.find('thead th .sort-indicator')
- .removeClass(this.SORT_INDICATOR_ASC_CLASS)
- .removeClass(this.SORT_INDICATOR_DESC_CLASS)
- .toggleClass('hidden', true)
- .addClass(this.SORT_INDICATOR_DESC_CLASS);
-
- this.$el.find('thead th.column-' + sort + ' .sort-indicator')
- .removeClass(this.SORT_INDICATOR_ASC_CLASS)
- .removeClass(this.SORT_INDICATOR_DESC_CLASS)
- .toggleClass('hidden', false)
- .addClass(direction === 'desc' ? this.SORT_INDICATOR_DESC_CLASS : this.SORT_INDICATOR_ASC_CLASS);
- if (update) {
- if (this._clientSideSort) {
- this.files.sort(this._sortComparator);
- this.setFiles(this.files);
- }
- else {
- this.reload();
- }
- }
-
- if (persist && OC.getCurrentUser().uid) {
- $.post(OC.generateUrl('/apps/files/api/v1/sorting'), {
- mode: sort,
- direction: direction
- });
- }
- },
-
- /**
- * Returns list of webdav properties to request
- */
- _getWebdavProperties: function() {
- return [].concat(this.filesClient.getPropfindProperties());
- },
-
- /**
- * Reloads the file list using ajax call
- *
- * @return ajax call object
- */
- reload: function() {
- this._selectedFiles = {};
- this._selectionSummary.clear();
- if (this._currentFileModel) {
- this._currentFileModel.off();
- }
- this._currentFileModel = null;
- this.$el.find('.select-all').prop('checked', false);
- this.showMask();
- this._reloadCall = this.filesClient.getFolderContents(
- this.getCurrentDirectory(), {
- includeParent: true,
- properties: this._getWebdavProperties()
- }
- );
- if (this._detailsView) {
- // close sidebar
- this._updateDetailsView(null);
- }
- this._setCurrentDir(this.getCurrentDirectory(), false);
- var callBack = this.reloadCallback.bind(this);
- return this._reloadCall.then(callBack, callBack);
- },
- reloadCallback: function(status, result) {
- delete this._reloadCall;
- this.hideMask();
-
- if (status === 401) {
- // We are not authentificated, so reload the page so that we get
- // redirected to the login page while saving the current url.
- location.reload();
- }
-
- // Firewall Blocked request?
- if (status === 403) {
- // Go home
- this.changeDirectory('/');
- OC.Notification.show(t('files', 'This operation is forbidden'), {type: 'error'});
- return false;
- }
-
- // Did share service die or something else fail?
- if (status === 500) {
- // Go home
- this.changeDirectory('/');
- OC.Notification.show(t('files', 'This directory is unavailable, please check the logs or contact the administrator'),
- {type: 'error'}
- );
- return false;
- }
-
- if (status === 503) {
- // Go home
- if (this.getCurrentDirectory() !== '/') {
- this.changeDirectory('/');
- // TODO: read error message from exception
- OC.Notification.show(t('files', 'Storage is temporarily not available'),
- {type: 'error'}
- );
- }
- return false;
- }
-
- if (status === 400 || status === 404 || status === 405) {
- // go back home
- this.changeDirectory('/');
- return false;
- }
- // aborted ?
- if (status === 0){
- return true;
- }
-
- this.updateStorageStatistics(true);
-
- // first entry is the root
- this.dirInfo = result.shift();
- this.breadcrumb.setDirectoryInfo(this.dirInfo);
-
- if (this.dirInfo.permissions) {
- this._updateDirectoryPermissions();
- }
-
- result.sort(this._sortComparator);
- this.setFiles(result);
-
- if (this.dirInfo) {
- // Make sure the currentFileList is the current one
- // When navigating to the favorite or share with you virtual
- // folder, this is not correctly set during the initialisation
- // otherwise.
- OCA.Files.App && OCA.Files.App.updateCurrentFileList(this);
-
- var newFileId = this.dirInfo.id;
- // update fileid in URL
- var params = {
- dir: this.getCurrentDirectory()
- };
- if (newFileId) {
- params.fileId = newFileId;
- }
- this.$el.trigger(jQuery.Event('afterChangeDirectory', params));
- }
- return true;
- },
-
- updateStorageStatistics: function(force) {
- OCA.Files.Files.updateStorageStatistics(this.getCurrentDirectory(), force);
- },
-
- updateStorageQuotas: function() {
- OCA.Files.Files.updateStorageQuotas();
- },
-
- /**
- * @deprecated do not use nor override
- */
- getAjaxUrl: function(action, params) {
- return OCA.Files.Files.getAjaxUrl(action, params);
- },
-
- getDownloadUrl: function(files, dir, isDir) {
- return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory(), isDir);
- },
-
- getDefaultActionUrl: function(path, id) {
- return this.linkTo(path) + "&openfile="+id;
- },
-
- getUploadUrl: function(fileName, dir) {
- if (_.isUndefined(dir)) {
- dir = this.getCurrentDirectory();
- }
-
- var pathSections = dir.split('/');
- if (!_.isUndefined(fileName)) {
- pathSections.push(fileName);
- }
- var encodedPath = '';
- _.each(pathSections, function(section) {
- if (section !== '') {
- encodedPath += '/' + encodeURIComponent(section);
- }
- });
- return OC.linkToRemoteBase('webdav') + encodedPath;
- },
-
- /**
- * Generates a preview URL based on the URL space.
- * @param urlSpec attributes for the URL
- * @param {number} urlSpec.x width
- * @param {number} urlSpec.y height
- * @param {String} urlSpec.file path to the file
- * @return preview URL
- */
- generatePreviewUrl: function(urlSpec) {
- urlSpec = urlSpec || {};
- if (!urlSpec.x) {
- urlSpec.x = this.$table.data('preview-x') || 250;
- }
- if (!urlSpec.y) {
- urlSpec.y = this.$table.data('preview-y') || 250;
- }
- urlSpec.x *= window.devicePixelRatio;
- urlSpec.y *= window.devicePixelRatio;
- urlSpec.x = Math.ceil(urlSpec.x);
- urlSpec.y = Math.ceil(urlSpec.y);
- urlSpec.forceIcon = 0;
-
- /**
- * Images are cropped to a square by default. Append a=1 to the URL
- * if the user wants to see images with original aspect ratio.
- */
- urlSpec.a = this._filesConfig.get('cropimagepreviews') ? 0 : 1;
-
- if (typeof urlSpec.fileId !== 'undefined') {
- delete urlSpec.file;
- return OC.generateUrl('/core/preview?') + $.param(urlSpec);
- } else {
- delete urlSpec.fileId;
- return OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
- }
-
- },
-
- /**
- * Lazy load a file's preview.
- *
- * @param path path of the file
- * @param mime mime type
- * @param callback callback function to call when the image was loaded
- * @param etag file etag (for caching)
- */
- lazyLoadPreview : function(options) {
- var self = this;
- var fileId = options.fileId;
- var path = options.path;
- var mime = options.mime;
- var ready = options.callback;
- var etag = options.etag;
-
- // get mime icon url
- var iconURL = OC.MimeType.getIconUrl(mime);
- var previewURL,
- urlSpec = {};
- ready(iconURL); // set mimeicon URL
-
- urlSpec.fileId = fileId;
- urlSpec.file = OCA.Files.Files.fixPath(path);
- if (options.x) {
- urlSpec.x = options.x;
- }
- if (options.y) {
- urlSpec.y = options.y;
- }
- if (options.a) {
- urlSpec.a = options.a;
- }
- if (options.mode) {
- urlSpec.mode = options.mode;
- }
-
- if (etag){
- // use etag as cache buster
- urlSpec.c = etag;
- }
-
- previewURL = self.generatePreviewUrl(urlSpec);
- previewURL = previewURL.replace(/\(/g, '%28').replace(/\)/g, '%29');
-
- // preload image to prevent delay
- // this will make the browser cache the image
- var img = new Image();
- img.onload = function(){
- // if loading the preview image failed (no preview for the mimetype) then img.width will < 5
- if (img.width > 5) {
- ready(previewURL, img);
- } else if (options.error) {
- options.error();
- }
- };
- if (options.error) {
- img.onerror = options.error;
- }
- img.src = previewURL;
- },
-
- _updateDirectoryPermissions: function() {
- var isCreatable = (this.dirInfo.permissions & OC.PERMISSION_CREATE) !== 0 && this.$el.find('#free_space').val() !== '0';
- this.$el.find('#permissions').val(this.dirInfo.permissions);
- this.$el.find('.creatable').toggleClass('hidden', !isCreatable);
- this.$el.find('.notCreatable').toggleClass('hidden', isCreatable);
- },
- /**
- * Shows/hides action buttons
- *
- * @param show true for enabling, false for disabling
- */
- showActions: function(show){
- this.$el.find('.actions,#file_action_panel').toggleClass('hidden', !show);
- if (show){
- // make sure to display according to permissions
- var permissions = this.getDirectoryPermissions();
- var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
- this.$el.find('.creatable').toggleClass('hidden', !isCreatable);
- this.$el.find('.notCreatable').toggleClass('hidden', isCreatable);
- // remove old style breadcrumbs (some apps might create them)
- this.$el.find('#controls .crumb').remove();
- // refresh breadcrumbs in case it was replaced by an app
- this.breadcrumb.render();
- }
- else{
- this.$el.find('.creatable, .notCreatable').addClass('hidden');
- }
- },
- /**
- * Enables/disables viewer mode.
- * In viewer mode, apps can embed themselves under the controls bar.
- * In viewer mode, the actions of the file list will be hidden.
- * @param show true for enabling, false for disabling
- */
- setViewerMode: function(show){
- this.showActions(!show);
- this.$el.find('#filestable').toggleClass('hidden', show);
- this.$el.trigger(new $.Event('changeViewerMode', {viewerModeEnabled: show}));
- },
- /**
- * Removes a file entry from the list
- * @param name name of the file to remove
- * @param {Object} [options] map of attributes
- * @param {boolean} [options.updateSummary] true to update the summary
- * after removing, false otherwise. Defaults to true.
- * @return deleted element
- */
- remove: function(name, options){
- options = options || {};
- var fileEl = this.findFileEl(name);
- var fileData = _.findWhere(this.files, {name: name});
- if (!fileData) {
- return;
- }
- var fileId = fileData.id;
- if (this._selectedFiles[fileId]) {
- // remove from selection first
- this._selectFileEl(fileEl, false);
- this.updateSelectionSummary();
- }
- if (this._selectedFiles[fileId]) {
- delete this._selectedFiles[fileId];
- this._selectionSummary.remove(fileData);
- this.updateSelectionSummary();
- }
- var index = this.files.findIndex(function(el){return el.name==name;});
- this.files.splice(index, 1);
-
- // TODO: improve performance on batch update
- this.isEmpty = !this.files.length;
- if (typeof(options.updateSummary) === 'undefined' || !!options.updateSummary) {
- this.updateEmptyContent();
- this.fileSummary.remove({type: fileData.type, size: fileData.size}, true);
- }
-
- if (!fileEl.length) {
- return null;
- }
-
- if (this._dragOptions && (fileEl.data('permissions') & OC.PERMISSION_DELETE)) {
- // file is only draggable when delete permissions are set
- fileEl.find('td.filename').draggable('destroy');
- }
- if (this._currentFileModel && this._currentFileModel.get('id') === fileId) {
- // Note: in the future we should call destroy() directly on the model
- // and the model will take care of the deletion.
- // Here we only trigger the event to notify listeners that
- // the file was removed.
- this._currentFileModel.trigger('destroy');
- this._updateDetailsView(null);
- }
- fileEl.remove();
-
- var lastIndex = this.$fileList.children().length;
- // if there are less elements visible than one page
- // but there are still pending elements in the array,
- // then directly append the next page
- if (lastIndex < this.files.length && lastIndex < this.pageSize()) {
- this._nextPage(true);
- }
-
- return fileEl;
- },
- /**
- * Finds the index of the row before which the given
- * fileData should be inserted, considering the current
- * sorting
- *
- * @param {OC.Files.FileInfo} fileData file info
- */
- _findInsertionIndex: function(fileData) {
- var index = 0;
- while (index < this.files.length && this._sortComparator(fileData, this.files[index]) > 0) {
- index++;
- }
- return index;
- },
-
- /**
- * Moves a file to a given target folder.
- *
- * @param fileNames array of file names to move
- * @param targetPath absolute target path
- * @param callback function to call when movement is finished
- * @param dir the dir path where fileNames are located (optionnal, will take current folder if undefined)
- */
- move: function(fileNames, targetPath, callback, dir) {
- var self = this;
-
- dir = typeof dir === 'string' ? dir : this.getCurrentDirectory();
- if (dir.charAt(dir.length - 1) !== '/') {
- dir += '/';
- }
- var target = OC.basename(targetPath);
- if (!_.isArray(fileNames)) {
- fileNames = [fileNames];
- }
-
- var moveFileFunction = function(fileName) {
- var $tr = self.findFileEl(fileName);
- self.showFileBusyState($tr, true);
- if (targetPath.charAt(targetPath.length - 1) !== '/') {
- // make sure we move the files into the target dir,
- // not overwrite it
- targetPath = targetPath + '/';
- }
- return self.filesClient.move(dir + fileName, targetPath + fileName)
- .done(function() {
- // if still viewing the same directory
- if (OC.joinPaths(self.getCurrentDirectory(), '/') === OC.joinPaths(dir, '/')) {
- // recalculate folder size
- var oldFile = self.findFileEl(target);
- var newFile = self.findFileEl(fileName);
- var oldSize = oldFile.data('size');
- var newSize = oldSize + newFile.data('size');
- oldFile.data('size', newSize);
- oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize));
-
- self.remove(fileName);
- }
- })
- .fail(function(status) {
- if (status === 412) {
- // TODO: some day here we should invoke the conflict dialog
- OC.Notification.show(t('files', 'Could not move "{file}", target exists',
- {file: fileName}), {type: 'error'}
- );
- } else {
- OC.Notification.show(t('files', 'Could not move "{file}"',
- {file: fileName}), {type: 'error'}
- );
- }
- })
- .always(function() {
- self.showFileBusyState($tr, false);
- });
- };
- return this.reportOperationProgress(fileNames, moveFileFunction, callback);
- },
-
- _reflect: function (promise){
- return promise.then(function(v){ return {};}, function(e){ return {};});
- },
-
- reportOperationProgress: function (fileNames, operationFunction, callback){
- var self = this;
- self._operationProgressBar.showProgressBar(false);
- var mcSemaphore = new OCA.Files.Semaphore(5);
- var counter = 0;
- var promises = _.map(fileNames, function(arg) {
- return mcSemaphore.acquire().then(function(){
- return operationFunction(arg).always(function(){
- mcSemaphore.release();
- counter++;
- self._operationProgressBar.setProgressBarValue(100.0*counter/fileNames.length);
- });
- });
- });
-
- return Promise.all(_.map(promises, self._reflect)).then(function(){
- if (callback) {
- callback();
- }
- self._operationProgressBar.hideProgressBar();
- });
- },
-
- /**
- * Copies a file to a given target folder.
- *
- * @param fileNames array of file names to copy
- * @param targetPath absolute target path
- * @param callback to call when copy is finished with success
- * @param dir the dir path where fileNames are located (optionnal, will take current folder if undefined)
- */
- copy: function(fileNames, targetPath, callback, dir) {
- var self = this;
- var filesToNotify = [];
- var count = 0;
-
- dir = typeof dir === 'string' ? dir : this.getCurrentDirectory();
- if (dir.charAt(dir.length - 1) !== '/') {
- dir += '/';
- }
- var target = OC.basename(targetPath);
- if (!_.isArray(fileNames)) {
- fileNames = [fileNames];
- }
- var copyFileFunction = function(fileName) {
- var $tr = self.findFileEl(fileName);
- self.showFileBusyState($tr, true);
- if (targetPath.charAt(targetPath.length - 1) !== '/') {
- // make sure we move the files into the target dir,
- // not overwrite it
- targetPath = targetPath + '/';
- }
- var targetPathAndName = targetPath + fileName;
- if ((dir + fileName) === targetPathAndName) {
- var dotIndex = targetPathAndName.indexOf(".");
- if ( dotIndex > 1) {
- var leftPartOfName = targetPathAndName.substr(0, dotIndex);
- var fileNumber = leftPartOfName.match(/\d+/);
- // TRANSLATORS name that is appended to copied files with the same name, will be put in parenthesis and appened with a number if it is the second+ copy
- var copyNameLocalized = t('files', 'copy');
- if (isNaN(fileNumber) ) {
- fileNumber++;
- targetPathAndName = targetPathAndName.replace(/(?=\.[^.]+$)/g, " (" + copyNameLocalized + " " + fileNumber + ")");
- }
- else {
- // Check if we have other files with 'copy X' and the same name
- var maxNum = 1;
- if (self.files !== null) {
- leftPartOfName = leftPartOfName.replace("/", "");
- leftPartOfName = leftPartOfName.replace(new RegExp("\\(" + copyNameLocalized + "( \\d+)?\\)"),"");
- // find the last file with the number extension and add one to the new name
- for (var j = 0; j < self.files.length; j++) {
- var cName = self.files[j].name;
- if (cName.indexOf(leftPartOfName) > -1) {
- if (cName.indexOf("(" + copyNameLocalized + ")") > 0) {
- targetPathAndName = targetPathAndName.replace(new RegExp(" \\(" + copyNameLocalized + "\\)"),"");
- if (maxNum == 1) {
- maxNum = 2;
- }
- }
- else {
- var cFileNumber = cName.match(new RegExp("\\(" + copyNameLocalized + " (\\d+)\\)"));
- if (cFileNumber && parseInt(cFileNumber[1]) >= maxNum) {
- maxNum = parseInt(cFileNumber[1]) + 1;
- }
- }
- }
- }
- targetPathAndName = targetPathAndName.replace(new RegExp(" \\(" + copyNameLocalized + " \\d+\\)"),"");
- }
- // Create the new file name with _x at the end
- // Start from 2 per a special request of the 'standard'
- var extensionName = " (" + copyNameLocalized + " " + maxNum +")";
- if (maxNum == 1) {
- extensionName = " (" + copyNameLocalized + ")";
- }
- targetPathAndName = targetPathAndName.replace(/(?=\.[^.]+$)/g, extensionName);
- }
- }
- }
- return self.filesClient.copy(dir + fileName, targetPathAndName)
- .done(function () {
- filesToNotify.push(fileName);
-
- // if still viewing the same directory
- if (OC.joinPaths(self.getCurrentDirectory(), '/') === OC.joinPaths(dir, '/')) {
- // recalculate folder size
- var oldFile = self.findFileEl(target);
- var newFile = self.findFileEl(fileName);
- var oldSize = oldFile.data('size');
- var newSize = oldSize + newFile.data('size');
- oldFile.data('size', newSize);
- oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize));
- }
- self.reload();
- })
- .fail(function(status) {
- if (status === 412) {
- // TODO: some day here we should invoke the conflict dialog
- OC.Notification.show(t('files', 'Could not copy "{file}", target exists',
- {file: fileName}), {type: 'error'}
- );
- } else {
- OC.Notification.show(t('files', 'Could not copy "{file}"',
- {file: fileName}), {type: 'error'}
- );
- }
- })
- .always(function() {
- self.showFileBusyState($tr, false);
- count++;
-
- /**
- * We only show the notifications once the last file has been copied
- */
- if (count === fileNames.length) {
- // Remove leading and ending /
- if (targetPath.slice(0, 1) === '/') {
- targetPath = targetPath.slice(1, targetPath.length);
- }
- if (targetPath.slice(-1) === '/') {
- targetPath = targetPath.slice(0, -1);
- }
-
- if (filesToNotify.length > 0) {
- // Since there's no visual indication that the files were copied, let's send some notifications !
- if (filesToNotify.length === 1) {
- OC.Notification.show(t('files', 'Copied {origin} inside {destination}',
- {
- origin: filesToNotify[0],
- destination: targetPath
- }
- ), {timeout: 10});
- } else if (filesToNotify.length > 0 && filesToNotify.length < 3) {
- OC.Notification.show(t('files', 'Copied {origin} inside {destination}',
- {
- origin: filesToNotify.join(', '),
- destination: targetPath
- }
- ), {timeout: 10});
- } else {
- OC.Notification.show(t('files', 'Copied {origin} and {nbfiles} other files inside {destination}',
- {
- origin: filesToNotify[0],
- nbfiles: filesToNotify.length - 1,
- destination: targetPath
- }
- ), {timeout: 10});
- }
- }
- }
- });
- };
- return this.reportOperationProgress(fileNames, copyFileFunction, callback);
- },
-
- /**
- * Updates the given row with the given file info
- *
- * @param {Object} $tr row element
- * @param {OCA.Files.FileInfo} fileInfo file info
- * @param {Object} options options
- *
- * @return {Object} new row element
- */
- updateRow: function($tr, fileInfo, options) {
- this.files.splice($tr.index(), 1);
- $tr.remove();
- options = _.extend({silent: true}, options);
- options = _.extend(options, {updateSummary: false});
- $tr = this.add(fileInfo, options);
- this.$fileList.trigger($.Event('fileActionsReady', {fileList: this, $files: $tr}));
- return $tr;
- },
-
- /**
- * Triggers file rename input field for the given file name.
- * If the user enters a new name, the file will be renamed.
- *
- * @param oldName file name of the file to rename
- */
- rename: function(oldName) {
- var self = this;
- var tr, td, input, form;
- tr = this.findFileEl(oldName);
- var oldFileInfo = this.files[tr.index()];
- tr.data('renaming',true);
- td = tr.children('td.filename');
- input = $('<input type="text" class="filename"/>').val(oldName);
- form = $('<form></form>');
- form.append(input);
- td.children('a.name').children(':not(.thumbnail-wrapper)').hide();
- td.append(form);
- input.focus();
- //preselect input
- var len = input.val().lastIndexOf('.');
- if ( len === -1 ||
- tr.data('type') === 'dir' ) {
- len = input.val().length;
- }
- input.selectRange(0, len);
- var checkInput = function () {
- var filename = input.val();
- if (filename !== oldName) {
- // Files.isFileNameValid(filename) throws an exception itself
- OCA.Files.Files.isFileNameValid(filename);
- if (self.inList(filename)) {
- throw t('files', '{newName} already exists', {newName: filename}, undefined, {
- escape: false
- });
- }
- }
- return true;
- };
-
- function restore() {
- input.tooltip('hide');
- tr.data('renaming',false);
- form.remove();
- td.children('a.name').children(':not(.thumbnail-wrapper)').show();
- }
-
- function updateInList(fileInfo) {
- self.updateRow(tr, fileInfo);
- self._updateDetailsView(fileInfo.name, false);
- }
-
- // TODO: too many nested blocks, move parts into functions
- form.submit(function(event) {
- event.stopPropagation();
- event.preventDefault();
- if (input.hasClass('error')) {
- return;
- }
-
- try {
- var newName = input.val().trim();
- input.tooltip('hide');
- form.remove();
-
- if (newName !== oldName) {
- checkInput();
- // mark as loading (temp element)
- self.showFileBusyState(tr, true);
- tr.attr('data-file', newName);
- var basename = newName;
- if (newName.indexOf('.') > 0 && tr.data('type') !== 'dir') {
- basename = newName.substr(0, newName.lastIndexOf('.'));
- }
- td.find('a.name span.nametext').text(basename);
- td.children('a.name').children(':not(.thumbnail-wrapper)').show();
-
- var path = tr.attr('data-path') || self.getCurrentDirectory();
- self.filesClient.move(OC.joinPaths(path, oldName), OC.joinPaths(path, newName))
- .done(function() {
- oldFileInfo.name = newName;
- updateInList(oldFileInfo);
- })
- .fail(function(status) {
- // TODO: 409 means current folder does not exist, redirect ?
- if (status === 404) {
- // source not found, so remove it from the list
- OC.Notification.show(t('files', 'Could not rename "{fileName}", it does not exist any more',
- {fileName: oldName}), {timeout: 7, type: 'error'}
- );
-
- self.remove(newName, {updateSummary: true});
- return;
- } else if (status === 412) {
- // target exists
- OC.Notification.show(
- t('files', 'The name "{targetName}" is already used in the folder "{dir}". Please choose a different name.',
- {
- targetName: newName,
- dir: self.getCurrentDirectory(),
- }),
- {
- type: 'error'
- }
- );
- } else {
- // restore the item to its previous state
- OC.Notification.show(t('files', 'Could not rename "{fileName}"',
- {fileName: oldName}), {type: 'error'}
- );
- }
- updateInList(oldFileInfo);
- });
- } else {
- // add back the old file info when cancelled
- self.files.splice(tr.index(), 1);
- tr.remove();
- tr = self.add(oldFileInfo, {updateSummary: false, silent: true});
- self.$fileList.trigger($.Event('fileActionsReady', {fileList: self, $files: $(tr)}));
- }
- } catch (error) {
- input.attr('title', error);
- input.tooltip({placement: 'right', trigger: 'manual'});
- input.tooltip('_fixTitle');
- input.tooltip('show');
- input.addClass('error');
- }
- return false;
- });
- input.keyup(function(event) {
- // verify filename on typing
- try {
- checkInput();
- input.tooltip('hide');
- input.removeClass('error');
- } catch (error) {
- input.attr('title', error);
- input.tooltip({placement: 'right', trigger: 'manual'});
- input.tooltip('_fixTitle');
- input.tooltip('show');
- input.addClass('error');
- }
- if (event.keyCode === 27) {
- restore();
- }
- });
- input.click(function(event) {
- event.stopPropagation();
- event.preventDefault();
- });
- input.blur(function() {
- if(input.hasClass('error')) {
- restore();
- } else {
- form.trigger('submit');
- }
- });
- },
-
- /**
- * Create an empty file inside the current directory.
- *
- * @param {string} name name of the file
- *
- * @return {Promise} promise that will be resolved after the
- * file was created
- *
- * @since 8.2
- */
- createFile: function(name, options) {
- var self = this;
- var deferred = $.Deferred();
- var promise = deferred.promise();
-
- OCA.Files.Files.isFileNameValid(name);
-
- if (this.lastAction) {
- this.lastAction();
- }
-
- name = this.getUniqueName(name);
- var targetPath = this.getCurrentDirectory() + '/' + name;
-
- self.filesClient.putFileContents(
- targetPath,
- ' ', // dont create empty files which fails on some storage backends
- {
- contentType: 'text/plain',
- overwrite: true
- }
- )
- .done(function() {
- // TODO: error handling / conflicts
- options = _.extend({scrollTo: true}, options || {});
- self.addAndFetchFileInfo(targetPath, '', options).then(function(status, data) {
- deferred.resolve(status, data);
- }, function() {
- OC.Notification.show(t('files', 'Could not create file "{file}"',
- {file: name}), {type: 'error'}
- );
- });
- })
- .fail(function(status) {
- if (status === 412) {
- OC.Notification.show(t('files', 'Could not create file "{file}" because it already exists',
- {file: name}), {type: 'error'}
- );
- } else {
- OC.Notification.show(t('files', 'Could not create file "{file}"',
- {file: name}), {type: 'error'}
- );
- }
- deferred.reject(status);
- });
-
- return promise;
- },
-
- /**
- * Create a directory inside the current directory.
- *
- * @param {string} name name of the directory
- *
- * @return {Promise} promise that will be resolved after the
- * directory was created
- *
- * @since 8.2
- */
- createDirectory: function(name) {
- var self = this;
- var deferred = $.Deferred();
- var promise = deferred.promise();
-
- OCA.Files.Files.isFileNameValid(name);
-
- if (this.lastAction) {
- this.lastAction();
- }
-
- name = this.getUniqueName(name);
- var targetPath = this.getCurrentDirectory() + '/' + name;
-
- this.filesClient.createDirectory(targetPath)
- .done(function() {
- self.addAndFetchFileInfo(targetPath, '', {scrollTo:true}).then(function(status, data) {
- deferred.resolve(status, data);
- }, function() {
- OC.Notification.show(t('files', 'Could not create folder "{dir}"',
- {dir: name}), {type: 'error'}
- );
- });
- })
- .fail(function(createStatus) {
- // method not allowed, folder might exist already
- if (createStatus === 405) {
- // add it to the list, for completeness
- self.addAndFetchFileInfo(targetPath, '', {scrollTo:true})
- .done(function(status, data) {
- OC.Notification.show(t('files', 'Could not create folder "{dir}" because it already exists',
- {dir: name}), {type: 'error'}
- );
- // still consider a failure
- deferred.reject(createStatus, data);
- })
- .fail(function() {
- OC.Notification.show(t('files', 'Could not create folder "{dir}"',
- {dir: name}), {type: 'error'}
- );
- deferred.reject(status);
- });
- } else {
- OC.Notification.show(t('files', 'Could not create folder "{dir}"',
- {dir: name}), {type: 'error'}
- );
- deferred.reject(createStatus);
- }
- });
-
- return promise;
- },
-
- /**
- * Add file into the list by fetching its information from the server first.
- *
- * If the given directory does not match the current directory, nothing will
- * be fetched.
- *
- * @param {String} fileName file name
- * @param {String} [dir] optional directory, defaults to the current one
- * @param {Object} options same options as #add
- * @return {Promise} promise that resolves with the file info, or an
- * already resolved Promise if no info was fetched. The promise rejects
- * if the file was not found or an error occurred.
- *
- * @since 9.0
- */
- addAndFetchFileInfo: function(fileName, dir, options) {
- var self = this;
- var deferred = $.Deferred();
- if (_.isUndefined(dir)) {
- dir = this.getCurrentDirectory();
- } else {
- dir = dir || '/';
- }
-
- var targetPath = OC.joinPaths(dir, fileName);
-
- if ((OC.dirname(targetPath) || '/') !== this.getCurrentDirectory()) {
- // no need to fetch information
- deferred.resolve();
- return deferred.promise();
- }
-
- var addOptions = _.extend({
- animate: true,
- scrollTo: false
- }, options || {});
-
- this.filesClient.getFileInfo(targetPath, {
- properties: this._getWebdavProperties()
- })
- .then(function(status, data) {
- // remove first to avoid duplicates
- self.remove(data.name);
- self.add(data, addOptions);
- deferred.resolve(status, data);
- })
- .fail(function(status) {
- OCP.Toast.error(
- t('files', 'Could not fetch file details "{file}"', { file: fileName })
- );
- deferred.reject(status);
- });
-
- return deferred.promise();
- },
-
- /**
- * Returns whether the given file name exists in the list
- *
- * @param {string} file file name
- *
- * @return {boolean} true if the file exists in the list, false otherwise
- */
- inList:function(file) {
- return this.findFile(file);
- },
-
- /**
- * Shows busy state on a given file row or multiple
- *
- * @param {string|Array.<string>} files file name or array of file names
- * @param {boolean} [busy=true] busy state, true for busy, false to remove busy state
- *
- * @since 8.2
- */
- showFileBusyState: function(files, state) {
- var self = this;
- if (!_.isArray(files) && !files.is) {
- files = [files];
- }
-
- if (_.isUndefined(state)) {
- state = true;
- }
-
- _.each(files, function(fileName) {
- // jquery element already ?
- var $tr;
- if (_.isString(fileName)) {
- $tr = self.findFileEl(fileName);
- } else {
- $tr = $(fileName);
- }
-
- var $thumbEl = $tr.find('.thumbnail');
- $tr.toggleClass('busy', state);
-
- if (state) {
- $thumbEl.parent().addClass('icon-loading-small');
- } else {
- $thumbEl.parent().removeClass('icon-loading-small');
- }
- });
- },
-
- /**
- * Delete the given files from the given dir
- * @param files file names list (without path)
- * @param dir directory in which to delete the files, defaults to the current
- * directory
- */
- do_delete:function(files, dir) {
- var self = this;
- if (files && files.substr) {
- files=[files];
- }
- if (!files) {
- // delete all files in directory
- files = _.pluck(this.files, 'name');
- }
- // Finish any existing actions
- if (this.lastAction) {
- this.lastAction();
- }
-
- dir = dir || this.getCurrentDirectory();
-
- var removeFunction = function(fileName) {
- var $tr = self.findFileEl(fileName);
- self.showFileBusyState($tr, true);
- return self.filesClient.remove(dir + '/' + fileName)
- .done(function() {
- if (OC.joinPaths(self.getCurrentDirectory(), '/') === OC.joinPaths(dir, '/')) {
- self.remove(fileName);
- }
- })
- .fail(function(status) {
- if (status === 404) {
- // the file already did not exist, remove it from the list
- if (OC.joinPaths(self.getCurrentDirectory(), '/') === OC.joinPaths(dir, '/')) {
- self.remove(fileName);
- }
- } else {
- // only reset the spinner for that one file
- OC.Notification.show(t('files', 'Error deleting file "{fileName}".',
- {fileName: fileName}), {type: 'error'}
- );
- }
- })
- .always(function() {
- self.showFileBusyState($tr, false);
- });
- };
- return this.reportOperationProgress(files, removeFunction).then(function(){
- self.updateStorageStatistics();
- self.updateStorageQuotas();
- });
- },
-
- /**
- * Creates the file summary section
- */
- _createSummary: function() {
- var $tr = $('<tr class="summary"></tr>');
-
- if (this._allowSelection) {
- // Dummy column for selection, as all rows must have the same
- // number of columns.
- $tr.append('<td></td>');
- }
-
- this.$el.find('tfoot').append($tr);
-
- return new OCA.Files.FileSummary($tr, {config: this._filesConfig});
- },
- updateEmptyContent: function() {
- var permissions = this.getDirectoryPermissions();
- var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
- this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
- this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
- this.$el.find('#emptycontent .uploadmessage').toggleClass('hidden', !isCreatable || !this.isEmpty);
- this.$el.find('#filestable').toggleClass('hidden', this.isEmpty);
- this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
- },
- /**
- * Shows the loading mask.
- *
- * @see OCA.Files.FileList#hideMask
- */
- showMask: function() {
- // in case one was shown before
- var $mask = this.$el.find('.mask');
- if ($mask.exists()) {
- return;
- }
-
- this.$table.addClass('hidden');
- this.$el.find('#emptycontent').addClass('hidden');
-
- $mask = $('<div class="mask transparent icon-loading"></div>');
-
- this.$el.append($mask);
-
- $mask.removeClass('transparent');
- },
- /**
- * Hide the loading mask.
- * @see OCA.Files.FileList#showMask
- */
- hideMask: function() {
- this.$el.find('.mask').remove();
- this.$table.removeClass('hidden');
- },
- scrollTo:function(file) {
- if (!_.isArray(file)) {
- file = [file];
- }
- if (file.length === 1) {
- _.defer(function() {
- this.showDetailsView(file[0]);
- }.bind(this));
- }
- this.highlightFiles(file, function($tr) {
- $tr.addClass('searchresult');
- $tr.one('hover', function() {
- $tr.removeClass('searchresult');
- });
- });
- },
- /**
- * @deprecated use setFilter(filter)
- */
- filter:function(query) {
- this.setFilter('');
- },
- /**
- * @deprecated use setFilter('')
- */
- unfilter:function() {
- this.setFilter('');
- },
- /**
- * hide files matching the given filter
- * @param {any} filter -
- */
- setFilter:function(filter) {
- var total = 0;
- if (this._filter === filter) {
- return;
- }
- this._filter = filter;
- this.fileSummary.setFilter(filter, this.files);
- total = this.fileSummary.getTotal();
- if (!this.$el.find('.mask').exists()) {
- this.hideIrrelevantUIWhenNoFilesMatch();
- }
-
- var visibleCount = 0;
- filter = filter.toLowerCase();
-
- function filterRows(tr) {
- var $e = $(tr);
- if ($e.data('file').toString().toLowerCase().indexOf(filter) === -1) {
- $e.addClass('hidden');
- } else {
- visibleCount++;
- $e.removeClass('hidden');
- }
- }
-
- var $trs = this.$fileList.find('tr');
- do {
- _.each($trs, filterRows);
- if (visibleCount < total) {
- $trs = this._nextPage(false);
- }
- } while (visibleCount < total && $trs.length > 0);
-
- this.$container.trigger('scroll');
- },
- hideIrrelevantUIWhenNoFilesMatch:function() {
- if (this._filter && this.fileSummary.summary.totalDirs + this.fileSummary.summary.totalFiles === 0) {
- this.$el.find('#filestable thead th').addClass('hidden');
- this.$el.find('#emptycontent').addClass('hidden');
- $('#searchresults').addClass('filter-empty');
- $('#searchresults .emptycontent').addClass('emptycontent-search');
- if ( $('#searchresults').length === 0 || $('#searchresults').hasClass('hidden') ) {
- var error;
- if (this._filter.length > 2) {
- error = t('files', 'No search results in other folders for {tag}{filter}{endtag}', {filter:this._filter});
- } else {
- error = t('files', 'Enter more than two characters to search in other folders');
- }
- this.$el.find('.nofilterresults').removeClass('hidden').
- find('p').html(error.replace('{tag}', '<strong>').replace('{endtag}', '</strong>'));
- }
- } else {
- $('#searchresults').removeClass('filter-empty');
- $('#searchresults .emptycontent').removeClass('emptycontent-search');
- this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
- if (!this.$el.find('.mask').exists()) {
- this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
- }
- this.$el.find('.nofilterresults').addClass('hidden');
- }
- },
- /**
- * get the current filter
- * @param {any} filter -
- */
- getFilter:function(filter) {
- return this._filter;
- },
-
- /**
- * Update UI based on the current selection
- */
- updateSelectionSummary: function() {
- var summary = this._selectionSummary.summary;
- var selection;
-
- var showHidden = !!this._filesConfig.get('showhidden');
- if (summary.totalFiles === 0 && summary.totalDirs === 0) {
- this.$el.find('#headerName a.name>span:first').text(t('files','Name'));
- this.$el.find('#headerSize a>span:first').text(t('files','Size'));
- this.$el.find('#modified a>span:first').text(t('files','Modified'));
- this.$el.find('table').removeClass('multiselect');
- this.$el.find('.selectedActions').addClass('hidden');
- }
- else {
- this.$el.find('.selectedActions').removeClass('hidden');
- this.$el.find('#headerSize a>span:first').text(OC.Util.humanFileSize(summary.totalSize));
-
- var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs);
- var fileInfo = n('files', '%n file', '%n files', summary.totalFiles);
-
- if (summary.totalDirs > 0 && summary.totalFiles > 0) {
- var selectionVars = {
- dirs: directoryInfo,
- files: fileInfo
- };
- selection = t('files', '{dirs} and {files}', selectionVars);
- } else if (summary.totalDirs > 0) {
- selection = directoryInfo;
- } else {
- selection = fileInfo;
- }
-
- if (!showHidden && summary.totalHidden > 0) {
- var hiddenInfo = n('files', 'including %n hidden', 'including %n hidden', summary.totalHidden);
- selection += ' (' + hiddenInfo + ')';
- }
-
- this.$el.find('#headerName a.name>span:first').text(selection);
- this.$el.find('#modified a>span:first').text('');
- this.$el.find('table').addClass('multiselect');
-
- if (this.fileMultiSelectMenu) {
- this.fileMultiSelectMenu.toggleItemVisibility('download', this.isSelectedDownloadable());
- this.fileMultiSelectMenu.toggleItemVisibility('delete', this.isSelectedDeletable());
- this.fileMultiSelectMenu.toggleItemVisibility('copyMove', this.isSelectedCopiable());
- if (this.isSelectedCopiable()) {
- if (this.isSelectedMovable()) {
- this.fileMultiSelectMenu.updateItemText('copyMove', t('files', 'Move or copy'));
- } else {
- this.fileMultiSelectMenu.updateItemText('copyMove', t('files', 'Copy'));
- }
- } else {
- this.fileMultiSelectMenu.toggleItemVisibility('copyMove', false);
- }
- }
- }
- },
-
- /**
- * Check whether all selected files are copiable
- */
- isSelectedCopiable: function() {
- return _.reduce(this.getSelectedFiles(), function(copiable, file) {
- var requiredPermission = $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ;
- return copiable && (file.permissions & requiredPermission);
- }, true);
- },
-
- /**
- * Check whether all selected files are movable
- */
- isSelectedMovable: function() {
- return _.reduce(this.getSelectedFiles(), function(movable, file) {
- return movable && (file.permissions & OC.PERMISSION_UPDATE);
- }, true);
- },
-
- /**
- * Check whether all selected files are downloadable
- */
- isSelectedDownloadable: function() {
- return _.reduce(this.getSelectedFiles(), function(downloadable, file) {
- return downloadable && (file.permissions & OC.PERMISSION_READ);
- }, true);
- },
-
- /**
- * Check whether all selected files are deletable
- */
- isSelectedDeletable: function() {
- return _.reduce(this.getSelectedFiles(), function(deletable, file) {
- return deletable && (file.permissions & OC.PERMISSION_DELETE);
- }, true);
- },
-
- /**
- * Are all files selected?
- *
- * @returns {Boolean} all files are selected
- */
- isAllSelected: function() {
- var checkbox = this.$el.find('.select-all')
- var checked = checkbox.prop('checked')
- var indeterminate = checkbox.prop('indeterminate')
- return checked && !indeterminate;
- },
-
- /**
- * Returns the file info of the selected files
- *
- * @return array of file names
- */
- getSelectedFiles: function() {
- return _.values(this._selectedFiles);
- },
-
- getUniqueName: function(name) {
- if (this.findFileEl(name).exists()) {
- var numMatch;
- var parts=name.split('.');
- var extension = "";
- if (parts.length > 1) {
- extension=parts.pop();
- }
- var base=parts.join('.');
- numMatch=base.match(/\((\d+)\)/);
- var num=2;
- if (numMatch && numMatch.length>0) {
- num=parseInt(numMatch[numMatch.length-1], 10)+1;
- base=base.split('(');
- base.pop();
- base=$.trim(base.join('('));
- }
- name=base+' ('+num+')';
- if (extension) {
- name = name+'.'+extension;
- }
- // FIXME: ugly recursion
- return this.getUniqueName(name);
- }
- return name;
- },
-
- /**
- * Shows a "permission denied" notification
- */
- _showPermissionDeniedNotification: function() {
- var message = t('files', 'You don’t have permission to upload or create files here');
- OC.Notification.show(message, {type: 'error'});
- },
-
- /**
- * Setup file upload events related to the file-upload plugin
- *
- * @param {OC.Uploader} uploader
- */
- setupUploadEvents: function(uploader) {
- var self = this;
-
- self._uploads = {};
-
- // detect the progress bar resize
- uploader.on('resized', this._onResize);
-
- uploader.on('drop', function(e, data) {
- self._uploader.log('filelist handle fileuploaddrop', e, data);
-
- if (self.$el.hasClass('hidden')) {
- // do not upload to invisible lists
- e.preventDefault();
- return false;
- }
-
- var dropTarget = $(e.delegatedEvent.target);
-
- // check if dropped inside this container and not another one
- if (dropTarget.length
- && !self.$el.is(dropTarget) // dropped on list directly
- && !self.$el.has(dropTarget).length // dropped inside list
- && !dropTarget.is(self.$container) // dropped on main container
- && !self.$el.parent().is(dropTarget) // drop on the parent container (#app-content) since the main container might not have the full height
- ) {
- e.preventDefault();
- return false;
- }
-
- // find the closest tr or crumb to use as target
- dropTarget = dropTarget.closest('tr, .crumb');
-
- // if dropping on tr or crumb, drag&drop upload to folder
- if (dropTarget && (dropTarget.data('type') === 'dir' ||
- dropTarget.hasClass('crumb'))) {
-
- // remember as context
- data.context = dropTarget;
-
- // if permissions are specified, only allow if create permission is there
- var permissions = dropTarget.data('permissions');
- if (!_.isUndefined(permissions) && (permissions & OC.PERMISSION_CREATE) === 0) {
- self._showPermissionDeniedNotification();
- return false;
- }
- var dir = dropTarget.data('file');
- // if from file list, need to prepend parent dir
- if (dir) {
- var parentDir = self.getCurrentDirectory();
- if (parentDir[parentDir.length - 1] !== '/') {
- parentDir += '/';
- }
- dir = parentDir + dir;
- }
- else{
- // read full path from crumb
- dir = dropTarget.data('dir') || '/';
- }
-
- // add target dir
- data.targetDir = dir;
- } else {
- // cancel uploads to current dir if no permission
- var isCreatable = (self.getDirectoryPermissions() & OC.PERMISSION_CREATE) !== 0;
- if (!isCreatable) {
- self._showPermissionDeniedNotification();
- e.stopPropagation();
- return false;
- }
-
- // we are dropping somewhere inside the file list, which will
- // upload the file to the current directory
- data.targetDir = self.getCurrentDirectory();
- }
- });
- uploader.on('add', function(e, data) {
- self._uploader.log('filelist handle fileuploadadd', e, data);
-
- // add ui visualization to existing folder
- if (data.context && data.context.data('type') === 'dir') {
- // add to existing folder
-
- // update upload counter ui
- var uploadText = data.context.find('.uploadtext');
- var currentUploads = parseInt(uploadText.attr('currentUploads'), 10);
- currentUploads += 1;
- uploadText.attr('currentUploads', currentUploads);
-
- var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads);
- if (currentUploads === 1) {
- self.showFileBusyState(uploadText.closest('tr'), true);
- uploadText.text(translatedText);
- uploadText.show();
- } else {
- uploadText.text(translatedText);
- }
- }
-
- if (!data.targetDir) {
- data.targetDir = self.getCurrentDirectory();
- }
-
- });
- /*
- * when file upload done successfully add row to filelist
- * update counter when uploading to sub folder
- */
- uploader.on('done', function(e, upload) {
- var data = upload.data;
- self._uploader.log('filelist handle fileuploaddone', e, data);
-
- var status = data.jqXHR.status;
- if (status < 200 || status >= 300) {
- // error was handled in OC.Uploads already
- return;
- }
-
- var fileName = upload.getFileName();
- var fetchInfoPromise = self.addAndFetchFileInfo(fileName, upload.getFullPath());
- if (!self._uploads) {
- self._uploads = {};
- }
- if (OC.isSamePath(OC.dirname(upload.getFullPath() + '/'), self.getCurrentDirectory())) {
- self._uploads[fileName] = fetchInfoPromise;
- }
-
- var uploadText = self.$fileList.find('tr .uploadtext');
- self.showFileBusyState(uploadText.closest('tr'), false);
- uploadText.fadeOut();
- uploadText.attr('currentUploads', 0);
-
- self.updateStorageQuotas();
- });
- uploader.on('createdfolder', function(fullPath) {
- self.addAndFetchFileInfo(OC.basename(fullPath), OC.dirname(fullPath));
- });
- uploader.on('stop', function() {
- self._uploader.log('filelist handle fileuploadstop');
-
- // prepare list of uploaded file names in the current directory
- // and discard the other ones
- var promises = _.values(self._uploads);
- var fileNames = _.keys(self._uploads);
- self._uploads = [];
-
- // as soon as all info is fetched
- $.when.apply($, promises).then(function() {
- // highlight uploaded files
- self.highlightFiles(fileNames);
- self.updateStorageStatistics();
- });
-
- var uploadText = self.$fileList.find('tr .uploadtext');
- self.showFileBusyState(uploadText.closest('tr'), false);
- uploadText.fadeOut();
- uploadText.attr('currentUploads', 0);
- });
- uploader.on('fail', function(e, data) {
- self._uploader.log('filelist handle fileuploadfail', e, data);
- self._uploads = [];
-
- //if user pressed cancel hide upload chrome
- //cleanup uploading to a dir
- var uploadText = self.$fileList.find('tr .uploadtext');
- self.showFileBusyState(uploadText.closest('tr'), false);
- uploadText.fadeOut();
- uploadText.attr('currentUploads', 0);
- self.updateStorageStatistics();
- });
-
- },
-
- /**
- * Scroll to the last file of the given list
- * Highlight the list of files
- * @param files array of filenames,
- * @param {Function} [highlightFunction] optional function
- * to be called after the scrolling is finished
- */
- highlightFiles: function(files, highlightFunction) {
- // Detection of the uploaded element
- var filename = files[files.length - 1];
- var $fileRow = this.findFileEl(filename);
-
- while(!$fileRow.exists() && this._nextPage(false) !== false) { // Checking element existence
- $fileRow = this.findFileEl(filename);
- }
-
- if (!$fileRow.exists()) { // Element not present in the file list
- return;
- }
-
- var currentOffset = this.$container.scrollTop();
- var additionalOffset = this.$el.find("#controls").height()+this.$el.find("#controls").offset().top;
-
- // Animation
- var _this = this;
- var $scrollContainer = this.$container;
- if ($scrollContainer[0] === window) {
- // need to use "html" to animate scrolling
- // when the scroll container is the window
- $scrollContainer = $('html');
- }
- $scrollContainer.animate({
- // Scrolling to the top of the new element
- scrollTop: currentOffset + $fileRow.offset().top - $fileRow.height() * 2 - additionalOffset
- }, {
- duration: 500,
- complete: function() {
- // Highlighting function
- var highlightRow = highlightFunction;
-
- if (!highlightRow) {
- highlightRow = function($fileRow) {
- $fileRow.addClass("highlightUploaded");
- setTimeout(function() {
- $fileRow.removeClass("highlightUploaded");
- }, 2500);
- };
- }
-
- // Loop over uploaded files
- for(var i=0; i<files.length; i++) {
- var $fileRow = _this.findFileEl(files[i]);
-
- if($fileRow.length !== 0) { // Checking element existence
- highlightRow($fileRow);
- }
- }
-
- }
- });
- },
-
- _renderNewButton: function() {
- // if an upload button (legacy) already exists or no actions container exist, skip
- var $actionsContainer = this.$el.find('#controls .actions');
- if (!$actionsContainer.length || this.$el.find('.button.upload').length) {
- return;
- }
- var $newButton = $(OCA.Files.Templates['template_addbutton']({
- addText: t('files', 'New'),
- iconClass: 'icon-add'
- }));
-
- $actionsContainer.prepend($newButton);
- $newButton.tooltip({'placement': 'bottom'});
-
- $newButton.click(_.bind(this._onClickNewButton, this));
- this._newButton = $newButton;
- },
-
- _onClickNewButton: function(event) {
- var $target = $(event.target);
- if (!$target.hasClass('.button')) {
- $target = $target.closest('.button');
- }
- this._newButton.tooltip('hide');
- event.preventDefault();
- if ($target.hasClass('disabled')) {
- return false;
- }
- if (!this._newFileMenu) {
- this._newFileMenu = new OCA.Files.NewFileMenu({
- fileList: this
- });
- $('.actions').append(this._newFileMenu.$el);
- }
- this._newFileMenu.showAt($target);
-
- return false;
- },
-
- /**
- * Register a tab view to be added to all views
- */
- registerTabView: function(tabView) {
- console.warn('registerTabView is deprecated! It will be removed in nextcloud 20.');
- const enabled = tabView.canDisplay || undefined
- if (tabView.id) {
- OCA.Files.Sidebar.registerTab(new OCA.Files.Sidebar.Tab({
- id: tabView.id,
- name: tabView.getLabel(),
- icon: tabView.getIcon(),
- mount: function(el, fileInfo) {
- tabView.setFileInfo(new OCA.Files.FileInfoModel(fileInfo))
- el.appendChild(tabView.el)
- },
- update: function(fileInfo) {
- tabView.setFileInfo(new OCA.Files.FileInfoModel(fileInfo))
- },
- destroy: function() {
- tabView.el.remove()
- },
- enabled: enabled
- }))
- }
- },
-
- /**
- * Register a detail view to be added to all views
- */
- registerDetailView: function(detailView) {
- console.warn('registerDetailView is deprecated! It will be removed in nextcloud 20.');
- if (detailView.el) {
- OCA.Files.Sidebar.registerSecondaryView(detailView)
- }
- },
-
- /**
- * Register a view to be added to the breadcrumb view
- */
- registerBreadCrumbDetailView: function(detailView) {
- if (this.breadcrumb) {
- this.breadcrumb.addDetailView(detailView);
- }
- },
-
- /**
- * Returns the registered detail views.
- *
- * @return null|Array<OCA.Files.DetailFileInfoView> an array with the
- * registered DetailFileInfoViews, or null if the details view
- * is not enabled.
- */
- getRegisteredDetailViews: function() {
- if (this._detailsView) {
- return this._detailsView.getDetailViews();
- }
-
- return null;
- },
-
- registerHeader: function(header) {
- this.headers.push(
- _.defaults(header, { order: 0 })
- );
- },
-
- registerFooter: function(footer) {
- this.footers.push(
- _.defaults(footer, { order: 0 })
- );
- }
- };
-
- FileList.MultiSelectMenuActions = {
- ToggleSelectionModeAction: function(fileList) {
- return {
- name: 'toggleSelectionMode',
- displayName: function(context) {
- return t('files', 'Select file range');
- },
- iconClass: 'icon-fullscreen',
- order: 15,
- action: function() {
- fileList._onClickToggleSelectionMode();
- },
- };
- },
- },
-
- /**
- * Sort comparators.
- * @namespace OCA.Files.FileList.Comparators
- * @private
- */
- FileList.Comparators = {
- /**
- * Compares two file infos by name, making directories appear
- * first.
- *
- * @param {OC.Files.FileInfo} fileInfo1 file info
- * @param {OC.Files.FileInfo} fileInfo2 file info
- * @return {number} -1 if the first file must appear before the second one,
- * 0 if they are identify, 1 otherwise.
- */
- name: function(fileInfo1, fileInfo2) {
- if (fileInfo1.type === 'dir' && fileInfo2.type !== 'dir') {
- return -1;
- }
- if (fileInfo1.type !== 'dir' && fileInfo2.type === 'dir') {
- return 1;
- }
- return OC.Util.naturalSortCompare(fileInfo1.name, fileInfo2.name);
- },
- /**
- * Compares two file infos by size.
- *
- * @param {OC.Files.FileInfo} fileInfo1 file info
- * @param {OC.Files.FileInfo} fileInfo2 file info
- * @return {number} -1 if the first file must appear before the second one,
- * 0 if they are identify, 1 otherwise.
- */
- size: function(fileInfo1, fileInfo2) {
- return fileInfo1.size - fileInfo2.size;
- },
- /**
- * Compares two file infos by timestamp.
- *
- * @param {OC.Files.FileInfo} fileInfo1 file info
- * @param {OC.Files.FileInfo} fileInfo2 file info
- * @return {number} -1 if the first file must appear before the second one,
- * 0 if they are identify, 1 otherwise.
- */
- mtime: function(fileInfo1, fileInfo2) {
- return fileInfo1.mtime - fileInfo2.mtime;
- }
- };
-
- /**
- * File info attributes.
- *
- * @typedef {Object} OC.Files.FileInfo
- *
- * @lends OC.Files.FileInfo
- *
- * @deprecated use OC.Files.FileInfo instead
- *
- */
- OCA.Files.FileInfo = OC.Files.FileInfo;
-
- OCA.Files.FileList = FileList;
-})();
-
-window.addEventListener('DOMContentLoaded', function() {
- // FIXME: unused ?
- OCA.Files.FileList.useUndo = (window.onbeforeunload)?true:false;
- $(window).on('beforeunload', function () {
- if (OCA.Files.FileList.lastAction) {
- OCA.Files.FileList.lastAction();
- }
- });
-
-});
diff --git a/apps/files/js/filemultiselectmenu.js b/apps/files/js/filemultiselectmenu.js
deleted file mode 100644
index d50fe28eace..00000000000
--- a/apps/files/js/filemultiselectmenu.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2018
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
- var FileMultiSelectMenu = OC.Backbone.View.extend({
- tagName: 'div',
- className: 'filesSelectMenu popovermenu bubble menu-center',
- _scopes: null,
- initialize: function(menuItems) {
- this._scopes = menuItems;
- },
- events: {
- 'click a.action': '_onClickAction'
- },
-
- /**
- * Renders the menu with the currently set items
- */
- render: function() {
- this.$el.html(OCA.Files.Templates['filemultiselectmenu']({
- items: this._scopes
- }));
- },
- /**
- * Displays the menu under the given element
- *
- * @param {OCA.Files.FileActionContext} context context
- * @param {Object} $trigger trigger element
- */
- show: function(context) {
- this._context = context;
- this.$el.removeClass('hidden');
- if (window.innerWidth < 480) {
- this.$el.removeClass('menu-center').addClass('menu-right');
- } else {
- this.$el.removeClass('menu-right').addClass('menu-center');
- }
- OC.showMenu(null, this.$el);
- return false;
- },
- toggleItemVisibility: function (itemName, show) {
- if (show) {
- this.$el.find('.item-' + itemName).removeClass('hidden');
- } else {
- this.$el.find('.item-' + itemName).addClass('hidden');
- }
- },
- updateItemText: function (itemName, translation) {
- this.$el.find('.item-' + itemName).find('.label').text(translation);
- },
- toggleLoading: function (itemName, showLoading) {
- var $actionElement = this.$el.find('.item-' + itemName);
- if ($actionElement.length === 0) {
- return;
- }
- var $icon = $actionElement.find('.icon');
- if (showLoading) {
- var $loadingIcon = $('<span class="icon icon-loading-small"></span>');
- $icon.after($loadingIcon);
- $icon.addClass('hidden');
- $actionElement.addClass('disabled');
- } else {
- $actionElement.find('.icon-loading-small').remove();
- $actionElement.find('.icon').removeClass('hidden');
- $actionElement.removeClass('disabled');
- }
- },
- isDisabled: function (itemName) {
- var $actionElement = this.$el.find('.item-' + itemName);
- return $actionElement.hasClass('disabled');
- },
- /**
- * Event handler whenever an action has been clicked within the menu
- *
- * @param {Object} event event object
- */
- _onClickAction: function (event) {
- var $target = $(event.currentTarget);
- if (!$target.hasClass('menuitem')) {
- $target = $target.closest('.menuitem');
- }
-
- OC.hideMenus();
- this._context.multiSelectMenuClick(event, $target.data('action'));
- return false;
- }
- });
-
- OCA.Files.FileMultiSelectMenu = FileMultiSelectMenu;
-})(OC, OCA);
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
deleted file mode 100644
index ae247584682..00000000000
--- a/apps/files/js/files.js
+++ /dev/null
@@ -1,542 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* global getURLParameter */
-/**
- * Utility class for file related operations
- */
-(function() {
- var Files = {
- // file space size sync
- _updateStorageStatistics: function(currentDir) {
- var state = Files.updateStorageStatistics;
- if (state.dir){
- if (state.dir === currentDir) {
- return;
- }
- // cancel previous call, as it was for another dir
- state.call.abort();
- }
- state.dir = currentDir;
- state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php') + '?dir=' + encodeURIComponent(currentDir),function(response) {
- state.dir = null;
- state.call = null;
- Files.updateMaxUploadFilesize(response);
- });
- },
- // update quota
- updateStorageQuotas: function() {
- Files._updateStorageQuotasThrottled();
- },
- _updateStorageQuotas: function() {
- var state = Files.updateStorageQuotas;
- state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) {
- Files.updateQuota(response);
- });
- },
- /**
- * Update storage statistics such as free space, max upload,
- * etc based on the given directory.
- *
- * Note this function is debounced to avoid making too
- * many ajax calls in a row.
- *
- * @param dir directory
- * @param force whether to force retrieving
- */
- updateStorageStatistics: function(dir, force) {
- if (!OC.currentUser) {
- return;
- }
-
- if (force) {
- Files._updateStorageStatistics(dir);
- }
- else {
- Files._updateStorageStatisticsDebounced(dir);
- }
- },
-
- updateMaxUploadFilesize:function(response) {
- if (response === undefined) {
- return;
- }
- if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) {
- $('#free_space').val(response.data.freeSpace);
- $('#upload.button').attr('data-original-title', response.data.maxHumanFilesize);
- $('#usedSpacePercent').val(response.data.usedSpacePercent);
- $('#usedSpacePercent').data('mount-type', response.data.mountType);
- $('#usedSpacePercent').data('mount-point', response.data.mountPoint);
- $('#owner').val(response.data.owner);
- $('#ownerDisplayName').val(response.data.ownerDisplayName);
- Files.displayStorageWarnings();
- OCA.Files.App.fileList._updateDirectoryPermissions();
- }
- if (response[0] === undefined) {
- return;
- }
- if (response[0].uploadMaxFilesize !== undefined) {
- $('#upload.button').attr('data-original-title', response[0].maxHumanFilesize);
- $('#usedSpacePercent').val(response[0].usedSpacePercent);
- Files.displayStorageWarnings();
- }
-
- },
-
- updateQuota:function(response) {
- if (response === undefined) {
- return;
- }
- if (response.data !== undefined
- && response.data.quota !== undefined
- && response.data.used !== undefined
- && response.data.usedSpacePercent !== undefined) {
- var humanUsed = OC.Util.humanFileSize(response.data.used, true);
- var humanQuota = OC.Util.humanFileSize(response.data.quota, true);
- if (response.data.quota > 0) {
- $('#quota').attr('data-original-title', Math.floor(response.data.used/response.data.quota*1000)/10 + '%');
- $('#quota progress').val(response.data.usedSpacePercent);
- $('#quotatext').text(t('files', '{used} of {quota} used', {used: humanUsed, quota: humanQuota}));
- } else {
- $('#quotatext').text(t('files', '{used} used', {used: humanUsed}));
- }
- if (response.data.usedSpacePercent > 80) {
- $('#quota progress').addClass('warn');
- } else {
- $('#quota progress').removeClass('warn');
- }
- }
-
- },
-
- /**
- * Fix path name by removing double slash at the beginning, if any
- */
- fixPath: function(fileName) {
- if (fileName.substr(0, 2) == '//') {
- return fileName.substr(1);
- }
- return fileName;
- },
-
- /**
- * Checks whether the given file name is valid.
- * @param name file name to check
- * @return true if the file name is valid.
- * Throws a string exception with an error message if
- * the file name is not valid
- *
- * NOTE: This function is duplicated in the filepicker inside core/src/OC/dialogs.js
- */
- isFileNameValid: function (name) {
- var trimmedName = name.trim();
- if (trimmedName === '.' || trimmedName === '..')
- {
- throw t('files', '"{name}" is an invalid file name.', {name: name});
- } else if (trimmedName.length === 0) {
- throw t('files', 'File name cannot be empty.');
- } else if (trimmedName.indexOf('/') !== -1) {
- throw t('files', '"/" is not allowed inside a file name.');
- } else if (!!(trimmedName.match(OC.config.blacklist_files_regex))) {
- throw t('files', '"{name}" is not an allowed filetype', {name: name});
- }
-
- return true;
- },
- displayStorageWarnings: function() {
- if (!OC.Notification.isHidden()) {
- return;
- }
-
- var usedSpacePercent = $('#usedSpacePercent').val(),
- owner = $('#owner').val(),
- ownerDisplayName = $('#ownerDisplayName').val(),
- mountType = $('#usedSpacePercent').data('mount-type'),
- mountPoint = $('#usedSpacePercent').data('mount-point');
- if (usedSpacePercent > 98) {
- if (owner !== OC.getCurrentUser().uid) {
- OC.Notification.show(t('files', 'Storage of {owner} is full, files cannot be updated or synced anymore!',
- {owner: ownerDisplayName}), {type: 'error'}
- );
- } else if (mountType === 'group') {
- OC.Notification.show(t('files',
- 'Group folder "{mountPoint}" is full, files cannot be updated or synced anymore!',
- {mountPoint: mountPoint}),
- {type: 'error'}
- );
- } else if (mountType === 'external') {
- OC.Notification.show(t('files',
- 'External storage "{mountPoint}" is full, files cannot be updated or synced anymore!',
- {mountPoint: mountPoint}),
- {type : 'error'}
- );
- } else {
- OC.Notification.show(t('files',
- 'Your storage is full, files cannot be updated or synced anymore!'),
- {type: 'error'}
- );
- }
- } else if (usedSpacePercent > 90) {
- if (owner !== OC.getCurrentUser().uid) {
- OC.Notification.show(t('files', 'Storage of {owner} is almost full ({usedSpacePercent}%).',
- {
- usedSpacePercent: usedSpacePercent,
- owner: ownerDisplayName
- }),
- {
- type: 'error'
- }
- );
- } else if (mountType === 'group') {
- OC.Notification.show(t('files',
- 'Group folder "{mountPoint}" is almost full ({usedSpacePercent}%).',
- {mountPoint: mountPoint, usedSpacePercent: usedSpacePercent}),
- {type : 'error'}
- );
- } else if (mountType === 'external') {
- OC.Notification.show(t('files',
- 'External storage "{mountPoint}" is almost full ({usedSpacePercent}%).',
- {mountPoint: mountPoint, usedSpacePercent: usedSpacePercent}),
- {type : 'error'}
- );
- } else {
- OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%).',
- {usedSpacePercent: usedSpacePercent}),
- {type : 'error'}
- );
- }
- }
- },
-
- /**
- * Returns the download URL of the given file(s)
- * @param {string} filename string or array of file names to download
- * @param {string} [dir] optional directory in which the file name is, defaults to the current directory
- * @param {boolean} [isDir=false] whether the given filename is a directory and might need a special URL
- */
- getDownloadUrl: function(filename, dir, isDir) {
- if (!_.isArray(filename) && !isDir) {
- var pathSections = dir.split('/');
- pathSections.push(filename);
- var encodedPath = '';
- _.each(pathSections, function(section) {
- if (section !== '') {
- encodedPath += '/' + encodeURIComponent(section);
- }
- });
- return OC.linkToRemoteBase('webdav') + encodedPath;
- }
-
- if (_.isArray(filename)) {
- filename = JSON.stringify(filename);
- }
-
- var params = {
- dir: dir,
- files: filename
- };
- return this.getAjaxUrl('download', params);
- },
-
- /**
- * Returns the ajax URL for a given action
- * @param action action string
- * @param params optional params map
- */
- getAjaxUrl: function(action, params) {
- var q = '';
- if (params) {
- q = '?' + OC.buildQueryString(params);
- }
- return OC.filePath('files', 'ajax', action + '.php') + q;
- },
-
- /**
- * Fetch the icon url for the mimetype
- * @param {string} mime The mimetype
- * @param {Files~mimeicon} ready Function to call when mimetype is retrieved
- * @deprecated use OC.MimeType.getIconUrl(mime)
- */
- getMimeIcon: function(mime, ready) {
- ready(OC.MimeType.getIconUrl(mime));
- },
-
- /**
- * Generates a preview URL based on the URL space.
- * @param urlSpec attributes for the URL
- * @param {number} urlSpec.x width
- * @param {number} urlSpec.y height
- * @param {String} urlSpec.file path to the file
- * @return preview URL
- * @deprecated used OCA.Files.FileList.generatePreviewUrl instead
- */
- generatePreviewUrl: function(urlSpec) {
- console.warn('DEPRECATED: please use generatePreviewUrl() from an OCA.Files.FileList instance');
- return OCA.Files.App.fileList.generatePreviewUrl(urlSpec);
- },
-
- /**
- * Lazy load preview
- * @deprecated used OCA.Files.FileList.lazyLoadPreview instead
- */
- lazyLoadPreview : function(path, mime, ready, width, height, etag) {
- console.warn('DEPRECATED: please use lazyLoadPreview() from an OCA.Files.FileList instance');
- return FileList.lazyLoadPreview({
- path: path,
- mime: mime,
- callback: ready,
- width: width,
- height: height,
- etag: etag
- });
- },
-
- /**
- * Initialize the files view
- */
- initialize: function() {
- Files.bindKeyboardShortcuts(document, $);
-
- // TODO: move file list related code (upload) to OCA.Files.FileList
- $('#file_action_panel').attr('activeAction', false);
-
- // drag&drop support using jquery.fileupload
- // TODO use OC.dialogs
- $(document).bind('drop dragover', function (e) {
- e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
- });
-
- // display storage warnings
- setTimeout(Files.displayStorageWarnings, 100);
-
- // only possible at the moment if user is logged in or the files app is loaded
- if (OC.currentUser && OCA.Files.App && OC.config.session_keepalive) {
- // start on load - we ask the server every 5 minutes
- var func = _.bind(OCA.Files.App.fileList.updateStorageStatistics, OCA.Files.App.fileList);
- var updateStorageStatisticsInterval = 5*60*1000;
- var updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
-
- // TODO: this should also stop when switching to another view
- // Use jquery-visibility to de-/re-activate file stats sync
- if ($.support.pageVisibility) {
- $(document).on({
- 'show': function() {
- if (!updateStorageStatisticsIntervalId) {
- updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
- }
- },
- 'hide': function() {
- clearInterval(updateStorageStatisticsIntervalId);
- updateStorageStatisticsIntervalId = 0;
- }
- });
- }
- }
-
-
- $('#webdavurl').on('click touchstart', function () {
- this.focus();
- this.setSelectionRange(0, this.value.length);
- });
-
- $('#upload').tooltip({placement:'right'});
-
- //FIXME scroll to and highlight preselected file
- /*
- if (getURLParameter('scrollto')) {
- FileList.scrollTo(getURLParameter('scrollto'));
- }
- */
- },
-
- /**
- * Handles the download and calls the callback function once the download has started
- * - browser sends download request and adds parameter with a token
- * - server notices this token and adds a set cookie to the download response
- * - browser now adds this cookie for the domain
- * - JS periodically checks for this cookie and then knows when the download has started to call the callback
- *
- * @param {string} url download URL
- * @param {Function} callback function to call once the download has started
- */
- handleDownload: function(url, callback) {
- var randomToken = Math.random().toString(36).substring(2),
- checkForDownloadCookie = function() {
- if (!OC.Util.isCookieSetToValue('ocDownloadStarted', randomToken)){
- return false;
- } else {
- callback();
- return true;
- }
- };
-
- if (url.indexOf('?') >= 0) {
- url += '&';
- } else {
- url += '?';
- }
- OC.redirect(url + 'downloadStartSecret=' + randomToken);
- OC.Util.waitFor(checkForDownloadCookie, 500);
- }
- };
-
- Files._updateStorageStatisticsDebounced = _.debounce(Files._updateStorageStatistics, 250);
- Files._updateStorageQuotasThrottled = _.throttle(Files._updateStorageQuotas, 30000);
- OCA.Files.Files = Files;
-})();
-
-// TODO: move to FileList
-var createDragShadow = function(event) {
- // FIXME: inject file list instance somehow
- /* global FileList, Files */
-
- //select dragged file
- var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
- if (!isDragSelected) {
- //select dragged file
- FileList._selectFileEl($(event.target).parents('tr:first'), true, false);
- }
-
- // do not show drag shadow for too many files
- var selectedFiles = _.first(FileList.getSelectedFiles(), FileList.pageSize());
- selectedFiles = _.sortBy(selectedFiles, FileList._fileInfoCompare);
-
- if (!isDragSelected && selectedFiles.length === 1) {
- //revert the selection
- FileList._selectFileEl($(event.target).parents('tr:first'), false, false);
- }
-
- // build dragshadow
- var dragshadow = $('<table class="dragshadow"></table>');
- var tbody = $('<tbody></tbody>');
- dragshadow.append(tbody);
-
- var dir = FileList.getCurrentDirectory();
-
- $(selectedFiles).each(function(i,elem) {
- // TODO: refactor this with the table row creation code
- var newtr = $('<tr></tr>')
- .attr('data-dir', dir)
- .attr('data-file', elem.name)
- .attr('data-origin', elem.origin);
- newtr.append($('<td class="filename"></td>').text(elem.name).css('background-size', 32));
- newtr.append($('<td class="size"></td>').text(OC.Util.humanFileSize(elem.size)));
- tbody.append(newtr);
- if (elem.type === 'dir') {
- newtr.find('td.filename')
- .css('background-image', 'url(' + OC.MimeType.getIconUrl('folder') + ')');
- } else {
- var path = dir + '/' + elem.name;
- Files.lazyLoadPreview(path, elem.mimetype, function(previewpath) {
- newtr.find('td.filename')
- .css('background-image', 'url(' + previewpath + ')');
- }, null, null, elem.etag);
- }
- });
-
- return dragshadow;
-};
-
-//options for file drag/drop
-//start&stop handlers needs some cleaning up
-// TODO: move to FileList class
-var dragOptions={
- revert: 'invalid',
- revertDuration: 300,
- opacity: 0.7,
- appendTo: 'body',
- cursorAt: { left: 24, top: 18 },
- helper: createDragShadow,
- cursor: 'move',
-
- start: function(event, ui){
- var $selectedFiles = $('td.filename input:checkbox:checked');
- if (!$selectedFiles.length) {
- $selectedFiles = $(this);
- }
- $selectedFiles.closest('tr').addClass('animate-opacity dragging');
- $selectedFiles.closest('tr').filter('.ui-droppable').droppable( 'disable' );
- // Show breadcrumbs menu
- $('.crumbmenu').addClass('canDropChildren');
-
- },
- stop: function(event, ui) {
- var $selectedFiles = $('td.filename input:checkbox:checked');
- if (!$selectedFiles.length) {
- $selectedFiles = $(this);
- }
-
- var $tr = $selectedFiles.closest('tr');
- $tr.removeClass('dragging');
- $tr.filter('.ui-droppable').droppable( 'enable' );
-
- setTimeout(function() {
- $tr.removeClass('animate-opacity');
- }, 300);
- // Hide breadcrumbs menu
- $('.crumbmenu').removeClass('canDropChildren');
- },
- drag: function(event, ui) {
- var scrollingArea = window;
- var currentScrollTop = $(scrollingArea).scrollTop();
- var scrollArea = Math.min(Math.floor($(window).innerHeight() / 2), 100);
-
- var bottom = $(window).innerHeight() - scrollArea;
- var top = $(window).scrollTop() + scrollArea;
- if (event.pageY < top) {
- $(scrollingArea).animate({
- scrollTop: currentScrollTop - 10
- }, 400);
-
- } else if (event.pageY > bottom) {
- $(scrollingArea).animate({
- scrollTop: currentScrollTop + 10
- }, 400);
- }
-
- }
-};
-// sane browsers support using the distance option
-if ( $('html.ie').length === 0) {
- dragOptions['distance'] = 20;
-}
-
-// TODO: move to FileList class
-var folderDropOptions = {
- hoverClass: "canDrop",
- drop: function( event, ui ) {
- // don't allow moving a file into a selected folder
- /* global FileList */
- if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) {
- return false;
- }
-
- var $tr = $(this).closest('tr');
- if (($tr.data('permissions') & OC.PERMISSION_CREATE) === 0) {
- FileList._showPermissionDeniedNotification();
- return false;
- }
- var targetPath = FileList.getCurrentDirectory() + '/' + $tr.data('file');
-
- var files = FileList.getSelectedFiles();
- if (files.length === 0) {
- // single one selected without checkbox?
- files = _.map(ui.helper.find('tr'), function(el) {
- return FileList.elementToFile($(el));
- });
- }
-
- FileList.move(_.pluck(files, 'name'), targetPath);
- },
- tolerance: 'pointer'
-};
-
-// for backward compatibility
-window.Files = OCA.Files.Files;
diff --git a/apps/files/js/filesummary.js b/apps/files/js/filesummary.js
deleted file mode 100644
index 54d038d86c6..00000000000
--- a/apps/files/js/filesummary.js
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
-* ownCloud
-*
-* @author Vincent Petry
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-(function() {
- /**
- * The FileSummary class encapsulates the file summary values and
- * the logic to render it in the given container
- *
- * @constructs FileSummary
- * @memberof OCA.Files
- *
- * @param $tr table row element
- * @param {OC.Backbone.Model} [options.filesConfig] files app configuration
- */
- var FileSummary = function($tr, options) {
- options = options || {};
- var self = this;
- this.$el = $tr;
- var filesConfig = options.config;
- if (filesConfig) {
- this._showHidden = !!filesConfig.get('showhidden');
- filesConfig.on('change:showhidden', function() {
- self._showHidden = !!this.get('showhidden');
- self.update();
- });
- }
- this.clear();
- this.render();
- };
-
- FileSummary.prototype = {
- _showHidden: null,
-
- summary: {
- totalFiles: 0,
- totalDirs: 0,
- totalHidden: 0,
- totalSize: 0,
- filter:'',
- sumIsPending:false
- },
-
- /**
- * Returns whether the given file info must be hidden
- *
- * @param {OC.Files.FileInfo} fileInfo file info
- *
- * @return {boolean} true if the file is a hidden file, false otherwise
- */
- _isHiddenFile: function(file) {
- return file.name && file.name.charAt(0) === '.';
- },
-
- /**
- * Adds file
- * @param {OC.Files.FileInfo} file file to add
- * @param {boolean} update whether to update the display
- */
- add: function(file, update) {
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- return;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- this.summary.totalDirs++;
- }
- else {
- this.summary.totalFiles++;
- }
- if (this._isHiddenFile(file)) {
- this.summary.totalHidden++;
- }
-
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- this.summary.totalSize += size;
- } else {
- this.summary.sumIsPending = true;
- }
- if (!!update) {
- this.update();
- }
- },
- /**
- * Removes file
- * @param {OC.Files.FileInfo} file file to remove
- * @param {boolean} update whether to update the display
- */
- remove: function(file, update) {
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- return;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- this.summary.totalDirs--;
- }
- else {
- this.summary.totalFiles--;
- }
- if (this._isHiddenFile(file)) {
- this.summary.totalHidden--;
- }
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- this.summary.totalSize -= size;
- }
- if (!!update) {
- this.update();
- }
- },
- setFilter: function(filter, files){
- this.summary.filter = filter.toLowerCase();
- this.calculate(files);
- },
- /**
- * Returns the total of files and directories
- */
- getTotal: function() {
- return this.summary.totalDirs + this.summary.totalFiles;
- },
- /**
- * Recalculates the summary based on the given files array
- * @param files array of files
- */
- calculate: function(files) {
- var file;
- var summary = {
- totalDirs: 0,
- totalFiles: 0,
- totalHidden: 0,
- totalSize: 0,
- filter: this.summary.filter,
- sumIsPending: false
- };
-
- for (var i = 0; i < files.length; i++) {
- file = files[i];
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- continue;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- summary.totalDirs++;
- }
- else {
- summary.totalFiles++;
- }
- if (this._isHiddenFile(file)) {
- summary.totalHidden++;
- }
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- summary.totalSize += size;
- } else {
- summary.sumIsPending = true;
- }
- }
- this.setSummary(summary);
- },
- /**
- * Clears the summary
- */
- clear: function() {
- this.calculate([]);
- },
- /**
- * Sets the current summary values
- * @param summary map
- */
- setSummary: function(summary) {
- this.summary = summary;
- if (typeof this.summary.filter === 'undefined') {
- this.summary.filter = '';
- }
- this.update();
- },
-
- _infoTemplate: function(data) {
- /* NOTE: To update the template make changes in filesummary.handlebars
- * and run:
- *
- * handlebars -n OCA.Files.FileSummary.Templates filesummary.handlebars -f filesummary_template.js
- */
- return OCA.Files.Templates['filesummary'](_.extend({
- connectorLabel: t('files', '{dirs} and {files}', {dirs: '', files: ''})
- }, data));
- },
-
- /**
- * Renders the file summary element
- */
- update: function() {
- if (!this.$el) {
- return;
- }
- if (!this.summary.totalFiles && !this.summary.totalDirs) {
- this.$el.addClass('hidden');
- return;
- }
- // There's a summary and data -> Update the summary
- this.$el.removeClass('hidden');
- var $dirInfo = this.$el.find('.dirinfo');
- var $fileInfo = this.$el.find('.fileinfo');
- var $connector = this.$el.find('.connector');
- var $filterInfo = this.$el.find('.filter');
- var $hiddenInfo = this.$el.find('.hiddeninfo');
-
- // Substitute old content with new translations
- $dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs));
- $fileInfo.html(n('files', '%n file', '%n files', this.summary.totalFiles));
- $hiddenInfo.html(' (' + n('files', 'including %n hidden', 'including %n hidden', this.summary.totalHidden) + ')');
- var fileSize = this.summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(this.summary.totalSize);
- this.$el.find('.filesize').html(fileSize);
-
- // Show only what's necessary (may be hidden)
- if (this.summary.totalDirs === 0) {
- $dirInfo.addClass('hidden');
- $connector.addClass('hidden');
- } else {
- $dirInfo.removeClass('hidden');
- }
- if (this.summary.totalFiles === 0) {
- $fileInfo.addClass('hidden');
- $connector.addClass('hidden');
- } else {
- $fileInfo.removeClass('hidden');
- }
- if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) {
- $connector.removeClass('hidden');
- }
- $hiddenInfo.toggleClass('hidden', this.summary.totalHidden === 0 || this._showHidden)
- if (this.summary.filter === '') {
- $filterInfo.html('');
- $filterInfo.addClass('hidden');
- } else {
- $filterInfo.html(' ' + n('files', 'matches "{filter}"', 'match "{filter}"', this.summary.totalDirs + this.summary.totalFiles, {filter: this.summary.filter}));
- $filterInfo.removeClass('hidden');
- }
- },
- render: function() {
- if (!this.$el) {
- return;
- }
- var summary = this.summary;
-
- // don't show the filesize column, if filesize is NaN (e.g. in trashbin)
- var fileSize = '';
- if (!isNaN(summary.totalSize)) {
- fileSize = summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(summary.totalSize);
- fileSize = '<td class="filesize">' + fileSize + '</td>';
- }
-
- var $summary = $(
- '<td class="filesummary">'+ this._infoTemplate() + '</td>' +
- fileSize +
- '<td class="date"></td>'
- );
- this.$el.addClass('hidden');
- this.$el.append($summary);
- this.update();
- }
- };
- OCA.Files.FileSummary = FileSummary;
-})();
-
diff --git a/apps/files/js/gotoplugin.js b/apps/files/js/gotoplugin.js
deleted file mode 100644
index 474acdab587..00000000000
--- a/apps/files/js/gotoplugin.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2016 Robin Appelman <robin@icewind.nl>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-
-(function (OCA) {
-
- OCA.Files = OCA.Files || {};
-
- /**
- * @namespace OCA.Files.GotoPlugin
- *
- */
- OCA.Files.GotoPlugin = {
- name: 'Goto',
-
- disallowedLists: [
- 'files',
- 'trashbin'
- ],
-
- attach: function (fileList) {
- if (this.disallowedLists.indexOf(fileList.id) !== -1) {
- return;
- }
- // lists where the "Open" default action is disabled should
- // also have the goto action disabled
- if (fileList._defaultFileActionsDisabled) {
- return
- }
- var fileActions = fileList.fileActions;
-
- fileActions.registerAction({
- name: 'Goto',
- displayName: t('files', 'View in folder'),
- mime: 'all',
- permissions: OC.PERMISSION_ALL,
- iconClass: 'icon-goto nav-icon-extstoragemounts',
- type: OCA.Files.FileActions.TYPE_DROPDOWN,
- actionHandler: function (fileName, context) {
- var fileModel = context.fileInfoModel;
- OC.Apps.hideAppSidebar($('.detailsView'));
- OCA.Files.App.setActiveView('files', { silent: true });
- OCA.Files.App.fileList.changeDirectory(fileModel.get('path'), true, true).then(function() {
- OCA.Files.App.fileList.scrollTo(fileModel.get('name'));
- });
- },
- render: function (actionSpec, isDefault, context) {
- return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context)
- .removeClass('permanent');
- }
- });
- }
- };
-})(OCA);
-
-OC.Plugins.register('OCA.Files.FileList', OCA.Files.GotoPlugin);
-
diff --git a/apps/files/js/jquery-visibility.js b/apps/files/js/jquery-visibility.js
deleted file mode 100644
index 4d65e7771f9..00000000000
--- a/apps/files/js/jquery-visibility.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*!
- * jquery-visibility v1.0.11
- * Page visibility shim for jQuery.
- *
- * Project Website: http://mths.be/visibility
- *
- * @version 1.0.11
- * @license MIT.
- * @author Mathias Bynens - @mathias
- * @author Jan Paepke - @janpaepke
- */
-;(function (root, factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD. Register as an anonymous module.
- define(['jquery'], function ($) {
- return factory(root, $);
- });
- } else if (typeof exports === 'object') {
- // Node/CommonJS
- module.exports = factory(root, require('jquery'));
- } else {
- // Browser globals
- factory(root, jQuery);
- }
-}(this, function(window, $, undefined) {
- "use strict";
-
- var
- document = window.document,
- property, // property name of document, that stores page visibility
- vendorPrefixes = ['webkit', 'o', 'ms', 'moz', ''],
- $support = $.support || {},
- // In Opera, `'onfocusin' in document == true`, hence the extra `hasFocus` check to detect IE-like behavior
- eventName = 'onfocusin' in document && 'hasFocus' in document ?
- 'focusin focusout' :
- 'focus blur';
-
- var prefix;
- while ((prefix = vendorPrefixes.pop()) !== undefined) {
- property = (prefix ? prefix + 'H': 'h') + 'idden';
- $support.pageVisibility = document[property] !== undefined;
- if ($support.pageVisibility) {
- eventName = prefix + 'visibilitychange';
- break;
- }
- }
-
- // normalize to and update document hidden property
- function updateState() {
- if (property !== 'hidden') {
- document.hidden = $support.pageVisibility ? document[property] : undefined;
- }
- }
- updateState();
-
- $(/blur$/.test(eventName) ? window : document).on(eventName, function(event) {
- var type = event.type;
- var originalEvent = event.originalEvent;
-
- // Avoid errors from triggered native events for which `originalEvent` is
- // not available.
- if (!originalEvent) {
- return;
- }
-
- var toElement = originalEvent.toElement;
-
- // If it’s a `{focusin,focusout}` event (IE), `fromElement` and `toElement`
- // should both be `null` or `undefined`; else, the page visibility hasn’t
- // changed, but the user just clicked somewhere in the doc. In IE9, we need
- // to check the `relatedTarget` property instead.
- if (
- !/^focus./.test(type) || (
- toElement === undefined &&
- originalEvent.fromElement === undefined &&
- originalEvent.relatedTarget === undefined
- )
- ) {
- $(document).triggerHandler(
- property && document[property] || /^(?:blur|focusout)$/.test(type) ?
- 'hide' :
- 'show'
- );
- }
- // and update the current state
- updateState();
- });
-}));
diff --git a/apps/files/js/jquery.fileupload.js b/apps/files/js/jquery.fileupload.js
deleted file mode 100644
index cc0c97ba3ed..00000000000
--- a/apps/files/js/jquery.fileupload.js
+++ /dev/null
@@ -1,1499 +0,0 @@
-/*
- * jQuery File Upload Plugin 9.12.5
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2010, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/* jshint nomen:false */
-/* global define, require, window, document, location, Blob, FormData */
-
-;(function (factory) {
- 'use strict';
- if (typeof define === 'function' && define.amd) {
- // Register as an anonymous AMD module:
- define([
- 'jquery',
- 'jquery.ui.widget'
- ], factory);
- } else if (typeof exports === 'object') {
- // Node/CommonJS:
- factory(
- require('jquery'),
- require('./vendor/jquery.ui.widget')
- );
- } else {
- // Browser globals:
- factory(window.jQuery);
- }
-}(function ($) {
- 'use strict';
-
- // Detect file input support, based on
- // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
- $.support.fileInput = !(new RegExp(
- // Handle devices which give false positives for the feature detection:
- '(Android (1\\.[0156]|2\\.[01]))' +
- '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
- '|(w(eb)?OSBrowser)|(webOS)' +
- '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
- ).test(window.navigator.userAgent) ||
- // Feature detection for all other devices:
- $('<input type="file">').prop('disabled'));
-
- // The FileReader API is not actually used, but works as feature detection,
- // as some Safari versions (5?) support XHR file uploads via the FormData API,
- // but not non-multipart XHR file uploads.
- // window.XMLHttpRequestUpload is not available on IE10, so we check for
- // window.ProgressEvent instead to detect XHR2 file upload capability:
- $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);
- $.support.xhrFormDataFileUpload = !!window.FormData;
-
- // Detect support for Blob slicing (required for chunked uploads):
- $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
- Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
-
- // Helper function to create drag handlers for dragover/dragenter/dragleave:
- function getDragHandler(type) {
- var isDragOver = type === 'dragover';
- return function (e) {
- e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
- var dataTransfer = e.dataTransfer;
- if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&
- this._trigger(
- type,
- $.Event(type, {delegatedEvent: e})
- ) !== false) {
- e.preventDefault();
- if (isDragOver) {
- dataTransfer.dropEffect = 'copy';
- }
- }
- };
- }
-
- // The fileupload widget listens for change events on file input fields defined
- // via fileInput setting and paste or drop events of the given dropZone.
- // In addition to the default jQuery Widget methods, the fileupload widget
- // exposes the "add" and "send" methods, to add or directly send files using
- // the fileupload API.
- // By default, files added via file input selection, paste, drag & drop or
- // "add" method are uploaded immediately, but it is possible to override
- // the "add" callback option to queue file uploads.
- $.widget('blueimp.fileupload', {
-
- options: {
- // The drop target element(s), by the default the complete document.
- // Set to null to disable drag & drop support:
- dropZone: $(document),
- // The paste target element(s), by the default undefined.
- // Set to a DOM node or jQuery object to enable file pasting:
- pasteZone: undefined,
- // The file input field(s), that are listened to for change events.
- // If undefined, it is set to the file input fields inside
- // of the widget element on plugin initialization.
- // Set to null to disable the change listener.
- fileInput: undefined,
- // By default, the file input field is replaced with a clone after
- // each input field change event. This is required for iframe transport
- // queues and allows change events to be fired for the same file
- // selection, but can be disabled by setting the following option to false:
- replaceFileInput: true,
- // The parameter name for the file form data (the request argument name).
- // If undefined or empty, the name property of the file input field is
- // used, or "files[]" if the file input name property is also empty,
- // can be a string or an array of strings:
- paramName: undefined,
- // By default, each file of a selection is uploaded using an individual
- // request for XHR type uploads. Set to false to upload file
- // selections in one request each:
- singleFileUploads: true,
- // To limit the number of files uploaded with one XHR request,
- // set the following option to an integer greater than 0:
- limitMultiFileUploads: undefined,
- // The following option limits the number of files uploaded with one
- // XHR request to keep the request size under or equal to the defined
- // limit in bytes:
- limitMultiFileUploadSize: undefined,
- // Multipart file uploads add a number of bytes to each uploaded file,
- // therefore the following option adds an overhead for each file used
- // in the limitMultiFileUploadSize configuration:
- limitMultiFileUploadSizeOverhead: 512,
- // Set the following option to true to issue all file upload requests
- // in a sequential order:
- sequentialUploads: false,
- // To limit the number of concurrent uploads,
- // set the following option to an integer greater than 0:
- limitConcurrentUploads: undefined,
- // Set the following option to true to force iframe transport uploads:
- forceIframeTransport: false,
- // Set the following option to the location of a redirect url on the
- // origin server, for cross-domain iframe transport uploads:
- redirect: undefined,
- // The parameter name for the redirect url, sent as part of the form
- // data and set to 'redirect' if this option is empty:
- redirectParamName: undefined,
- // Set the following option to the location of a postMessage window,
- // to enable postMessage transport uploads:
- postMessage: undefined,
- // By default, XHR file uploads are sent as multipart/form-data.
- // The iframe transport is always using multipart/form-data.
- // Set to false to enable non-multipart XHR uploads:
- multipart: true,
- // To upload large files in smaller chunks, set the following option
- // to a preferred maximum chunk size. If set to 0, null or undefined,
- // or the browser does not support the required Blob API, files will
- // be uploaded as a whole.
- maxChunkSize: undefined,
- // When a non-multipart upload or a chunked multipart upload has been
- // aborted, this option can be used to resume the upload by setting
- // it to the size of the already uploaded bytes. This option is most
- // useful when modifying the options object inside of the "add" or
- // "send" callbacks, as the options are cloned for each file upload.
- uploadedBytes: undefined,
- // By default, failed (abort or error) file uploads are removed from the
- // global progress calculation. Set the following option to false to
- // prevent recalculating the global progress data:
- recalculateProgress: true,
- // Interval in milliseconds to calculate and trigger progress events:
- progressInterval: 100,
- // Interval in milliseconds to calculate progress bitrate:
- bitrateInterval: 500,
- // By default, uploads are started automatically when adding files:
- autoUpload: true,
-
- // Error and info messages:
- messages: {
- uploadedBytes: 'Uploaded bytes exceed file size'
- },
-
- // Translation function, gets the message key to be translated
- // and an object with context specific data as arguments:
- i18n: function (message, context) {
- message = this.messages[message] || message.toString();
- if (context) {
- $.each(context, function (key, value) {
- message = message.replace('{' + key + '}', value);
- });
- }
- return message;
- },
-
- // Additional form data to be sent along with the file uploads can be set
- // using this option, which accepts an array of objects with name and
- // value properties, a function returning such an array, a FormData
- // object (for XHR file uploads), or a simple object.
- // The form of the first fileInput is given as parameter to the function:
- formData: function (form) {
- return form.serializeArray();
- },
-
- // The add callback is invoked as soon as files are added to the fileupload
- // widget (via file input selection, drag & drop, paste or add API call).
- // If the singleFileUploads option is enabled, this callback will be
- // called once for each file in the selection for XHR file uploads, else
- // once for each file selection.
- //
- // The upload starts when the submit method is invoked on the data parameter.
- // The data object contains a files property holding the added files
- // and allows you to override plugin options as well as define ajax settings.
- //
- // Listeners for this callback can also be bound the following way:
- // .bind('fileuploadadd', func);
- //
- // data.submit() returns a Promise object and allows to attach additional
- // handlers using jQuery's Deferred callbacks:
- // data.submit().done(func).fail(func).always(func);
- add: function (e, data) {
- if (e.isDefaultPrevented()) {
- return false;
- }
- if (data.autoUpload || (data.autoUpload !== false &&
- $(this).fileupload('option', 'autoUpload'))) {
- data.process().done(function () {
- data.submit();
- });
- }
- },
-
- // Other callbacks:
-
- // Callback for the submit event of each file upload:
- // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
-
- // Callback for the start of each file upload request:
- // send: function (e, data) {}, // .bind('fileuploadsend', func);
-
- // Callback for successful uploads:
- // done: function (e, data) {}, // .bind('fileuploaddone', func);
-
- // Callback for failed (abort or error) uploads:
- // fail: function (e, data) {}, // .bind('fileuploadfail', func);
-
- // Callback for completed (success, abort or error) requests:
- // always: function (e, data) {}, // .bind('fileuploadalways', func);
-
- // Callback for upload progress events:
- // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
-
- // Callback for global upload progress events:
- // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
-
- // Callback for uploads start, equivalent to the global ajaxStart event:
- // start: function (e) {}, // .bind('fileuploadstart', func);
-
- // Callback for uploads stop, equivalent to the global ajaxStop event:
- // stop: function (e) {}, // .bind('fileuploadstop', func);
-
- // Callback for change events of the fileInput(s):
- // change: function (e, data) {}, // .bind('fileuploadchange', func);
-
- // Callback for paste events to the pasteZone(s):
- // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
-
- // Callback for drop events of the dropZone(s):
- // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
-
- // Callback for drop events of the dropZone(s) when there are no files:
- // dropnofiles: function (e) {}, // .bind('fileuploaddropnofiles', func);
-
- // Callback for dragover events of the dropZone(s):
- // dragover: function (e) {}, // .bind('fileuploaddragover', func);
-
- // Callback for the start of each chunk upload request:
- // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
-
- // Callback for successful chunk uploads:
- // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
-
- // Callback for failed (abort or error) chunk uploads:
- // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
-
- // Callback for completed (success, abort or error) chunk upload requests:
- // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
-
- // The plugin options are used as settings object for the ajax calls.
- // The following are jQuery ajax settings required for the file uploads:
- processData: false,
- contentType: false,
- cache: false,
- timeout: 0
- },
-
- // A list of options that require reinitializing event listeners and/or
- // special initialization code:
- _specialOptions: [
- 'fileInput',
- 'dropZone',
- 'pasteZone',
- 'multipart',
- 'forceIframeTransport'
- ],
-
- _blobSlice: $.support.blobSlice && function () {
- var slice = this.slice || this.webkitSlice || this.mozSlice;
- return slice.apply(this, arguments);
- },
-
- _BitrateTimer: function () {
- this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
- this.loaded = 0;
- this.bitrate = 0;
- this.getBitrate = function (now, loaded, interval) {
- var timeDiff = now - this.timestamp;
- if (!this.bitrate || !interval || timeDiff > interval) {
- this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
- this.loaded = loaded;
- this.timestamp = now;
- }
- return this.bitrate;
- };
- },
-
- _isXHRUpload: function (options) {
- return !options.forceIframeTransport &&
- ((!options.multipart && $.support.xhrFileUpload) ||
- $.support.xhrFormDataFileUpload);
- },
-
- _getFormData: function (options) {
- var formData;
- if ($.type(options.formData) === 'function') {
- return options.formData(options.form);
- }
- if ($.isArray(options.formData)) {
- return options.formData;
- }
- if ($.type(options.formData) === 'object') {
- formData = [];
- $.each(options.formData, function (name, value) {
- formData.push({name: name, value: value});
- });
- return formData;
- }
- return [];
- },
-
- _getTotal: function (files) {
- var total = 0;
- $.each(files, function (index, file) {
- total += file.size || 1;
- });
- return total;
- },
-
- _initProgressObject: function (obj) {
- var progress = {
- loaded: 0,
- total: 0,
- bitrate: 0
- };
- if (obj._progress) {
- $.extend(obj._progress, progress);
- } else {
- obj._progress = progress;
- }
- },
-
- _initResponseObject: function (obj) {
- var prop;
- if (obj._response) {
- for (prop in obj._response) {
- if (obj._response.hasOwnProperty(prop)) {
- delete obj._response[prop];
- }
- }
- } else {
- obj._response = {};
- }
- },
-
- _onProgress: function (e, data) {
- if (e.lengthComputable) {
- var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
- loaded;
- if (data._time && data.progressInterval &&
- (now - data._time < data.progressInterval) &&
- e.loaded !== e.total) {
- return;
- }
- data._time = now;
- loaded = Math.floor(
- e.loaded / e.total * (data.chunkSize || data._progress.total)
- ) + (data.uploadedBytes || 0);
- // Add the difference from the previously loaded state
- // to the global loaded counter:
- this._progress.loaded += (loaded - data._progress.loaded);
- this._progress.bitrate = this._bitrateTimer.getBitrate(
- now,
- this._progress.loaded,
- data.bitrateInterval
- );
- data._progress.loaded = data.loaded = loaded;
- data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
- now,
- loaded,
- data.bitrateInterval
- );
- // Trigger a custom progress event with a total data property set
- // to the file size(s) of the current upload and a loaded data
- // property calculated accordingly:
- this._trigger(
- 'progress',
- $.Event('progress', {delegatedEvent: e}),
- data
- );
- // Trigger a global progress event for all current file uploads,
- // including ajax calls queued for sequential file uploads:
- this._trigger(
- 'progressall',
- $.Event('progressall', {delegatedEvent: e}),
- this._progress
- );
- }
- },
-
- _initProgressListener: function (options) {
- var that = this,
- xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
- // Accesss to the native XHR object is required to add event listeners
- // for the upload progress event:
- if (xhr.upload) {
- $(xhr.upload).bind('progress', function (e) {
- var oe = e.originalEvent;
- // Make sure the progress event properties get copied over:
- e.lengthComputable = oe.lengthComputable;
- e.loaded = oe.loaded;
- e.total = oe.total;
- that._onProgress(e, options);
- });
- options.xhr = function () {
- return xhr;
- };
- }
- },
-
- _isInstanceOf: function (type, obj) {
- // Cross-frame instanceof check
- return Object.prototype.toString.call(obj) === '[object ' + type + ']';
- },
-
- _initXHRData: function (options) {
- var that = this,
- formData,
- file = options.files[0],
- // Ignore non-multipart setting if not supported:
- multipart = options.multipart || !$.support.xhrFileUpload,
- paramName = $.type(options.paramName) === 'array' ?
- options.paramName[0] : options.paramName;
- options.headers = $.extend({}, options.headers);
- if (options.contentRange) {
- options.headers['Content-Range'] = options.contentRange;
- }
- if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
- options.headers['Content-Disposition'] = 'attachment; filename="' +
- encodeURI(file.name) + '"';
- }
- if (!multipart) {
- options.contentType = file.type || 'application/octet-stream';
- options.data = options.blob || file;
- } else if ($.support.xhrFormDataFileUpload) {
- if (options.postMessage) {
- // window.postMessage does not allow sending FormData
- // objects, so we just add the File/Blob objects to
- // the formData array and let the postMessage window
- // create the FormData object out of this array:
- formData = this._getFormData(options);
- if (options.blob) {
- formData.push({
- name: paramName,
- value: options.blob
- });
- } else {
- $.each(options.files, function (index, file) {
- formData.push({
- name: ($.type(options.paramName) === 'array' &&
- options.paramName[index]) || paramName,
- value: file
- });
- });
- }
- } else {
- if (that._isInstanceOf('FormData', options.formData)) {
- formData = options.formData;
- } else {
- formData = new FormData();
- $.each(this._getFormData(options), function (index, field) {
- formData.append(field.name, field.value);
- });
- }
- if (options.blob) {
- formData.append(paramName, options.blob, file.name);
- } else {
- $.each(options.files, function (index, file) {
- // This check allows the tests to run with
- // dummy objects:
- if (that._isInstanceOf('File', file) ||
- that._isInstanceOf('Blob', file)) {
- formData.append(
- ($.type(options.paramName) === 'array' &&
- options.paramName[index]) || paramName,
- file,
- file.uploadName || file.name
- );
- }
- });
- }
- }
- options.data = formData;
- }
- // Blob reference is not needed anymore, free memory:
- options.blob = null;
- },
-
- _initIframeSettings: function (options) {
- var targetHost = $('<a></a>').prop('href', options.url).prop('host');
- // Setting the dataType to iframe enables the iframe transport:
- options.dataType = 'iframe ' + (options.dataType || '');
- // The iframe transport accepts a serialized array as form data:
- options.formData = this._getFormData(options);
- // Add redirect url to form data on cross-domain uploads:
- if (options.redirect && targetHost && targetHost !== location.host) {
- options.formData.push({
- name: options.redirectParamName || 'redirect',
- value: options.redirect
- });
- }
- },
-
- _initDataSettings: function (options) {
- if (this._isXHRUpload(options)) {
- if (!this._chunkedUpload(options, true)) {
- if (!options.data) {
- this._initXHRData(options);
- }
- this._initProgressListener(options);
- }
- if (options.postMessage) {
- // Setting the dataType to postmessage enables the
- // postMessage transport:
- options.dataType = 'postmessage ' + (options.dataType || '');
- }
- } else {
- this._initIframeSettings(options);
- }
- },
-
- _getParamName: function (options) {
- var fileInput = $(options.fileInput),
- paramName = options.paramName;
- if (!paramName) {
- paramName = [];
- fileInput.each(function () {
- var input = $(this),
- name = input.prop('name') || 'files[]',
- i = (input.prop('files') || [1]).length;
- while (i) {
- paramName.push(name);
- i -= 1;
- }
- });
- if (!paramName.length) {
- paramName = [fileInput.prop('name') || 'files[]'];
- }
- } else if (!$.isArray(paramName)) {
- paramName = [paramName];
- }
- return paramName;
- },
-
- _initFormSettings: function (options) {
- // Retrieve missing options from the input field and the
- // associated form, if available:
- if (!options.form || !options.form.length) {
- options.form = $(options.fileInput.prop('form'));
- // If the given file input doesn't have an associated form,
- // use the default widget file input's form:
- if (!options.form.length) {
- options.form = $(this.options.fileInput.prop('form'));
- }
- }
- options.paramName = this._getParamName(options);
- if (!options.url) {
- options.url = options.form.prop('action') || location.href;
- }
- // The HTTP request method must be "POST" or "PUT":
- options.type = (options.type ||
- ($.type(options.form.prop('method')) === 'string' &&
- options.form.prop('method')) || ''
- ).toUpperCase();
- if (options.type !== 'POST' && options.type !== 'PUT' &&
- options.type !== 'PATCH') {
- options.type = 'POST';
- }
- if (!options.formAcceptCharset) {
- options.formAcceptCharset = options.form.attr('accept-charset');
- }
- },
-
- _getAJAXSettings: function (data) {
- var options = $.extend({}, this.options, data);
- this._initFormSettings(options);
- this._initDataSettings(options);
- return options;
- },
-
- // jQuery 1.6 doesn't provide .state(),
- // while jQuery 1.8+ removed .isRejected() and .isResolved():
- _getDeferredState: function (deferred) {
- if (deferred.state) {
- return deferred.state();
- }
- if (deferred.isResolved()) {
- return 'resolved';
- }
- if (deferred.isRejected()) {
- return 'rejected';
- }
- return 'pending';
- },
-
- // Maps jqXHR callbacks to the equivalent
- // methods of the given Promise object:
- _enhancePromise: function (promise) {
- promise.success = promise.done;
- promise.error = promise.fail;
- promise.complete = promise.always;
- return promise;
- },
-
- // Creates and returns a Promise object enhanced with
- // the jqXHR methods abort, success, error and complete:
- _getXHRPromise: function (resolveOrReject, context, args) {
- var dfd = $.Deferred(),
- promise = dfd.promise();
- context = context || this.options.context || promise;
- if (resolveOrReject === true) {
- dfd.resolveWith(context, args);
- } else if (resolveOrReject === false) {
- dfd.rejectWith(context, args);
- }
- promise.abort = dfd.promise;
- return this._enhancePromise(promise);
- },
-
- // Adds convenience methods to the data callback argument:
- _addConvenienceMethods: function (e, data) {
- var that = this,
- getPromise = function (args) {
- return $.Deferred().resolveWith(that, args).promise();
- };
- data.process = function (resolveFunc, rejectFunc) {
- if (resolveFunc || rejectFunc) {
- data._processQueue = this._processQueue =
- (this._processQueue || getPromise([this])).then(
- function () {
- if (data.errorThrown) {
- return $.Deferred()
- .rejectWith(that, [data]).promise();
- }
- return getPromise(arguments);
- }
- ).then(resolveFunc, rejectFunc);
- }
- return this._processQueue || getPromise([this]);
- };
- data.submit = function () {
- if (this.state() !== 'pending') {
- data.jqXHR = this.jqXHR =
- (that._trigger(
- 'submit',
- $.Event('submit', {delegatedEvent: e}),
- this
- ) !== false) && that._onSend(e, this);
- }
- return this.jqXHR || that._getXHRPromise();
- };
- data.abort = function () {
- if (this.jqXHR) {
- return this.jqXHR.abort();
- }
- this.errorThrown = 'abort';
- that._trigger('fail', null, this);
- return that._getXHRPromise(false);
- };
- data.state = function () {
- if (this.jqXHR) {
- return that._getDeferredState(this.jqXHR);
- }
- if (this._processQueue) {
- return that._getDeferredState(this._processQueue);
- }
- };
- data.processing = function () {
- return !this.jqXHR && this._processQueue && that
- ._getDeferredState(this._processQueue) === 'pending';
- };
- data.progress = function () {
- return this._progress;
- };
- data.response = function () {
- return this._response;
- };
- },
-
- // Parses the Range header from the server response
- // and returns the uploaded bytes:
- _getUploadedBytes: function (jqXHR) {
- var range = jqXHR.getResponseHeader('Range'),
- parts = range && range.split('-'),
- upperBytesPos = parts && parts.length > 1 &&
- parseInt(parts[1], 10);
- return upperBytesPos && upperBytesPos + 1;
- },
-
- // Uploads a file in multiple, sequential requests
- // by splitting the file up in multiple blob chunks.
- // If the second parameter is true, only tests if the file
- // should be uploaded in chunks, but does not invoke any
- // upload requests:
- _chunkedUpload: function (options, testOnly) {
- options.uploadedBytes = options.uploadedBytes || 0;
- var that = this,
- file = options.files[0],
- fs = file.size,
- ub = options.uploadedBytes,
- mcs = options.maxChunkSize || fs,
- slice = this._blobSlice,
- dfd = $.Deferred(),
- promise = dfd.promise(),
- jqXHR,
- upload;
- if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
- options.data) {
- return false;
- }
- if (testOnly) {
- return true;
- }
- if (ub >= fs) {
- file.error = options.i18n('uploadedBytes');
- return this._getXHRPromise(
- false,
- options.context,
- [null, 'error', file.error]
- );
- }
- // The chunk upload method:
- upload = function () {
- // Clone the options object for each chunk upload:
- var o = $.extend({}, options),
- currentLoaded = o._progress.loaded;
- o.blob = slice.call(
- file,
- ub,
- ub + mcs,
- file.type
- );
- // Store the current chunk size, as the blob itself
- // will be dereferenced after data processing:
- o.chunkSize = o.blob.size;
- // Expose the chunk bytes position range:
- o.contentRange = 'bytes ' + ub + '-' +
- (ub + o.chunkSize - 1) + '/' + fs;
- // Process the upload data (the blob and potential form data):
- that._initXHRData(o);
- // Add progress listeners for this chunk upload:
- that._initProgressListener(o);
- jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
- that._getXHRPromise(false, o.context))
- .done(function (result, textStatus, jqXHR) {
- ub = that._getUploadedBytes(jqXHR) ||
- (ub + o.chunkSize);
- // Create a progress event if no final progress event
- // with loaded equaling total has been triggered
- // for this chunk:
- if (currentLoaded + o.chunkSize - o._progress.loaded) {
- that._onProgress($.Event('progress', {
- lengthComputable: true,
- loaded: ub - o.uploadedBytes,
- total: ub - o.uploadedBytes
- }), o);
- }
- options.uploadedBytes = o.uploadedBytes = ub;
- o.result = result;
- o.textStatus = textStatus;
- o.jqXHR = jqXHR;
- that._trigger('chunkdone', null, o);
- that._trigger('chunkalways', null, o);
- if (ub < fs) {
- // File upload not yet complete,
- // continue with the next chunk:
- upload();
- } else {
- dfd.resolveWith(
- o.context,
- [result, textStatus, jqXHR]
- );
- }
- })
- .fail(function (jqXHR, textStatus, errorThrown) {
- o.jqXHR = jqXHR;
- o.textStatus = textStatus;
- o.errorThrown = errorThrown;
- that._trigger('chunkfail', null, o);
- that._trigger('chunkalways', null, o);
- dfd.rejectWith(
- o.context,
- [jqXHR, textStatus, errorThrown]
- );
- });
- };
- this._enhancePromise(promise);
- promise.abort = function () {
- return jqXHR.abort();
- };
- upload();
- return promise;
- },
-
- _beforeSend: function (e, data) {
- if (this._active === 0) {
- // the start callback is triggered when an upload starts
- // and no other uploads are currently running,
- // equivalent to the global ajaxStart event:
- this._trigger('start');
- // Set timer for global bitrate progress calculation:
- this._bitrateTimer = new this._BitrateTimer();
- // Reset the global progress values:
- this._progress.loaded = this._progress.total = 0;
- this._progress.bitrate = 0;
- }
- // Make sure the container objects for the .response() and
- // .progress() methods on the data object are available
- // and reset to their initial state:
- this._initResponseObject(data);
- this._initProgressObject(data);
- data._progress.loaded = data.loaded = data.uploadedBytes || 0;
- data._progress.total = data.total = this._getTotal(data.files) || 1;
- data._progress.bitrate = data.bitrate = 0;
- this._active += 1;
- // Initialize the global progress values:
- this._progress.loaded += data.loaded;
- this._progress.total += data.total;
- },
-
- _onDone: function (result, textStatus, jqXHR, options) {
- var total = options._progress.total,
- response = options._response;
- if (options._progress.loaded < total) {
- // Create a progress event if no final progress event
- // with loaded equaling total has been triggered:
- this._onProgress($.Event('progress', {
- lengthComputable: true,
- loaded: total,
- total: total
- }), options);
- }
- response.result = options.result = result;
- response.textStatus = options.textStatus = textStatus;
- response.jqXHR = options.jqXHR = jqXHR;
- this._trigger('done', null, options);
- },
-
- _onFail: function (jqXHR, textStatus, errorThrown, options) {
- var response = options._response;
- if (options.recalculateProgress) {
- // Remove the failed (error or abort) file upload from
- // the global progress calculation:
- this._progress.loaded -= options._progress.loaded;
- this._progress.total -= options._progress.total;
- }
- response.jqXHR = options.jqXHR = jqXHR;
- response.textStatus = options.textStatus = textStatus;
- response.errorThrown = options.errorThrown = errorThrown;
- this._trigger('fail', null, options);
- },
-
- _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
- // jqXHRorResult, textStatus and jqXHRorError are added to the
- // options object via done and fail callbacks
- this._trigger('always', null, options);
- },
-
- _onSend: function (e, data) {
- if (!data.submit) {
- this._addConvenienceMethods(e, data);
- }
- var that = this,
- jqXHR,
- aborted,
- slot,
- pipe,
- options = that._getAJAXSettings(data),
- send = function () {
- that._sending += 1;
- // Set timer for bitrate progress calculation:
- options._bitrateTimer = new that._BitrateTimer();
- jqXHR = jqXHR || (
- ((aborted || that._trigger(
- 'send',
- $.Event('send', {delegatedEvent: e}),
- options
- ) === false) &&
- that._getXHRPromise(false, options.context, aborted)) ||
- that._chunkedUpload(options) || $.ajax(options)
- ).done(function (result, textStatus, jqXHR) {
- that._onDone(result, textStatus, jqXHR, options);
- }).fail(function (jqXHR, textStatus, errorThrown) {
- that._onFail(jqXHR, textStatus, errorThrown, options);
- }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
- that._onAlways(
- jqXHRorResult,
- textStatus,
- jqXHRorError,
- options
- );
- that._sending -= 1;
- that._active -= 1;
- if (options.limitConcurrentUploads &&
- options.limitConcurrentUploads > that._sending) {
- // Start the next queued upload,
- // that has not been aborted:
- var nextSlot = that._slots.shift();
- while (nextSlot) {
- if (that._getDeferredState(nextSlot) === 'pending') {
- nextSlot.resolve();
- break;
- }
- nextSlot = that._slots.shift();
- }
- }
- if (that._active === 0) {
- // The stop callback is triggered when all uploads have
- // been completed, equivalent to the global ajaxStop event:
- that._trigger('stop');
- }
- });
- return jqXHR;
- };
- this._beforeSend(e, options);
- if (this.options.sequentialUploads ||
- (this.options.limitConcurrentUploads &&
- this.options.limitConcurrentUploads <= this._sending)) {
- if (this.options.limitConcurrentUploads > 1) {
- slot = $.Deferred();
- this._slots.push(slot);
- pipe = slot.then(send);
- } else {
- this._sequence = this._sequence.then(send, send);
- pipe = this._sequence;
- }
- // Return the piped Promise object, enhanced with an abort method,
- // which is delegated to the jqXHR object of the current upload,
- // and jqXHR callbacks mapped to the equivalent Promise methods:
- pipe.abort = function () {
- aborted = [undefined, 'abort', 'abort'];
- if (!jqXHR) {
- if (slot) {
- slot.rejectWith(options.context, aborted);
- }
- return send();
- }
- return jqXHR.abort();
- };
- return this._enhancePromise(pipe);
- }
- return send();
- },
-
- _onAdd: function (e, data) {
- var that = this,
- result = true,
- options = $.extend({}, this.options, data),
- files = data.files,
- filesLength = files.length,
- limit = options.limitMultiFileUploads,
- limitSize = options.limitMultiFileUploadSize,
- overhead = options.limitMultiFileUploadSizeOverhead,
- batchSize = 0,
- paramName = this._getParamName(options),
- paramNameSet,
- paramNameSlice,
- fileSet,
- i,
- j = 0;
- if (!filesLength) {
- return false;
- }
- if (limitSize && files[0].size === undefined) {
- limitSize = undefined;
- }
- if (!(options.singleFileUploads || limit || limitSize) ||
- !this._isXHRUpload(options)) {
- fileSet = [files];
- paramNameSet = [paramName];
- } else if (!(options.singleFileUploads || limitSize) && limit) {
- fileSet = [];
- paramNameSet = [];
- for (i = 0; i < filesLength; i += limit) {
- fileSet.push(files.slice(i, i + limit));
- paramNameSlice = paramName.slice(i, i + limit);
- if (!paramNameSlice.length) {
- paramNameSlice = paramName;
- }
- paramNameSet.push(paramNameSlice);
- }
- } else if (!options.singleFileUploads && limitSize) {
- fileSet = [];
- paramNameSet = [];
- for (i = 0; i < filesLength; i = i + 1) {
- batchSize += files[i].size + overhead;
- if (i + 1 === filesLength ||
- ((batchSize + files[i + 1].size + overhead) > limitSize) ||
- (limit && i + 1 - j >= limit)) {
- fileSet.push(files.slice(j, i + 1));
- paramNameSlice = paramName.slice(j, i + 1);
- if (!paramNameSlice.length) {
- paramNameSlice = paramName;
- }
- paramNameSet.push(paramNameSlice);
- j = i + 1;
- batchSize = 0;
- }
- }
- } else {
- paramNameSet = paramName;
- }
- data.originalFiles = [];
- $.each(files, function (file) {
- if (!file.isDirectory) {
- data.originalFiles.push(file);
- }
- });
- $.each(fileSet || files, function (index, element) {
- var newData = $.extend({}, data);
- newData.files = fileSet ? element : [element];
- newData.paramName = paramNameSet[index];
- that._initResponseObject(newData);
- that._initProgressObject(newData);
- that._addConvenienceMethods(e, newData);
- result = that._trigger(
- 'add',
- $.Event('add', {delegatedEvent: e}),
- newData
- );
- return result;
- });
- return result;
- },
-
- _replaceFileInput: function (data) {
- var input = data.fileInput,
- inputClone = input.clone(true),
- restoreFocus = input.is(document.activeElement);
- // Add a reference for the new cloned file input to the data argument:
- data.fileInputClone = inputClone;
- $('<form></form>').append(inputClone)[0].reset();
- // Detaching allows to insert the fileInput on another form
- // without loosing the file input value:
- input.after(inputClone).detach();
- // If the fileInput had focus before it was detached,
- // restore focus to the inputClone.
- if (restoreFocus) {
- inputClone.focus();
- }
- // Avoid memory leaks with the detached file input:
- $.cleanData(input.unbind('remove'));
- // Replace the original file input element in the fileInput
- // elements set with the clone, which has been copied including
- // event handlers:
- this.options.fileInput = this.options.fileInput.map(function (i, el) {
- if (el === input[0]) {
- return inputClone[0];
- }
- return el;
- });
- // If the widget has been initialized on the file input itself,
- // override this.element with the file input clone:
- if (input[0] === this.element[0]) {
- this.element = inputClone;
- }
- },
-
- _handleFileTreeEntry: function (entry, path) {
- var that = this,
- dfd = $.Deferred(),
- errorHandler = function (e) {
- if (e && !e.entry) {
- e.entry = entry;
- }
- // Since $.when returns immediately if one
- // Deferred is rejected, we use resolve instead.
- // This allows valid files and invalid items
- // to be returned together in one set:
- dfd.resolve([e]);
- },
- successHandler = function (entries) {
- that._handleFileTreeEntries(
- entries,
- path + entry.name + '/'
- ).done(function (files) {
- // empty folder
- if (!files.length && entry.isDirectory) {
- dfd.resolve(entry);
- } else {
- dfd.resolve(files);
- }
- }).fail(errorHandler);
- },
- readEntries = function () {
- dirReader.readEntries(function (results) {
- if (!results.length) {
- successHandler(entries);
- } else {
- entries = entries.concat(results);
- readEntries();
- }
- }, errorHandler);
- },
- dirReader, entries = [];
- path = path || '';
- if (entry.isFile) {
- if (entry._file) {
- // Workaround for Chrome bug #149735
- entry._file.relativePath = path;
- dfd.resolve(entry._file);
- } else {
- entry.file(function (file) {
- file.relativePath = path;
- dfd.resolve(file);
- }, errorHandler);
- }
- } else if (entry.isDirectory) {
- dirReader = entry.createReader();
- readEntries();
- } else {
- // Return an empy list for file system items
- // other than files or directories:
- dfd.resolve([]);
- }
- return dfd.promise();
- },
-
- _handleFileTreeEntries: function (entries, path) {
- var that = this;
- return $.when.apply(
- $,
- $.map(entries, function (entry) {
- return that._handleFileTreeEntry(entry, path);
- })
- ).then(function () {
- return Array.prototype.concat.apply(
- [],
- arguments
- );
- });
- },
-
- _getDroppedFiles: function (dataTransfer) {
- dataTransfer = dataTransfer || {};
- var items = dataTransfer.items;
- if (items && items.length && (items[0].webkitGetAsEntry ||
- items[0].getAsEntry)) {
- return this._handleFileTreeEntries(
- $.map(items, function (item) {
- var entry;
- if (item.webkitGetAsEntry) {
- entry = item.webkitGetAsEntry();
- if (entry) {
- // Workaround for Chrome bug #149735:
- entry._file = item.getAsFile();
- }
- return entry;
- }
- return item.getAsEntry();
- })
- );
- }
- return $.Deferred().resolve(
- $.makeArray(dataTransfer.files)
- ).promise();
- },
-
- _getSingleFileInputFiles: function (fileInput) {
- fileInput = $(fileInput);
- var entries = fileInput.prop('webkitEntries') ||
- fileInput.prop('entries'),
- files,
- value;
- if (entries && entries.length) {
- return this._handleFileTreeEntries(entries);
- }
- files = $.makeArray(fileInput.prop('files'));
- if (!files.length) {
- value = fileInput.prop('value');
- if (!value) {
- return $.Deferred().resolve([]).promise();
- }
- // If the files property is not available, the browser does not
- // support the File API and we add a pseudo File object with
- // the input value as name with path information removed:
- files = [{name: value.replace(/^.*\\/, '')}];
- } else if (files[0].name === undefined && files[0].fileName) {
- // File normalization for Safari 4 and Firefox 3:
- $.each(files, function (index, file) {
- file.name = file.fileName;
- file.size = file.fileSize;
- });
- }
- return $.Deferred().resolve(files).promise();
- },
-
- _getFileInputFiles: function (fileInput) {
- if (!(fileInput instanceof $) || fileInput.length === 1) {
- return this._getSingleFileInputFiles(fileInput);
- }
- return $.when.apply(
- $,
- $.map(fileInput, this._getSingleFileInputFiles)
- ).then(function () {
- return Array.prototype.concat.apply(
- [],
- arguments
- );
- });
- },
-
- _onChange: function (e) {
- var that = this,
- data = {
- fileInput: $(e.target),
- form: $(e.target.form)
- };
- this._getFileInputFiles(data.fileInput).always(function (files) {
- data.files = files;
- if (that.options.replaceFileInput) {
- that._replaceFileInput(data);
- }
- if (that._trigger(
- 'change',
- $.Event('change', {delegatedEvent: e}),
- data
- ) !== false) {
- that._onAdd(e, data);
- }
- });
- },
-
- _onPaste: function (e) {
- var items = e.originalEvent && e.originalEvent.clipboardData &&
- e.originalEvent.clipboardData.items,
- data = {files: []};
- if (items && items.length) {
- $.each(items, function (index, item) {
- var file = item.getAsFile && item.getAsFile();
- if (file) {
- data.files.push(file);
- }
- });
- if (this._trigger(
- 'paste',
- $.Event('paste', {delegatedEvent: e}),
- data
- ) !== false) {
- this._onAdd(e, data);
- }
- }
- },
-
- _onDrop: function (e) {
- e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
- var that = this,
- dataTransfer = e.dataTransfer,
- data = {};
- if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
- e.preventDefault();
- this._getDroppedFiles(dataTransfer).always(function (files) {
- data.files = files;
- if (that._trigger(
- 'drop',
- $.Event('drop', {delegatedEvent: e}),
- data
- ) !== false) {
- that._onAdd(e, data);
- }
- });
- } else {
- // "dropnofiles" is triggered to allow proper cleanup of the
- // drag and drop operation, as some browsers trigger "drop"
- // events that have no files even if the "DataTransfer.types" of
- // the "dragover" event included a "Files" item.
- this._trigger(
- 'dropnofiles',
- $.Event('drop', {delegatedEvent: e})
- );
- }
- },
-
- _onDragOver: getDragHandler('dragover'),
-
- _onDragEnter: getDragHandler('dragenter'),
-
- _onDragLeave: getDragHandler('dragleave'),
-
- _initEventHandlers: function () {
- if (this._isXHRUpload(this.options)) {
- this._on(this.options.dropZone, {
- dragover: this._onDragOver,
- drop: this._onDrop,
- // event.preventDefault() on dragenter is required for IE10+:
- dragenter: this._onDragEnter,
- // dragleave is not required, but added for completeness:
- dragleave: this._onDragLeave
- });
- this._on(this.options.pasteZone, {
- paste: this._onPaste
- });
- }
- if ($.support.fileInput) {
- this._on(this.options.fileInput, {
- change: this._onChange
- });
- }
- },
-
- _destroyEventHandlers: function () {
- this._off(this.options.dropZone, 'dragenter dragleave dragover drop');
- this._off(this.options.pasteZone, 'paste');
- this._off(this.options.fileInput, 'change');
- },
-
- _setOption: function (key, value) {
- var reinit = $.inArray(key, this._specialOptions) !== -1;
- if (reinit) {
- this._destroyEventHandlers();
- }
- this._super(key, value);
- if (reinit) {
- this._initSpecialOptions();
- this._initEventHandlers();
- }
- },
-
- _initSpecialOptions: function () {
- var options = this.options;
- if (options.fileInput === undefined) {
- options.fileInput = this.element.is('input[type="file"]') ?
- this.element : this.element.find('input[type="file"]');
- } else if (!(options.fileInput instanceof $)) {
- options.fileInput = $(options.fileInput);
- }
- if (!(options.dropZone instanceof $)) {
- options.dropZone = $(options.dropZone);
- }
- if (!(options.pasteZone instanceof $)) {
- options.pasteZone = $(options.pasteZone);
- }
- },
-
- _getRegExp: function (str) {
- var parts = str.split('/'),
- modifiers = parts.pop();
- parts.shift();
- return new RegExp(parts.join('/'), modifiers);
- },
-
- _isRegExpOption: function (key, value) {
- return key !== 'url' && $.type(value) === 'string' &&
- /^\/.*\/[igm]{0,3}$/.test(value);
- },
-
- _initDataAttributes: function () {
- var that = this,
- options = this.options,
- data = this.element.data();
- // Initialize options set via HTML5 data-attributes:
- $.each(
- this.element[0].attributes,
- function (index, attr) {
- var key = attr.name.toLowerCase(),
- value;
- if (/^data-/.test(key)) {
- // Convert hyphen-ated key to camelCase:
- key = key.slice(5).replace(/-[a-z]/g, function (str) {
- return str.charAt(1).toUpperCase();
- });
- value = data[key];
- if (that._isRegExpOption(key, value)) {
- value = that._getRegExp(value);
- }
- options[key] = value;
- }
- }
- );
- },
-
- _create: function () {
- this._initDataAttributes();
- this._initSpecialOptions();
- this._slots = [];
- this._sequence = this._getXHRPromise(true);
- this._sending = this._active = 0;
- this._initProgressObject(this);
- this._initEventHandlers();
- },
-
- // This method is exposed to the widget API and allows to query
- // the number of active uploads:
- active: function () {
- return this._active;
- },
-
- // This method is exposed to the widget API and allows to query
- // the widget upload progress.
- // It returns an object with loaded, total and bitrate properties
- // for the running uploads:
- progress: function () {
- return this._progress;
- },
-
- // This method is exposed to the widget API and allows adding files
- // using the fileupload API. The data parameter accepts an object which
- // must have a files property and can contain additional options:
- // .fileupload('add', {files: filesList});
- add: function (data) {
- var that = this;
- if (!data || this.options.disabled) {
- return;
- }
- if (data.fileInput && !data.files) {
- this._getFileInputFiles(data.fileInput).always(function (files) {
- data.files = files;
- that._onAdd(null, data);
- });
- } else {
- data.files = $.makeArray(data.files);
- this._onAdd(null, data);
- }
- },
-
- // This method is exposed to the widget API and allows sending files
- // using the fileupload API. The data parameter accepts an object which
- // must have a files or fileInput property and can contain additional options:
- // .fileupload('send', {files: filesList});
- // The method returns a Promise object for the file upload call.
- send: function (data) {
- if (data && !this.options.disabled) {
- if (data.fileInput && !data.files) {
- var that = this,
- dfd = $.Deferred(),
- promise = dfd.promise(),
- jqXHR,
- aborted;
- promise.abort = function () {
- aborted = true;
- if (jqXHR) {
- return jqXHR.abort();
- }
- dfd.reject(null, 'abort', 'abort');
- return promise;
- };
- this._getFileInputFiles(data.fileInput).always(
- function (files) {
- if (aborted) {
- return;
- }
- if (!files.length) {
- dfd.reject();
- return;
- }
- data.files = files;
- jqXHR = that._onSend(null, data);
- jqXHR.then(
- function (result, textStatus, jqXHR) {
- dfd.resolve(result, textStatus, jqXHR);
- },
- function (jqXHR, textStatus, errorThrown) {
- dfd.reject(jqXHR, textStatus, errorThrown);
- }
- );
- }
- );
- return this._enhancePromise(promise);
- }
- data.files = $.makeArray(data.files);
- if (data.files.length) {
- return this._onSend(null, data);
- }
- }
- return this._getXHRPromise(false, data && data.context);
- }
-
- });
-
-}));
diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js
deleted file mode 100644
index b2f2cd0e582..00000000000
--- a/apps/files/js/keyboardshortcuts.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * Copyright (c) 2012 Erik Sargent <esthepiking at gmail dot com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- */
-/*****************************
- * Keyboard shortcuts for Files app
- * ctrl/cmd+n: new folder
- * ctrl/cmd+shift+n: new file
- * esc (while new file context menu is open): close menu
- * up/down: select file/folder
- * enter: open file/folder
- * delete/backspace: delete file/folder
- *****************************/
-(function(Files) {
- var keys = [];
- var keyCodes = {
- shift: 16,
- n: 78,
- cmdFirefox: 224,
- cmdOpera: 17,
- leftCmdWebKit: 91,
- rightCmdWebKit: 93,
- ctrl: 17,
- esc: 27,
- downArrow: 40,
- upArrow: 38,
- enter: 13,
- del: 46
- };
-
- function removeA(arr) {
- var what, a = arguments,
- L = a.length,
- ax;
- while (L > 1 && arr.length) {
- what = a[--L];
- while ((ax = arr.indexOf(what)) !== -1) {
- arr.splice(ax, 1);
- }
- }
- return arr;
- }
-
- function newFile() {
- $("#new").addClass("active");
- $(".popup.popupTop").toggle(true);
- $('#new li[data-type="file"]').trigger('click');
- removeA(keys, keyCodes.n);
- }
-
- function newFolder() {
- $("#new").addClass("active");
- $(".popup.popupTop").toggle(true);
- $('#new li[data-type="folder"]').trigger('click');
- removeA(keys, keyCodes.n);
- }
-
- function esc() {
- $("#controls").trigger('click');
- }
-
- function down() {
- var select = -1;
- $("#fileList tr").each(function(index) {
- if ($(this).hasClass("mouseOver")) {
- select = index + 1;
- $(this).removeClass("mouseOver");
- }
- });
- if (select === -1) {
- $("#fileList tr:first").addClass("mouseOver");
- } else {
- $("#fileList tr").each(function(index) {
- if (index === select) {
- $(this).addClass("mouseOver");
- }
- });
- }
- }
-
- function up() {
- var select = -1;
- $("#fileList tr").each(function(index) {
- if ($(this).hasClass("mouseOver")) {
- select = index - 1;
- $(this).removeClass("mouseOver");
- }
- });
- if (select === -1) {
- $("#fileList tr:last").addClass("mouseOver");
- } else {
- $("#fileList tr").each(function(index) {
- if (index === select) {
- $(this).addClass("mouseOver");
- }
- });
- }
- }
-
- function enter() {
- $("#fileList tr").each(function(index) {
- if ($(this).hasClass("mouseOver")) {
- $(this).removeClass("mouseOver");
- $(this).find("span.nametext").trigger('click');
- }
- });
- }
-
- function del() {
- $("#fileList tr").each(function(index) {
- if ($(this).hasClass("mouseOver")) {
- $(this).removeClass("mouseOver");
- $(this).find("a.action.delete").trigger('click');
- }
- });
- }
-
- function rename() {
- $("#fileList tr").each(function(index) {
- if ($(this).hasClass("mouseOver")) {
- $(this).removeClass("mouseOver");
- $(this).find("a[data-action='Rename']").trigger('click');
- }
- });
- }
- Files.bindKeyboardShortcuts = function(document, $) {
- $(document).keydown(function(event) { //check for modifier keys
- if(!$(event.target).is('body')) {
- return;
- }
- var preventDefault = false;
- if ($.inArray(event.keyCode, keys) === -1) {
- keys.push(event.keyCode);
- }
- if (
- $.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) {
- preventDefault = true; //new file/folder prevent browser from responding
- }
- if (preventDefault) {
- event.preventDefault(); //Prevent web browser from responding
- event.stopPropagation();
- return false;
- }
- });
- $(document).keyup(function(event) {
- // do your event.keyCode checks in here
- if (
- $.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) {
- if ($.inArray(keyCodes.shift, keys) !== -1) { //16=shift, New File
- newFile();
- } else { //New Folder
- newFolder();
- }
- } else if ($("#new").hasClass("active") && $.inArray(keyCodes.esc, keys) !== -1) { //close new window
- esc();
- } else if ($.inArray(keyCodes.downArrow, keys) !== -1) { //select file
- down();
- } else if ($.inArray(keyCodes.upArrow, keys) !== -1) { //select file
- up();
- } else if (!$("#new").hasClass("active") && $.inArray(keyCodes.enter, keys) !== -1) { //open file
- enter();
- } else if (!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) { //delete file
- del();
- }
- removeA(keys, event.keyCode);
- });
- };
-})((OCA.Files && OCA.Files.Files) || {});
diff --git a/apps/files/js/mainfileinfodetailview.js b/apps/files/js/mainfileinfodetailview.js
deleted file mode 100644
index 0e0a297c793..00000000000
--- a/apps/files/js/mainfileinfodetailview.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
- /**
- * @class OCA.Files.MainFileInfoDetailView
- * @classdesc
- *
- * Displays main details about a file
- *
- */
- var MainFileInfoDetailView = OCA.Files.DetailFileInfoView.extend(
- /** @lends OCA.Files.MainFileInfoDetailView.prototype */ {
-
- className: 'mainFileInfoView',
-
- /**
- * Associated file list instance, for file actions
- *
- * @type {OCA.Files.FileList}
- */
- _fileList: null,
-
- /**
- * File actions
- *
- * @type {OCA.Files.FileActions}
- */
- _fileActions: null,
-
- /**
- * @type {OCA.Files.SidebarPreviewManager}
- */
- _previewManager: null,
-
- events: {
- 'click a.action-favorite': '_onClickFavorite',
- 'click a.action-default': '_onClickDefaultAction',
- 'click a.permalink': '_onClickPermalink',
- 'focus .permalink-field>input': '_onFocusPermalink'
- },
-
- template: function(data) {
- return OCA.Files.Templates['mainfileinfodetailsview'](data);
- },
-
- initialize: function(options) {
- options = options || {};
- this._fileList = options.fileList;
- this._fileActions = options.fileActions;
- if (!this._fileList) {
- throw 'Missing required parameter "fileList"';
- }
- if (!this._fileActions) {
- throw 'Missing required parameter "fileActions"';
- }
- this._previewManager = new OCA.Files.SidebarPreviewManager(this._fileList);
-
- this._setupClipboard();
- },
-
- _setupClipboard: function() {
- var clipboard = new Clipboard('.permalink');
- clipboard.on('success', function(e) {
- var $el = $(e.trigger);
- $el.tooltip('hide')
- .attr('data-original-title', t('core', 'Copied!'))
- .tooltip('_fixTitle')
- .tooltip({placement: 'bottom', trigger: 'manual'})
- .tooltip('show');
- _.delay(function() {
- $el.tooltip('hide');
- $el.attr('data-original-title', t('files', 'Copy direct link (only works for users who have access to this file/folder)'))
- .tooltip('_fixTitle');
- }, 3000);
- });
- clipboard.on('error', function(e) {
- var $row = this.$('.permalink-field');
- $row.toggleClass('hidden');
- if (!$row.hasClass('hidden')) {
- $row.find('>input').focus();
- }
- });
- },
-
- _onClickPermalink: function(e) {
- e.preventDefault();
- return;
- },
-
- _onFocusPermalink: function() {
- this.$('.permalink-field>input').select();
- },
-
- _onClickFavorite: function(event) {
- event.preventDefault();
- this._fileActions.triggerAction('Favorite', this.model, this._fileList);
- },
-
- _onClickDefaultAction: function(event) {
- event.preventDefault();
- this._fileActions.triggerAction(null, this.model, this._fileList);
- },
-
- _onModelChanged: function() {
- // simply re-render
- this.render();
- },
-
- _makePermalink: function(fileId) {
- var baseUrl = OC.getProtocol() + '://' + OC.getHost();
- return baseUrl + OC.generateUrl('/f/{fileId}', {fileId: fileId});
- },
-
- setFileInfo: function(fileInfo) {
- if (this.model) {
- this.model.off('change', this._onModelChanged, this);
- }
- this.model = fileInfo;
- if (this.model) {
- this.model.on('change', this._onModelChanged, this);
- }
-
- if (this.model) {
- var properties = [];
- if( !this.model.has('size') ) {
- properties.push(OC.Files.Client.PROPERTY_SIZE);
- properties.push(OC.Files.Client.PROPERTY_GETCONTENTLENGTH);
- }
-
- if( properties.length > 0){
- this.model.reloadProperties(properties);
- }
- }
-
- this.render();
- },
-
- /**
- * Renders this details view
- */
- render: function() {
- this.trigger('pre-render');
-
- if (this.model) {
- var isFavorite = (this.model.get('tags') || []).indexOf(OC.TAG_FAVORITE) >= 0;
- var availableActions = this._fileActions.get(
- this.model.get('mimetype'),
- this.model.get('type'),
- this.model.get('permissions'),
- this.model.get('name')
- );
- var hasFavoriteAction = 'Favorite' in availableActions;
- this.$el.html(this.template({
- type: this.model.isImage()? 'image': '',
- nameLabel: t('files', 'Name'),
- name: this.model.get('displayName') || this.model.get('name'),
- pathLabel: t('files', 'Path'),
- path: this.model.get('path'),
- hasSize: this.model.has('size'),
- sizeLabel: t('files', 'Size'),
- size: OC.Util.humanFileSize(this.model.get('size'), true),
- altSize: n('files', '%n byte', '%n bytes', this.model.get('size')),
- dateLabel: t('files', 'Modified'),
- altDate: OC.Util.formatDate(this.model.get('mtime')),
- timestamp: this.model.get('mtime'),
- date: OC.Util.relativeModifiedDate(this.model.get('mtime')),
- hasFavoriteAction: hasFavoriteAction,
- starAltText: isFavorite ? t('files', 'Favorited') : t('files', 'Favorite'),
- starClass: isFavorite ? 'icon-starred' : 'icon-star',
- permalink: this._makePermalink(this.model.get('id')),
- permalinkTitle: t('files', 'Copy direct link (only works for users who have access to this file/folder)')
- }));
-
- // TODO: we really need OC.Previews
- var $iconDiv = this.$el.find('.thumbnail');
- var $container = this.$el.find('.thumbnailContainer');
- if (!this.model.isDirectory()) {
- $iconDiv.addClass('icon-loading icon-32');
- this._previewManager.loadPreview(this.model, $iconDiv, $container);
- } else {
- var iconUrl = this.model.get('icon') || OC.MimeType.getIconUrl('dir');
- if (typeof this.model.get('mountType') !== 'undefined') {
- iconUrl = OC.MimeType.getIconUrl('dir-' + this.model.get('mountType'))
- }
- $iconDiv.css('background-image', 'url("' + iconUrl + '")');
- }
- this.$el.find('[title]').tooltip({placement: 'bottom'});
- } else {
- this.$el.empty();
- }
- this.delegateEvents();
-
- this.trigger('post-render');
- }
- });
-
- OCA.Files.MainFileInfoDetailView = MainFileInfoDetailView;
-})();
diff --git a/apps/files/js/merged-index.json b/apps/files/js/merged-index.json
deleted file mode 100644
index 478db35f6fb..00000000000
--- a/apps/files/js/merged-index.json
+++ /dev/null
@@ -1,32 +0,0 @@
-[
- "app.js",
- "breadcrumb.js",
- "detailfileinfoview.js",
- "detailsview.js",
- "detailtabview.js",
- "favoritesfilelist.js",
- "favoritesplugin.js",
- "file-upload.js",
- "fileactions.js",
- "fileactionsmenu.js",
- "fileinfomodel.js",
- "filelist.js",
- "filemultiselectmenu.js",
- "files.js",
- "filesummary.js",
- "gotoplugin.js",
- "jquery-visibility.js",
- "jquery.fileupload.js",
- "keyboardshortcuts.js",
- "mainfileinfodetailview.js",
- "navigation.js",
- "newfilemenu.js",
- "operationprogressbar.js",
- "recentfilelist.js",
- "recentplugin.js",
- "semaphore.js",
- "sidebarpreviewmanager.js",
- "sidebarpreviewtext.js",
- "tagsplugin.js",
- "templates.js"
-]
diff --git a/apps/files/js/navigation.js b/apps/files/js/navigation.js
deleted file mode 100644
index f8f15394ef0..00000000000
--- a/apps/files/js/navigation.js
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * @Copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Vincent Petry
- * @author Felix Nüsse <felix.nuesse@t-online.de>
- *
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function () {
-
- /**
- * @class OCA.Files.Navigation
- * @classdesc Navigation control for the files app sidebar.
- *
- * @param $el element containing the navigation
- */
- var Navigation = function ($el) {
- this.initialize($el);
- };
-
- /**
- * @memberof OCA.Files
- */
- Navigation.prototype = {
-
- /**
- * Currently selected item in the list
- */
- _activeItem: null,
-
- /**
- * Currently selected container
- */
- $currentContent: null,
-
- /**
- * Key for the quick-acces-list
- */
- $quickAccessListKey: 'sublist-favorites',
- /**
- * Initializes the navigation from the given container
- *
- * @private
- * @param $el element containing the navigation
- */
- initialize: function ($el) {
- this.$el = $el;
- this._activeItem = null;
- this.$currentContent = null;
- this._setupEvents();
-
- this.setInitialQuickaccessSettings();
- },
-
- /**
- * Setup UI events
- */
- _setupEvents: function () {
- this.$el.on('click', 'li a', _.bind(this._onClickItem, this));
- this.$el.on('click', 'li button', _.bind(this._onClickMenuButton, this));
-
- var trashBinElement = $('.nav-trashbin');
- trashBinElement.droppable({
- over: function (event, ui) {
- trashBinElement.addClass('dropzone-background');
- },
- out: function (event, ui) {
- trashBinElement.removeClass('dropzone-background');
- },
- activate: function (event, ui) {
- var element = trashBinElement.find('a').first();
- element.addClass('nav-icon-trashbin-starred').removeClass('nav-icon-trashbin');
- },
- deactivate: function (event, ui) {
- var element = trashBinElement.find('a').first();
- element.addClass('nav-icon-trashbin').removeClass('nav-icon-trashbin-starred');
- },
- drop: function (event, ui) {
- trashBinElement.removeClass('dropzone-background');
-
- var $selectedFiles = $(ui.draggable);
-
- // FIXME: when there are a lot of selected files the helper
- // contains only a subset of them; the list of selected
- // files should be gotten from the file list instead to
- // ensure that all of them are removed.
- var item = ui.helper.find('tr');
- for (var i = 0; i < item.length; i++) {
- $selectedFiles.trigger('droppedOnTrash', item[i].getAttribute('data-file'), item[i].getAttribute('data-dir'));
- }
- }
- });
- },
-
- /**
- * Returns the container of the currently active app.
- *
- * @return app container
- */
- getActiveContainer: function () {
- return this.$currentContent;
- },
-
- /**
- * Returns the currently active item
- *
- * @return item ID
- */
- getActiveItem: function () {
- return this._activeItem;
- },
-
- /**
- * Switch the currently selected item, mark it as selected and
- * make the content container visible, if any.
- *
- * @param string itemId id of the navigation item to select
- * @param array options "silent" to not trigger event
- */
- setActiveItem: function (itemId, options) {
- var currentItem = this.$el.find('li[data-id="' + itemId + '"]');
- var itemDir = currentItem.data('dir');
- var itemView = currentItem.data('view');
- var oldItemId = this._activeItem;
- if (itemId === this._activeItem) {
- if (!options || !options.silent) {
- this.$el.trigger(
- new $.Event('itemChanged', {
- itemId: itemId,
- previousItemId: oldItemId,
- dir: itemDir,
- view: itemView
- })
- );
- }
- return;
- }
- this.$el.find('li a').removeClass('active');
- if (this.$currentContent) {
- this.$currentContent.addClass('hidden');
- this.$currentContent.trigger(jQuery.Event('hide'));
- }
- this._activeItem = itemId;
- currentItem.children('a').addClass('active');
- this.$currentContent = $('#app-content-' + (typeof itemView === 'string' && itemView !== '' ? itemView : itemId));
- this.$currentContent.removeClass('hidden');
- if (!options || !options.silent) {
- this.$currentContent.trigger(jQuery.Event('show', {
- itemId: itemId,
- previousItemId: oldItemId,
- dir: itemDir,
- view: itemView
- }));
- this.$el.trigger(
- new $.Event('itemChanged', {
- itemId: itemId,
- previousItemId: oldItemId,
- dir: itemDir,
- view: itemView
- })
- );
- }
- },
-
- /**
- * Returns whether a given item exists
- */
- itemExists: function (itemId) {
- return this.$el.find('li[data-id="' + itemId + '"]').length;
- },
-
- /**
- * Event handler for when clicking on an item.
- */
- _onClickItem: function (ev) {
- var $target = $(ev.target);
- var itemId = $target.closest('li').attr('data-id');
- if (!_.isUndefined(itemId)) {
- this.setActiveItem(itemId);
- }
- ev.preventDefault();
- },
-
- /**
- * Event handler for clicking a button
- */
- _onClickMenuButton: function (ev) {
- var $target = $(ev.target);
- var $menu = $target.parent('li');
- var itemId = $target.closest('button').attr('id');
-
- var collapsibleToggles = [];
- var dotmenuToggles = [];
-
- if ($menu.hasClass('collapsible') && $menu.data('expandedstate')) {
- $menu.toggleClass('open');
- var show = $menu.hasClass('open') ? 1 : 0;
- var key = $menu.data('expandedstate');
- $.post(OC.generateUrl("/apps/files/api/v1/toggleShowFolder/" + key), {show: show});
- }
-
- dotmenuToggles.forEach(function foundToggle (item) {
- if (item[0] === ("#" + itemId)) {
- document.getElementById(item[1]).classList.toggle('open');
- }
- });
-
- ev.preventDefault();
- },
-
- /**
- * Sort initially as setup of sidebar for QuickAccess
- */
- setInitialQuickaccessSettings: function () {
- var quickAccessKey = this.$quickAccessListKey;
- var quickAccessMenu = document.getElementById(quickAccessKey);
- if (quickAccessMenu) {
- var list = quickAccessMenu.getElementsByTagName('li');
- this.QuickSort(list, 0, list.length - 1);
- }
-
- var favoritesListElement = $(quickAccessMenu).parent();
- favoritesListElement.droppable({
- over: function (event, ui) {
- favoritesListElement.addClass('dropzone-background');
- },
- out: function (event, ui) {
- favoritesListElement.removeClass('dropzone-background');
- },
- activate: function (event, ui) {
- var element = favoritesListElement.find('a').first();
- element.addClass('nav-icon-favorites-starred').removeClass('nav-icon-favorites');
- },
- deactivate: function (event, ui) {
- var element = favoritesListElement.find('a').first();
- element.addClass('nav-icon-favorites').removeClass('nav-icon-favorites-starred');
- },
- drop: function (event, ui) {
- favoritesListElement.removeClass('dropzone-background');
-
- var $selectedFiles = $(ui.draggable);
-
- if (ui.helper.find('tr').size() === 1) {
- var $tr = $selectedFiles.closest('tr');
- if ($tr.attr("data-favorite")) {
- return;
- }
- $selectedFiles.trigger('droppedOnFavorites', $tr.attr('data-file'));
- } else {
- // FIXME: besides the issue described for dropping on
- // the trash bin, for favoriting it is not possible to
- // use the data from the helper; due to some bugs the
- // tags are not always added to the selected files, and
- // thus that data can not be accessed through the helper
- // to prevent triggering the favorite action on an
- // already favorited file (which would remove it from
- // favorites).
- OC.Notification.showTemporary(t('files', 'You can only favorite a single file or folder at a time'));
- }
- }
- });
- },
-
- /**
- * Sorting-Algorithm for QuickAccess
- */
- QuickSort: function (list, start, end) {
- var lastMatch;
- if (list.length > 1) {
- lastMatch = this.quicksort_helper(list, start, end);
- if (start < lastMatch - 1) {
- this.QuickSort(list, start, lastMatch - 1);
- }
- if (lastMatch < end) {
- this.QuickSort(list, lastMatch, end);
- }
- }
- },
-
- /**
- * Sorting-Algorithm-Helper for QuickAccess
- */
- quicksort_helper: function (list, start, end) {
- var pivot = Math.floor((end + start) / 2);
- var pivotElement = this.getCompareValue(list, pivot);
- var i = start;
- var j = end;
-
- while (i <= j) {
- while (this.getCompareValue(list, i) < pivotElement) {
- i++;
- }
- while (this.getCompareValue(list, j) > pivotElement) {
- j--;
- }
- if (i <= j) {
- this.swap(list, i, j);
- i++;
- j--;
- }
- }
- return i;
- },
-
- /**
- * Sorting-Algorithm-Helper for QuickAccess
- * This method allows easy access to the element which is sorted by.
- */
- getCompareValue: function (nodes, int, strategy) {
- return nodes[int].getElementsByTagName('a')[0].innerHTML.toLowerCase();
- },
-
- /**
- * Sorting-Algorithm-Helper for QuickAccess
- * This method allows easy swapping of elements.
- */
- swap: function (list, j, i) {
- var before = function(node, insertNode) {
- node.parentNode.insertBefore(insertNode, node);
- }
- before(list[i], list[j]);
- before(list[j], list[i]);
- }
-
- };
-
- OCA.Files.Navigation = Navigation;
-
-})();
-
-
-
-
-
diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js
deleted file mode 100644
index faebc305c6d..00000000000
--- a/apps/files/js/newfilemenu.js
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* global Files */
-
-(function() {
-
- /**
- * Construct a new NewFileMenu instance
- * @constructs NewFileMenu
- *
- * @memberof OCA.Files
- */
- var NewFileMenu = OC.Backbone.View.extend({
- tagName: 'div',
- // Menu is opened by default because it's rendered on "add-button" click
- className: 'newFileMenu popovermenu bubble menu open menu-left',
-
- events: {
- 'click .menuitem': '_onClickAction'
- },
-
- /**
- * @type OCA.Files.FileList
- */
- fileList: null,
-
- initialize: function(options) {
- var self = this;
- var $uploadEl = $('#file_upload_start');
- if ($uploadEl.length) {
- $uploadEl.on('fileuploadstart', function() {
- self.trigger('actionPerformed', 'upload');
- });
- } else {
- console.warn('Missing upload element "file_upload_start"');
- }
-
- this.fileList = options && options.fileList;
-
- this._menuItems = [{
- id: 'folder',
- displayName: t('files', 'New folder'),
- templateName: t('files', 'New folder'),
- iconClass: 'icon-folder',
- fileType: 'folder',
- actionHandler: function(name) {
- self.fileList.createDirectory(name);
- }
- }];
-
- OC.Plugins.attach('OCA.Files.NewFileMenu', this);
- },
-
- template: function(data) {
- return OCA.Files.Templates['newfilemenu'](data);
- },
-
- /**
- * Event handler whenever an action has been clicked within the menu
- *
- * @param {Object} event event object
- */
- _onClickAction: function(event) {
- var $target = $(event.target);
- if (!$target.hasClass('menuitem')) {
- $target = $target.closest('.menuitem');
- }
- var action = $target.attr('data-action');
- // note: clicking the upload label will automatically
- // set the focus on the "file_upload_start" hidden field
- // which itself triggers the upload dialog.
- // Currently the upload logic is still in file-upload.js and filelist.js
- if (action === 'upload') {
- OC.hideMenus();
- } else {
- event.preventDefault();
- this.$el.find('.menuitem.active').removeClass('active');
- $target.addClass('active');
- this._promptFileName($target);
- }
- },
-
- _promptFileName: function($target) {
- var self = this;
-
- if ($target.find('form').length) {
- $target.find('input[type=\'text\']').focus();
- return;
- }
-
- // discard other forms
- this.$el.find('form').remove();
- this.$el.find('.displayname').removeClass('hidden');
-
- $target.find('.displayname').addClass('hidden');
-
- var newName = $target.attr('data-templatename');
- var fileType = $target.attr('data-filetype');
- var $form = $(OCA.Files.Templates['newfilemenu_filename_form']({
- fileName: newName,
- cid: this.cid,
- fileType: fileType
- }));
-
- //this.trigger('actionPerformed', action);
- $target.append($form);
-
- // here comes the OLD code
- var $input = $form.find('input[type=\'text\']');
- var $submit = $form.find('input[type=\'submit\']');
-
- var lastPos;
- var checkInput = function () {
- // Special handling for the setup template directory
- if ($target.attr('data-action') === 'template-init') {
- return true;
- }
-
- var filename = $input.val();
- try {
- if (!Files.isFileNameValid(filename)) {
- // Files.isFileNameValid(filename) throws an exception itself
- } else if (self.fileList.inList(filename)) {
- throw t('files', '{newName} already exists', {newName: filename}, undefined, {
- escape: false
- });
- } else {
- return true;
- }
- } catch (error) {
- $input.attr('title', error);
- $input.tooltip({placement: 'right', trigger: 'manual', container: self.$el});
- $input.tooltip('_fixTitle');
- $input.tooltip('show');
- $input.addClass('error');
- }
- return false;
- };
-
- // verify filename on typing
- $input.keyup(function() {
- if (checkInput()) {
- $input.tooltip('hide');
- $input.removeClass('error');
- }
- });
-
- $submit.click(function(event) {
- event.stopPropagation();
- event.preventDefault();
- $form.submit();
- });
-
- $input.focus();
- // pre select name up to the extension
- lastPos = newName.lastIndexOf('.');
- if (lastPos === -1) {
- lastPos = newName.length;
- }
- $input.selectRange(0, lastPos);
-
- $form.submit(function(event) {
- event.stopPropagation();
- event.preventDefault();
-
- if (checkInput()) {
- var newname = $input.val().trim();
-
- /* Find the right actionHandler that should be called.
- * Actions is retrieved by using `actionSpec.id` */
- var action = _.filter(self._menuItems, function(item) {
- return item.id == $target.attr('data-action');
- }).pop();
- action.actionHandler(newname);
-
- $form.remove();
- $target.find('.displayname').removeClass('hidden');
- OC.hideMenus();
- }
- });
- },
-
- /**
- * Add a new item menu entry in the “New” file menu (in
- * last position). By clicking on the item, the
- * `actionHandler` function is called.
- *
- * @param {Object} actionSpec item’s properties
- */
- addMenuEntry: function(actionSpec) {
- this._menuItems.push({
- id: actionSpec.id,
- displayName: actionSpec.displayName,
- templateName: actionSpec.templateName,
- iconClass: actionSpec.iconClass,
- fileType: actionSpec.fileType,
- actionHandler: actionSpec.actionHandler,
- checkFilename: actionSpec.checkFilename
- });
- },
-
- /**
- * Remove a menu item from the "New" file menu
- * @param {string} actionId
- */
- removeMenuEntry: function(actionId) {
- var index = this._menuItems.findIndex(function (actionSpec) {
- return actionSpec.id === actionId;
- });
- if (index > -1) {
- this._menuItems.splice(index, 1);
- }
- },
-
- /**
- * Renders the menu with the currently set items
- */
- render: function() {
- this.$el.html(this.template({
- uploadMaxHumanFileSize: 'TODO',
- uploadLabel: t('files', 'Upload file'),
- items: this._menuItems
- }));
-
- // Trigger upload action also with keyboard navigation on enter
- this.$el.find('[for="file_upload_start"]').on('keyup', function(event) {
- if (event.key === " " || event.key === "Enter") {
- $('#file_upload_start').trigger('click');
- }
- });
- },
-
- /**
- * Displays the menu under the given element
- *
- * @param {Object} $target target element
- */
- showAt: function($target) {
- this.render();
- OC.showMenu(null, this.$el);
- }
- });
-
- OCA.Files.NewFileMenu = NewFileMenu;
-
-})();
diff --git a/apps/files/js/operationprogressbar.js b/apps/files/js/operationprogressbar.js
deleted file mode 100755
index f1138163f1b..00000000000
--- a/apps/files/js/operationprogressbar.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2018
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function() {
- var OperationProgressBar = OC.Backbone.View.extend({
- tagName: 'div',
- id: 'uploadprogresswrapper',
- events: {
- 'click button.stop': '_onClickCancel'
- },
-
- render: function() {
- this.$el.html(OCA.Files.Templates['operationprogressbar']({
- textCancelButton: t('Cancel operation')
- }));
- this.setProgressBarText(t('Uploading …'), t('…'));
- },
-
- hideProgressBar: function() {
- var self = this;
- $('#uploadprogresswrapper .stop').fadeOut();
- $('#uploadprogressbar').fadeOut(function() {
- self.$el.trigger(new $.Event('resized'));
- });
- },
-
- hideCancelButton: function() {
- var self = this;
- $('#uploadprogresswrapper .stop').fadeOut(function() {
- self.$el.trigger(new $.Event('resized'));
- });
- },
-
- showProgressBar: function(showCancelButton) {
- if (showCancelButton) {
- showCancelButton = true;
- }
- $('#uploadprogressbar').progressbar({value: 0});
- if(showCancelButton) {
- $('#uploadprogresswrapper .stop').show();
- } else {
- $('#uploadprogresswrapper .stop').hide();
- }
- $('#uploadprogresswrapper .label').show();
- $('#uploadprogressbar').fadeIn();
- this.$el.trigger(new $.Event('resized'));
- },
-
- setProgressBarValue: function(value) {
- $('#uploadprogressbar').progressbar({value: value});
- },
-
- setProgressBarText: function(textDesktop, textMobile, title) {
- var labelHtml = OCA.Files.Templates['operationprogressbarlabel']({textDesktop: textDesktop, textMobile: textMobile});
- $('#uploadprogressbar .ui-progressbar-value').html(labelHtml);
- $('#uploadprogressbar .ui-progressbar-value>em').addClass('inner');
- $('#uploadprogressbar>em').replaceWith(labelHtml);
- $('#uploadprogressbar>em').addClass('outer');
- $('#uploadprogressbar').tooltip({placement: 'bottom', container: '#uploadprogresswrapper'});
- if (title) {
- $('#uploadprogressbar').attr('data-original-title', title);
- $('#uploadprogresswrapper .tooltip-inner').text(title);
- }
- if(textDesktop || textMobile) {
- $('#uploadprogresswrapper .stop').show();
- }
- },
-
- _onClickCancel: function (event) {
- this.trigger('cancel');
- return false;
- }
- });
-
- OCA.Files.OperationProgressBar = OperationProgressBar;
-})(OC, OCA);
diff --git a/apps/files/js/recentfilelist.js b/apps/files/js/recentfilelist.js
deleted file mode 100644
index 78eaa0b6858..00000000000
--- a/apps/files/js/recentfilelist.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-// HACK: this piece needs to be loaded AFTER the files app (for unit tests)
-window.addEventListener('DOMContentLoaded', function () {
- (function (OCA) {
- /**
- * @class OCA.Files.RecentFileList
- * @augments OCA.Files.RecentFileList
- *
- * @classdesc Recent file list.
- * Displays the list of recently modified files
- *
- * @param $el container element with existing markup for the #controls
- * and a table
- * @param [options] map of options, see other parameters
- */
- var RecentFileList = function ($el, options) {
- options.sorting = {
- mode: 'mtime',
- direction: 'desc'
- };
- this.initialize($el, options);
- this._allowSorting = false;
- };
- RecentFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
- /** @lends OCA.Files.RecentFileList.prototype */ {
- id: 'recent',
- appName: t('files', 'Recent'),
-
- _clientSideSort: true,
- _allowSelection: false,
-
- /**
- * @private
- */
- initialize: function () {
- OCA.Files.FileList.prototype.initialize.apply(this, arguments);
- if (this.initialized) {
- return;
- }
- OC.Plugins.attach('OCA.Files.RecentFileList', this);
- },
-
- updateEmptyContent: function () {
- var dir = this.getCurrentDirectory();
- if (dir === '/') {
- // root has special permissions
- this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
- this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
- }
- else {
- OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments);
- }
- },
-
- getDirectoryPermissions: function () {
- return OC.PERMISSION_READ | OC.PERMISSION_DELETE;
- },
-
- updateStorageStatistics: function () {
- // no op because it doesn't have
- // storage info like free space / used space
- },
-
- reload: function () {
- this.showMask();
- if (this._reloadCall) {
- this._reloadCall.abort();
- }
-
- // there is only root
- this._setCurrentDir('/', false);
-
- this._reloadCall = $.ajax({
- url: OC.generateUrl('/apps/files/api/v1/recent'),
- type: 'GET',
- dataType: 'json'
- });
- var callBack = this.reloadCallback.bind(this);
- return this._reloadCall.then(callBack, callBack);
- },
-
- reloadCallback: function (result) {
- delete this._reloadCall;
- this.hideMask();
-
- if (result.files) {
- this.setFiles(result.files.sort(this._sortComparator));
- return true;
- }
- return false;
- }
- });
-
- OCA.Files.RecentFileList = RecentFileList;
- })(OCA);
-});
-
diff --git a/apps/files/js/recentplugin.js b/apps/files/js/recentplugin.js
deleted file mode 100644
index a6eddc752db..00000000000
--- a/apps/files/js/recentplugin.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function (OCA) {
- /**
- * Registers the recent file list from the files app sidebar.
- *
- * @namespace OCA.Files.RecentPlugin
- */
- OCA.Files.RecentPlugin = {
- name: 'Recent',
-
- /**
- * @type OCA.Files.RecentFileList
- */
- recentFileList: null,
-
- attach: function () {
- var self = this;
- $('#app-content-recent').on('show.plugin-recent', function (e) {
- self.showFileList($(e.target));
- });
- $('#app-content-recent').on('hide.plugin-recent', function () {
- self.hideFileList();
- });
- },
-
- detach: function () {
- if (this.recentFileList) {
- this.recentFileList.destroy();
- OCA.Files.fileActions.off('setDefault.plugin-recent', this._onActionsUpdated);
- OCA.Files.fileActions.off('registerAction.plugin-recent', this._onActionsUpdated);
- $('#app-content-recent').off('.plugin-recent');
- this.recentFileList = null;
- }
- },
-
- showFileList: function ($el) {
- if (!this.recentFileList) {
- this.recentFileList = this._createRecentFileList($el);
- }
- return this.recentFileList;
- },
-
- hideFileList: function () {
- if (this.recentFileList) {
- this.recentFileList.$fileList.empty();
- }
- },
-
- /**
- * Creates the recent file list.
- *
- * @param $el container for the file list
- * @return {OCA.Files.RecentFileList} file list
- */
- _createRecentFileList: function ($el) {
- var fileActions = this._createFileActions();
- // register recent list for sidebar section
- return new OCA.Files.RecentFileList(
- $el, {
- fileActions: fileActions,
- // The file list is created when a "show" event is handled,
- // so it should be marked as "shown" like it would have been
- // done if handling the event with the file list already
- // created.
- shown: true
- }
- );
- },
-
- _createFileActions: function () {
- // inherit file actions from the files app
- var fileActions = new OCA.Files.FileActions();
- // note: not merging the legacy actions because legacy apps are not
- // compatible with the sharing overview and need to be adapted first
- fileActions.registerDefaultActions();
- fileActions.merge(OCA.Files.fileActions);
-
- if (!this._globalActionsInitialized) {
- // in case actions are registered later
- this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
- OCA.Files.fileActions.on('setDefault.plugin-recent', this._onActionsUpdated);
- OCA.Files.fileActions.on('registerAction.plugin-recent', this._onActionsUpdated);
- this._globalActionsInitialized = true;
- }
-
- // when the user clicks on a folder, redirect to the corresponding
- // folder in the files app instead of opening it directly
- fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
- OCA.Files.App.setActiveView('files', {silent: true});
- var path = OC.joinPaths(context.$file.attr('data-path'), filename);
- OCA.Files.App.fileList.changeDirectory(path, true, true);
- });
- fileActions.setDefault('dir', 'Open');
- return fileActions;
- },
-
- _onActionsUpdated: function (ev) {
- if (ev.action) {
- this.recentFileList.fileActions.registerAction(ev.action);
- } else if (ev.defaultAction) {
- this.recentFileList.fileActions.setDefault(
- ev.defaultAction.mime,
- ev.defaultAction.name
- );
- }
- }
- };
-
-})(OCA);
-
-OC.Plugins.register('OCA.Files.App', OCA.Files.RecentPlugin);
-
diff --git a/apps/files/js/semaphore.js b/apps/files/js/semaphore.js
deleted file mode 100644
index aa327e0f8a1..00000000000
--- a/apps/files/js/semaphore.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2018
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function(){
- var Semaphore = function(max) {
- var counter = 0;
- var waiting = [];
-
- this.acquire = function() {
- if(counter < max) {
- counter++;
- return new Promise(function(resolve) { resolve(); });
- } else {
- return new Promise(function(resolve) { waiting.push(resolve); });
- }
- };
-
- this.release = function() {
- counter--;
- if (waiting.length > 0 && counter < max) {
- counter++;
- var promise = waiting.shift();
- promise();
- }
- };
- };
-
- // needed on public share page to properly register this
- if (!OCA.Files) {
- OCA.Files = {};
- }
- OCA.Files.Semaphore = Semaphore;
-
-})();
diff --git a/apps/files/js/sidebarpreviewmanager.js b/apps/files/js/sidebarpreviewmanager.js
deleted file mode 100644
index cb5a7ee9960..00000000000
--- a/apps/files/js/sidebarpreviewmanager.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2016
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function () {
- var SidebarPreviewManager = function (fileList) {
- this._fileList = fileList;
- this._previewHandlers = {};
- OC.Plugins.attach('OCA.Files.SidebarPreviewManager', this);
- };
-
- SidebarPreviewManager.prototype = {
- addPreviewHandler: function (mime, handler) {
- this._previewHandlers[mime] = handler;
- },
-
- getMimeTypePreviewHandler: function(mime) {
- var mimePart = mime.split('/').shift();
- if (this._previewHandlers[mime]) {
- return this._previewHandlers[mime];
- } else if (this._previewHandlers[mimePart]) {
- return this._previewHandlers[mimePart];
- } else {
- return null;
- }
- },
-
- getPreviewHandler: function (mime) {
- var mimetypeHandler = this.getMimeTypePreviewHandler(mime);
- if (mimetypeHandler) {
- return mimetypeHandler;
- } else {
- return this.fallbackPreview.bind(this);
- }
- },
-
- loadPreview: function (model, $thumbnailDiv, $thumbnailContainer) {
- if (model.get('hasPreview') === false && this.getMimeTypePreviewHandler(model.get('mimetype')) === null) {
- var mimeIcon = OC.MimeType.getIconUrl(model.get('mimetype'));
- $thumbnailDiv.removeClass('icon-loading icon-32');
- $thumbnailContainer.removeClass('image'); //fall back to regular view
- $thumbnailDiv.css({
- 'background-image': 'url("' + mimeIcon + '")'
- });
- } else {
- var handler = this.getPreviewHandler(model.get('mimetype'));
- var fallback = this.fallbackPreview.bind(this, model, $thumbnailDiv, $thumbnailContainer);
- handler(model, $thumbnailDiv, $thumbnailContainer, fallback);
- }
- },
-
- // previews for images and mimetype icons
- fallbackPreview: function (model, $thumbnailDiv, $thumbnailContainer) {
- var isImage = model.isImage();
- var maxImageWidth = $thumbnailContainer.parent().width() + 50; // 50px for negative margins
- var maxImageHeight = maxImageWidth / (16 / 9);
-
- var isLandscape = function (img) {
- return img.width > (img.height * 1.2);
- };
-
- var isSmall = function (img) {
- return (img.width * 1.1) < (maxImageWidth * window.devicePixelRatio);
- };
-
- var getTargetHeight = function (img) {
- var targetHeight = img.height / window.devicePixelRatio;
- if (targetHeight <= maxImageHeight) {
- targetHeight = maxImageHeight;
- }
- return targetHeight;
- };
-
- var getTargetRatio = function (img) {
- var ratio = img.width / img.height;
- if (ratio > 16 / 9) {
- return ratio;
- } else {
- return 16 / 9;
- }
- };
-
- this._fileList.lazyLoadPreview({
- fileId: model.get('id'),
- path: model.getFullPath(),
- mime: model.get('mimetype'),
- etag: model.get('etag'),
- y: maxImageHeight,
- x: maxImageWidth,
- a: 1,
- mode: 'cover',
- callback: function (previewUrl, img) {
- $thumbnailDiv.previewImg = previewUrl;
-
- // as long as we only have the mimetype icon, we only save it in case there is no preview
- if (!img) {
- return;
- }
- $thumbnailDiv.removeClass('icon-loading icon-32');
- var targetHeight = getTargetHeight(img);
- $thumbnailContainer.addClass((isLandscape(img) && !isSmall(img)) ? 'landscape' : 'portrait');
- $thumbnailContainer.addClass('large');
-
- // only set background when we have an actual preview
- // when we don't have a preview we show the mime icon in the error handler
- $thumbnailDiv.css({
- 'background-image': 'url("' + previewUrl + '")',
- height: (targetHeight > maxImageHeight) ? 'auto' : targetHeight,
- 'max-height': isSmall(img) ? targetHeight : null
- });
-
- var targetRatio = getTargetRatio(img);
- $thumbnailDiv.find('.stretcher').css({
- 'padding-bottom': (100 / targetRatio) + '%'
- });
- },
- error: function () {
- $thumbnailDiv.removeClass('icon-loading icon-32');
- $thumbnailContainer.removeClass('image'); //fall back to regular view
- $thumbnailDiv.css({
- 'background-image': 'url("' + $thumbnailDiv.previewImg + '")'
- });
- }
- });
- }
- };
-
- OCA.Files.SidebarPreviewManager = SidebarPreviewManager;
-})();
diff --git a/apps/files/js/sidebarpreviewtext.js b/apps/files/js/sidebarpreviewtext.js
deleted file mode 100644
index f786a9a3e4d..00000000000
--- a/apps/files/js/sidebarpreviewtext.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2016
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-(function () {
- var SidebarPreview = function () {
- };
-
- SidebarPreview.prototype = {
- attach: function (manager) {
- manager.addPreviewHandler('text', this.handlePreview.bind(this));
- },
-
- handlePreview: function (model, $thumbnailDiv, $thumbnailContainer, fallback) {
- var previewWidth = $thumbnailContainer.parent().width() + 50; // 50px for negative margins
- var previewHeight = previewWidth / (16 / 9);
-
- this.getFileContent(model.getFullPath()).then(function (content) {
- $thumbnailDiv.removeClass('icon-loading icon-32');
- $thumbnailContainer.addClass('large');
- $thumbnailContainer.addClass('text');
- var $textPreview = $('<pre></pre>').text(content);
- $thumbnailDiv.children('.stretcher').remove();
- $thumbnailDiv.append($textPreview);
- $thumbnailContainer.css("max-height", previewHeight);
- }, function () {
- fallback();
- });
- },
-
- getFileContent: function (path) {
- return $.ajax({
- url: OC.linkToRemoteBase('files' + path),
- headers: {
- 'Range': 'bytes=0-10240'
- }
- });
- }
- };
-
- OC.Plugins.register('OCA.Files.SidebarPreviewManager', new SidebarPreview());
-})();
diff --git a/apps/files/js/tagsplugin.js b/apps/files/js/tagsplugin.js
deleted file mode 100644
index 6759aa7002b..00000000000
--- a/apps/files/js/tagsplugin.js
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* global Handlebars */
-
-(function (OCA) {
-
- _.extend(OC.Files.Client, {
- PROPERTY_TAGS: '{' + OC.Files.Client.NS_OWNCLOUD + '}tags',
- PROPERTY_FAVORITE: '{' + OC.Files.Client.NS_OWNCLOUD + '}favorite'
- });
-
- /**
- * Returns the icon class for the matching state
- *
- * @param {boolean} state true if starred, false otherwise
- * @return {string} icon class for star image
- */
- function getStarIconClass (state) {
- return state ? 'icon-starred' : 'icon-star';
- }
-
- /**
- * Render the star icon with the given state
- *
- * @param {boolean} state true if starred, false otherwise
- * @return {Object} jQuery object
- */
- function renderStar (state) {
- return OCA.Files.Templates['favorite_mark']({
- isFavorite: state,
- altText: state ? t('files', 'Favorited') : t('files', 'Not favorited'),
- iconClass: getStarIconClass(state)
- });
- }
-
- /**
- * Toggle star icon on favorite mark element
- *
- * @param {Object} $favoriteMarkEl favorite mark element
- * @param {boolean} state true if starred, false otherwise
- */
- function toggleStar ($favoriteMarkEl, state) {
- $favoriteMarkEl.removeClass('icon-star icon-starred').addClass(getStarIconClass(state));
- $favoriteMarkEl.toggleClass('permanent', state);
- }
-
- /**
- * Remove Item from Quickaccesslist
- *
- * @param {String} appfolder folder to be removed
- */
- function removeFavoriteFromList (appfolder) {
- var quickAccessList = 'sublist-favorites';
- var listULElements = document.getElementById(quickAccessList);
- if (!listULElements) {
- return;
- }
-
- var apppath=appfolder;
- if(appfolder.startsWith("//")){
- apppath=appfolder.substring(1, appfolder.length);
- }
-
- $(listULElements).find('[data-dir="' + _.escape(apppath) + '"]').remove();
-
- if (listULElements.childElementCount === 0) {
- var collapsibleButton = $(listULElements).parent().find('button.collapse');
- collapsibleButton.hide();
- $("#button-collapse-parent-favorites").removeClass('collapsible');
- }
- }
-
- /**
- * Add Item to Quickaccesslist
- *
- * @param {String} appfolder folder to be added
- */
- function addFavoriteToList (appfolder) {
- var quickAccessList = 'sublist-favorites';
- var listULElements = document.getElementById(quickAccessList);
- if (!listULElements) {
- return;
- }
- var listLIElements = listULElements.getElementsByTagName('li');
-
- var appName = appfolder.substring(appfolder.lastIndexOf("/") + 1, appfolder.length);
- var apppath = appfolder;
-
- if(appfolder.startsWith("//")){
- apppath = appfolder.substring(1, appfolder.length);
- }
- var url = OC.generateUrl('/apps/files/?dir=' + apppath + '&view=files');
-
- var innerTagA = document.createElement('A');
- innerTagA.setAttribute("href", url);
- innerTagA.setAttribute("class", "nav-icon-files svg");
- innerTagA.innerHTML = _.escape(appName);
-
- var length = listLIElements.length + 1;
- var innerTagLI = document.createElement('li');
- innerTagLI.setAttribute("data-id", apppath.replace('/', '-'));
- innerTagLI.setAttribute("data-dir", apppath);
- innerTagLI.setAttribute("data-view", 'files');
- innerTagLI.setAttribute("class", "nav-" + appName);
- innerTagLI.setAttribute("folderpos", length.toString());
- innerTagLI.appendChild(innerTagA);
-
- $.get(OC.generateUrl("/apps/files/api/v1/quickaccess/get/NodeType"),{folderpath: apppath}, function (data, status) {
- if (data === "dir") {
- if (listULElements.childElementCount <= 0) {
- listULElements.appendChild(innerTagLI);
- var collapsibleButton = $(listULElements).parent().find('button.collapse');
- collapsibleButton.show();
- $(listULElements).parent().addClass('collapsible');
- } else {
- listLIElements[listLIElements.length - 1].after(innerTagLI);
- }
- }
- }
- );
- }
-
- OCA.Files = OCA.Files || {};
-
- /**
- * Extends the file actions and file list to include a favorite mark icon
- * and a favorite action in the file actions menu; it also adds "data-tags"
- * and "data-favorite" attributes to file elements.
- *
- * @namespace OCA.Files.TagsPlugin
- */
- OCA.Files.TagsPlugin = {
- name: 'Tags',
-
- allowedLists: [
- 'files',
- 'favorites',
- 'systemtags',
- 'shares.self',
- 'shares.others',
- 'shares.link'
- ],
-
- _extendFileActions: function (fileActions) {
- var self = this;
-
- fileActions.registerAction({
- name: 'Favorite',
- displayName: function (context) {
- var $file = context.$file;
- var isFavorite = $file.data('favorite') === true;
-
- if (isFavorite) {
- return t('files', 'Remove from favorites');
- }
-
- // As it is currently not possible to provide a context for
- // the i18n strings "Add to favorites" was used instead of
- // "Favorite" to remove the ambiguity between verb and noun
- // when it is translated.
- return t('files', 'Add to favorites');
- },
- mime: 'all',
- order: -100,
- permissions: OC.PERMISSION_NONE,
- iconClass: function (fileName, context) {
- var $file = context.$file;
- var isFavorite = $file.data('favorite') === true;
-
- if (isFavorite) {
- return 'icon-favorite';
- }
-
- return 'icon-starred';
- },
- actionHandler: function (fileName, context) {
- var $favoriteMarkEl = context.$file.find('.favorite-mark');
- var $file = context.$file;
- var fileInfo = context.fileList.files[$file.index()];
- var dir = context.dir || context.fileList.getCurrentDirectory();
- var tags = $file.attr('data-tags');
-
- if (_.isUndefined(tags)) {
- tags = '';
- }
- tags = tags.split('|');
- tags = _.without(tags, '');
- var isFavorite = tags.indexOf(OC.TAG_FAVORITE) >= 0;
- if (isFavorite) {
- // remove tag from list
- tags = _.without(tags, OC.TAG_FAVORITE);
- removeFavoriteFromList(dir + '/' + fileName);
- } else {
- tags.push(OC.TAG_FAVORITE);
- addFavoriteToList(dir + '/' + fileName);
- }
-
- // pre-toggle the star
- toggleStar($favoriteMarkEl, !isFavorite);
-
- context.fileInfoModel.trigger('busy', context.fileInfoModel, true);
-
- self.applyFileTags(
- dir + '/' + fileName,
- tags,
- $favoriteMarkEl,
- isFavorite
- ).then(function (result) {
- context.fileInfoModel.trigger('busy', context.fileInfoModel, false);
- // response from server should contain updated tags
- var newTags = result.tags;
- if (_.isUndefined(newTags)) {
- newTags = tags;
- }
- context.fileInfoModel.set({
- 'tags': newTags,
- 'favorite': !isFavorite
- });
- });
- }
- });
- },
-
- _extendFileList: function (fileList) {
- // extend row prototype
- var oldCreateRow = fileList._createRow;
- fileList._createRow = function (fileData) {
- var $tr = oldCreateRow.apply(this, arguments);
- var isFavorite = false;
- if (fileData.tags) {
- $tr.attr('data-tags', fileData.tags.join('|'));
- if (fileData.tags.indexOf(OC.TAG_FAVORITE) >= 0) {
- $tr.attr('data-favorite', true);
- isFavorite = true;
- }
- }
- var $icon = $(renderStar(isFavorite));
- $tr.find('td.filename .thumbnail').append($icon);
- return $tr;
- };
- var oldElementToFile = fileList.elementToFile;
- fileList.elementToFile = function ($el) {
- var fileInfo = oldElementToFile.apply(this, arguments);
- var tags = $el.attr('data-tags');
- if (_.isUndefined(tags)) {
- tags = '';
- }
- tags = tags.split('|');
- tags = _.without(tags, '');
- fileInfo.tags = tags;
- return fileInfo;
- };
-
- var oldGetWebdavProperties = fileList._getWebdavProperties;
- fileList._getWebdavProperties = function () {
- var props = oldGetWebdavProperties.apply(this, arguments);
- props.push(OC.Files.Client.PROPERTY_TAGS);
- props.push(OC.Files.Client.PROPERTY_FAVORITE);
- return props;
- };
-
- fileList.filesClient.addFileInfoParser(function (response) {
- var data = {};
- var props = response.propStat[0].properties;
- var tags = props[OC.Files.Client.PROPERTY_TAGS];
- var favorite = props[OC.Files.Client.PROPERTY_FAVORITE];
- if (tags && tags.length) {
- tags = _.chain(tags).filter(function (xmlvalue) {
- return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'tag');
- }).map(function (xmlvalue) {
- return xmlvalue.textContent || xmlvalue.text;
- }).value();
- }
- if (tags) {
- data.tags = tags;
- }
- if (favorite && parseInt(favorite, 10) !== 0) {
- data.tags = data.tags || [];
- data.tags.push(OC.TAG_FAVORITE);
- }
- return data;
- });
- },
-
- attach: function (fileList) {
- if (this.allowedLists.indexOf(fileList.id) < 0) {
- return;
- }
- this._extendFileActions(fileList.fileActions);
- this._extendFileList(fileList);
- },
-
- /**
- * Replaces the given files' tags with the specified ones.
- *
- * @param {String} fileName path to the file or folder to tag
- * @param {Array.<String>} tagNames array of tag names
- * @param {Object} $favoriteMarkEl favorite mark element
- * @param {boolean} isFavorite Was the item favorited before
- */
- applyFileTags: function (fileName, tagNames, $favoriteMarkEl, isFavorite) {
- var encodedPath = OC.encodePath(fileName);
- while (encodedPath[0] === '/') {
- encodedPath = encodedPath.substr(1);
- }
- return $.ajax({
- url: OC.generateUrl('/apps/files/api/v1/files/') + encodedPath,
- contentType: 'application/json',
- data: JSON.stringify({
- tags: tagNames || []
- }),
- dataType: 'json',
- type: 'POST'
- }).fail(function (response) {
- var message = '';
- // show message if it is available
- if (response.responseJSON && response.responseJSON.message) {
- message = ': ' + response.responseJSON.message;
- }
- OC.Notification.show(t('files', 'An error occurred while trying to update the tags' + message), {type: 'error'});
- toggleStar($favoriteMarkEl, isFavorite);
- });
- }
- };
-})
-(OCA);
-
-OC.Plugins.register('OCA.Files.FileList', OCA.Files.TagsPlugin);
diff --git a/apps/files/js/templates.js b/apps/files/js/templates.js
deleted file mode 100644
index d9d333648ce..00000000000
--- a/apps/files/js/templates.js
+++ /dev/null
@@ -1,424 +0,0 @@
-(function() {
- var template = Handlebars.template, templates = OCA.Files.Templates = OCA.Files.Templates || {};
-templates['detailsview'] = template({"1":function(container,depth0,helpers,partials,data) {
- var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<ul class=\"tabHeaders\">\n"
- + ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"tabHeaders") : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":1},"end":{"line":9,"column":10}}})) != null ? stack1 : "")
- + "</ul>\n";
-},"2":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <li class=\"tabHeader\" data-tabid=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"tabId") || (depth0 != null ? lookupProperty(depth0,"tabId") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tabId","hash":{},"data":data,"loc":{"start":{"line":5,"column":35},"end":{"line":5,"column":44}}}) : helper)))
- + "\" tabindex=\"0\">\n "
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"tabIcon") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":6,"column":5},"end":{"line":6,"column":65}}})) != null ? stack1 : "")
- + "\n <a href=\"#\" tabindex=\"-1\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"label") || (depth0 != null ? lookupProperty(depth0,"label") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"label","hash":{},"data":data,"loc":{"start":{"line":7,"column":28},"end":{"line":7,"column":37}}}) : helper)))
- + "</a>\n </li>\n";
-},"3":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<span class=\"icon "
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"tabIcon") || (depth0 != null ? lookupProperty(depth0,"tabIcon") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"tabIcon","hash":{},"data":data,"loc":{"start":{"line":6,"column":38},"end":{"line":6,"column":49}}}) : helper)))
- + "\"></span>";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<div class=\"detailFileInfoContainer\"></div>\n"
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"tabHeaders") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":0},"end":{"line":11,"column":7}}})) != null ? stack1 : "")
- + "<div class=\"tabsContainer\"></div>\n<a class=\"close icon-close\" href=\"#\"><span class=\"hidden-visually\">"
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"closeLabel") || (depth0 != null ? lookupProperty(depth0,"closeLabel") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"closeLabel","hash":{},"data":data,"loc":{"start":{"line":13,"column":67},"end":{"line":13,"column":81}}}) : helper)))
- + "</span></a>\n";
-},"useData":true});
-templates['favorite_mark'] = template({"1":function(container,depth0,helpers,partials,data) {
- return "permanent";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- }, buffer =
- "<div class=\"favorite-mark ";
- stack1 = ((helper = (helper = lookupProperty(helpers,"isFavorite") || (depth0 != null ? lookupProperty(depth0,"isFavorite") : depth0)) != null ? helper : alias2),(options={"name":"isFavorite","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":1,"column":26},"end":{"line":1,"column":65}}}),(typeof helper === alias3 ? helper.call(alias1,options) : helper));
- if (!lookupProperty(helpers,"isFavorite")) { stack1 = container.hooks.blockHelperMissing.call(depth0,stack1,options)}
- if (stack1 != null) { buffer += stack1; }
- return buffer + "\">\n <span class=\"icon "
- + alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}}}) : helper)))
- + "\" />\n <span class=\"hidden-visually\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":42}}}) : helper)))
- + "</span>\n</div>\n";
-},"useData":true});
-templates['file_action_trigger'] = template({"1":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <img class=\"svg\" alt=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":3,"column":24},"end":{"line":3,"column":35}}}) : helper)))
- + "\" src=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"icon") || (depth0 != null ? lookupProperty(depth0,"icon") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"icon","hash":{},"data":data,"loc":{"start":{"line":3,"column":42},"end":{"line":3,"column":50}}}) : helper)))
- + "\" />\n";
-},"3":function(container,depth0,helpers,partials,data) {
- var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":9}}})) != null ? stack1 : "")
- + ((stack1 = lookupProperty(helpers,"unless").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasDisplayName") : depth0),{"name":"unless","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":8,"column":2},"end":{"line":10,"column":13}}})) != null ? stack1 : "");
-},"4":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <span class=\"icon "
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":6,"column":21},"end":{"line":6,"column":34}}}) : helper)))
- + "\"></span>\n";
-},"6":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <span class=\"hidden-visually\">"
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":9,"column":33},"end":{"line":9,"column":44}}}) : helper)))
- + "</span>\n";
-},"8":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<span> "
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":12,"column":27},"end":{"line":12,"column":42}}}) : helper)))
- + "</span>";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<a class=\"action action-"
- + alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":41}}}) : helper)))
- + "\" href=\"#\" data-action=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":1,"column":65},"end":{"line":1,"column":73}}}) : helper)))
- + "\">\n"
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"icon") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":11,"column":8}}})) != null ? stack1 : "")
- + " "
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"displayName") : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":12,"column":1},"end":{"line":12,"column":56}}})) != null ? stack1 : "")
- + "\n</a>\n";
-},"useData":true});
-templates['fileactionsmenu'] = template({"1":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <li class=\""
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"inline") : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":13},"end":{"line":3,"column":40}}})) != null ? stack1 : "")
- + " action-"
- + alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":3,"column":48},"end":{"line":3,"column":65}}}) : helper)))
- + "-container\">\n <a href=\"#\" class=\"menuitem action action-"
- + alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":4,"column":45},"end":{"line":4,"column":62}}}) : helper)))
- + " permanent\" data-action=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":87},"end":{"line":4,"column":95}}}) : helper)))
- + "\">\n "
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"icon") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":12,"column":11}}})) != null ? stack1 : "")
- + " <span>"
- + alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":13,"column":10},"end":{"line":13,"column":25}}}) : helper)))
- + "</span>\n </a>\n </li>\n";
-},"2":function(container,depth0,helpers,partials,data) {
- return "hidden";
-},"4":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<img class=\"icon\" src=\""
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"icon") || (depth0 != null ? lookupProperty(depth0,"icon") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"icon","hash":{},"data":data,"loc":{"start":{"line":5,"column":39},"end":{"line":5,"column":47}}}) : helper)))
- + "\"/>\n";
-},"6":function(container,depth0,helpers,partials,data) {
- var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.program(9, data, 0),"data":data,"loc":{"start":{"line":7,"column":5},"end":{"line":11,"column":12}}})) != null ? stack1 : "");
-},"7":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <span class=\"icon "
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":8,"column":24},"end":{"line":8,"column":37}}}) : helper)))
- + "\"></span>\n";
-},"9":function(container,depth0,helpers,partials,data) {
- return " <span class=\"no-icon\"></span>\n";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<ul>\n"
- + ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":16,"column":10}}})) != null ? stack1 : "")
- + "</ul>\n";
-},"useData":true});
-templates['filemultiselectmenu'] = template({"1":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <li class=\"item-"
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":26}}}) : helper)))
- + "\">\n <a href=\"#\" class=\"menuitem action "
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":38},"end":{"line":4,"column":46}}}) : helper)))
- + " permanent\" data-action=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":71},"end":{"line":4,"column":79}}}) : helper)))
- + "\">\n"
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(4, data, 0),"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":9,"column":11}}})) != null ? stack1 : "")
- + " <span class=\"label\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":10,"column":24},"end":{"line":10,"column":39}}}) : helper)))
- + "</span>\n </a>\n </li>\n";
-},"2":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <span class=\"icon "
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":36}}}) : helper)))
- + "\"></span>\n";
-},"4":function(container,depth0,helpers,partials,data) {
- return " <span class=\"no-icon\"></span>\n";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<ul>\n"
- + ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":13,"column":10}}})) != null ? stack1 : "")
- + "</ul>\n";
-},"useData":true});
-templates['filesummary'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<span class=\"info\">\n <span class=\"dirinfo\"></span>\n <span class=\"connector\">"
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"connectorLabel") || (depth0 != null ? lookupProperty(depth0,"connectorLabel") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"connectorLabel","hash":{},"data":data,"loc":{"start":{"line":3,"column":25},"end":{"line":3,"column":43}}}) : helper)))
- + "</span>\n <span class=\"fileinfo\"></span>\n <span class=\"hiddeninfo\"></span>\n <span class=\"filter\"></span>\n</span>\n";
-},"useData":true});
-templates['mainfileinfodetailsview'] = template({"1":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <a href=\"#\" class=\"action action-favorite favorite permanent\">\n <span class=\"icon "
- + alias4(((helper = (helper = lookupProperty(helpers,"starClass") || (depth0 != null ? lookupProperty(depth0,"starClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"starClass","hash":{},"data":data,"loc":{"start":{"line":13,"column":22},"end":{"line":13,"column":35}}}) : helper)))
- + "\" title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"starAltText") || (depth0 != null ? lookupProperty(depth0,"starAltText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"starAltText","hash":{},"data":data,"loc":{"start":{"line":13,"column":44},"end":{"line":13,"column":59}}}) : helper)))
- + "\"></span>\n </a>\n";
-},"3":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<span class=\"size\" title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"altSize") || (depth0 != null ? lookupProperty(depth0,"altSize") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altSize","hash":{},"data":data,"loc":{"start":{"line":16,"column":43},"end":{"line":16,"column":54}}}) : helper)))
- + "\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"size") || (depth0 != null ? lookupProperty(depth0,"size") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"size","hash":{},"data":data,"loc":{"start":{"line":16,"column":56},"end":{"line":16,"column":64}}}) : helper)))
- + "</span>, ";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<div class=\"thumbnailContainer\"><a href=\"#\" class=\"thumbnail action-default\"><div class=\"stretcher\"></div></a></div>\n<div class=\"file-details-container\">\n <div class=\"fileName\">\n <h3 title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":13},"end":{"line":4,"column":21}}}) : helper)))
- + "\" class=\"ellipsis\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":40},"end":{"line":4,"column":48}}}) : helper)))
- + "</h3>\n <a class=\"permalink\" href=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":5,"column":29},"end":{"line":5,"column":42}}}) : helper)))
- + "\" title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":5,"column":51},"end":{"line":5,"column":69}}}) : helper)))
- + "\" data-clipboard-text=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":5,"column":92},"end":{"line":5,"column":105}}}) : helper)))
- + "\">\n <span class=\"icon icon-clippy\"></span>\n <span class=\"hidden-visually\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":7,"column":33},"end":{"line":7,"column":51}}}) : helper)))
- + "</span>\n </a>\n </div>\n <div class=\"file-details ellipsis\">\n"
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasFavoriteAction") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":11,"column":2},"end":{"line":15,"column":9}}})) != null ? stack1 : "")
- + " "
- + ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasSize") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":80}}})) != null ? stack1 : "")
- + "<span class=\"date live-relative-timestamp\" data-timestamp=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"timestamp") || (depth0 != null ? lookupProperty(depth0,"timestamp") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"timestamp","hash":{},"data":data,"loc":{"start":{"line":16,"column":139},"end":{"line":16,"column":152}}}) : helper)))
- + "\" title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"altDate") || (depth0 != null ? lookupProperty(depth0,"altDate") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altDate","hash":{},"data":data,"loc":{"start":{"line":16,"column":161},"end":{"line":16,"column":172}}}) : helper)))
- + "\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"date") || (depth0 != null ? lookupProperty(depth0,"date") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"date","hash":{},"data":data,"loc":{"start":{"line":16,"column":174},"end":{"line":16,"column":182}}}) : helper)))
- + "</span>\n </div>\n</div>\n<div class=\"hidden permalink-field\">\n <input type=\"text\" value=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":20,"column":27},"end":{"line":20,"column":40}}}) : helper)))
- + "\" placeholder=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":20,"column":55},"end":{"line":20,"column":73}}}) : helper)))
- + "\" readonly=\"readonly\"/>\n</div>\n";
-},"useData":true});
-templates['newfilemenu'] = template({"1":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return " <li>\n <a href=\"#\" class=\"menuitem\" data-templatename=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"templateName") || (depth0 != null ? lookupProperty(depth0,"templateName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"templateName","hash":{},"data":data,"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":67}}}) : helper)))
- + "\" data-filetype=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"fileType") || (depth0 != null ? lookupProperty(depth0,"fileType") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileType","hash":{},"data":data,"loc":{"start":{"line":7,"column":84},"end":{"line":7,"column":96}}}) : helper)))
- + "\" data-action=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"id") || (depth0 != null ? lookupProperty(depth0,"id") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"id","hash":{},"data":data,"loc":{"start":{"line":7,"column":111},"end":{"line":7,"column":117}}}) : helper)))
- + "\"><span class=\"icon "
- + alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":7,"column":137},"end":{"line":7,"column":150}}}) : helper)))
- + " svg\"></span><span class=\"displayname\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":7,"column":189},"end":{"line":7,"column":204}}}) : helper)))
- + "</span></a>\n </li>\n";
-},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<ul>\n <li>\n <label for=\"file_upload_start\" class=\"menuitem\" data-action=\"upload\" title=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"uploadMaxHumanFilesize") || (depth0 != null ? lookupProperty(depth0,"uploadMaxHumanFilesize") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"uploadMaxHumanFilesize","hash":{},"data":data,"loc":{"start":{"line":3,"column":78},"end":{"line":3,"column":104}}}) : helper)))
- + "\" tabindex=\"0\"><span class=\"svg icon icon-upload\"></span><span class=\"displayname\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"uploadLabel") || (depth0 != null ? lookupProperty(depth0,"uploadLabel") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"uploadLabel","hash":{},"data":data,"loc":{"start":{"line":3,"column":187},"end":{"line":3,"column":202}}}) : helper)))
- + "</span></label>\n </li>\n"
- + ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":1},"end":{"line":9,"column":10}}})) != null ? stack1 : "")
- + "</ul>\n";
-},"useData":true});
-templates['newfilemenu_filename_form'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<form class=\"filenameform\">\n <input id=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"cid") || (depth0 != null ? lookupProperty(depth0,"cid") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"cid","hash":{},"data":data,"loc":{"start":{"line":2,"column":12},"end":{"line":2,"column":19}}}) : helper)))
- + "-input-"
- + alias4(((helper = (helper = lookupProperty(helpers,"fileType") || (depth0 != null ? lookupProperty(depth0,"fileType") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileType","hash":{},"data":data,"loc":{"start":{"line":2,"column":26},"end":{"line":2,"column":38}}}) : helper)))
- + "\" type=\"text\" value=\""
- + alias4(((helper = (helper = lookupProperty(helpers,"fileName") || (depth0 != null ? lookupProperty(depth0,"fileName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileName","hash":{},"data":data,"loc":{"start":{"line":2,"column":59},"end":{"line":2,"column":71}}}) : helper)))
- + "\" autocomplete=\"off\" autocapitalize=\"off\">\n <input type=\"submit\" value=\" \" class=\"icon-confirm\" />\n</form>\n";
-},"useData":true});
-templates['operationprogressbar'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<div id=\"uploadprogressbar\">\n <em class=\"label outer\" style=\"display:none\"></em>\n</div>\n<button class=\"stop icon-close\" style=\"display:none\">\n <span class=\"hidden-visually\">"
- + container.escapeExpression(((helper = (helper = lookupProperty(helpers,"textCancelButton") || (depth0 != null ? lookupProperty(depth0,"textCancelButton") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"textCancelButton","hash":{},"data":data,"loc":{"start":{"line":5,"column":31},"end":{"line":5,"column":51}}}) : helper)))
- + "</span>\n</button>\n";
-},"useData":true});
-templates['operationprogressbarlabel'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<em class=\"label\">\n <span class=\"desktop\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"textDesktop") || (depth0 != null ? lookupProperty(depth0,"textDesktop") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"textDesktop","hash":{},"data":data,"loc":{"start":{"line":2,"column":23},"end":{"line":2,"column":38}}}) : helper)))
- + "</span>\n <span class=\"mobile\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"textMobile") || (depth0 != null ? lookupProperty(depth0,"textMobile") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"textMobile","hash":{},"data":data,"loc":{"start":{"line":3,"column":22},"end":{"line":3,"column":36}}}) : helper)))
- + "</span>\n</em>\n";
-},"useData":true});
-templates['template_addbutton'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
- var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
- return parent[propertyName];
- }
- return undefined
- };
-
- return "<a href=\"#\" class=\"button new\">\n <span class=\"icon "
- + alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}}}) : helper)))
- + "\"></span>\n <span class=\"hidden-visually\">"
- + alias4(((helper = (helper = lookupProperty(helpers,"addText") || (depth0 != null ? lookupProperty(depth0,"addText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addText","hash":{},"data":data,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":42}}}) : helper)))
- + "</span>\n</a>\n";
-},"useData":true});
-})(); \ No newline at end of file
diff --git a/apps/files/js/templates/detailsview.handlebars b/apps/files/js/templates/detailsview.handlebars
deleted file mode 100644
index 4d489e4fa0d..00000000000
--- a/apps/files/js/templates/detailsview.handlebars
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="detailFileInfoContainer"></div>
-{{#if tabHeaders}}
-<ul class="tabHeaders">
- {{#each tabHeaders}}
- <li class="tabHeader" data-tabid="{{tabId}}" tabindex="0">
- {{#if tabIcon}}<span class="icon {{tabIcon}}"></span>{{/if}}
- <a href="#" tabindex="-1">{{label}}</a>
- </li>
- {{/each}}
-</ul>
-{{/if}}
-<div class="tabsContainer"></div>
-<a class="close icon-close" href="#"><span class="hidden-visually">{{closeLabel}}</span></a>
diff --git a/apps/files/js/templates/favorite_mark.handlebars b/apps/files/js/templates/favorite_mark.handlebars
deleted file mode 100644
index 7e0cb4385a8..00000000000
--- a/apps/files/js/templates/favorite_mark.handlebars
+++ /dev/null
@@ -1,4 +0,0 @@
-<div class="favorite-mark {{#isFavorite}}permanent{{/isFavorite}}">
- <span class="icon {{iconClass}}" />
- <span class="hidden-visually">{{altText}}</span>
-</div>
diff --git a/apps/files/js/templates/file_action_trigger.handlebars b/apps/files/js/templates/file_action_trigger.handlebars
deleted file mode 100644
index e74b3717c92..00000000000
--- a/apps/files/js/templates/file_action_trigger.handlebars
+++ /dev/null
@@ -1,13 +0,0 @@
-<a class="action action-{{nameLowerCase}}" href="#" data-action="{{name}}">
- {{#if icon}}
- <img class="svg" alt="{{altText}}" src="{{icon}}" />
- {{else}}
- {{#if iconClass}}
- <span class="icon {{iconClass}}"></span>
- {{/if}}
- {{#unless hasDisplayName}}
- <span class="hidden-visually">{{altText}}</span>
- {{/unless}}
- {{/if}}
- {{#if displayName}}<span> {{displayName}}</span>{{/if}}
-</a>
diff --git a/apps/files/js/templates/fileactionsmenu.handlebars b/apps/files/js/templates/fileactionsmenu.handlebars
deleted file mode 100644
index b14ec02e5b9..00000000000
--- a/apps/files/js/templates/fileactionsmenu.handlebars
+++ /dev/null
@@ -1,17 +0,0 @@
-<ul>
- {{#each items}}
- <li class="{{#if inline}}hidden{{/if}} action-{{nameLowerCase}}-container">
- <a href="#" class="menuitem action action-{{nameLowerCase}} permanent" data-action="{{name}}">
- {{#if icon}}<img class="icon" src="{{icon}}"/>
- {{else}}
- {{#if iconClass}}
- <span class="icon {{iconClass}}"></span>
- {{else}}
- <span class="no-icon"></span>
- {{/if}}
- {{/if}}
- <span>{{displayName}}</span>
- </a>
- </li>
- {{/each}}
-</ul>
diff --git a/apps/files/js/templates/filemultiselectmenu.handlebars b/apps/files/js/templates/filemultiselectmenu.handlebars
deleted file mode 100644
index 9a723920db9..00000000000
--- a/apps/files/js/templates/filemultiselectmenu.handlebars
+++ /dev/null
@@ -1,14 +0,0 @@
-<ul>
- {{#each items}}
- <li class="item-{{name}}">
- <a href="#" class="menuitem action {{name}} permanent" data-action="{{name}}">
- {{#if iconClass}}
- <span class="icon {{iconClass}}"></span>
- {{else}}
- <span class="no-icon"></span>
- {{/if}}
- <span class="label">{{displayName}}</span>
- </a>
- </li>
- {{/each}}
-</ul>
diff --git a/apps/files/js/templates/filesummary.handlebars b/apps/files/js/templates/filesummary.handlebars
deleted file mode 100644
index f975a2a7737..00000000000
--- a/apps/files/js/templates/filesummary.handlebars
+++ /dev/null
@@ -1,7 +0,0 @@
-<span class="info">
- <span class="dirinfo"></span>
- <span class="connector">{{connectorLabel}}</span>
- <span class="fileinfo"></span>
- <span class="hiddeninfo"></span>
- <span class="filter"></span>
-</span>
diff --git a/apps/files/js/templates/mainfileinfodetailsview.handlebars b/apps/files/js/templates/mainfileinfodetailsview.handlebars
deleted file mode 100644
index db836ca5991..00000000000
--- a/apps/files/js/templates/mainfileinfodetailsview.handlebars
+++ /dev/null
@@ -1,21 +0,0 @@
-<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"><div class="stretcher"></div></a></div>
-<div class="file-details-container">
- <div class="fileName">
- <h3 title="{{name}}" class="ellipsis">{{name}}</h3>
- <a class="permalink" href="{{permalink}}" title="{{permalinkTitle}}" data-clipboard-text="{{permalink}}">
- <span class="icon icon-clippy"></span>
- <span class="hidden-visually">{{permalinkTitle}}</span>
- </a>
- </div>
- <div class="file-details ellipsis">
- {{#if hasFavoriteAction}}
- <a href="#" class="action action-favorite favorite permanent">
- <span class="icon {{starClass}}" title="{{starAltText}}"></span>
- </a>
- {{/if}}
- {{#if hasSize}}<span class="size" title="{{altSize}}">{{size}}</span>, {{/if}}<span class="date live-relative-timestamp" data-timestamp="{{timestamp}}" title="{{altDate}}">{{date}}</span>
- </div>
-</div>
-<div class="hidden permalink-field">
- <input type="text" value="{{permalink}}" placeholder="{{permalinkTitle}}" readonly="readonly"/>
-</div>
diff --git a/apps/files/js/templates/newfilemenu.handlebars b/apps/files/js/templates/newfilemenu.handlebars
deleted file mode 100644
index 0d9ad9682ca..00000000000
--- a/apps/files/js/templates/newfilemenu.handlebars
+++ /dev/null
@@ -1,10 +0,0 @@
-<ul>
- <li>
- <label for="file_upload_start" class="menuitem" data-action="upload" title="{{uploadMaxHumanFilesize}}" tabindex="0"><span class="svg icon icon-upload"></span><span class="displayname">{{uploadLabel}}</span></label>
- </li>
- {{#each items}}
- <li>
- <a href="#" class="menuitem" data-templatename="{{templateName}}" data-filetype="{{fileType}}" data-action="{{id}}"><span class="icon {{iconClass}} svg"></span><span class="displayname">{{displayName}}</span></a>
- </li>
- {{/each}}
-</ul>
diff --git a/apps/files/js/templates/newfilemenu_filename_form.handlebars b/apps/files/js/templates/newfilemenu_filename_form.handlebars
deleted file mode 100644
index 5fc37ecf781..00000000000
--- a/apps/files/js/templates/newfilemenu_filename_form.handlebars
+++ /dev/null
@@ -1,4 +0,0 @@
-<form class="filenameform">
- <input id="{{cid}}-input-{{fileType}}" type="text" value="{{fileName}}" autocomplete="off" autocapitalize="off">
- <input type="submit" value=" " class="icon-confirm" />
-</form>
diff --git a/apps/files/js/templates/operationprogressbar.handlebars b/apps/files/js/templates/operationprogressbar.handlebars
deleted file mode 100644
index c02ac623fab..00000000000
--- a/apps/files/js/templates/operationprogressbar.handlebars
+++ /dev/null
@@ -1,6 +0,0 @@
-<div id="uploadprogressbar">
- <em class="label outer" style="display:none"></em>
-</div>
-<button class="stop icon-close" style="display:none">
- <span class="hidden-visually">{{textCancelButton}}</span>
-</button>
diff --git a/apps/files/js/templates/operationprogressbarlabel.handlebars b/apps/files/js/templates/operationprogressbarlabel.handlebars
deleted file mode 100644
index 24ac66994da..00000000000
--- a/apps/files/js/templates/operationprogressbarlabel.handlebars
+++ /dev/null
@@ -1,4 +0,0 @@
-<em class="label">
- <span class="desktop">{{textDesktop}}</span>
- <span class="mobile">{{textMobile}}</span>
-</em>
diff --git a/apps/files/js/templates/template_addbutton.handlebars b/apps/files/js/templates/template_addbutton.handlebars
deleted file mode 100644
index 62a022715a9..00000000000
--- a/apps/files/js/templates/template_addbutton.handlebars
+++ /dev/null
@@ -1,4 +0,0 @@
-<a href="#" class="button new">
- <span class="icon {{iconClass}}"></span>
- <span class="hidden-visually">{{addText}}</span>
-</a>
diff --git a/apps/files/js/upload.js b/apps/files/js/upload.js
deleted file mode 100644
index 518608615e0..00000000000
--- a/apps/files/js/upload.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-function Upload(fileSelector) {
- if ($.support.xhrFileUpload) {
- return new XHRUpload(fileSelector.target.files);
- } else {
- return new FormUpload(fileSelector);
- }
-}
-Upload.target = OC.filePath('files', 'ajax', 'upload.php');
diff --git a/apps/files/l10n/ach.js b/apps/files/l10n/ach.js
deleted file mode 100644
index c50be1aa479..00000000000
--- a/apps/files/l10n/ach.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/ach.json b/apps/files/l10n/ach.json
deleted file mode 100644
index 210ac153bab..00000000000
--- a/apps/files/l10n/ach.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ady.js b/apps/files/l10n/ady.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/ady.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ady.json b/apps/files/l10n/ady.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/ady.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/af.js b/apps/files/l10n/af.js
deleted file mode 100644
index 404d258091d..00000000000
--- a/apps/files/l10n/af.js
+++ /dev/null
@@ -1,139 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Berging is tydelik onbeskikbaar",
- "Storage invalid" : "Berging ongeldig",
- "Unknown error" : "Onbekende fout",
- "File could not be found" : "Lêer kon nie gevind word nie",
- "Move or copy" : "Kopieer of skuif",
- "Download" : "Laai af",
- "Delete" : "Skrap",
- "Home" : "Tuis",
- "Close" : "Sluit",
- "Favorites" : "Gunstelinge",
- "Could not create folder \"{dir}\"" : "Kan nie vouer “{dir}” skep nie",
- "This will stop your current uploads." : "Dit sal u huidige oplaaie stop.",
- "Upload cancelled." : "Oplaai gekanselleer.",
- "Processing files …" : "Verwerk tans lêers …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan nie {filename} oplaai nie aangesien dit óf 'n gids is óf 0 grepe groot is",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie genoeg oop spasie nie, u laai {size1} op maar slegs {size2} is oor",
- "Target folder \"{dir}\" does not exist any more" : "Teikengids \"{dir}\" bestaan nie meer nie",
- "Not enough free space" : "Nie genoeg oop spasie nie",
- "An unknown error has occurred" : "’n Onbekende fout het voorgekom",
- "Uploading …" : "Laai tans op …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "Teikengids bestaan nie meer nie",
- "Actions" : "Aksies",
- "Rename" : "Hernoem",
- "Copy" : "Kopieer",
- "Choose target folder" : "Kies teikenvouer",
- "Open" : "Open",
- "Delete file" : "Skrap lêer",
- "Delete folder" : "Skrap vouer",
- "Disconnect storage" : "Ontkoppel berging",
- "Could not load info for file \"{file}\"" : "Kon nie inligting vir lêer: “{file}” laai nie ",
- "Files" : "Lêers",
- "Details" : "Besonderhede",
- "Select" : "Kies",
- "Pending" : "Hangend",
- "Unable to determine date" : "Kan nie datum bepaal nie",
- "This operation is forbidden" : "Die operasie is verbode",
- "This directory is unavailable, please check the logs or contact the administrator" : "Hierdie gids is onbeskikbaar, gaan die logs na of kontak die administrateur",
- "Could not move \"{file}\", target exists" : "Kon nie \"{file}\" skuif nie, teiken bestaan",
- "Could not move \"{file}\"" : "Kon nie \"{file}\" skuif nie",
- "copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Kon nie \"{file}\" kopieer nie, teiken bestaan",
- "Could not copy \"{file}\"" : "Kon nie \"{file}\" kopieer nie",
- "Copied {origin} inside {destination}" : "{origin} binne {destination} gekopieer",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} en {nbfiles} ander lêers binne {destination} gekopieer",
- "{newName} already exists" : "{newName} bestaan reeds",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kon nie “{fileName}” hernoem nie, dit bestaan nie meer nie",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Die naam “{targetName}” word reeds in vouer “{dir}” gebruik. Kies asb. ’n ander naam.",
- "Could not rename \"{fileName}\"" : "Kon nie “{file}” hernoem nie",
- "Could not create file \"{file}\"" : "Kan nie lêer “{file}” skep nie",
- "Could not create file \"{file}\" because it already exists" : "Kon nie lêer “{file}” skep nie omdat dit reeds bestaan",
- "Could not create folder \"{dir}\" because it already exists" : "Kon nie vouer “{dir}” skep nie omdat dit reeds bestaan",
- "Name" : "Naam",
- "Size" : "Grootte",
- "Modified" : "Gewysig",
- "_%n folder_::_%n folders_" : ["%n gids","%n gidse"],
- "_%n file_::_%n files_" : ["%n lêer","%n lêers"],
- "{dirs} and {files}" : "{dirs} en {files}",
- "_including %n hidden_::_including %n hidden_" : ["insluitend %n verborge","insluitende %n verborge"],
- "You don’t have permission to upload or create files here" : "U het nie toestemming om lêers hier op te laai of te skep nie",
- "_Uploading %n file_::_Uploading %n files_" : ["Laai tans %n lêer op ","Laai tans %n lêers op"],
- "New" : "Nuwe",
- "{used} of {quota} used" : "{used} van {quota} gebruik",
- "{used} used" : "{used} gebruik",
- "\"{name}\" is an invalid file name." : "\"{name}\" is nie 'n geldige lêer naam nie.",
- "File name cannot be empty." : "Lêernaam kan nie leeg wees nie.",
- "\"/\" is not allowed inside a file name." : "\"/\" word nie binne 'n lêernaam toegelaat nie.",
- "View in folder" : "Vertoon in gids",
- "Copied!" : "Gekopieer!",
- "Path" : "Roete",
- "_%n byte_::_%n bytes_" : ["%n greep","%n grepe"],
- "Favorited" : "As gunsteling ",
- "Favorite" : "Gunsteling",
- "New folder" : "Nuwe gids",
- "Upload file" : "Laai lêer op",
- "Recent" : "Onlangs",
- "Not favorited" : "Nie as gunsteling",
- "Remove from favorites" : "Verwyder uit gunstelinge",
- "Add to favorites" : "Voeg by gunstelinge",
- "An error occurred while trying to update the tags" : "'n Fout het voorgekom terwyl die merkers opgedateer word",
- "Added to favorites" : "Tot gunstelinge bygevoeg",
- "Removed from favorites" : "Uit gunstelinge verwyder",
- "You added {file} to your favorites" : "U het {file} tot u gunstelinge bygevoeg",
- "You removed {file} from your favorites" : "U het {file} uit u gunstelinge verwyder",
- "File changes" : "Lêer veranderinge ",
- "Created by {user}" : "Geskep deur {user}",
- "Changed by {user}" : "Verander deur {user}",
- "Deleted by {user}" : "Geskrap deur {user}",
- "Restored by {user}" : "Herstel deur {user}",
- "Renamed by {user}" : "Naam verander deur {user}",
- "Moved by {user}" : "Geskuif deur {user}",
- "\"remote user\"" : "“afstandsgebruiker”",
- "You created {file}" : "U het {file} geskep",
- "{user} created {file}" : "{user} het {file} geskep",
- "{file} was created in a public folder" : "{file} is in 'n publieke gids geskep",
- "You changed {file}" : "U het {file} verander",
- "{user} changed {file}" : "{user} het {file} verander",
- "You deleted {file}" : "U het {file} geskrap",
- "{user} deleted {file}" : "{user} het {file} geskrap",
- "You restored {file}" : "U het {file} herstel",
- "{user} restored {file}" : "{user} het {file} herstel",
- "You renamed {oldfile} to {newfile}" : "U het die naam van {oldfile} na {newfile} verander",
- "{user} renamed {oldfile} to {newfile}" : "{user} het die naam van {oldfile} na {newfile} verander",
- "You moved {oldfile} to {newfile}" : "U het {oldfile} na {newfile} geskuif",
- "{user} moved {oldfile} to {newfile}" : "{user} het {oldfile} na {newfile} geskuif",
- "All files" : "Alle lêers",
- "Unlimited" : "Onbeperkte",
- "Upload (max. %s)" : "Oplaai (maks. %s)",
- "Accept" : "Aanvaar",
- "in %s" : "in %s",
- "File Management" : "Lêerbestuur",
- "Tags" : "Merkers",
- "Cancel" : "Kanselleer",
- "Create" : "Skep",
- "%s used" : "%s gebruik",
- "%1$s of %2$s used" : "%1$s van %2$s gebruik",
- "Settings" : "Instellings",
- "Show hidden files" : "Vertoon verborge lêers ",
- "WebDAV" : "WebDAV",
- "No files in here" : "Geen lêers hierbinne nie",
- "Upload some content or sync with your devices!" : "Laai 'n paar lêers op of sinchroniseer met u toestelle",
- "No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind",
- "Select all" : "Merk alles",
- "Upload too large" : "Oplaai te groot",
- "No favorites yet" : "Tans geen gunstelinge ",
- "Files and folders you mark as favorite will show up here" : "Lêers en gidse wat u as gunsteling merk sal hier vertoon word",
- "Deleted files" : "Geskrapte lêers",
- "Shared with others" : "Gedeel met ander",
- "Shared with you" : "Met u gedeel",
- "Shared by link" : "Gedeel per skakel",
- "Text file" : "Tekslêer",
- "New text file.txt" : "Nuwe tekslêer.txt",
- "_matches '{filter}'_::_match '{filter}'_" : ["pas '{filter}'","pas '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/af.json b/apps/files/l10n/af.json
deleted file mode 100644
index 3d3a428ecf2..00000000000
--- a/apps/files/l10n/af.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Berging is tydelik onbeskikbaar",
- "Storage invalid" : "Berging ongeldig",
- "Unknown error" : "Onbekende fout",
- "File could not be found" : "Lêer kon nie gevind word nie",
- "Move or copy" : "Kopieer of skuif",
- "Download" : "Laai af",
- "Delete" : "Skrap",
- "Home" : "Tuis",
- "Close" : "Sluit",
- "Favorites" : "Gunstelinge",
- "Could not create folder \"{dir}\"" : "Kan nie vouer “{dir}” skep nie",
- "This will stop your current uploads." : "Dit sal u huidige oplaaie stop.",
- "Upload cancelled." : "Oplaai gekanselleer.",
- "Processing files …" : "Verwerk tans lêers …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan nie {filename} oplaai nie aangesien dit óf 'n gids is óf 0 grepe groot is",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie genoeg oop spasie nie, u laai {size1} op maar slegs {size2} is oor",
- "Target folder \"{dir}\" does not exist any more" : "Teikengids \"{dir}\" bestaan nie meer nie",
- "Not enough free space" : "Nie genoeg oop spasie nie",
- "An unknown error has occurred" : "’n Onbekende fout het voorgekom",
- "Uploading …" : "Laai tans op …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "Teikengids bestaan nie meer nie",
- "Actions" : "Aksies",
- "Rename" : "Hernoem",
- "Copy" : "Kopieer",
- "Choose target folder" : "Kies teikenvouer",
- "Open" : "Open",
- "Delete file" : "Skrap lêer",
- "Delete folder" : "Skrap vouer",
- "Disconnect storage" : "Ontkoppel berging",
- "Could not load info for file \"{file}\"" : "Kon nie inligting vir lêer: “{file}” laai nie ",
- "Files" : "Lêers",
- "Details" : "Besonderhede",
- "Select" : "Kies",
- "Pending" : "Hangend",
- "Unable to determine date" : "Kan nie datum bepaal nie",
- "This operation is forbidden" : "Die operasie is verbode",
- "This directory is unavailable, please check the logs or contact the administrator" : "Hierdie gids is onbeskikbaar, gaan die logs na of kontak die administrateur",
- "Could not move \"{file}\", target exists" : "Kon nie \"{file}\" skuif nie, teiken bestaan",
- "Could not move \"{file}\"" : "Kon nie \"{file}\" skuif nie",
- "copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Kon nie \"{file}\" kopieer nie, teiken bestaan",
- "Could not copy \"{file}\"" : "Kon nie \"{file}\" kopieer nie",
- "Copied {origin} inside {destination}" : "{origin} binne {destination} gekopieer",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} en {nbfiles} ander lêers binne {destination} gekopieer",
- "{newName} already exists" : "{newName} bestaan reeds",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kon nie “{fileName}” hernoem nie, dit bestaan nie meer nie",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Die naam “{targetName}” word reeds in vouer “{dir}” gebruik. Kies asb. ’n ander naam.",
- "Could not rename \"{fileName}\"" : "Kon nie “{file}” hernoem nie",
- "Could not create file \"{file}\"" : "Kan nie lêer “{file}” skep nie",
- "Could not create file \"{file}\" because it already exists" : "Kon nie lêer “{file}” skep nie omdat dit reeds bestaan",
- "Could not create folder \"{dir}\" because it already exists" : "Kon nie vouer “{dir}” skep nie omdat dit reeds bestaan",
- "Name" : "Naam",
- "Size" : "Grootte",
- "Modified" : "Gewysig",
- "_%n folder_::_%n folders_" : ["%n gids","%n gidse"],
- "_%n file_::_%n files_" : ["%n lêer","%n lêers"],
- "{dirs} and {files}" : "{dirs} en {files}",
- "_including %n hidden_::_including %n hidden_" : ["insluitend %n verborge","insluitende %n verborge"],
- "You don’t have permission to upload or create files here" : "U het nie toestemming om lêers hier op te laai of te skep nie",
- "_Uploading %n file_::_Uploading %n files_" : ["Laai tans %n lêer op ","Laai tans %n lêers op"],
- "New" : "Nuwe",
- "{used} of {quota} used" : "{used} van {quota} gebruik",
- "{used} used" : "{used} gebruik",
- "\"{name}\" is an invalid file name." : "\"{name}\" is nie 'n geldige lêer naam nie.",
- "File name cannot be empty." : "Lêernaam kan nie leeg wees nie.",
- "\"/\" is not allowed inside a file name." : "\"/\" word nie binne 'n lêernaam toegelaat nie.",
- "View in folder" : "Vertoon in gids",
- "Copied!" : "Gekopieer!",
- "Path" : "Roete",
- "_%n byte_::_%n bytes_" : ["%n greep","%n grepe"],
- "Favorited" : "As gunsteling ",
- "Favorite" : "Gunsteling",
- "New folder" : "Nuwe gids",
- "Upload file" : "Laai lêer op",
- "Recent" : "Onlangs",
- "Not favorited" : "Nie as gunsteling",
- "Remove from favorites" : "Verwyder uit gunstelinge",
- "Add to favorites" : "Voeg by gunstelinge",
- "An error occurred while trying to update the tags" : "'n Fout het voorgekom terwyl die merkers opgedateer word",
- "Added to favorites" : "Tot gunstelinge bygevoeg",
- "Removed from favorites" : "Uit gunstelinge verwyder",
- "You added {file} to your favorites" : "U het {file} tot u gunstelinge bygevoeg",
- "You removed {file} from your favorites" : "U het {file} uit u gunstelinge verwyder",
- "File changes" : "Lêer veranderinge ",
- "Created by {user}" : "Geskep deur {user}",
- "Changed by {user}" : "Verander deur {user}",
- "Deleted by {user}" : "Geskrap deur {user}",
- "Restored by {user}" : "Herstel deur {user}",
- "Renamed by {user}" : "Naam verander deur {user}",
- "Moved by {user}" : "Geskuif deur {user}",
- "\"remote user\"" : "“afstandsgebruiker”",
- "You created {file}" : "U het {file} geskep",
- "{user} created {file}" : "{user} het {file} geskep",
- "{file} was created in a public folder" : "{file} is in 'n publieke gids geskep",
- "You changed {file}" : "U het {file} verander",
- "{user} changed {file}" : "{user} het {file} verander",
- "You deleted {file}" : "U het {file} geskrap",
- "{user} deleted {file}" : "{user} het {file} geskrap",
- "You restored {file}" : "U het {file} herstel",
- "{user} restored {file}" : "{user} het {file} herstel",
- "You renamed {oldfile} to {newfile}" : "U het die naam van {oldfile} na {newfile} verander",
- "{user} renamed {oldfile} to {newfile}" : "{user} het die naam van {oldfile} na {newfile} verander",
- "You moved {oldfile} to {newfile}" : "U het {oldfile} na {newfile} geskuif",
- "{user} moved {oldfile} to {newfile}" : "{user} het {oldfile} na {newfile} geskuif",
- "All files" : "Alle lêers",
- "Unlimited" : "Onbeperkte",
- "Upload (max. %s)" : "Oplaai (maks. %s)",
- "Accept" : "Aanvaar",
- "in %s" : "in %s",
- "File Management" : "Lêerbestuur",
- "Tags" : "Merkers",
- "Cancel" : "Kanselleer",
- "Create" : "Skep",
- "%s used" : "%s gebruik",
- "%1$s of %2$s used" : "%1$s van %2$s gebruik",
- "Settings" : "Instellings",
- "Show hidden files" : "Vertoon verborge lêers ",
- "WebDAV" : "WebDAV",
- "No files in here" : "Geen lêers hierbinne nie",
- "Upload some content or sync with your devices!" : "Laai 'n paar lêers op of sinchroniseer met u toestelle",
- "No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind",
- "Select all" : "Merk alles",
- "Upload too large" : "Oplaai te groot",
- "No favorites yet" : "Tans geen gunstelinge ",
- "Files and folders you mark as favorite will show up here" : "Lêers en gidse wat u as gunsteling merk sal hier vertoon word",
- "Deleted files" : "Geskrapte lêers",
- "Shared with others" : "Gedeel met ander",
- "Shared with you" : "Met u gedeel",
- "Shared by link" : "Gedeel per skakel",
- "Text file" : "Tekslêer",
- "New text file.txt" : "Nuwe tekslêer.txt",
- "_matches '{filter}'_::_match '{filter}'_" : ["pas '{filter}'","pas '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ak.js b/apps/files/l10n/ak.js
deleted file mode 100644
index 971a3489878..00000000000
--- a/apps/files/l10n/ak.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=n > 1;");
diff --git a/apps/files/l10n/ak.json b/apps/files/l10n/ak.json
deleted file mode 100644
index 321985e508d..00000000000
--- a/apps/files/l10n/ak.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=n > 1;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/am_ET.js b/apps/files/l10n/am_ET.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/am_ET.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/am_ET.json b/apps/files/l10n/am_ET.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/am_ET.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 1878168cb14..d57aec00b76 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
- "Storage invalid" : "وحدة تخزين غير صالحة",
- "Unknown error" : "خطأ غير معروف",
- "File could not be found" : "الملف غير موجود",
- "Move or copy" : "إنقل أو انسخ",
- "Download" : "تنزيل",
- "Delete" : "حذف ",
- "Home" : "الرئيسية",
- "Close" : "إغلاق",
- "Favorites" : "المفضلة ",
- "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
- "This will stop your current uploads." : "سيتم ايقاف رفع الملفات الحالية.",
- "Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
- "Processing files …" : "معالجة الملفات…",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
- "Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
- "Not enough free space" : "لا يوجد مساحة تخزينية كافية",
- "An unknown error has occurred" : "حدث خطأ غير معروف",
- "Uploading …" : "جاري الرفع...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} من {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "رفع هذا النوع الملفات غير مدعوم",
- "Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
- "Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
- "Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
- "Actions" : "الإجراءات",
- "Rename" : "إعادة التسمية",
- "Copy" : "نسخ",
- "Choose target folder" : "اختر مكان المجلد",
- "Open" : "افتح",
- "Delete file" : "احذف الملف",
- "Delete folder" : "حذف المجلد",
- "Disconnect storage" : "قطع اتصال التخزين",
- "Leave this share" : "مغادرة هذه المشاركة",
- "Could not load info for file \"{file}\"" : "لم يستطع تحميل معلومات الملف \"{file}\"",
- "Files" : "الملفات",
- "Details" : "التفاصيل",
- "Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
- "Apply tag(s) to selection" : "تطبيق العلامة (العلامات) على التحديد",
- "Select" : "إختر",
- "Pending" : "قيد الانتظار",
- "Unable to determine date" : "تعذر تحديد التاريخ",
- "This operation is forbidden" : "هذة العملية ممنوعة ",
- "This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر, الرجاء مراجعة سجل الأخطاء أو الاتصال بمدير النظام",
- "Could not move \"{file}\", target exists" : "لا يمكن نقل \"{file}\", الملف موجود بالفعل هناك",
- "Could not move \"{file}\"" : "لا يمكن نقل \"{file}\"",
- "copy" : "أنسخ",
- "Could not copy \"{file}\", target exists" : "لم يستطع نسخ \"{file}\"، المستهدف موجود",
- "Could not copy \"{file}\"" : "لم يستطع نسخ \"{file}\"",
- "Copied {origin} inside {destination}" : "منسوخ {origin} داخل {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "منسوخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
- "{newName} already exists" : "{newname} موجود مسبقاً",
- "Could not rename \"{fileName}\", it does not exist any more" : "لا يمكن اعادة تسمية \"{fileName}\", لانه لم يعد موجود",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{targetName}\" مستخدم من قبل في المجلد \"{dir}\". الرجاء اختيار اسم اخر.",
- "Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
- "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
- "Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
- "Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
- "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "لا نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
- "Name" : "الإسم",
- "Size" : "الحجم",
- "Modified" : "معدل",
- "_%n folder_::_%n folders_" : ["لا يوجد مجلدات %n","1 مجلد %n","2 مجلد %n","عدد قليل من مجلدات %n","عدد كبير من مجلدات %n","مجلدات %n"],
- "_%n file_::_%n files_" : ["لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"],
- "{dirs} and {files}" : "{dirs} و {files}",
- "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
- "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ",
- "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"],
- "New" : "جديد",
- "Select file range" : "حدد نطاق الملف",
- "{used} of {quota} used" : "{used} من {quota} مستخدم",
- "{used} used" : "{used} مستخدم",
- "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
- "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
- "\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\""],
- "View in folder" : "اعرض في المجلد",
- "Copied!" : "نسخت!",
- "Copy direct link (only works for users who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط لـ المستخدمين الذين يمكنهم الولوج الى هذا الملف/الفايل)",
- "Path" : "المسار",
- "_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%nبايت"],
- "Favorited" : "المفضلة",
- "Favorite" : "المفضلة",
- "You can only favorite a single file or folder at a time" : "يمكنك فقط تفضيل ملف أو مجلد واحد في المرة الواحدة",
- "New folder" : "مجلد جديد",
- "Upload file" : "رفع ملف",
- "Recent" : "الحديثة",
- "Not favorited" : "ازالة من المفضلة",
- "Remove from favorites" : "إزالته مِن المفضلة",
- "Add to favorites" : "إضافة إلى المفضلة",
- "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"Added to favorites" : "تمت إضافته إلى المفضلة",
"Removed from favorites" : "تمت إزالته مِن المفضلة",
"You added {file} to your favorites" : "أنت اضفت {file} إلى مفضلتك",
"You removed {file} from your favorites" : "تم ازالت {file} من مفضلتك",
+ "Favorites" : "المفضلة ",
"File changes" : "تغيير في ملف",
"Created by {user}" : "انشاء جديد من قبل {user}",
"Changed by {user}" : "تغيير من قبل {user}",
@@ -116,20 +13,20 @@ OC.L10N.register(
"Restored by {user}" : "استعادة من قبل {user}",
"Renamed by {user}" : "اعادة تسمية من قبل {user}",
"Moved by {user}" : "نقل من قبل {user}",
- "\"remote user\"" : "\"مستخدم عن بعد\"",
+ "\"remote account\"" : "\"حساب بعيد\"",
"You created {file}" : "أنشأتَ {file}",
- "You created an encrypted file in {file}" : "أنت انشأت ملف مشفر في {file}",
- "{user} created {file}" : "{user} انشاء ملف {file}",
- "{user} created an encrypted file in {file}" : "{user} انشاء ملف مشفر {file}",
- "{file} was created in a public folder" : "{file} انشاء ملف في المجلد العام",
+ "You created an encrypted file in {file}" : "انشأت ملف مشفر في {file}",
+ "{user} created {file}" : "{user} قام بإنشاء ملف {file}",
+ "{user} created an encrypted file in {file}" : "{user} قام بإنشاء ملف مشفر {file}",
+ "{file} was created in a public folder" : "{file} تم إنشاءه في مجلد عام",
"You changed {file}" : "أنت قمت بتغيير {file}",
"You changed an encrypted file in {file}" : "أنت قمت بتغيير ملف مشفر {file}",
- "{user} changed {file}" : "{user} تغيير {file}",
- "{user} changed an encrypted file in {file}" : "{user} تغيير ملف مشفر {file}",
+ "{user} changed {file}" : "{user} قام بتغيير {file}",
+ "{user} changed an encrypted file in {file}" : "{user} قام بتغيير ملف مشفر {file}",
"You deleted {file}" : "أنت حذفت ملف {file}",
"You deleted an encrypted file in {file}" : "أنت حذفت ملف مشفر {file}",
- "{user} deleted {file}" : "{user} حذف {file}",
- "{user} deleted an encrypted file in {file}" : "{user} حذف ملف مشفر {file}",
+ "{user} deleted {file}" : "{user} قام بحذف {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} قام بحذف ملف مشفر {file}",
"You restored {file}" : "أنت قمت باستعادة {file}",
"{user} restored {file}" : "{user} استعادة ملف {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
@@ -143,78 +40,427 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "أنت نقلت {oldfile} إلى {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} نقل {oldfile} إلى {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "ملف اضيف إلى او تم ازالته من <strong> مفضلتك </strong>",
+ "Files" : "الملفات",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
"A favorite file or folder has been <strong>changed</strong>" : "ملف في المفضلة تم <strong>تم تغييره</strong>",
- "All files" : "كل الملفات",
- "Unlimited" : "غير محدود",
- "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
+ "Failed to authorize" : "فشل في التخويل",
+ "Invalid folder path" : "مسار المجلد غير صحيح",
+ "Folder not found" : "المجلد غير موجود",
+ "The file cannot be found" : "تعذّر العثور على الملف",
+ "The destination path does not exist: %1$s" : "مسار المَقصِد غير موجود: %1$s",
+ "You do not have permission to create a file at the specified location" : "ليس لديك صلاحية لإنشاء ملف في الموقع المحدد",
+ "The file could not be converted." : "لايمكن تحويل الملف.",
+ "Could not get relative path to converted file" : "تعذّر الحصول على المسار النسبي للملف المُتحوِّل",
+ "Favorite files" : "الملفات المُفضَّلة",
+ "No favorites" : "لا يوجد مفضلات ",
+ "More favorites" : "مزيد من المُفضَّلة",
"Accept" : "قبول",
"Reject" : "رفض",
"Incoming ownership transfer from {user}" : "تم تحويل ملكية الملف إليك من قبل {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "هل تريد الموافقة {path}?\n\nملاحظة: عملية موافقة على النقل قد تستغرق إلى 1 ساعة.",
- "Ownership transfer failed" : "فشل نقل ملكية",
+ "Ownership transfer denied" : "تمّ رفض نقل الملكية",
+ "Your ownership transfer of {path} was denied by {user}." : "تمّ رفض نقل ملكية الملفات في {path} من قِبَل المستخدِم {user}.",
+ "Ownership transfer failed" : "فشل نقل ملكية الملفات",
"Your ownership transfer of {path} to {user} failed." : "فشلت عمليتك لنقل الـ {path} إلى {user}",
"The ownership transfer of {path} from {user} failed." : "فشل عملية النقل لـ {path} من قبل {user}",
- "Ownership transfer done" : "تم نقل ملكية بنجاح",
+ "Ownership transfer done" : "تم نقل ملكية الملفات بنجاح",
"Your ownership transfer of {path} to {user} has completed." : "عمليتك لنقل الـ {path} إلى {user} تمت بنجاح.",
- "The ownership transfer of {path} from {user} has completed." : "نقل الملكية لـ {path} من قبل {user} تمت بنجاح.",
+ "The ownership transfer of {path} from {user} has completed." : "نقل ملكية الملفات لـ {path} من قبل {user} تمت بنجاح.",
"in %s" : "في %s",
+ "Transferred from %1$s on %2$s" : "تم النقل من %1$s في%2$s",
+ "Files compatibility" : "توافقية الملفات",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "السماح بتقييد أسماء الملفات لضمان إمكانية مزامنة الملفات مع جميع العملاء. بشكل افتراضي، يُسمح بجميع أسماء الملفات الصالحة على POSIX (مثل Linux أو macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "بعد تمكين أسماء الملفات المتوافقة مع نظام التشغيل Windows، لا يمكن تعديل الملفات الموجودة بعد الآن ولكن يمكن إعادة تسميتها بأسماء جديدة صالحة بواسطة مالكها.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "من الممكن أيضًا ترحيل الملفات تلقائيًا بعد تمكين هذا الإعداد، يرجى الرجوع إلى الوثائق المتعلقة بأمر occ.",
+ "Enforce Windows compatibility" : "فرض التوافق مع ويندوز",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "سيؤدي هذا إلى حظر أسماء الملفات غير الصالحة على أنظمة Windows؛ مثل استخدام الأسماء المحجوزة أو الأحرف الخاصة. لكن هذا لن يفرض توافق حساسية الحالة.",
"File Management" : "إدارة الملفات",
- "Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
- "Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
- "Change" : "تغير",
- "New owner" : "مالك جديد",
- "Search users" : "ابحث عن مستخدمين",
+ "Home" : "الرئيسية",
+ "Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
+ "Reload current directory" : "إعادة تحميل المجلد الحالي",
+ "Go to the \"{dir}\" directory" : "إنتقل إلى المجلد \"{dir}\"",
+ "Current directory path" : "مسار المجلد الحالي",
+ "Your have used your space quota and cannot upload files anymore" : "لقد استنفذت حصتك التخزينية و لم يعد بإمكانك رفع أي ملفات الآن",
+ "You do not have permission to upload or create files here." : "أنت ليس لديك إذنٌ برفع أو إنشاء الملفات هنا.",
+ "Drag and drop files here to upload" : "إسحب وأفلت الملفات هنا لرفعها",
+ "Favorite" : "المفضلة",
+ "Back" : "عودة",
+ "Toggle selection for file \"{displayName}\"" : "تبديل الاختيار للملف \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "تبديل الاختيار للمجلد \"{displayName}\"",
+ "File is loading" : "يتم تحميل الملف...",
+ "Folder is loading" : "يتم تحميل المجلد...",
+ "Filename" : "اسم الملف",
+ "Folder name" : "اسم المجلد",
+ "This node is unavailable" : "هذه العُقْدَة node غير متوفرة ",
+ "Another entry with the same name already exists." : "توجد سلفاً إدخالية أخرى بنفس هذا الاسم.",
+ "Invalid filename." : "اسم ملف غير صحيح.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "تمت إعادة تسمية \"{oldName}\" إلى \"{newName}\"",
+ "Rename file" : "إعادة تسمية الملف",
+ "Folder" : "مجلد",
+ "Unknown file type" : "نوع ملف غير معروف",
+ "Pending" : "قيد الانتظار",
+ "Unknown date" : "تاريخ غير معروف",
+ "Clear filter" : "إزالة التصفية",
+ "Modified" : "التعديل",
+ "Search everywhere" : "البحث الشامل",
+ "Type" : "النوع",
+ "Active filters" : "فلاتر نشطة",
+ "Remove filter" : "إزالة عامل التصفية ",
+ "Total rows summary" : "ملخص مجموع الأسطر",
+ "Toggle selection for all files and folders" : "تبديل الاختيار لكل الملفات و المجلدات",
+ "Name" : "الاسم",
+ "File type" : "نوع الملف",
+ "Size" : "الحجم",
+ "Actions" : "الإجراءات",
+ "(selected)" : "(تم اختياره)",
+ "List of files and folders." : "قائمة الملفات والمجلدات",
+ "You have used your space quota and cannot upload files anymore." : "لقد قمت باستنفاذ كامل حصتك التخزينية و لايمكنك تحميل المزيد من الملفات.",
+ "Column headers with buttons are sortable." : "ترويسات الأعمدة ذات الأزرار قابلة للترتيب.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
+ "File not found" : "تعذر العثور على الملف",
+ "_{count} selected_::_{count} selected_" : ["{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
+ "{used} of {quota} used" : "{used} من {quota} مستخدم",
+ "{relative}% used" : "{relative}% مستخدمة",
+ "Could not refresh storage stats" : "تعذر تحديث حالة التخزين",
+ "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
+ "Storage information" : "معلومات التخزين",
+ "Storage quota" : "حصة التخزين",
+ "New folder" : "مجلد جديد",
+ "Create new folder" : "إنشاء مجلد جديد",
+ "This name is already in use." : "هذا الاسم سبق استعماله.",
+ "Create" : "إنشاء",
+ "Fill template fields" : "قُم بملء حقول القالب",
+ "Submitting fields …" : "إرسال الحقول ...",
+ "Submit" : "إرسال ",
"Choose a file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Transfer" : "نقل ملكية",
"Transfer {path} to {userid}" : "نقل ملكية {path} إلى {userid}",
"Invalid path selected" : "المسار او الملف غير صحيح",
+ "Unknown error" : "خطأ غير معروف",
"Ownership transfer request sent" : "طلب نقل الملكية أرسل بنجاح",
- "Cannot transfer ownership of a file or folder you don't own" : "لا يمكنك تحويل ملكية ملف أو مجلد ليس ملكك",
- "Tags" : "الوسوم",
- "Unable to change the favourite state of the file" : "لم نستطع تغير الحالة المفضلة للملف",
+ "Cannot transfer ownership of a file or folder you do not own" : "لايمكنك نقل ملكية ملف أو مجلد لا تملكه",
+ "Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
+ "Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
+ "Change" : "تغير",
+ "New owner" : "مالك جديد",
+ "Keep {old}" : "إحتَفِظ بـ {old}",
+ "Keep without extension" : "إحتَفِظ بدون امتداد",
+ "Use {new}" : "إستَعمِل {new}",
+ "Remove extension" : "أزِل الامتداد",
+ "Change file extension" : "تغيير امتداد الملف",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "تغيير امتداد اسم الملف من \"{old}\" إلى \"{new}\" يمكن أن يتسبب في جعله غير قابل للعرض.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "إزالة الامتداد \"{old}\" من اسم الملف يمكن أن يتسبب في تغيير طريقة تناول و عرض الملف أو يجعله غير قابل للعرض.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "إضافة الامتداد \"{new}\" لاسم الملف يمكن أن يتسبب في تغيير طريقة تناول و عرض الملف أو أن يجعله غير قابل للعرض.",
+ "Do not show this dialog again." : "لا تُظهِر هذه النافذة مرة أخرى",
+ "Select file or folder to link to" : "اختر ملف أو مجلد للربط معه",
+ "Choose {file}" : "إختر {file}",
+ "Share" : "مشاركة",
+ "Shared by link" : "شاركته باستخدام رابط مشاركة",
+ "Shared" : "مشاركة",
+ "Switch to list view" : "التبديل إلى عرض القائمة",
+ "Switch to grid view" : "تبديل إلى العرض الشبكي",
+ "The file could not be found" : "تعذّر إيجاد الملف",
+ "Upload was cancelled by user" : "عملية الرفع تمّ إلغاؤها من المستخدم",
+ "Not enough free space" : "لا يوجد مساحة تخزينية كافية",
+ "Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
+ "Error during upload: {message}" : "حدث خطأ أثناء الرفع: {message}",
+ "Error during upload, status code {status}" : "حدث خطأ أثناء الرفع. رمز الحالة {status}",
+ "Unknown error during upload" : "خطأ غير محدد حدث أثناء الرفع",
+ "Loading current folder" : "تحميل المجلد الحالي",
+ "Retry" : "أعِدِ المحاولة",
+ "No files in here" : "لا توجد ملفات هنا ",
+ "Upload some content or sync with your devices!" : "ارفع بعض المحتوى أو قم بالمزامنة مع أجهزتك!",
+ "Go back" : "العودة",
+ "Views" : "مشاهدات",
+ "Files settings" : "إعدادات الملفات",
+ "Your files" : "ملفاتك",
+ "Open in files" : "فتح في تطبيق الملفات",
+ "File cannot be accessed" : "الملف لم يمكن الوصول إليه",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "إمّا أن الملف غير موجود أو أنك لا تمتلك الصلاحية لعرضه. أُطلُب من المُرسل أن يتشاركه معك.",
+ "Clipboard is not available" : "الحافظة غير متاحة",
+ "General" : "عامٌّ",
+ "All files" : "كل الملفات",
+ "Personal files" : "ملفات شخصية",
+ "Sort favorites first" : "فرز المفضلة أولا",
+ "Sort folders before files" : "فرز المجلدات قبل الملفات",
+ "Appearance" : "المظهر",
+ "Show hidden files" : "عرض الملفات المخفية",
+ "Show file type column" : "عرض عمود نوع الملف",
+ "Crop image previews" : "اقتصاص صورة العروض",
+ "Additional settings" : "الإعدادات المتقدمة",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "عنوان URL لـ WebDAV",
+ "Copy" : "نسخ",
+ "Warnings" : "تحذيرات",
+ "Keyboard shortcuts" : "اختصارات لوحة المفاتيح",
+ "File actions" : "إجراءات الملفات",
+ "Rename" : "إعادة التسمية",
+ "Delete" : "حذف ",
+ "Manage tags" : "إدارة الوسوم",
+ "Selection" : "اختيار",
+ "Select all files" : "تحديد كل الملفات",
+ "Deselect all" : "إلغاء تحديد الكل",
+ "Navigation" : "التنقل",
+ "View" : "عرض",
+ "Toggle grid view" : "تفعيل/تعطيل وضع القائمة",
+ "Show those shortcuts" : "أعرُض تلك الاختصارات",
+ "You" : "أنت",
+ "Shared multiple times with different people" : "تمّت مشاركته عدة مرات مع أشخاص متعددين",
+ "Unable to change the favorite state of the file" : "تعذّر تغيير حالة المُفضَّلة للملف",
"Error while loading the file data" : "خطأ اثناء تحميل بيانات الملف",
+ "Owner" : "المالك",
+ "Remove from favorites" : "إزالة من المفضلة",
+ "Add to favorites" : "إضافة إلى المفضلة",
+ "Tags" : "الوسوم",
+ "Blank" : "فارغ",
+ "Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Pick a template for {name}" : "اختر قالبا لـ {name}",
- "Cancel" : "الغاء",
- "Create" : "إنشاء",
"Create a new file with the selected template" : "إنشاء ملف جديد بإستخدام القالب المحدد",
"Creating file" : "إنشاء ملف",
- "Blank" : "فارغ",
- "Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
- "Set up templates folder" : "إعداد مجلد القوالب",
- "Templates" : "القوالب",
+ "Save as {displayName}" : "حفظ باسم {displayName}",
+ "Save as …" : "حفظ باسم ...",
+ "Converting files …" : "تحويل الملفات ...",
+ "Failed to convert files: {message}" : "تعذّر تحويل الملفات: {message}",
+ "All files failed to be converted" : "تعذّر تحويل كل الملفات",
+ "One file could not be converted: {message}" : "تعذّر تحويل الملف : {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n ملف لايمكن تحويله","ملف واحد لايمكن تحويله","%n ملف لايمكن تحويله","%n ملفات لايمكن تحويلها","%n ملف لايمكن تحويله","%n ملف لايمكن تحويله"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n ملف تمّ تحويله بنجاحٍ","ملف واحد تمّ تحويله بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ","%n ملفات تمّ تحويلها بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ"],
+ "Files successfully converted" : "ملفات تمّ تحويلها بنجاحٍ",
+ "Failed to convert files" : "تعذّر تحويل الملفات",
+ "Converting file …" : "تحويل الملف ...",
+ "File successfully converted" : "تمّ تحويل الملفات بنجاحٍ",
+ "Failed to convert file: {message}" : "تعذّر تحويل الملف: {message}",
+ "Failed to convert file" : "تعذّر تحويل ملف",
+ "Leave this share" : "مغادرة هذه المشاركة",
+ "Leave these shares" : "مغادرة هاتين المشاركتين",
+ "Disconnect storage" : "قطع اتصال التخزين",
+ "Disconnect storages" : "فصل وحدات تخزين",
+ "Delete permanently" : "حذف بشكل دائم",
+ "Delete and unshare" : "حذف وإلغاء المشاركة",
+ "Delete file" : "حذف الملف",
+ "Delete files" : "حذف الملفات",
+ "Delete folder" : "حذف مجلد",
+ "Delete folders" : "حذف مجلدين",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عناصر","أنت على وشك أن تحذف نهائياً {count} عناصر","أنت على وشك حذف {count} عنصر بشكل نهائي "],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عناصر","أنت على وشك أن تحذف {count} عناصر","أنت على وشك أن تحذف {count} عنصراً"],
+ "Confirm deletion" : "تأكيد الحذف",
+ "Cancel" : "إلغاء",
+ "Download" : "تنزيل",
+ "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …",
+ "Destination is not a folder" : "الوجهة ليست مجلد",
+ "This file/folder is already in that directory" : "هذا الملف/المجلد موجود سلفاً في ذلك المجلد",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
+ "(copy)" : "(نسخ)",
+ "(copy %n)" : "(نسخ %n)",
+ "A file or folder with that name already exists in this folder" : "ملف أو مجلد بنفس ذاك الاسم موجود سلفاً في هذا المجلد",
+ "The files are locked" : "الملفات مقفلة",
+ "The file does not exist anymore" : "الملف لم يعد موجوداً",
+ "Choose destination" : "تحديد الوجهة",
+ "Copy to {target}" : "نسخ إلى {target}",
+ "Move to {target}" : "نقل إلى {target}",
+ "Move" : "نقل",
+ "Move or copy operation failed" : "عملية النسخ أو النقل فشلت",
+ "Move or copy" : "نقل أو نسخ",
+ "Open folder {displayName}" : "فتح المجلد {displayName}",
+ "Open in Files" : "فتح في \"الملفات\"",
+ "Open locally" : "الفتح محلّيّاً",
+ "Failed to redirect to client" : "فشل في التحويل الى العميل",
+ "Open file locally" : "فتح الملف محلّيّاً",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "يجب أن يفتح الملف الآن على جهازك. إذا لم يحدث ذلك، فيرجى التأكد من تثبيت تطبيق سطح المكتب.",
+ "Retry and close" : "أعِد المحاولة ثم أغلِق",
+ "Open online" : "إفتَح مُتَّصِلاً بالإنترنت",
+ "Details" : "التفاصيل",
+ "View in folder" : "عرض في المجلد",
+ "Today" : "اليوم",
+ "Last 7 days" : "آخر 7 أيام",
+ "Last 30 days" : "آخر 30 يوماً",
+ "This year ({year})" : "هذا العام ({year})",
+ "Last year ({year})" : "العام الماضي ({year})",
+ "Documents" : "المستندات",
+ "Spreadsheets" : "الجداول الالكترونية",
+ "Presentations" : "العروض",
+ "PDFs" : "ملفات PDF",
+ "Folders" : "المجلدات",
+ "Audio" : "صوت",
+ "Images" : "الصِّوَر",
+ "Videos" : "مقاطع فيديو",
+ "Created new folder \"{name}\"" : "تمّ إنشاء مجلد جديد باسم \"{name}\"",
"Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب",
- "%s used" : "%s مُستخدَم",
- "%s%% of %s used" : "%s%% من %s قيد الاستخدام",
- "%1$s of %2$s used" : "تم استخدام %1$s من %2$s",
- "Settings" : "الإعدادات",
- "Show hidden files" : "عرض الملفات المخفية",
- "Crop image previews" : "اقتصاص صورة العروض",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
- "Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
- "Toggle grid view" : "تفعيل/تعطيل القائمة",
- "No files in here" : "لا يوجد ملفات هنا ",
- "Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
+ "Create templates folder" : "إنشاء مجلد للقوالب",
+ "Templates" : "القوالب",
+ "New template folder" : "مجلد القوالب الجديد",
+ "In folder" : "في المجلد",
+ "Search in folder: {folder}" : "البحث في المجلد: {folder}",
+ "One of the dropped files could not be processed" : "أحد الملفات المُفلَتة لا يمكن معالجته",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "مُستعرِضُك لا يدعم واجهة تطبيق نظام الملفات Filesystem API. لذا، لن يُمكن رفع المجلدات",
+ "No files to upload" : "لا توجد ملفات لرفعها",
+ "Unable to create the directory {directory}" : "تعذّر إنشاء الدليل {directory}",
+ "Some files could not be uploaded" : "بعض الملفات لم يمكن رفعها",
+ "Files uploaded successfully" : "تمّ رفع الملفات بنجاح",
+ "No files to process" : "لا توجد ملفات لمعالجتها",
+ "Some files could not be copied" : "بعض الملفات لا يمكن نسخها",
+ "Some files could not be moved" : "تعذر نقل بعض الملفات",
+ "Files copied successfully" : "تمّ نسخ الملفات بنجاح",
+ "Files moved successfully" : "تمّ نقل الملفات بنجاح",
+ "Conflicts resolution skipped" : "تمّ تخطّي حلّ التعارضات",
+ "Upload cancelled" : "تمّ إلغاء الرفع",
+ "Could not rename \"{oldName}\", it does not exist any more" : "تعذر إعادة تسمية \"{oldName}\"، لم يعد موجودًا",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{newName}\" مستعمل سلفاً في المجلد\"{dir}\". إختر اسماً آخر رجاءً.",
+ "Could not rename \"{oldName}\"" : "تعذرت إعادة تسمية \"{oldName}\"",
+ "This operation is forbidden" : "هذه العملية ممنوعة ",
+ "Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
+ "Unexpected error: {error}" : "خطأ غير متوقع: {error}",
+ "_%n file_::_%n files_" : ["لا يوجد ملفات %n","%n ملف","ملفان","%n ملفات","%n ملف","%n ملفات"],
+ "_%n folder_::_%n folders_" : ["لا توجد مجلدات","مجلد واحد","مجلدان","%n مجلدات","%n مجلد","%n مجلدات"],
+ "Filename must not be empty." : "يجب ألّا يكون اسم الملف فارغاً.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" غير مسموح به في اسم الملف.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" هو اسم محجوز و لا يجوز استعماله كاسم لملف.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" غير مسموح به كنوع لملف.",
+ "Filenames must not end with \"{extension}\"." : "أسماء الملفات يجب ألّا تنتهي بـ \"{extension}\".",
+ "List of favorite files and folders." : "قائمة بالملفات و المجلدات المُفضّلة.",
+ "No favorites yet" : "ليس لديك ملفات مفضلة",
+ "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كمفضلة سوف تظهر هنا ",
+ "List of your files and folders." : "قائمة بملفاتك و مجلداتك",
+ "List of your files and folders that are not shared." : "قائمة بالملفات و المجلدات التي لم تتم مشاركتها.",
+ "No personal files found" : "لا توجد أي ملفات شخصية",
+ "Files that are not shared will show up here." : "الملفات التي لم تتم مشاركتها يتم عرضها هنا",
+ "Recent" : "آخر الملفات",
+ "List of recently modified files and folders." : "قائمة بالملفات والمجلدات التي تمّ تعديلها مؤخراً.",
+ "No recently modified files" : "لا توجد أي ملفات تمّ تعديلها مؤخراً",
+ "Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
+ "Search" : "بحث",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
- "Upload too large" : "حجم الترفيع أعلى من المسموح",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
- "No favorites yet" : "ليست عندك مفضلات بعد",
- "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
- "Deleted files" : "الملفات المحذوفة",
- "Shares" : "التي قمتَ بمشاركتها",
- "Shared with others" : "شاركته مع الاخرين",
- "Shared with you" : "شورك معك",
- "Shared by link" : "شاركته باستخدام رابط مشاركة",
- "Deleted shares" : "تم حذف المشاركات",
- "Pending shares" : "انتظار المشاركات",
+ "Upload too large" : "حجم الرفع أعلى من المسموح",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد رفعها أعلى من المسموح على الخادم.",
+ "File could not be found" : "لم يتم العثور على الملف",
+ "Show list view" : "اظهر معاينات الروابط",
+ "Show grid view" : "عرض شبكي",
+ "Close" : "إغلاق",
+ "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
+ "This will stop your current uploads." : "هذا سيقوم بوقف رفع الملفات الحالية.",
+ "Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
+ "Processing files …" : "معالجة الملفات…",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
+ "An unknown error has occurred" : "حدث خطأ غير معروف",
+ "File could not be uploaded" : "لا يمكن تحميل الملف ",
+ "Uploading …" : "الرفع جارٍ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "يتم التحديث… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} من {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "رفع هذا النوع الملفات غير مدعوم",
+ "Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
+ "Choose target folder" : "اختر مكان المجلد",
+ "Set reminder" : "ضبط التذكير",
+ "Edit locally" : "تحرير الملف محلياً",
+ "Open" : "فتح",
+ "Could not load info for file \"{file}\"" : "فشل تحميل معلومات الملف \"{file}\"",
+ "Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
+ "Apply tag(s) to selection" : "تطبيق وسم على التحديد",
+ "Select directory \"{dirName}\"" : "حدِّد الدليل \"{dirName}\"",
+ "Select file \"{fileName}\"" : "حدِّد الملف \"{fileName}\"",
+ "Unable to determine date" : "تعذر تحديد التاريخ",
+ "This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر، الرجاء مراجعة سجل الحركات أو الاتصال بمشرف النظام",
+ "Could not move \"{file}\", target exists" : "فشل نقل \"{file}\", الملف موجود بالفعل هناك",
+ "Could not move \"{file}\"" : "فشل نقل \"{file}\"",
+ "copy" : "نسخ",
+ "Could not copy \"{file}\", target exists" : "فشل نسخ \"{file}\"، المستهدف موجود",
+ "Could not copy \"{file}\"" : "فشل نسخ \"{file}\"",
+ "Copied {origin} inside {destination}" : "تم نسخ {origin} داخل {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "تم نسخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
+ "{newName} already exists" : "{newName} موجود مسبقاً",
+ "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "فشل إنشاء الملف \"{file}\" فهو موجود بالفعل",
+ "Could not create folder \"{dir}\" because it already exists" : "فشل إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
+ "Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "لاتوجد نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
+ "{dirs} and {files}" : "{dirs} و {files}",
+ "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
+ "You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا",
+ "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم رفع الملفات %n"],
+ "New" : "جديد",
+ "New file/folder menu" : "قائمة مجلد/ملف جديد",
+ "Select file range" : "حدد نطاق الملف",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} مستخدم",
+ "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
+ "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
+ "\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابق \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "تم نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
+ "Path" : "المسار",
+ "_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%n بايت"],
+ "Favored" : "مُفضّلة",
+ "Favor" : "تفضيل",
+ "Copy direct link (only works for people who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
+ "Upload file" : "رفع ملف",
+ "Not favored" : "غير مُفضّلة",
+ "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث الوسوم",
+ "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" الأمر نُفّذ بنجاح",
+ "\"{displayName}\" action failed" : "\"{displayName}\" الأمر أخفق عند التنفيذ",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" فشل في بعض العناصر",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" حزمة الأوامر تم تنفيذها بنجاح",
+ "Submitting fields…" : "إرسال الحقول...",
+ "Filter filenames…" : "تصفية باسم الملف...",
+ "WebDAV URL copied to clipboard" : "تم نسخ WebDAV URL إلى الحافظة",
+ "Enable the grid view" : "تمكين العرض الشبكي",
+ "Enable folder tree" : "تمكين شجرة المجلدات",
+ "Copy to clipboard" : "نسخ الرابط",
+ "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
+ "Deletion cancelled" : "تمّ إلغاء الحذف",
+ "Move cancelled" : "تمّ إلغاء النقل",
+ "Cancelled move or copy of \"{filename}\"." : "تمّ إلغاء عملية حذف أو نقل الملف \"{filename}\".",
+ "Cancelled move or copy operation" : ".عملية النسخ أو النقل تمّ إلغاؤها",
+ "Open details" : "فتح التفاصيل",
+ "Photos and images" : "الصور ",
+ "New folder creation cancelled" : "تمّ إلغاء عملية إنشاء مجلد جديد",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلد","{folderCount} مجلد"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملف","{fileCount} ملف"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و{folderCount} مجلدات","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد","{fileCount} ملفات و 1 مجلد ","{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ملف و {folderCount} مجلد",
+ "All folders" : "كل المجلدات",
+ "Personal Files" : "ملفات شخصية",
"Text file" : "ملف نصي",
"New text file.txt" : "ملف نصي جديد fille.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "مساحة تخزين {owner} ممتلئة، لا يمكن تحديث الملفات او مزامنتها بعد الان !",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "مجلد مجموعة \"{mountPoint}\" ممتلئ, لا يمكن تحديث او مزامنة الملفات بعد الآن!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "التخزين الخارجي \"{mountPoint}\" ممتلئ, لا يمكن تحديث او مزامنة الملفات بعد الآن!",
- "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
- "_matches '{filter}'_::_match '{filter}'_" : ["تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\""]
+ "renamed file" : "ملف معاد تسميته",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "بعد تمكين أسماء الملفات المتوافقة مع نظام التشغيل Windows، لا يمكن تعديل الملفات الموجودة بعد الآن ولكن يمكن إعادة تسميتها إلى أسماء جديدة صالحة بواسطة مالكها.",
+ "Filter file names …" : "تصفية بأسماء الملفات...",
+ "Prevent warning dialogs from open or reenable them." : "منع نوافذ التحذير من الفتح أو إعادة تمكينها.",
+ "Show a warning dialog when changing a file extension." : "أظهِر نافذة التحذير عندما يتم تغيير امتداد الملف.",
+ "Speed up your Files experience with these quick shortcuts." : "سرِّع تعاملك مع الملفات بهذه الاختصارات السريعة.",
+ "Open the actions menu for a file" : "إفتَح قائمة الإجراءات للملف",
+ "Rename a file" : "تغيير اسم ملف",
+ "Delete a file" : "حذف ملف",
+ "Favorite or remove a file from favorites" : "تفضيل أو إلغاء تفضيل ملف",
+ "Manage tags for a file" : "إدارة الوسوم لملف",
+ "Deselect all files" : "إلغاء تحديد كل الملفات",
+ "Select or deselect a file" : "اختيار أو إلغاء اختيار ملف",
+ "Select a range of files" : "تحديد نطاق من الملفات",
+ "Navigate to the parent folder" : "إنتقِل إلى المجلد الأب",
+ "Navigate to the file above" : "إنتقِل إلى الملف أعلاه",
+ "Navigate to the file below" : "إنتقِل إلى الملف أسفله",
+ "Navigate to the file on the left (in grid mode)" : "إنتقِل إلى الملف أيسره (في الشبكة)",
+ "Navigate to the file on the right (in grid mode)" : "إنتقِل إلى الملف أيمنه (في الشبكة)",
+ "Toggle the grid view" : "بدِّل وضعية الشبكة",
+ "Open the sidebar for a file" : "إفتَح الشريط الجانبي للملف"
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index e09d8e3d04a..815140534df 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
- "Storage invalid" : "وحدة تخزين غير صالحة",
- "Unknown error" : "خطأ غير معروف",
- "File could not be found" : "الملف غير موجود",
- "Move or copy" : "إنقل أو انسخ",
- "Download" : "تنزيل",
- "Delete" : "حذف ",
- "Home" : "الرئيسية",
- "Close" : "إغلاق",
- "Favorites" : "المفضلة ",
- "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
- "This will stop your current uploads." : "سيتم ايقاف رفع الملفات الحالية.",
- "Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
- "Processing files …" : "معالجة الملفات…",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
- "Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
- "Not enough free space" : "لا يوجد مساحة تخزينية كافية",
- "An unknown error has occurred" : "حدث خطأ غير معروف",
- "Uploading …" : "جاري الرفع...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} من {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "رفع هذا النوع الملفات غير مدعوم",
- "Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
- "Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
- "Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
- "Actions" : "الإجراءات",
- "Rename" : "إعادة التسمية",
- "Copy" : "نسخ",
- "Choose target folder" : "اختر مكان المجلد",
- "Open" : "افتح",
- "Delete file" : "احذف الملف",
- "Delete folder" : "حذف المجلد",
- "Disconnect storage" : "قطع اتصال التخزين",
- "Leave this share" : "مغادرة هذه المشاركة",
- "Could not load info for file \"{file}\"" : "لم يستطع تحميل معلومات الملف \"{file}\"",
- "Files" : "الملفات",
- "Details" : "التفاصيل",
- "Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
- "Apply tag(s) to selection" : "تطبيق العلامة (العلامات) على التحديد",
- "Select" : "إختر",
- "Pending" : "قيد الانتظار",
- "Unable to determine date" : "تعذر تحديد التاريخ",
- "This operation is forbidden" : "هذة العملية ممنوعة ",
- "This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر, الرجاء مراجعة سجل الأخطاء أو الاتصال بمدير النظام",
- "Could not move \"{file}\", target exists" : "لا يمكن نقل \"{file}\", الملف موجود بالفعل هناك",
- "Could not move \"{file}\"" : "لا يمكن نقل \"{file}\"",
- "copy" : "أنسخ",
- "Could not copy \"{file}\", target exists" : "لم يستطع نسخ \"{file}\"، المستهدف موجود",
- "Could not copy \"{file}\"" : "لم يستطع نسخ \"{file}\"",
- "Copied {origin} inside {destination}" : "منسوخ {origin} داخل {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "منسوخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
- "{newName} already exists" : "{newname} موجود مسبقاً",
- "Could not rename \"{fileName}\", it does not exist any more" : "لا يمكن اعادة تسمية \"{fileName}\", لانه لم يعد موجود",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{targetName}\" مستخدم من قبل في المجلد \"{dir}\". الرجاء اختيار اسم اخر.",
- "Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
- "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
- "Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
- "Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
- "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "لا نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
- "Name" : "الإسم",
- "Size" : "الحجم",
- "Modified" : "معدل",
- "_%n folder_::_%n folders_" : ["لا يوجد مجلدات %n","1 مجلد %n","2 مجلد %n","عدد قليل من مجلدات %n","عدد كبير من مجلدات %n","مجلدات %n"],
- "_%n file_::_%n files_" : ["لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"],
- "{dirs} and {files}" : "{dirs} و {files}",
- "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
- "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ",
- "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"],
- "New" : "جديد",
- "Select file range" : "حدد نطاق الملف",
- "{used} of {quota} used" : "{used} من {quota} مستخدم",
- "{used} used" : "{used} مستخدم",
- "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
- "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
- "\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\""],
- "View in folder" : "اعرض في المجلد",
- "Copied!" : "نسخت!",
- "Copy direct link (only works for users who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط لـ المستخدمين الذين يمكنهم الولوج الى هذا الملف/الفايل)",
- "Path" : "المسار",
- "_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%nبايت"],
- "Favorited" : "المفضلة",
- "Favorite" : "المفضلة",
- "You can only favorite a single file or folder at a time" : "يمكنك فقط تفضيل ملف أو مجلد واحد في المرة الواحدة",
- "New folder" : "مجلد جديد",
- "Upload file" : "رفع ملف",
- "Recent" : "الحديثة",
- "Not favorited" : "ازالة من المفضلة",
- "Remove from favorites" : "إزالته مِن المفضلة",
- "Add to favorites" : "إضافة إلى المفضلة",
- "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"Added to favorites" : "تمت إضافته إلى المفضلة",
"Removed from favorites" : "تمت إزالته مِن المفضلة",
"You added {file} to your favorites" : "أنت اضفت {file} إلى مفضلتك",
"You removed {file} from your favorites" : "تم ازالت {file} من مفضلتك",
+ "Favorites" : "المفضلة ",
"File changes" : "تغيير في ملف",
"Created by {user}" : "انشاء جديد من قبل {user}",
"Changed by {user}" : "تغيير من قبل {user}",
@@ -114,20 +11,20 @@
"Restored by {user}" : "استعادة من قبل {user}",
"Renamed by {user}" : "اعادة تسمية من قبل {user}",
"Moved by {user}" : "نقل من قبل {user}",
- "\"remote user\"" : "\"مستخدم عن بعد\"",
+ "\"remote account\"" : "\"حساب بعيد\"",
"You created {file}" : "أنشأتَ {file}",
- "You created an encrypted file in {file}" : "أنت انشأت ملف مشفر في {file}",
- "{user} created {file}" : "{user} انشاء ملف {file}",
- "{user} created an encrypted file in {file}" : "{user} انشاء ملف مشفر {file}",
- "{file} was created in a public folder" : "{file} انشاء ملف في المجلد العام",
+ "You created an encrypted file in {file}" : "انشأت ملف مشفر في {file}",
+ "{user} created {file}" : "{user} قام بإنشاء ملف {file}",
+ "{user} created an encrypted file in {file}" : "{user} قام بإنشاء ملف مشفر {file}",
+ "{file} was created in a public folder" : "{file} تم إنشاءه في مجلد عام",
"You changed {file}" : "أنت قمت بتغيير {file}",
"You changed an encrypted file in {file}" : "أنت قمت بتغيير ملف مشفر {file}",
- "{user} changed {file}" : "{user} تغيير {file}",
- "{user} changed an encrypted file in {file}" : "{user} تغيير ملف مشفر {file}",
+ "{user} changed {file}" : "{user} قام بتغيير {file}",
+ "{user} changed an encrypted file in {file}" : "{user} قام بتغيير ملف مشفر {file}",
"You deleted {file}" : "أنت حذفت ملف {file}",
"You deleted an encrypted file in {file}" : "أنت حذفت ملف مشفر {file}",
- "{user} deleted {file}" : "{user} حذف {file}",
- "{user} deleted an encrypted file in {file}" : "{user} حذف ملف مشفر {file}",
+ "{user} deleted {file}" : "{user} قام بحذف {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} قام بحذف ملف مشفر {file}",
"You restored {file}" : "أنت قمت باستعادة {file}",
"{user} restored {file}" : "{user} استعادة ملف {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
@@ -141,78 +38,427 @@
"You moved {oldfile} to {newfile}" : "أنت نقلت {oldfile} إلى {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} نقل {oldfile} إلى {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "ملف اضيف إلى او تم ازالته من <strong> مفضلتك </strong>",
+ "Files" : "الملفات",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
"A favorite file or folder has been <strong>changed</strong>" : "ملف في المفضلة تم <strong>تم تغييره</strong>",
- "All files" : "كل الملفات",
- "Unlimited" : "غير محدود",
- "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
+ "Failed to authorize" : "فشل في التخويل",
+ "Invalid folder path" : "مسار المجلد غير صحيح",
+ "Folder not found" : "المجلد غير موجود",
+ "The file cannot be found" : "تعذّر العثور على الملف",
+ "The destination path does not exist: %1$s" : "مسار المَقصِد غير موجود: %1$s",
+ "You do not have permission to create a file at the specified location" : "ليس لديك صلاحية لإنشاء ملف في الموقع المحدد",
+ "The file could not be converted." : "لايمكن تحويل الملف.",
+ "Could not get relative path to converted file" : "تعذّر الحصول على المسار النسبي للملف المُتحوِّل",
+ "Favorite files" : "الملفات المُفضَّلة",
+ "No favorites" : "لا يوجد مفضلات ",
+ "More favorites" : "مزيد من المُفضَّلة",
"Accept" : "قبول",
"Reject" : "رفض",
"Incoming ownership transfer from {user}" : "تم تحويل ملكية الملف إليك من قبل {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "هل تريد الموافقة {path}?\n\nملاحظة: عملية موافقة على النقل قد تستغرق إلى 1 ساعة.",
- "Ownership transfer failed" : "فشل نقل ملكية",
+ "Ownership transfer denied" : "تمّ رفض نقل الملكية",
+ "Your ownership transfer of {path} was denied by {user}." : "تمّ رفض نقل ملكية الملفات في {path} من قِبَل المستخدِم {user}.",
+ "Ownership transfer failed" : "فشل نقل ملكية الملفات",
"Your ownership transfer of {path} to {user} failed." : "فشلت عمليتك لنقل الـ {path} إلى {user}",
"The ownership transfer of {path} from {user} failed." : "فشل عملية النقل لـ {path} من قبل {user}",
- "Ownership transfer done" : "تم نقل ملكية بنجاح",
+ "Ownership transfer done" : "تم نقل ملكية الملفات بنجاح",
"Your ownership transfer of {path} to {user} has completed." : "عمليتك لنقل الـ {path} إلى {user} تمت بنجاح.",
- "The ownership transfer of {path} from {user} has completed." : "نقل الملكية لـ {path} من قبل {user} تمت بنجاح.",
+ "The ownership transfer of {path} from {user} has completed." : "نقل ملكية الملفات لـ {path} من قبل {user} تمت بنجاح.",
"in %s" : "في %s",
+ "Transferred from %1$s on %2$s" : "تم النقل من %1$s في%2$s",
+ "Files compatibility" : "توافقية الملفات",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "السماح بتقييد أسماء الملفات لضمان إمكانية مزامنة الملفات مع جميع العملاء. بشكل افتراضي، يُسمح بجميع أسماء الملفات الصالحة على POSIX (مثل Linux أو macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "بعد تمكين أسماء الملفات المتوافقة مع نظام التشغيل Windows، لا يمكن تعديل الملفات الموجودة بعد الآن ولكن يمكن إعادة تسميتها بأسماء جديدة صالحة بواسطة مالكها.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "من الممكن أيضًا ترحيل الملفات تلقائيًا بعد تمكين هذا الإعداد، يرجى الرجوع إلى الوثائق المتعلقة بأمر occ.",
+ "Enforce Windows compatibility" : "فرض التوافق مع ويندوز",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "سيؤدي هذا إلى حظر أسماء الملفات غير الصالحة على أنظمة Windows؛ مثل استخدام الأسماء المحجوزة أو الأحرف الخاصة. لكن هذا لن يفرض توافق حساسية الحالة.",
"File Management" : "إدارة الملفات",
- "Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
- "Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
- "Change" : "تغير",
- "New owner" : "مالك جديد",
- "Search users" : "ابحث عن مستخدمين",
+ "Home" : "الرئيسية",
+ "Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
+ "Reload current directory" : "إعادة تحميل المجلد الحالي",
+ "Go to the \"{dir}\" directory" : "إنتقل إلى المجلد \"{dir}\"",
+ "Current directory path" : "مسار المجلد الحالي",
+ "Your have used your space quota and cannot upload files anymore" : "لقد استنفذت حصتك التخزينية و لم يعد بإمكانك رفع أي ملفات الآن",
+ "You do not have permission to upload or create files here." : "أنت ليس لديك إذنٌ برفع أو إنشاء الملفات هنا.",
+ "Drag and drop files here to upload" : "إسحب وأفلت الملفات هنا لرفعها",
+ "Favorite" : "المفضلة",
+ "Back" : "عودة",
+ "Toggle selection for file \"{displayName}\"" : "تبديل الاختيار للملف \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "تبديل الاختيار للمجلد \"{displayName}\"",
+ "File is loading" : "يتم تحميل الملف...",
+ "Folder is loading" : "يتم تحميل المجلد...",
+ "Filename" : "اسم الملف",
+ "Folder name" : "اسم المجلد",
+ "This node is unavailable" : "هذه العُقْدَة node غير متوفرة ",
+ "Another entry with the same name already exists." : "توجد سلفاً إدخالية أخرى بنفس هذا الاسم.",
+ "Invalid filename." : "اسم ملف غير صحيح.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "تمت إعادة تسمية \"{oldName}\" إلى \"{newName}\"",
+ "Rename file" : "إعادة تسمية الملف",
+ "Folder" : "مجلد",
+ "Unknown file type" : "نوع ملف غير معروف",
+ "Pending" : "قيد الانتظار",
+ "Unknown date" : "تاريخ غير معروف",
+ "Clear filter" : "إزالة التصفية",
+ "Modified" : "التعديل",
+ "Search everywhere" : "البحث الشامل",
+ "Type" : "النوع",
+ "Active filters" : "فلاتر نشطة",
+ "Remove filter" : "إزالة عامل التصفية ",
+ "Total rows summary" : "ملخص مجموع الأسطر",
+ "Toggle selection for all files and folders" : "تبديل الاختيار لكل الملفات و المجلدات",
+ "Name" : "الاسم",
+ "File type" : "نوع الملف",
+ "Size" : "الحجم",
+ "Actions" : "الإجراءات",
+ "(selected)" : "(تم اختياره)",
+ "List of files and folders." : "قائمة الملفات والمجلدات",
+ "You have used your space quota and cannot upload files anymore." : "لقد قمت باستنفاذ كامل حصتك التخزينية و لايمكنك تحميل المزيد من الملفات.",
+ "Column headers with buttons are sortable." : "ترويسات الأعمدة ذات الأزرار قابلة للترتيب.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
+ "File not found" : "تعذر العثور على الملف",
+ "_{count} selected_::_{count} selected_" : ["{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
+ "{used} of {quota} used" : "{used} من {quota} مستخدم",
+ "{relative}% used" : "{relative}% مستخدمة",
+ "Could not refresh storage stats" : "تعذر تحديث حالة التخزين",
+ "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
+ "Storage information" : "معلومات التخزين",
+ "Storage quota" : "حصة التخزين",
+ "New folder" : "مجلد جديد",
+ "Create new folder" : "إنشاء مجلد جديد",
+ "This name is already in use." : "هذا الاسم سبق استعماله.",
+ "Create" : "إنشاء",
+ "Fill template fields" : "قُم بملء حقول القالب",
+ "Submitting fields …" : "إرسال الحقول ...",
+ "Submit" : "إرسال ",
"Choose a file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Transfer" : "نقل ملكية",
"Transfer {path} to {userid}" : "نقل ملكية {path} إلى {userid}",
"Invalid path selected" : "المسار او الملف غير صحيح",
+ "Unknown error" : "خطأ غير معروف",
"Ownership transfer request sent" : "طلب نقل الملكية أرسل بنجاح",
- "Cannot transfer ownership of a file or folder you don't own" : "لا يمكنك تحويل ملكية ملف أو مجلد ليس ملكك",
- "Tags" : "الوسوم",
- "Unable to change the favourite state of the file" : "لم نستطع تغير الحالة المفضلة للملف",
+ "Cannot transfer ownership of a file or folder you do not own" : "لايمكنك نقل ملكية ملف أو مجلد لا تملكه",
+ "Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
+ "Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
+ "Change" : "تغير",
+ "New owner" : "مالك جديد",
+ "Keep {old}" : "إحتَفِظ بـ {old}",
+ "Keep without extension" : "إحتَفِظ بدون امتداد",
+ "Use {new}" : "إستَعمِل {new}",
+ "Remove extension" : "أزِل الامتداد",
+ "Change file extension" : "تغيير امتداد الملف",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "تغيير امتداد اسم الملف من \"{old}\" إلى \"{new}\" يمكن أن يتسبب في جعله غير قابل للعرض.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "إزالة الامتداد \"{old}\" من اسم الملف يمكن أن يتسبب في تغيير طريقة تناول و عرض الملف أو يجعله غير قابل للعرض.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "إضافة الامتداد \"{new}\" لاسم الملف يمكن أن يتسبب في تغيير طريقة تناول و عرض الملف أو أن يجعله غير قابل للعرض.",
+ "Do not show this dialog again." : "لا تُظهِر هذه النافذة مرة أخرى",
+ "Select file or folder to link to" : "اختر ملف أو مجلد للربط معه",
+ "Choose {file}" : "إختر {file}",
+ "Share" : "مشاركة",
+ "Shared by link" : "شاركته باستخدام رابط مشاركة",
+ "Shared" : "مشاركة",
+ "Switch to list view" : "التبديل إلى عرض القائمة",
+ "Switch to grid view" : "تبديل إلى العرض الشبكي",
+ "The file could not be found" : "تعذّر إيجاد الملف",
+ "Upload was cancelled by user" : "عملية الرفع تمّ إلغاؤها من المستخدم",
+ "Not enough free space" : "لا يوجد مساحة تخزينية كافية",
+ "Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
+ "Error during upload: {message}" : "حدث خطأ أثناء الرفع: {message}",
+ "Error during upload, status code {status}" : "حدث خطأ أثناء الرفع. رمز الحالة {status}",
+ "Unknown error during upload" : "خطأ غير محدد حدث أثناء الرفع",
+ "Loading current folder" : "تحميل المجلد الحالي",
+ "Retry" : "أعِدِ المحاولة",
+ "No files in here" : "لا توجد ملفات هنا ",
+ "Upload some content or sync with your devices!" : "ارفع بعض المحتوى أو قم بالمزامنة مع أجهزتك!",
+ "Go back" : "العودة",
+ "Views" : "مشاهدات",
+ "Files settings" : "إعدادات الملفات",
+ "Your files" : "ملفاتك",
+ "Open in files" : "فتح في تطبيق الملفات",
+ "File cannot be accessed" : "الملف لم يمكن الوصول إليه",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "إمّا أن الملف غير موجود أو أنك لا تمتلك الصلاحية لعرضه. أُطلُب من المُرسل أن يتشاركه معك.",
+ "Clipboard is not available" : "الحافظة غير متاحة",
+ "General" : "عامٌّ",
+ "All files" : "كل الملفات",
+ "Personal files" : "ملفات شخصية",
+ "Sort favorites first" : "فرز المفضلة أولا",
+ "Sort folders before files" : "فرز المجلدات قبل الملفات",
+ "Appearance" : "المظهر",
+ "Show hidden files" : "عرض الملفات المخفية",
+ "Show file type column" : "عرض عمود نوع الملف",
+ "Crop image previews" : "اقتصاص صورة العروض",
+ "Additional settings" : "الإعدادات المتقدمة",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "عنوان URL لـ WebDAV",
+ "Copy" : "نسخ",
+ "Warnings" : "تحذيرات",
+ "Keyboard shortcuts" : "اختصارات لوحة المفاتيح",
+ "File actions" : "إجراءات الملفات",
+ "Rename" : "إعادة التسمية",
+ "Delete" : "حذف ",
+ "Manage tags" : "إدارة الوسوم",
+ "Selection" : "اختيار",
+ "Select all files" : "تحديد كل الملفات",
+ "Deselect all" : "إلغاء تحديد الكل",
+ "Navigation" : "التنقل",
+ "View" : "عرض",
+ "Toggle grid view" : "تفعيل/تعطيل وضع القائمة",
+ "Show those shortcuts" : "أعرُض تلك الاختصارات",
+ "You" : "أنت",
+ "Shared multiple times with different people" : "تمّت مشاركته عدة مرات مع أشخاص متعددين",
+ "Unable to change the favorite state of the file" : "تعذّر تغيير حالة المُفضَّلة للملف",
"Error while loading the file data" : "خطأ اثناء تحميل بيانات الملف",
+ "Owner" : "المالك",
+ "Remove from favorites" : "إزالة من المفضلة",
+ "Add to favorites" : "إضافة إلى المفضلة",
+ "Tags" : "الوسوم",
+ "Blank" : "فارغ",
+ "Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Pick a template for {name}" : "اختر قالبا لـ {name}",
- "Cancel" : "الغاء",
- "Create" : "إنشاء",
"Create a new file with the selected template" : "إنشاء ملف جديد بإستخدام القالب المحدد",
"Creating file" : "إنشاء ملف",
- "Blank" : "فارغ",
- "Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
- "Set up templates folder" : "إعداد مجلد القوالب",
- "Templates" : "القوالب",
+ "Save as {displayName}" : "حفظ باسم {displayName}",
+ "Save as …" : "حفظ باسم ...",
+ "Converting files …" : "تحويل الملفات ...",
+ "Failed to convert files: {message}" : "تعذّر تحويل الملفات: {message}",
+ "All files failed to be converted" : "تعذّر تحويل كل الملفات",
+ "One file could not be converted: {message}" : "تعذّر تحويل الملف : {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n ملف لايمكن تحويله","ملف واحد لايمكن تحويله","%n ملف لايمكن تحويله","%n ملفات لايمكن تحويلها","%n ملف لايمكن تحويله","%n ملف لايمكن تحويله"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n ملف تمّ تحويله بنجاحٍ","ملف واحد تمّ تحويله بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ","%n ملفات تمّ تحويلها بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ","%n ملف تمّ تحويله بنجاحٍ"],
+ "Files successfully converted" : "ملفات تمّ تحويلها بنجاحٍ",
+ "Failed to convert files" : "تعذّر تحويل الملفات",
+ "Converting file …" : "تحويل الملف ...",
+ "File successfully converted" : "تمّ تحويل الملفات بنجاحٍ",
+ "Failed to convert file: {message}" : "تعذّر تحويل الملف: {message}",
+ "Failed to convert file" : "تعذّر تحويل ملف",
+ "Leave this share" : "مغادرة هذه المشاركة",
+ "Leave these shares" : "مغادرة هاتين المشاركتين",
+ "Disconnect storage" : "قطع اتصال التخزين",
+ "Disconnect storages" : "فصل وحدات تخزين",
+ "Delete permanently" : "حذف بشكل دائم",
+ "Delete and unshare" : "حذف وإلغاء المشاركة",
+ "Delete file" : "حذف الملف",
+ "Delete files" : "حذف الملفات",
+ "Delete folder" : "حذف مجلد",
+ "Delete folders" : "حذف مجلدين",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عنصراً","أنت على وشك أن تحذف نهائياً {count} عناصر","أنت على وشك أن تحذف نهائياً {count} عناصر","أنت على وشك حذف {count} عنصر بشكل نهائي "],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عنصراً","أنت على وشك أن تحذف {count} عناصر","أنت على وشك أن تحذف {count} عناصر","أنت على وشك أن تحذف {count} عنصراً"],
+ "Confirm deletion" : "تأكيد الحذف",
+ "Cancel" : "إلغاء",
+ "Download" : "تنزيل",
+ "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …",
+ "Destination is not a folder" : "الوجهة ليست مجلد",
+ "This file/folder is already in that directory" : "هذا الملف/المجلد موجود سلفاً في ذلك المجلد",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
+ "(copy)" : "(نسخ)",
+ "(copy %n)" : "(نسخ %n)",
+ "A file or folder with that name already exists in this folder" : "ملف أو مجلد بنفس ذاك الاسم موجود سلفاً في هذا المجلد",
+ "The files are locked" : "الملفات مقفلة",
+ "The file does not exist anymore" : "الملف لم يعد موجوداً",
+ "Choose destination" : "تحديد الوجهة",
+ "Copy to {target}" : "نسخ إلى {target}",
+ "Move to {target}" : "نقل إلى {target}",
+ "Move" : "نقل",
+ "Move or copy operation failed" : "عملية النسخ أو النقل فشلت",
+ "Move or copy" : "نقل أو نسخ",
+ "Open folder {displayName}" : "فتح المجلد {displayName}",
+ "Open in Files" : "فتح في \"الملفات\"",
+ "Open locally" : "الفتح محلّيّاً",
+ "Failed to redirect to client" : "فشل في التحويل الى العميل",
+ "Open file locally" : "فتح الملف محلّيّاً",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "يجب أن يفتح الملف الآن على جهازك. إذا لم يحدث ذلك، فيرجى التأكد من تثبيت تطبيق سطح المكتب.",
+ "Retry and close" : "أعِد المحاولة ثم أغلِق",
+ "Open online" : "إفتَح مُتَّصِلاً بالإنترنت",
+ "Details" : "التفاصيل",
+ "View in folder" : "عرض في المجلد",
+ "Today" : "اليوم",
+ "Last 7 days" : "آخر 7 أيام",
+ "Last 30 days" : "آخر 30 يوماً",
+ "This year ({year})" : "هذا العام ({year})",
+ "Last year ({year})" : "العام الماضي ({year})",
+ "Documents" : "المستندات",
+ "Spreadsheets" : "الجداول الالكترونية",
+ "Presentations" : "العروض",
+ "PDFs" : "ملفات PDF",
+ "Folders" : "المجلدات",
+ "Audio" : "صوت",
+ "Images" : "الصِّوَر",
+ "Videos" : "مقاطع فيديو",
+ "Created new folder \"{name}\"" : "تمّ إنشاء مجلد جديد باسم \"{name}\"",
"Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب",
- "%s used" : "%s مُستخدَم",
- "%s%% of %s used" : "%s%% من %s قيد الاستخدام",
- "%1$s of %2$s used" : "تم استخدام %1$s من %2$s",
- "Settings" : "الإعدادات",
- "Show hidden files" : "عرض الملفات المخفية",
- "Crop image previews" : "اقتصاص صورة العروض",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
- "Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
- "Toggle grid view" : "تفعيل/تعطيل القائمة",
- "No files in here" : "لا يوجد ملفات هنا ",
- "Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
+ "Create templates folder" : "إنشاء مجلد للقوالب",
+ "Templates" : "القوالب",
+ "New template folder" : "مجلد القوالب الجديد",
+ "In folder" : "في المجلد",
+ "Search in folder: {folder}" : "البحث في المجلد: {folder}",
+ "One of the dropped files could not be processed" : "أحد الملفات المُفلَتة لا يمكن معالجته",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "مُستعرِضُك لا يدعم واجهة تطبيق نظام الملفات Filesystem API. لذا، لن يُمكن رفع المجلدات",
+ "No files to upload" : "لا توجد ملفات لرفعها",
+ "Unable to create the directory {directory}" : "تعذّر إنشاء الدليل {directory}",
+ "Some files could not be uploaded" : "بعض الملفات لم يمكن رفعها",
+ "Files uploaded successfully" : "تمّ رفع الملفات بنجاح",
+ "No files to process" : "لا توجد ملفات لمعالجتها",
+ "Some files could not be copied" : "بعض الملفات لا يمكن نسخها",
+ "Some files could not be moved" : "تعذر نقل بعض الملفات",
+ "Files copied successfully" : "تمّ نسخ الملفات بنجاح",
+ "Files moved successfully" : "تمّ نقل الملفات بنجاح",
+ "Conflicts resolution skipped" : "تمّ تخطّي حلّ التعارضات",
+ "Upload cancelled" : "تمّ إلغاء الرفع",
+ "Could not rename \"{oldName}\", it does not exist any more" : "تعذر إعادة تسمية \"{oldName}\"، لم يعد موجودًا",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{newName}\" مستعمل سلفاً في المجلد\"{dir}\". إختر اسماً آخر رجاءً.",
+ "Could not rename \"{oldName}\"" : "تعذرت إعادة تسمية \"{oldName}\"",
+ "This operation is forbidden" : "هذه العملية ممنوعة ",
+ "Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
+ "Unexpected error: {error}" : "خطأ غير متوقع: {error}",
+ "_%n file_::_%n files_" : ["لا يوجد ملفات %n","%n ملف","ملفان","%n ملفات","%n ملف","%n ملفات"],
+ "_%n folder_::_%n folders_" : ["لا توجد مجلدات","مجلد واحد","مجلدان","%n مجلدات","%n مجلد","%n مجلدات"],
+ "Filename must not be empty." : "يجب ألّا يكون اسم الملف فارغاً.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" غير مسموح به في اسم الملف.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" هو اسم محجوز و لا يجوز استعماله كاسم لملف.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" غير مسموح به كنوع لملف.",
+ "Filenames must not end with \"{extension}\"." : "أسماء الملفات يجب ألّا تنتهي بـ \"{extension}\".",
+ "List of favorite files and folders." : "قائمة بالملفات و المجلدات المُفضّلة.",
+ "No favorites yet" : "ليس لديك ملفات مفضلة",
+ "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كمفضلة سوف تظهر هنا ",
+ "List of your files and folders." : "قائمة بملفاتك و مجلداتك",
+ "List of your files and folders that are not shared." : "قائمة بالملفات و المجلدات التي لم تتم مشاركتها.",
+ "No personal files found" : "لا توجد أي ملفات شخصية",
+ "Files that are not shared will show up here." : "الملفات التي لم تتم مشاركتها يتم عرضها هنا",
+ "Recent" : "آخر الملفات",
+ "List of recently modified files and folders." : "قائمة بالملفات والمجلدات التي تمّ تعديلها مؤخراً.",
+ "No recently modified files" : "لا توجد أي ملفات تمّ تعديلها مؤخراً",
+ "Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
+ "Search" : "بحث",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
- "Upload too large" : "حجم الترفيع أعلى من المسموح",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
- "No favorites yet" : "ليست عندك مفضلات بعد",
- "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
- "Deleted files" : "الملفات المحذوفة",
- "Shares" : "التي قمتَ بمشاركتها",
- "Shared with others" : "شاركته مع الاخرين",
- "Shared with you" : "شورك معك",
- "Shared by link" : "شاركته باستخدام رابط مشاركة",
- "Deleted shares" : "تم حذف المشاركات",
- "Pending shares" : "انتظار المشاركات",
+ "Upload too large" : "حجم الرفع أعلى من المسموح",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد رفعها أعلى من المسموح على الخادم.",
+ "File could not be found" : "لم يتم العثور على الملف",
+ "Show list view" : "اظهر معاينات الروابط",
+ "Show grid view" : "عرض شبكي",
+ "Close" : "إغلاق",
+ "Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
+ "This will stop your current uploads." : "هذا سيقوم بوقف رفع الملفات الحالية.",
+ "Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
+ "Processing files …" : "معالجة الملفات…",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
+ "An unknown error has occurred" : "حدث خطأ غير معروف",
+ "File could not be uploaded" : "لا يمكن تحميل الملف ",
+ "Uploading …" : "الرفع جارٍ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "يتم التحديث… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} من {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "رفع هذا النوع الملفات غير مدعوم",
+ "Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
+ "Choose target folder" : "اختر مكان المجلد",
+ "Set reminder" : "ضبط التذكير",
+ "Edit locally" : "تحرير الملف محلياً",
+ "Open" : "فتح",
+ "Could not load info for file \"{file}\"" : "فشل تحميل معلومات الملف \"{file}\"",
+ "Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
+ "Apply tag(s) to selection" : "تطبيق وسم على التحديد",
+ "Select directory \"{dirName}\"" : "حدِّد الدليل \"{dirName}\"",
+ "Select file \"{fileName}\"" : "حدِّد الملف \"{fileName}\"",
+ "Unable to determine date" : "تعذر تحديد التاريخ",
+ "This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر، الرجاء مراجعة سجل الحركات أو الاتصال بمشرف النظام",
+ "Could not move \"{file}\", target exists" : "فشل نقل \"{file}\", الملف موجود بالفعل هناك",
+ "Could not move \"{file}\"" : "فشل نقل \"{file}\"",
+ "copy" : "نسخ",
+ "Could not copy \"{file}\", target exists" : "فشل نسخ \"{file}\"، المستهدف موجود",
+ "Could not copy \"{file}\"" : "فشل نسخ \"{file}\"",
+ "Copied {origin} inside {destination}" : "تم نسخ {origin} داخل {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "تم نسخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
+ "{newName} already exists" : "{newName} موجود مسبقاً",
+ "Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "فشل إنشاء الملف \"{file}\" فهو موجود بالفعل",
+ "Could not create folder \"{dir}\" because it already exists" : "فشل إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
+ "Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "لاتوجد نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
+ "{dirs} and {files}" : "{dirs} و {files}",
+ "_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
+ "You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا",
+ "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم رفع الملفات %n"],
+ "New" : "جديد",
+ "New file/folder menu" : "قائمة مجلد/ملف جديد",
+ "Select file range" : "حدد نطاق الملف",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} مستخدم",
+ "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
+ "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
+ "\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابق \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "تم نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
+ "Path" : "المسار",
+ "_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%n بايت"],
+ "Favored" : "مُفضّلة",
+ "Favor" : "تفضيل",
+ "Copy direct link (only works for people who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
+ "Upload file" : "رفع ملف",
+ "Not favored" : "غير مُفضّلة",
+ "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث الوسوم",
+ "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" الأمر نُفّذ بنجاح",
+ "\"{displayName}\" action failed" : "\"{displayName}\" الأمر أخفق عند التنفيذ",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" فشل في بعض العناصر",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" حزمة الأوامر تم تنفيذها بنجاح",
+ "Submitting fields…" : "إرسال الحقول...",
+ "Filter filenames…" : "تصفية باسم الملف...",
+ "WebDAV URL copied to clipboard" : "تم نسخ WebDAV URL إلى الحافظة",
+ "Enable the grid view" : "تمكين العرض الشبكي",
+ "Enable folder tree" : "تمكين شجرة المجلدات",
+ "Copy to clipboard" : "نسخ الرابط",
+ "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان للوصول للملفات عبر WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "إذا كنت قد فعّلت خاصية \"التحقق ثنائي العوامل من الهوية 2FA\"، يجب عليك تجديد كلمة مرور التطبيق بالضغط هنا.",
+ "Deletion cancelled" : "تمّ إلغاء الحذف",
+ "Move cancelled" : "تمّ إلغاء النقل",
+ "Cancelled move or copy of \"{filename}\"." : "تمّ إلغاء عملية حذف أو نقل الملف \"{filename}\".",
+ "Cancelled move or copy operation" : ".عملية النسخ أو النقل تمّ إلغاؤها",
+ "Open details" : "فتح التفاصيل",
+ "Photos and images" : "الصور ",
+ "New folder creation cancelled" : "تمّ إلغاء عملية إنشاء مجلد جديد",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلد","{folderCount} مجلد"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملف","{fileCount} ملف"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد","1 ملف و{folderCount} مجلدات","1 ملف و {folderCount} مجلد","1 ملف و {folderCount} مجلد"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد","{fileCount} ملفات و 1 مجلد ","{fileCount} ملف و 1 مجلد","{fileCount} ملف و 1 مجلد"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ملف و {folderCount} مجلد",
+ "All folders" : "كل المجلدات",
+ "Personal Files" : "ملفات شخصية",
"Text file" : "ملف نصي",
"New text file.txt" : "ملف نصي جديد fille.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "مساحة تخزين {owner} ممتلئة، لا يمكن تحديث الملفات او مزامنتها بعد الان !",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "مجلد مجموعة \"{mountPoint}\" ممتلئ, لا يمكن تحديث او مزامنة الملفات بعد الآن!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "التخزين الخارجي \"{mountPoint}\" ممتلئ, لا يمكن تحديث او مزامنة الملفات بعد الآن!",
- "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
- "_matches '{filter}'_::_match '{filter}'_" : ["تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\"","تطابق \"{filter}\""]
+ "renamed file" : "ملف معاد تسميته",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "بعد تمكين أسماء الملفات المتوافقة مع نظام التشغيل Windows، لا يمكن تعديل الملفات الموجودة بعد الآن ولكن يمكن إعادة تسميتها إلى أسماء جديدة صالحة بواسطة مالكها.",
+ "Filter file names …" : "تصفية بأسماء الملفات...",
+ "Prevent warning dialogs from open or reenable them." : "منع نوافذ التحذير من الفتح أو إعادة تمكينها.",
+ "Show a warning dialog when changing a file extension." : "أظهِر نافذة التحذير عندما يتم تغيير امتداد الملف.",
+ "Speed up your Files experience with these quick shortcuts." : "سرِّع تعاملك مع الملفات بهذه الاختصارات السريعة.",
+ "Open the actions menu for a file" : "إفتَح قائمة الإجراءات للملف",
+ "Rename a file" : "تغيير اسم ملف",
+ "Delete a file" : "حذف ملف",
+ "Favorite or remove a file from favorites" : "تفضيل أو إلغاء تفضيل ملف",
+ "Manage tags for a file" : "إدارة الوسوم لملف",
+ "Deselect all files" : "إلغاء تحديد كل الملفات",
+ "Select or deselect a file" : "اختيار أو إلغاء اختيار ملف",
+ "Select a range of files" : "تحديد نطاق من الملفات",
+ "Navigate to the parent folder" : "إنتقِل إلى المجلد الأب",
+ "Navigate to the file above" : "إنتقِل إلى الملف أعلاه",
+ "Navigate to the file below" : "إنتقِل إلى الملف أسفله",
+ "Navigate to the file on the left (in grid mode)" : "إنتقِل إلى الملف أيسره (في الشبكة)",
+ "Navigate to the file on the right (in grid mode)" : "إنتقِل إلى الملف أيمنه (في الشبكة)",
+ "Toggle the grid view" : "بدِّل وضعية الشبكة",
+ "Open the sidebar for a file" : "إفتَح الشريط الجانبي للملف"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index 7f06463b5cf..69e85cb69fc 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -1,116 +1,347 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
- "Storage invalid" : "Almacenamientu non válidu",
- "Unknown error" : "Fallu desconocíu",
- "File could not be found" : "Nun s'atopó el ficheru",
- "Download" : "Descargar",
- "Delete" : "Desaniciar",
- "Home" : "Casa",
- "Close" : "Zarrar",
+ "Added to favorites" : "Metióse en Favoritos",
+ "Removed from favorites" : "Quitóse de Favoritos",
+ "You added {file} to your favorites" : "Metiesti'l ficheru {file} en Favoritos",
+ "You removed {file} from your favorites" : "Quitesti'l ficheru {file} de Favoritos",
"Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
- "Upload cancelled." : "Xuba encaboxada.",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
- "Not enough free space" : "Nun hai espaciu llibre abondo",
- "Uploading …" : "Xubiendo...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Actions" : "Aiciones",
- "Rename" : "Renomar",
- "Copy" : "Copiar",
- "Delete file" : "Desasniciar ficheru",
- "Delete folder" : "Desaniciar",
- "Disconnect storage" : "Desconeutar almacenamientu",
- "Could not load info for file \"{file}\"" : "Nun pudo cargase la información del ficheru «{file}»",
- "Files" : "Ficheros",
- "Details" : "Detalles",
- "Select" : "Esbillar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "Imposible determinar la fecha",
- "This operation is forbidden" : "La operación ta prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
- "Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
- "{newName} already exists" : "{newName} yá esiste",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
- "Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
- "Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
- "Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nun hai resultaos de gueta n'otres carpetes pa {tag}{filter}{endtag}",
- "Name" : "Nome",
- "Size" : "Tamañu",
- "Modified" : "Modificáu",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
- "_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "You don’t have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
- "_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
- "New" : "Nuevu",
- "\"{name}\" is an invalid file name." : "\"{name}\" ye un nome de ficheru inválidu.",
- "File name cannot be empty." : "El nome de ficheru nun pue quedar baleru.",
- "\"{name}\" is not an allowed filetype" : "«{name}» nun ye una triba de ficheru permitida",
- "View in folder" : "Ver na carpeta",
- "Copied!" : "¡Copióse!",
- "Path" : "Camín",
- "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
- "Favorited" : "Favoritos",
- "Favorite" : "Favoritu",
- "New folder" : "Nueva carpeta",
- "Upload file" : "Xubir ficheru",
- "Recent" : "Reciente",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Hebo un fallu mientres s'intentaba actualizar les etiquetes",
- "Added to favorites" : "Amestóse a favoritos",
- "\"remote user\"" : "«usuariu remotu»",
- "{user} created {file}" : "{user} creó {file}",
+ "File changes" : "Cambeos del ficheru",
+ "Created by {user}" : "Elementu creáu por {user}",
+ "Changed by {user}" : "Elementu camudáu por {user}",
+ "Deleted by {user}" : "Elementu desaniciáu por {user}",
+ "Restored by {user}" : "Elementu restauráu por {user}",
+ "Renamed by {user}" : "Elementu renomáu por {user}",
+ "Moved by {user}" : "Elementu movíu por {user}",
+ "\"remote account\"" : "«cuenta remota»",
+ "You created {file}" : "Creesti {file}",
+ "You created an encrypted file in {file}" : "Creesti un ficheru cifráu en: {file}",
+ "{user} created {file}" : "«{user}» creó «{file}»",
+ "{user} created an encrypted file in {file}" : "«{user}» creó un ficheru cifráu en: {file}",
"{file} was created in a public folder" : "{file} creóse nuna carpeta pública",
"You changed {file}" : "Camudesti {file}",
+ "You changed an encrypted file in {file}" : "Camudesti'l ficheru cifráu de: {file}",
"{user} changed {file}" : "{user} camudó {file}",
- "You deleted {file}" : "Desaniciesti {file}",
- "{user} deleted {file}" : "{user} desanició {file}",
+ "{user} changed an encrypted file in {file}" : "«{user}» camudó un ficheru cifráu de: {file}",
+ "You deleted {file}" : "Desaniciesti «{file}»",
+ "You deleted an encrypted file in {file}" : "Desaniciesti un ficheru cifráu de {file}",
+ "{user} deleted {file}" : "{user} desanició «{file}»",
+ "{user} deleted an encrypted file in {file}" : "«{user}» desanició un ficheru cifráu de: {file}",
"You restored {file}" : "Restauresti {file}",
"{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renomesti {oldfile} a {newfile}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}» (elementu anubríu)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}»",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Renomesti «{oldfile}» a «{newfile}» (elementu anubríu)",
+ "You renamed {oldfile} to {newfile}" : "Renomesti «{oldfile}» a «{newfile}»",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomó «{oldfile}» (elementu anubríu) a {newfile} (elementu anubríu)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomó {oldfile} (elementu anubríu) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomó {oldfile} a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} to {newfile}" : "{user} renomó {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Moviesti {oldfile} a {newfile}",
- "A file or folder has been <strong>changed</strong>" : "<strong>Camudóse</strong> un ficheru o carpeta",
- "All files" : "Tolos ficheros",
- "Unlimited" : "Non llendáu",
- "Upload (max. %s)" : "Xuba (máx. %s)",
- "Accept" : "Aceutar",
- "in %s" : "en %s",
+ "{user} moved {oldfile} to {newfile}" : "{user} movió «{oldfile}» a «{newfile}»",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Amestóse o quitóse un ficheru nos tos <strong>favoritos</strong>",
+ "Files" : "Ficheros",
+ "A file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta que <strong>camudó</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta de Favoritos que <strong>camudó</strong>",
+ "No favorites" : "Nengún favoritu",
+ "Accept" : "Aceptar",
+ "Reject" : "Refugar",
+ "Incoming ownership transfer from {user}" : "Recibióse una tresferencia de propiedá de: {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quies aceptar «{path}»?\n\nNota: el procesu de tresferencia pue tardar hasta 1 hora tres aceptalu",
+ "Ownership transfer denied" : "Negóse la tresferencia de la propiedá",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} negó la to tresferencia de la propiedá de: {path}",
+ "Ownership transfer failed" : "El procesu de tresferencia falló",
+ "Your ownership transfer of {path} to {user} failed." : "El procesu de tresferencia de «{path}» a «{user}» falló",
+ "The ownership transfer of {path} from {user} failed." : "El procesu de tresferencia de «{path}» dende «{user}» falló",
+ "Ownership transfer done" : "Completóse la tresferencia de propiedá",
+ "Your ownership transfer of {path} to {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» a «{user}».",
+ "The ownership transfer of {path} from {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» dende «{user}».",
+ "in %s" : "en «%s»",
+ "File Management" : "Xestión de ficheros",
+ "Home" : "Aniciu",
+ "Target folder does not exist any more" : "La carpeta de destín yá nun esiste",
+ "Reload current directory" : "Volver cargar el direutoriu actual",
+ "Go to the \"{dir}\" directory" : "Dir al direutoriu «{dir}»",
+ "Current directory path" : "Camín actual del direutoriu",
+ "Your have used your space quota and cannot upload files anymore" : "Usesti la to cuota d'espaciu y yá nun pues xubir ficheros",
+ "Drag and drop files here to upload" : "Arrastra y suelta los ficheros equí pa xubilos",
+ "Favorite" : "Meter en Favoritos",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar la seleición del ficheru «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar la seleición de la carpeta «{displayName}»",
+ "Filename" : "Nome de ficheru",
+ "Folder name" : "Nome de la carpeta",
+ "This node is unavailable" : "Esti noyu nun ta disponible",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renomóse «{oldName}» a «{newName}»",
+ "Rename file" : "Renomar el ficheru",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Modified" : "Modificóse",
+ "Type" : "Tipu",
+ "Remove filter" : "Quitar la peñera",
+ "Total rows summary" : "Resume total de fieleres",
+ "Toggle selection for all files and folders" : "Alternar la seleición de tolos ficheros y toles carpetes",
+ "Name" : "Nome",
+ "Size" : "Tamañu",
+ "Actions" : "Aiciones",
+ "List of files and folders." : "Una llista de ficheros y carpetes.",
+ "Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
+ "File not found" : "Nun s'atopó'l ficheru",
+ "{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
+ "{used} of {quota} used" : "{used} de {quota} n'usu",
+ "{relative}% used" : "{relative}% n'usu",
+ "Could not refresh storage stats" : "Nun se pudo anovar l'estáu del almacenamientu",
+ "Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear una carpeta",
+ "Create" : "Crear",
+ "Submit" : "Unviar",
+ "Choose a file or folder to transfer" : "Escueyi un ficheru o una carpeta a tresferir",
+ "Transfer" : "Tresferir",
+ "Transfer {path} to {userid}" : "Tresferir «{path}» a «{userid}»",
+ "Invalid path selected" : "Seleicionóse un camín inválidu",
+ "Unknown error" : "Error desconocíu",
+ "Ownership transfer request sent" : "Unvióse la solicitú de tresferencia de la propiedá",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nun se pue tresferir la propiedá d'un ficheru o una carpeta que nun te pertenez",
+ "Transfer ownership of a file or folder" : "Tresferir la propiedá d'un ficheru o una carpeta",
+ "Choose file or folder to transfer" : "Escoyer el ficheru o carpeta a tresferir",
"Change" : "Camudar",
+ "New owner" : "Propietariu nuevu",
+ "Select file or folder to link to" : "Seleicionar un ficheru o una carpeta a la qu'enllaciar",
+ "Choose {file}" : "Escoyer «{file}»",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartir pente un enllaz",
+ "Shared" : "Compartío",
+ "Switch to list view" : "Cambiar a la vista de llista",
+ "Switch to grid view" : "Cambiar a la vista de rexáu",
+ "Upload was cancelled by user" : "L'usuariu anuló la xuba",
+ "Not enough free space" : "Nun hai abondu espaciu llibre",
+ "Operation is blocked by access control" : "El control d'accesu bloquió la operación",
+ "Error during upload: {message}" : "Hebo un error demientres la xuba: {message}",
+ "Error during upload, status code {status}" : "Hebo un error demientres la xuba. Cödigu d'estáu: {status}",
+ "Unknown error during upload" : "Hebo un error desconocíu demientres la xuba",
+ "Loading current folder" : "Cargando la carpeta actual",
+ "Retry" : "Retentar",
+ "No files in here" : "Nun hai ficheros",
+ "Upload some content or sync with your devices!" : "¡Xubi conteníu o sincroniza daqué colos tos preseos!",
+ "Go back" : "Dir p'atrás",
+ "Views" : "Vistes",
+ "Files settings" : "Configuración de Ficheros",
+ "Your files" : "Los tos ficheros",
+ "Open in files" : "Abrir en Ficheros",
+ "File cannot be accessed" : "Nun se pue acceder al ficheru",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nun se pudo atopar el ficheru o nun tienes permisu pa velu. Pidi al remitente que lu comparta.",
+ "Clipboard is not available" : "El cartafueyu nun ta disponible",
+ "General" : "Xeneral",
+ "All files" : "Tolos ficheros",
+ "Personal files" : "Ficheros personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar les carpetes enantes que los ficheros",
+ "Appearance" : "Aspeutu",
+ "Show hidden files" : "Amosar los ficheros anubríos",
+ "Crop image previews" : "Recortar la previsualización d'imáxenes",
+ "Additional settings" : "Configuración adicional",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atayos del tecláu",
+ "Rename" : "Renomar",
+ "Delete" : "Desaniciar",
+ "Manage tags" : "Xestionar les etiquetes",
+ "Selection" : "Seleición",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar la vista de rexáu",
+ "You" : "Tu",
+ "Shared multiple times with different people" : "Compartióse múltiples vegaes con otres persones",
+ "Error while loading the file data" : "Hebo un error mentanto de cargaben los datos de los ficheros",
+ "Owner" : "Propietariu",
+ "Remove from favorites" : "Quitar de Favoritos",
+ "Add to favorites" : "Meter en Favoritos",
"Tags" : "Etiquetes",
+ "Blank" : "Baleru",
+ "Unable to create new file from template" : "Nun ye posible crear un ficheru a partir d'una plantía",
+ "Pick a template for {name}" : "Escoyer una plantía pa: {name}",
+ "Create a new file with the selected template" : "Crea un ficheru cola plantía seleicionada",
+ "Creating file" : "Creando'l ficheru",
+ "Leave this share" : "Dexar esta compartición",
+ "Leave these shares" : "Dexar estes comparticiones",
+ "Disconnect storage" : "Desconectar l'almacenamientu",
+ "Disconnect storages" : "Desconectar los almacenamientos",
+ "Delete permanently" : "Desaniciar permanentemente",
+ "Delete and unshare" : "Desaniciar y dexar de compartir",
+ "Delete file" : "Desaniciar el ficheru",
+ "Delete files" : "Desaniciar los ficheros",
+ "Delete folder" : "Desaniciar la carpeta",
+ "Delete folders" : "Desaniciar les carpetes",
+ "Confirm deletion" : "Confirmar el desaniciu",
"Cancel" : "Encaboxar",
- "Create" : "Crear",
- "%1$s of %2$s used" : "%1$s de %2$s usao",
- "Settings" : "Axustes",
- "Show hidden files" : "Amosar ficheros ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nun hai nengún ficheru equí",
- "Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
- "No entries found in this folder" : "Nenguna entrada en esta carpeta",
- "Select all" : "Esbillar too",
- "Upload too large" : "La xuba ye abondo grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.",
- "No favorites yet" : "Entá nun hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí",
- "Deleted files" : "Ficheros desaniciaos",
- "Shares" : "Comparticiones",
- "Shared with others" : "Compartío con otros",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Compartíos per enllaz",
+ "Download" : "Baxar",
+ "Destination is not a folder" : "El destín nun ye una carpeta",
+ "This file/folder is already in that directory" : "Esti ficheru o esta carpeta yá ta nel direutoriu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nun pues mover un ficheru/carpeta a sigo mesma o la mesma socarpeta de la mesma carpeta",
+ "(copy)" : "(copia)",
+ "(copy %n)" : "(copia %n)",
+ "A file or folder with that name already exists in this folder" : "Nesta carpeta, yá estie un ficheru o una carpeta con esi nome",
+ "The files are locked" : "Los ficheros tán bloquiaos",
+ "The file does not exist anymore" : "El ficheru yá nun esiste",
+ "Choose destination" : "Escoyer el destín",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir la carpeta «{displayName}»",
+ "Open in Files" : "Abrir en Ficheros",
+ "Open locally" : "Abrir llocalmente",
+ "Failed to redirect to client" : "Nun se pue redirixir al veceru",
+ "Details" : "Detalles",
+ "View in folder" : "Ver na carpeta",
+ "Today" : "Güei",
+ "Last 7 days" : "Los últimos 7 díes",
+ "Last 30 days" : "Los últimos 30 díes",
+ "Documents" : "Documentos",
+ "Folders" : "Carpetes",
+ "Audio" : "Audiu",
+ "Images" : "Imáxenes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Creóse la carpeta «{name}»",
+ "Unable to initialize the templates directory" : "Nun ye posible aniciar el direutoriu de plantíes",
+ "Templates" : "Plantíes",
+ "New template folder" : "Carpeta de plantíes nueva",
+ "In folder" : "Na carpeta",
+ "Search in folder: {folder}" : "Buscar na carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Nun se pudo procesar unu de los ficheros soltaos",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "El restolador nun ye compatible cola API de sistemes de ficheros. Nun van xubise los ficheros",
+ "No files to upload" : "Nun hai nengún ficheru pa xubir",
+ "Unable to create the directory {directory}" : "Nun ye posible crear el direutoriu «{directory}»",
+ "Some files could not be uploaded" : "Nun se pudieron xubir dalgunos ficheros",
+ "Files uploaded successfully" : "Los ficheros xubiéronse correutamente",
+ "No files to process" : "Nun hai nengún ficheru pa procesar",
+ "Some files could not be copied" : "Nun se pudieron copiar dalgunos ficheros",
+ "Some files could not be moved" : "Nun se pudieron copiar dalgunos ficheros",
+ "Files copied successfully" : "Los ficheros copiáronse correutamente",
+ "Files moved successfully" : "Los ficheros copiáronse correutamente",
+ "Conflicts resolution skipped" : "Saltóse la resolución de conflictos",
+ "Upload cancelled" : "Encaboxóse la busca",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nun se pue renomar «{oldName}». Yá nun esiste",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{newName}» yá ta n'usu na carpeta «{dir}». Escueyi otru nome.",
+ "Could not rename \"{oldName}\"" : "Nun se pudo renomar «{oldName}»",
+ "This operation is forbidden" : "Esta operación ta prohibida",
+ "Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
+ "_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
+ "No favorites yet" : "Entá nun hai nengún elementu favoritu",
+ "Files and folders you mark as favorite will show up here" : "Equí apaecen los ficheros y carpetes que metas en Favoritos",
+ "List of your files and folders." : "Una llista de los ficheros y les carpetes de to.",
+ "List of your files and folders that are not shared." : "Una llista de ficheros y carpetes que nun se compartieron.",
+ "No personal files found" : "Nun s'atopó nengún ficheru personal",
+ "Files that are not shared will show up here." : "Equí apaecen los ficheros que nun se compartan.",
+ "Recent" : "De recién",
+ "List of recently modified files and folders." : "Una llista de ficheros y carpetes modificaos de recién.",
+ "No recently modified files" : "Nun hai nengún ficheru modificáu de recién",
+ "Files and folders you recently modified will show up here." : "Equí apaecen los ficheros y les carpetes modificaes de recién.",
+ "Search" : "Buscar",
+ "No entries found in this folder" : "Nun s'atopó nenguna entrada nesta carpeta",
+ "Select all" : "Seleicionar too",
+ "Upload too large" : "La xuba ye mui grande",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tentes de xubir superen el tamañu máximu qu'esti sirvidor permite.",
+ "File could not be found" : "Nun se pudo atopar el ficheru",
+ "Show list view" : "Amosar la vista en llista",
+ "Show grid view" : "Amosar la vista en rexáu",
+ "Close" : "Zarrar",
+ "Could not create folder \"{dir}\"" : "Nun se pudo crear la carpeta «{dir}»",
+ "This will stop your current uploads." : "Esta aición va parar les xubes actuales.",
+ "Upload cancelled." : "Encaboxóse la xuba.",
+ "Processing files …" : "Procesando los ficheros…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun ye posible xubir «{filename}» darréu que ye un direutoriu o tien 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu porque namás queda {size2} y tas xubiendo {size1}",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta de destín «{dir}» xá nun esiste",
+ "An unknown error has occurred" : "Prodúxose un error desconocíu",
+ "File could not be uploaded" : "Nun se pudo xubir el ficheru",
+ "Uploading …" : "Xubiendo…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Xubiendo… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "La xuba d'esi elementu nun ye compatible",
+ "Error when assembling chunks, status code {status}" : "Hebo un error al atropar los cachos. Códigu d'estáu {status}",
+ "Choose target folder" : "Escoyer la carpeta de destín",
+ "Set reminder" : "Configurar un recordatoriu",
+ "Edit locally" : "Editar llocalmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "Nun se pudo cargar la información del ficheru «{file}»",
+ "Please select tag(s) to add to the selection" : "Seleiciona les etiquetes que quies amestar a la seleición",
+ "Apply tag(s) to selection" : "Aplicar les etiquetes a la seleición",
+ "Select directory \"{dirName}\"" : "Seleicionar el direutoriu «{dirName}»",
+ "Select file \"{fileName}\"" : "Seleicionar el ficheru «{fileName}»",
+ "Unable to determine date" : "Nun ye posible determinar la data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, revisa'l rexistru o ponte en contautu cola alministración.",
+ "Could not move \"{file}\", target exists" : "Nun se pudo mover «{file}», el destín esiste",
+ "Could not move \"{file}\"" : "Nun se pudo mover «{file}»",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "Nun se pudo copiar «{file}», el destín esiste",
+ "Could not copy \"{file}\"" : "Nun se pudo copiar «{file}»",
+ "Copied {origin} inside {destination}" : "Copióse «{origin}» dientro de: {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copióse «{origin}» y {nbfiles} ficheros más dientro de: {destination}",
+ "{newName} already exists" : "«{newName}» xá esiste",
+ "Could not create file \"{file}\"" : "Nun se pudo crear el ficheru «{file}»",
+ "Could not create file \"{file}\" because it already exists" : "Nun se pudo crear el ficheru «{file}» porque yá esiste",
+ "Could not create folder \"{dir}\" because it already exists" : "Nun se pudo crear la carpeta «{dir}» porque yá esiste",
+ "Could not fetch file details \"{file}\"" : "Nun se pudo dir en cata de los detalles del ficheru «{file}»",
+ "Error deleting file \"{fileName}\"." : "Hebo un error al desaniciar «{fileName}»",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Nun hai nengún resultáu de busca nes demás carpetes pa: {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Introduz más de dos carátueres pa buscar nes demás carpetes",
+ "{dirs} and {files}" : "{dirs} ya {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n elementu anubríu","incluyendo %n elementos anubríos"],
+ "You do not have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
+ "New" : "Nuevu",
+ "New file/folder menu" : "Menú de carpeta/ficheru nuevos",
+ "Select file range" : "Seleicionar el rangu de ficheros",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} n'usu",
+ "\"{name}\" is an invalid file name." : "«{name}» ye un nome inválidu.",
+ "File name cannot be empty." : "El nome del ficheru nun pue tar baleru.",
+ "\"/\" is not allowed inside a file name." : "«/» ye un caráuter que nun ta permitíu nel nome del ficheru.",
+ "\"{name}\" is not an allowed filetype" : "«{name}» nun ye un tipu de ficheru permitíu",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'almacenamientu del usuariu «{owner}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta del grupu «{mountPoint}» ta enllena, ¡yá nun se puen xubir nin sincronizar ficheros!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'almacenamientu esternu «{mountPoint}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "El to almacenamientu ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'almacenamientu del usuariu «{owner}» ta cuasi enllén ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta del grupu «{mountPoint}» ta cuasi enllena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'almacenamientu esternu «{mountPoint}» ta cuasi enllén ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "El to almacenamientu ta cuasi enllén ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["concasa con «{filter}»","concasen con «{filter}»"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
+ "Path" : "Camín",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
+ "Upload file" : "Xubir un ficheru",
+ "An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
+ "Upload (max. %s)" : "Xubir (%s como máximu)",
+ "\"{displayName}\" action executed successfully" : "L'aición «{displayName}» executóse correutamente",
+ "\"{displayName}\" action failed" : "L'aición «{displayName}» falló",
+ "\"{displayName}\" batch action executed successfully" : "L'aición per llotes «{displayName}» executóse correutamente",
+ "WebDAV URL copied to clipboard" : "La URL de WebDAV copióse nel cartafueyu",
+ "Enable the grid view" : "Activar la vista de rexáu",
+ "Copy to clipboard" : "Copiar nel cartafueyu",
+ "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
+ "Deletion cancelled" : "Anulóse'l desaniciu",
+ "Move cancelled" : "Anulóse la operación de mover",
+ "Cancelled move or copy operation" : "Anulóse la operación de mover o copiar",
+ "Open details" : "Abrir los detalles",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheru y 1 carpeta","{fileCount} ficheros y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheros y {folderCount} carpetes",
+ "All folders" : "Toles carpetes",
+ "Personal Files" : "Ficheros personales",
"Text file" : "Ficheru de testu",
- "New text file.txt" : "Nuevu testu ficheru.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'almacenamientu de {owner} ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
- "Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
- "_matches '{filter}'_::_match '{filter}'_" : ["concasa '{filter}'","concasa '{filter}'"]
+ "New text file.txt" : "ficheru_nuevu.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 88e284ce644..7224164279f 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -1,114 +1,345 @@
{ "translations": {
- "Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
- "Storage invalid" : "Almacenamientu non válidu",
- "Unknown error" : "Fallu desconocíu",
- "File could not be found" : "Nun s'atopó el ficheru",
- "Download" : "Descargar",
- "Delete" : "Desaniciar",
- "Home" : "Casa",
- "Close" : "Zarrar",
+ "Added to favorites" : "Metióse en Favoritos",
+ "Removed from favorites" : "Quitóse de Favoritos",
+ "You added {file} to your favorites" : "Metiesti'l ficheru {file} en Favoritos",
+ "You removed {file} from your favorites" : "Quitesti'l ficheru {file} de Favoritos",
"Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
- "Upload cancelled." : "Xuba encaboxada.",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
- "Not enough free space" : "Nun hai espaciu llibre abondo",
- "Uploading …" : "Xubiendo...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Actions" : "Aiciones",
- "Rename" : "Renomar",
- "Copy" : "Copiar",
- "Delete file" : "Desasniciar ficheru",
- "Delete folder" : "Desaniciar",
- "Disconnect storage" : "Desconeutar almacenamientu",
- "Could not load info for file \"{file}\"" : "Nun pudo cargase la información del ficheru «{file}»",
- "Files" : "Ficheros",
- "Details" : "Detalles",
- "Select" : "Esbillar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "Imposible determinar la fecha",
- "This operation is forbidden" : "La operación ta prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
- "Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
- "Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
- "{newName} already exists" : "{newName} yá esiste",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
- "Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
- "Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
- "Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nun hai resultaos de gueta n'otres carpetes pa {tag}{filter}{endtag}",
- "Name" : "Nome",
- "Size" : "Tamañu",
- "Modified" : "Modificáu",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
- "_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "You don’t have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
- "_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
- "New" : "Nuevu",
- "\"{name}\" is an invalid file name." : "\"{name}\" ye un nome de ficheru inválidu.",
- "File name cannot be empty." : "El nome de ficheru nun pue quedar baleru.",
- "\"{name}\" is not an allowed filetype" : "«{name}» nun ye una triba de ficheru permitida",
- "View in folder" : "Ver na carpeta",
- "Copied!" : "¡Copióse!",
- "Path" : "Camín",
- "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
- "Favorited" : "Favoritos",
- "Favorite" : "Favoritu",
- "New folder" : "Nueva carpeta",
- "Upload file" : "Xubir ficheru",
- "Recent" : "Reciente",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Hebo un fallu mientres s'intentaba actualizar les etiquetes",
- "Added to favorites" : "Amestóse a favoritos",
- "\"remote user\"" : "«usuariu remotu»",
- "{user} created {file}" : "{user} creó {file}",
+ "File changes" : "Cambeos del ficheru",
+ "Created by {user}" : "Elementu creáu por {user}",
+ "Changed by {user}" : "Elementu camudáu por {user}",
+ "Deleted by {user}" : "Elementu desaniciáu por {user}",
+ "Restored by {user}" : "Elementu restauráu por {user}",
+ "Renamed by {user}" : "Elementu renomáu por {user}",
+ "Moved by {user}" : "Elementu movíu por {user}",
+ "\"remote account\"" : "«cuenta remota»",
+ "You created {file}" : "Creesti {file}",
+ "You created an encrypted file in {file}" : "Creesti un ficheru cifráu en: {file}",
+ "{user} created {file}" : "«{user}» creó «{file}»",
+ "{user} created an encrypted file in {file}" : "«{user}» creó un ficheru cifráu en: {file}",
"{file} was created in a public folder" : "{file} creóse nuna carpeta pública",
"You changed {file}" : "Camudesti {file}",
+ "You changed an encrypted file in {file}" : "Camudesti'l ficheru cifráu de: {file}",
"{user} changed {file}" : "{user} camudó {file}",
- "You deleted {file}" : "Desaniciesti {file}",
- "{user} deleted {file}" : "{user} desanició {file}",
+ "{user} changed an encrypted file in {file}" : "«{user}» camudó un ficheru cifráu de: {file}",
+ "You deleted {file}" : "Desaniciesti «{file}»",
+ "You deleted an encrypted file in {file}" : "Desaniciesti un ficheru cifráu de {file}",
+ "{user} deleted {file}" : "{user} desanició «{file}»",
+ "{user} deleted an encrypted file in {file}" : "«{user}» desanició un ficheru cifráu de: {file}",
"You restored {file}" : "Restauresti {file}",
"{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renomesti {oldfile} a {newfile}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}» (elementu anubríu)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}»",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Renomesti «{oldfile}» a «{newfile}» (elementu anubríu)",
+ "You renamed {oldfile} to {newfile}" : "Renomesti «{oldfile}» a «{newfile}»",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomó «{oldfile}» (elementu anubríu) a {newfile} (elementu anubríu)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomó {oldfile} (elementu anubríu) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomó {oldfile} a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} to {newfile}" : "{user} renomó {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Moviesti {oldfile} a {newfile}",
- "A file or folder has been <strong>changed</strong>" : "<strong>Camudóse</strong> un ficheru o carpeta",
- "All files" : "Tolos ficheros",
- "Unlimited" : "Non llendáu",
- "Upload (max. %s)" : "Xuba (máx. %s)",
- "Accept" : "Aceutar",
- "in %s" : "en %s",
+ "{user} moved {oldfile} to {newfile}" : "{user} movió «{oldfile}» a «{newfile}»",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Amestóse o quitóse un ficheru nos tos <strong>favoritos</strong>",
+ "Files" : "Ficheros",
+ "A file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta que <strong>camudó</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta de Favoritos que <strong>camudó</strong>",
+ "No favorites" : "Nengún favoritu",
+ "Accept" : "Aceptar",
+ "Reject" : "Refugar",
+ "Incoming ownership transfer from {user}" : "Recibióse una tresferencia de propiedá de: {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quies aceptar «{path}»?\n\nNota: el procesu de tresferencia pue tardar hasta 1 hora tres aceptalu",
+ "Ownership transfer denied" : "Negóse la tresferencia de la propiedá",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} negó la to tresferencia de la propiedá de: {path}",
+ "Ownership transfer failed" : "El procesu de tresferencia falló",
+ "Your ownership transfer of {path} to {user} failed." : "El procesu de tresferencia de «{path}» a «{user}» falló",
+ "The ownership transfer of {path} from {user} failed." : "El procesu de tresferencia de «{path}» dende «{user}» falló",
+ "Ownership transfer done" : "Completóse la tresferencia de propiedá",
+ "Your ownership transfer of {path} to {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» a «{user}».",
+ "The ownership transfer of {path} from {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» dende «{user}».",
+ "in %s" : "en «%s»",
+ "File Management" : "Xestión de ficheros",
+ "Home" : "Aniciu",
+ "Target folder does not exist any more" : "La carpeta de destín yá nun esiste",
+ "Reload current directory" : "Volver cargar el direutoriu actual",
+ "Go to the \"{dir}\" directory" : "Dir al direutoriu «{dir}»",
+ "Current directory path" : "Camín actual del direutoriu",
+ "Your have used your space quota and cannot upload files anymore" : "Usesti la to cuota d'espaciu y yá nun pues xubir ficheros",
+ "Drag and drop files here to upload" : "Arrastra y suelta los ficheros equí pa xubilos",
+ "Favorite" : "Meter en Favoritos",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar la seleición del ficheru «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar la seleición de la carpeta «{displayName}»",
+ "Filename" : "Nome de ficheru",
+ "Folder name" : "Nome de la carpeta",
+ "This node is unavailable" : "Esti noyu nun ta disponible",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renomóse «{oldName}» a «{newName}»",
+ "Rename file" : "Renomar el ficheru",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Modified" : "Modificóse",
+ "Type" : "Tipu",
+ "Remove filter" : "Quitar la peñera",
+ "Total rows summary" : "Resume total de fieleres",
+ "Toggle selection for all files and folders" : "Alternar la seleición de tolos ficheros y toles carpetes",
+ "Name" : "Nome",
+ "Size" : "Tamañu",
+ "Actions" : "Aiciones",
+ "List of files and folders." : "Una llista de ficheros y carpetes.",
+ "Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
+ "File not found" : "Nun s'atopó'l ficheru",
+ "{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
+ "{used} of {quota} used" : "{used} de {quota} n'usu",
+ "{relative}% used" : "{relative}% n'usu",
+ "Could not refresh storage stats" : "Nun se pudo anovar l'estáu del almacenamientu",
+ "Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear una carpeta",
+ "Create" : "Crear",
+ "Submit" : "Unviar",
+ "Choose a file or folder to transfer" : "Escueyi un ficheru o una carpeta a tresferir",
+ "Transfer" : "Tresferir",
+ "Transfer {path} to {userid}" : "Tresferir «{path}» a «{userid}»",
+ "Invalid path selected" : "Seleicionóse un camín inválidu",
+ "Unknown error" : "Error desconocíu",
+ "Ownership transfer request sent" : "Unvióse la solicitú de tresferencia de la propiedá",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nun se pue tresferir la propiedá d'un ficheru o una carpeta que nun te pertenez",
+ "Transfer ownership of a file or folder" : "Tresferir la propiedá d'un ficheru o una carpeta",
+ "Choose file or folder to transfer" : "Escoyer el ficheru o carpeta a tresferir",
"Change" : "Camudar",
+ "New owner" : "Propietariu nuevu",
+ "Select file or folder to link to" : "Seleicionar un ficheru o una carpeta a la qu'enllaciar",
+ "Choose {file}" : "Escoyer «{file}»",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartir pente un enllaz",
+ "Shared" : "Compartío",
+ "Switch to list view" : "Cambiar a la vista de llista",
+ "Switch to grid view" : "Cambiar a la vista de rexáu",
+ "Upload was cancelled by user" : "L'usuariu anuló la xuba",
+ "Not enough free space" : "Nun hai abondu espaciu llibre",
+ "Operation is blocked by access control" : "El control d'accesu bloquió la operación",
+ "Error during upload: {message}" : "Hebo un error demientres la xuba: {message}",
+ "Error during upload, status code {status}" : "Hebo un error demientres la xuba. Cödigu d'estáu: {status}",
+ "Unknown error during upload" : "Hebo un error desconocíu demientres la xuba",
+ "Loading current folder" : "Cargando la carpeta actual",
+ "Retry" : "Retentar",
+ "No files in here" : "Nun hai ficheros",
+ "Upload some content or sync with your devices!" : "¡Xubi conteníu o sincroniza daqué colos tos preseos!",
+ "Go back" : "Dir p'atrás",
+ "Views" : "Vistes",
+ "Files settings" : "Configuración de Ficheros",
+ "Your files" : "Los tos ficheros",
+ "Open in files" : "Abrir en Ficheros",
+ "File cannot be accessed" : "Nun se pue acceder al ficheru",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nun se pudo atopar el ficheru o nun tienes permisu pa velu. Pidi al remitente que lu comparta.",
+ "Clipboard is not available" : "El cartafueyu nun ta disponible",
+ "General" : "Xeneral",
+ "All files" : "Tolos ficheros",
+ "Personal files" : "Ficheros personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar les carpetes enantes que los ficheros",
+ "Appearance" : "Aspeutu",
+ "Show hidden files" : "Amosar los ficheros anubríos",
+ "Crop image previews" : "Recortar la previsualización d'imáxenes",
+ "Additional settings" : "Configuración adicional",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atayos del tecláu",
+ "Rename" : "Renomar",
+ "Delete" : "Desaniciar",
+ "Manage tags" : "Xestionar les etiquetes",
+ "Selection" : "Seleición",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar la vista de rexáu",
+ "You" : "Tu",
+ "Shared multiple times with different people" : "Compartióse múltiples vegaes con otres persones",
+ "Error while loading the file data" : "Hebo un error mentanto de cargaben los datos de los ficheros",
+ "Owner" : "Propietariu",
+ "Remove from favorites" : "Quitar de Favoritos",
+ "Add to favorites" : "Meter en Favoritos",
"Tags" : "Etiquetes",
+ "Blank" : "Baleru",
+ "Unable to create new file from template" : "Nun ye posible crear un ficheru a partir d'una plantía",
+ "Pick a template for {name}" : "Escoyer una plantía pa: {name}",
+ "Create a new file with the selected template" : "Crea un ficheru cola plantía seleicionada",
+ "Creating file" : "Creando'l ficheru",
+ "Leave this share" : "Dexar esta compartición",
+ "Leave these shares" : "Dexar estes comparticiones",
+ "Disconnect storage" : "Desconectar l'almacenamientu",
+ "Disconnect storages" : "Desconectar los almacenamientos",
+ "Delete permanently" : "Desaniciar permanentemente",
+ "Delete and unshare" : "Desaniciar y dexar de compartir",
+ "Delete file" : "Desaniciar el ficheru",
+ "Delete files" : "Desaniciar los ficheros",
+ "Delete folder" : "Desaniciar la carpeta",
+ "Delete folders" : "Desaniciar les carpetes",
+ "Confirm deletion" : "Confirmar el desaniciu",
"Cancel" : "Encaboxar",
- "Create" : "Crear",
- "%1$s of %2$s used" : "%1$s de %2$s usao",
- "Settings" : "Axustes",
- "Show hidden files" : "Amosar ficheros ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nun hai nengún ficheru equí",
- "Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
- "No entries found in this folder" : "Nenguna entrada en esta carpeta",
- "Select all" : "Esbillar too",
- "Upload too large" : "La xuba ye abondo grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.",
- "No favorites yet" : "Entá nun hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí",
- "Deleted files" : "Ficheros desaniciaos",
- "Shares" : "Comparticiones",
- "Shared with others" : "Compartío con otros",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Compartíos per enllaz",
+ "Download" : "Baxar",
+ "Destination is not a folder" : "El destín nun ye una carpeta",
+ "This file/folder is already in that directory" : "Esti ficheru o esta carpeta yá ta nel direutoriu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nun pues mover un ficheru/carpeta a sigo mesma o la mesma socarpeta de la mesma carpeta",
+ "(copy)" : "(copia)",
+ "(copy %n)" : "(copia %n)",
+ "A file or folder with that name already exists in this folder" : "Nesta carpeta, yá estie un ficheru o una carpeta con esi nome",
+ "The files are locked" : "Los ficheros tán bloquiaos",
+ "The file does not exist anymore" : "El ficheru yá nun esiste",
+ "Choose destination" : "Escoyer el destín",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir la carpeta «{displayName}»",
+ "Open in Files" : "Abrir en Ficheros",
+ "Open locally" : "Abrir llocalmente",
+ "Failed to redirect to client" : "Nun se pue redirixir al veceru",
+ "Details" : "Detalles",
+ "View in folder" : "Ver na carpeta",
+ "Today" : "Güei",
+ "Last 7 days" : "Los últimos 7 díes",
+ "Last 30 days" : "Los últimos 30 díes",
+ "Documents" : "Documentos",
+ "Folders" : "Carpetes",
+ "Audio" : "Audiu",
+ "Images" : "Imáxenes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Creóse la carpeta «{name}»",
+ "Unable to initialize the templates directory" : "Nun ye posible aniciar el direutoriu de plantíes",
+ "Templates" : "Plantíes",
+ "New template folder" : "Carpeta de plantíes nueva",
+ "In folder" : "Na carpeta",
+ "Search in folder: {folder}" : "Buscar na carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Nun se pudo procesar unu de los ficheros soltaos",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "El restolador nun ye compatible cola API de sistemes de ficheros. Nun van xubise los ficheros",
+ "No files to upload" : "Nun hai nengún ficheru pa xubir",
+ "Unable to create the directory {directory}" : "Nun ye posible crear el direutoriu «{directory}»",
+ "Some files could not be uploaded" : "Nun se pudieron xubir dalgunos ficheros",
+ "Files uploaded successfully" : "Los ficheros xubiéronse correutamente",
+ "No files to process" : "Nun hai nengún ficheru pa procesar",
+ "Some files could not be copied" : "Nun se pudieron copiar dalgunos ficheros",
+ "Some files could not be moved" : "Nun se pudieron copiar dalgunos ficheros",
+ "Files copied successfully" : "Los ficheros copiáronse correutamente",
+ "Files moved successfully" : "Los ficheros copiáronse correutamente",
+ "Conflicts resolution skipped" : "Saltóse la resolución de conflictos",
+ "Upload cancelled" : "Encaboxóse la busca",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nun se pue renomar «{oldName}». Yá nun esiste",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{newName}» yá ta n'usu na carpeta «{dir}». Escueyi otru nome.",
+ "Could not rename \"{oldName}\"" : "Nun se pudo renomar «{oldName}»",
+ "This operation is forbidden" : "Esta operación ta prohibida",
+ "Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
+ "_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
+ "No favorites yet" : "Entá nun hai nengún elementu favoritu",
+ "Files and folders you mark as favorite will show up here" : "Equí apaecen los ficheros y carpetes que metas en Favoritos",
+ "List of your files and folders." : "Una llista de los ficheros y les carpetes de to.",
+ "List of your files and folders that are not shared." : "Una llista de ficheros y carpetes que nun se compartieron.",
+ "No personal files found" : "Nun s'atopó nengún ficheru personal",
+ "Files that are not shared will show up here." : "Equí apaecen los ficheros que nun se compartan.",
+ "Recent" : "De recién",
+ "List of recently modified files and folders." : "Una llista de ficheros y carpetes modificaos de recién.",
+ "No recently modified files" : "Nun hai nengún ficheru modificáu de recién",
+ "Files and folders you recently modified will show up here." : "Equí apaecen los ficheros y les carpetes modificaes de recién.",
+ "Search" : "Buscar",
+ "No entries found in this folder" : "Nun s'atopó nenguna entrada nesta carpeta",
+ "Select all" : "Seleicionar too",
+ "Upload too large" : "La xuba ye mui grande",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tentes de xubir superen el tamañu máximu qu'esti sirvidor permite.",
+ "File could not be found" : "Nun se pudo atopar el ficheru",
+ "Show list view" : "Amosar la vista en llista",
+ "Show grid view" : "Amosar la vista en rexáu",
+ "Close" : "Zarrar",
+ "Could not create folder \"{dir}\"" : "Nun se pudo crear la carpeta «{dir}»",
+ "This will stop your current uploads." : "Esta aición va parar les xubes actuales.",
+ "Upload cancelled." : "Encaboxóse la xuba.",
+ "Processing files …" : "Procesando los ficheros…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun ye posible xubir «{filename}» darréu que ye un direutoriu o tien 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu porque namás queda {size2} y tas xubiendo {size1}",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta de destín «{dir}» xá nun esiste",
+ "An unknown error has occurred" : "Prodúxose un error desconocíu",
+ "File could not be uploaded" : "Nun se pudo xubir el ficheru",
+ "Uploading …" : "Xubiendo…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Xubiendo… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "La xuba d'esi elementu nun ye compatible",
+ "Error when assembling chunks, status code {status}" : "Hebo un error al atropar los cachos. Códigu d'estáu {status}",
+ "Choose target folder" : "Escoyer la carpeta de destín",
+ "Set reminder" : "Configurar un recordatoriu",
+ "Edit locally" : "Editar llocalmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "Nun se pudo cargar la información del ficheru «{file}»",
+ "Please select tag(s) to add to the selection" : "Seleiciona les etiquetes que quies amestar a la seleición",
+ "Apply tag(s) to selection" : "Aplicar les etiquetes a la seleición",
+ "Select directory \"{dirName}\"" : "Seleicionar el direutoriu «{dirName}»",
+ "Select file \"{fileName}\"" : "Seleicionar el ficheru «{fileName}»",
+ "Unable to determine date" : "Nun ye posible determinar la data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, revisa'l rexistru o ponte en contautu cola alministración.",
+ "Could not move \"{file}\", target exists" : "Nun se pudo mover «{file}», el destín esiste",
+ "Could not move \"{file}\"" : "Nun se pudo mover «{file}»",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "Nun se pudo copiar «{file}», el destín esiste",
+ "Could not copy \"{file}\"" : "Nun se pudo copiar «{file}»",
+ "Copied {origin} inside {destination}" : "Copióse «{origin}» dientro de: {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copióse «{origin}» y {nbfiles} ficheros más dientro de: {destination}",
+ "{newName} already exists" : "«{newName}» xá esiste",
+ "Could not create file \"{file}\"" : "Nun se pudo crear el ficheru «{file}»",
+ "Could not create file \"{file}\" because it already exists" : "Nun se pudo crear el ficheru «{file}» porque yá esiste",
+ "Could not create folder \"{dir}\" because it already exists" : "Nun se pudo crear la carpeta «{dir}» porque yá esiste",
+ "Could not fetch file details \"{file}\"" : "Nun se pudo dir en cata de los detalles del ficheru «{file}»",
+ "Error deleting file \"{fileName}\"." : "Hebo un error al desaniciar «{fileName}»",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Nun hai nengún resultáu de busca nes demás carpetes pa: {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Introduz más de dos carátueres pa buscar nes demás carpetes",
+ "{dirs} and {files}" : "{dirs} ya {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n elementu anubríu","incluyendo %n elementos anubríos"],
+ "You do not have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
+ "New" : "Nuevu",
+ "New file/folder menu" : "Menú de carpeta/ficheru nuevos",
+ "Select file range" : "Seleicionar el rangu de ficheros",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} n'usu",
+ "\"{name}\" is an invalid file name." : "«{name}» ye un nome inválidu.",
+ "File name cannot be empty." : "El nome del ficheru nun pue tar baleru.",
+ "\"/\" is not allowed inside a file name." : "«/» ye un caráuter que nun ta permitíu nel nome del ficheru.",
+ "\"{name}\" is not an allowed filetype" : "«{name}» nun ye un tipu de ficheru permitíu",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'almacenamientu del usuariu «{owner}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta del grupu «{mountPoint}» ta enllena, ¡yá nun se puen xubir nin sincronizar ficheros!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'almacenamientu esternu «{mountPoint}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "El to almacenamientu ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'almacenamientu del usuariu «{owner}» ta cuasi enllén ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta del grupu «{mountPoint}» ta cuasi enllena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'almacenamientu esternu «{mountPoint}» ta cuasi enllén ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "El to almacenamientu ta cuasi enllén ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["concasa con «{filter}»","concasen con «{filter}»"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
+ "Path" : "Camín",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
+ "Upload file" : "Xubir un ficheru",
+ "An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
+ "Upload (max. %s)" : "Xubir (%s como máximu)",
+ "\"{displayName}\" action executed successfully" : "L'aición «{displayName}» executóse correutamente",
+ "\"{displayName}\" action failed" : "L'aición «{displayName}» falló",
+ "\"{displayName}\" batch action executed successfully" : "L'aición per llotes «{displayName}» executóse correutamente",
+ "WebDAV URL copied to clipboard" : "La URL de WebDAV copióse nel cartafueyu",
+ "Enable the grid view" : "Activar la vista de rexáu",
+ "Copy to clipboard" : "Copiar nel cartafueyu",
+ "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
+ "Deletion cancelled" : "Anulóse'l desaniciu",
+ "Move cancelled" : "Anulóse la operación de mover",
+ "Cancelled move or copy operation" : "Anulóse la operación de mover o copiar",
+ "Open details" : "Abrir los detalles",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheru y 1 carpeta","{fileCount} ficheros y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheros y {folderCount} carpetes",
+ "All folders" : "Toles carpetes",
+ "Personal Files" : "Ficheros personales",
"Text file" : "Ficheru de testu",
- "New text file.txt" : "Nuevu testu ficheru.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'almacenamientu de {owner} ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
- "Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
- "_matches '{filter}'_::_match '{filter}'_" : ["concasa '{filter}'","concasa '{filter}'"]
+ "New text file.txt" : "ficheru_nuevu.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js
deleted file mode 100644
index 7cce658e6c9..00000000000
--- a/apps/files/l10n/az.js
+++ /dev/null
@@ -1,104 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
- "Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
- "Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
- "Invalid Token" : "Yalnış token",
- "No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
- "There is no error, the file uploaded with success" : "Səhv yoxdur, fayl uğurla yüklənildi.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Yüklənilən faylin həcmi php.ini config faylinin upload_max_filesize direktivində göstəriləndən çoxdur.",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
- "The uploaded file was only partially uploaded" : "Yüklənilən faylın yalnız bir hissəsi yüklənildi",
- "No file was uploaded" : "Heç bir fayl yüklənilmədi",
- "Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
- "Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
- "Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
- "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
- "Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
- "Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
- "Invalid directory." : "Yalnış qovluq.",
- "Files" : "Fayllar",
- "All files" : "Bütün fayllar",
- "Home" : "Ev",
- "Close" : "Bağla",
- "Favorites" : "Sevimlilər",
- "Upload cancelled." : "Yüklənmə dayandırıldı.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
- "Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
- "Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
- "Uploading..." : "Serverə yüklənir...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
- "Actions" : "İşlər",
- "Download" : "Yüklə",
- "Rename" : "Adı dəyiş",
- "Delete" : "Sil",
- "Disconnect storage" : "Daşıyıcını ayır",
- "Unshare" : "Paylaşımı durdur",
- "Details" : "Detallar",
- "Select" : "Seç",
- "Pending" : "Gözləmə",
- "Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
- "This operation is forbidden" : "Bu əməliyyat qadağandır",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
- "No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
- "Name" : "Ad",
- "Size" : "Həcm",
- "Modified" : "Dəyişdirildi",
- "_%n folder_::_%n folders_" : ["%n qovluq","%n qovluqlar"],
- "_%n file_::_%n files_" : ["%n fayllar","%n fayllar"],
- "{dirs} and {files}" : "{dirs} və {files}",
- "You don’t have permission to upload or create files here" : "Sizin burda yükləməyə və ya fayl yaratmağa yetkiniz yoxdur ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n fayllar yüklənilir","%n fayllar yüklənilir"],
- "New" : "Yeni",
- "\"{name}\" is an invalid file name." : "\"{name}\" yalnış fayl adıdır.",
- "File name cannot be empty." : "Faylın adı boş ola bilməz.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} məlumat anbarı doludur, fayllar artıq yenilənə və ya sinxronizasiya edilə bilməz!",
- "Your storage is full, files can not be updated or synced anymore!" : "Sizin deponuz doludur, fayllar artıq yenilənə və sinxronizasiya edilə bilməz!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} məlumat anbari demək olar ki, doludur ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)" : "Sizin depo depo demək olar ki, doludur ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["uyğun '{filter}'","uyğun '{filter}'"],
- "Path" : "Ünvan",
- "_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
- "Favorited" : "İstəkləndi",
- "Favorite" : "İstəkli",
- "Folder" : "Qovluq",
- "New folder" : "Yeni qovluq",
- "{newname} already exists" : "{newname} artıq mövcuddur",
- "Upload" : "Serverə yüklə",
- "An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
- "A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
- "A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>sevimli faylların</strong> yaradılması və silinməsi haqqında olan xəbərdarlıqları limitlə <em>(Yalnız axınlar)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Fayl və ya direktoriya <strong>silinib</strong>",
- "A file or folder has been <strong>restored</strong>" : "Fayl yada qovluq geriyə <strong>qaytarıldı</strong>",
- "You created %1$s" : "Siz yaratdınız %1$s",
- "%2$s created %1$s" : "%2$s yaradılmış %1$s",
- "%1$s was created in a public folder" : "%1$s ictimai qovluqda yaradıldı",
- "You changed %1$s" : "Siz dəyişdiniz %1$s",
- "%2$s changed %1$s" : "%2$s dəyişdirildi %1$s",
- "You deleted %1$s" : "Siz silindiniz %1$s",
- "%2$s deleted %1$s" : "%2$s silindi %1$s",
- "You restored %1$s" : "Siz qayıtdınız %1$s",
- "%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
- "Upload (max. %s)" : "Yüklə (max. %s)",
- "File handling" : "Fayl emalı",
- "Maximum upload size" : "Maksimal yükləmə həcmi",
- "max. possible: " : "maks. ola bilər: ",
- "Save" : "Saxlamaq",
- "Settings" : "Quraşdırmalar",
- "WebDAV" : "WebDAV",
- "No files in here" : "Burda fayl yoxdur",
- "Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
- "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
- "Select all" : "Hamısıı seç",
- "Upload too large" : "Yüklənmə şox böyükdür",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
- "No favorites" : "Seçilmiş yoxdur",
- "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
- "Text file" : "Tekst faylı",
- "New text file.txt" : "Yeni mətn file.txt"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json
deleted file mode 100644
index 48bb39bc650..00000000000
--- a/apps/files/l10n/az.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{ "translations": {
- "Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
- "Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
- "Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
- "Invalid Token" : "Yalnış token",
- "No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
- "There is no error, the file uploaded with success" : "Səhv yoxdur, fayl uğurla yüklənildi.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Yüklənilən faylin həcmi php.ini config faylinin upload_max_filesize direktivində göstəriləndən çoxdur.",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
- "The uploaded file was only partially uploaded" : "Yüklənilən faylın yalnız bir hissəsi yüklənildi",
- "No file was uploaded" : "Heç bir fayl yüklənilmədi",
- "Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
- "Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
- "Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
- "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
- "Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
- "Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
- "Invalid directory." : "Yalnış qovluq.",
- "Files" : "Fayllar",
- "All files" : "Bütün fayllar",
- "Home" : "Ev",
- "Close" : "Bağla",
- "Favorites" : "Sevimlilər",
- "Upload cancelled." : "Yüklənmə dayandırıldı.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
- "Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
- "Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
- "Uploading..." : "Serverə yüklənir...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
- "Actions" : "İşlər",
- "Download" : "Yüklə",
- "Rename" : "Adı dəyiş",
- "Delete" : "Sil",
- "Disconnect storage" : "Daşıyıcını ayır",
- "Unshare" : "Paylaşımı durdur",
- "Details" : "Detallar",
- "Select" : "Seç",
- "Pending" : "Gözləmə",
- "Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
- "This operation is forbidden" : "Bu əməliyyat qadağandır",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
- "No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
- "Name" : "Ad",
- "Size" : "Həcm",
- "Modified" : "Dəyişdirildi",
- "_%n folder_::_%n folders_" : ["%n qovluq","%n qovluqlar"],
- "_%n file_::_%n files_" : ["%n fayllar","%n fayllar"],
- "{dirs} and {files}" : "{dirs} və {files}",
- "You don’t have permission to upload or create files here" : "Sizin burda yükləməyə və ya fayl yaratmağa yetkiniz yoxdur ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n fayllar yüklənilir","%n fayllar yüklənilir"],
- "New" : "Yeni",
- "\"{name}\" is an invalid file name." : "\"{name}\" yalnış fayl adıdır.",
- "File name cannot be empty." : "Faylın adı boş ola bilməz.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} məlumat anbarı doludur, fayllar artıq yenilənə və ya sinxronizasiya edilə bilməz!",
- "Your storage is full, files can not be updated or synced anymore!" : "Sizin deponuz doludur, fayllar artıq yenilənə və sinxronizasiya edilə bilməz!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} məlumat anbari demək olar ki, doludur ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)" : "Sizin depo depo demək olar ki, doludur ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["uyğun '{filter}'","uyğun '{filter}'"],
- "Path" : "Ünvan",
- "_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
- "Favorited" : "İstəkləndi",
- "Favorite" : "İstəkli",
- "Folder" : "Qovluq",
- "New folder" : "Yeni qovluq",
- "{newname} already exists" : "{newname} artıq mövcuddur",
- "Upload" : "Serverə yüklə",
- "An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
- "A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
- "A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>sevimli faylların</strong> yaradılması və silinməsi haqqında olan xəbərdarlıqları limitlə <em>(Yalnız axınlar)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Fayl və ya direktoriya <strong>silinib</strong>",
- "A file or folder has been <strong>restored</strong>" : "Fayl yada qovluq geriyə <strong>qaytarıldı</strong>",
- "You created %1$s" : "Siz yaratdınız %1$s",
- "%2$s created %1$s" : "%2$s yaradılmış %1$s",
- "%1$s was created in a public folder" : "%1$s ictimai qovluqda yaradıldı",
- "You changed %1$s" : "Siz dəyişdiniz %1$s",
- "%2$s changed %1$s" : "%2$s dəyişdirildi %1$s",
- "You deleted %1$s" : "Siz silindiniz %1$s",
- "%2$s deleted %1$s" : "%2$s silindi %1$s",
- "You restored %1$s" : "Siz qayıtdınız %1$s",
- "%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
- "Upload (max. %s)" : "Yüklə (max. %s)",
- "File handling" : "Fayl emalı",
- "Maximum upload size" : "Maksimal yükləmə həcmi",
- "max. possible: " : "maks. ola bilər: ",
- "Save" : "Saxlamaq",
- "Settings" : "Quraşdırmalar",
- "WebDAV" : "WebDAV",
- "No files in here" : "Burda fayl yoxdur",
- "Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
- "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
- "Select all" : "Hamısıı seç",
- "Upload too large" : "Yüklənmə şox böyükdür",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
- "No favorites" : "Seçilmiş yoxdur",
- "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
- "Text file" : "Tekst faylı",
- "New text file.txt" : "Yeni mətn file.txt"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js
index 55e94ac2477..1c72fa29839 100644
--- a/apps/files/l10n/be.js
+++ b/apps/files/l10n/be.js
@@ -1,6 +1,258 @@
OC.L10N.register(
"files",
{
- "Settings" : "Налады"
+ "Added to favorites" : "Дададзены ў абранае",
+ "Removed from favorites" : "Выдалены з абранага",
+ "You added {file} to your favorites" : "Вы дадалі {file} у абранае",
+ "You removed {file} from your favorites" : "Вы выдалілі {file} з абранага",
+ "Favorites" : "Абранае",
+ "File changes" : "Змены ў файлах",
+ "Created by {user}" : "Створаны карыстальнікам {user}",
+ "Changed by {user}" : "Зменены карыстальнікам {user}",
+ "Deleted by {user}" : "Выдалены карыстальнікам {user}",
+ "Restored by {user}" : "Адноўлены карыстальнікам {user}",
+ "Renamed by {user}" : "Перайменаваны карыстальнікам {user}",
+ "Moved by {user}" : "Перамешчаны карыстальнікам {user}",
+ "\"remote account\"" : "\"аддалены ўліковы запіс\"",
+ "You created {file}" : "Вы стварылі {file}",
+ "You created an encrypted file in {file}" : "Вы стварылі зашыфраваны файл у {file}",
+ "{user} created {file}" : "{user} стварыў(-ла) {file}",
+ "{user} created an encrypted file in {file}" : "{user} стварыў(-ла) зашыфраваны файл у {file}",
+ "You changed {file}" : "Вы змянілі {file}",
+ "You changed an encrypted file in {file}" : "Вы змянілі зашыфраваны файл у {file}",
+ "{user} changed {file}" : "{user} змяніў(-ла) {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змяніў(-ла) зашыфраваны файл у {file}",
+ "You deleted {file}" : "Вы выдалілі {file}",
+ "You deleted an encrypted file in {file}" : "Вы выдалілі зашыфраваны файл у {file}",
+ "{user} deleted {file}" : "{user} выдаліў(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} выдаліў(-ла) зашыфраваны файл у {file}",
+ "You restored {file}" : "Вы аднавілі {file}",
+ "{user} restored {file}" : "{user} аднавіў(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы перайменавалі {oldfile} (схаваны) у {newfile} (схаваны)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы перайменавалі {oldfile} (схаваны) у {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы перайменавалі {oldfile} у {newfile} (схаваны)",
+ "You renamed {oldfile} to {newfile}" : "Вы перайменавалі {oldfile} у {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} (схаваны) у {newfile} (схаваны)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перайменаваў(-ла) {oldfile} (схаваны) ў {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} у {newfile} (схаваны)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перайменаваў(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Вы перамясцілі {oldfile} у {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перамясціў(-ла) {oldfile} у {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл быў дададзены або выдалены з <strong>абраных</strong>",
+ "Files" : "Файлы",
+ "Folder not found" : "Папка не знойдзена",
+ "The file cannot be found" : "Файл не знойдзены",
+ "The destination path does not exist: %1$s" : "Шлях прызначэння не існуе: %1$s",
+ "Favorite files" : "Абраныя файлы",
+ "No favorites" : "Няма абраных",
+ "More favorites" : "Больш абраных",
+ "Accept" : "Прыняць",
+ "Reject" : "Адхіліць",
+ "in %s" : "у %s",
+ "Files compatibility" : "Сумяшчальнасць файлаў",
+ "File Management" : "Кіраванне файламі",
+ "Home" : "Дадому",
+ "Target folder does not exist any more" : "Мэтавая папка больш не існуе",
+ "Reload current directory" : "Перазагрузіць бягучы каталог",
+ "Go to the \"{dir}\" directory" : "Перайсці да каталога \"{dir}\"",
+ "Drag and drop files here to upload" : "Перацягніце файлы сюды, каб запампаваць іх",
+ "Favorite" : "Абранае",
+ "Back" : "Назад",
+ "File is loading" : "Файл загружаецца",
+ "Folder is loading" : "Папка загружаецца",
+ "Filename" : "Назва файла",
+ "Folder name" : "Назва папкі",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" перайменаваны ў \"{newName}\"",
+ "Rename file" : "Перайменаваць файл",
+ "Folder" : "Папка",
+ "Unknown file type" : "Невядомы тып файла",
+ "{ext} image" : "Відарыс {ext}",
+ "{ext} video" : "Відэа {ext}",
+ "{ext} audio" : "Аўдыя {ext} ",
+ "{ext} text" : "Тэкст {ext}",
+ "Pending" : "У чаканні",
+ "Unknown date" : "Невядомая дата",
+ "Clear filter" : "Ачысціць фільтр",
+ "Modified" : "Зменены",
+ "Type" : "Тып",
+ "Active filters" : "Актыўныя фільтры",
+ "Remove filter" : "Выдаліць фільтр",
+ "Name" : "Назва",
+ "File type" : "Тып файла",
+ "Size" : "Памер",
+ "Actions" : "Дзеянні",
+ "List of files and folders." : "Спіс файлаў і папак.",
+ "File not found" : "Файл не знойдзены",
+ "{usedQuotaByte} used" : "Выкарыстана {usedQuotaByte}",
+ "{used} of {quota} used" : "Выкарыстана {used} з {quota}",
+ "{relative}% used" : "Выкарыстана {relative}%",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Стварыць новую папку",
+ "This name is already in use." : "Гэта назва ўжо выкарыстоўваецца.",
+ "Create" : "Стварыць",
+ "Fill template fields" : "Запоўніце палі шаблону",
+ "Unknown error" : "Невядомая памылка",
+ "Change" : "Змяніць",
+ "New owner" : "Новы ўладальнік",
+ "Share" : "Абагуліць",
+ "Upload was cancelled by user" : "Карыстальнік скасаваў запампоўванне",
+ "Go back" : "Назад",
+ "Your files" : "Вашы файлы",
+ "File cannot be accessed" : "Немагчыма атрымаць доступ да файла",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Файл не знойдзены, або ў вас няма правоў на яго прагляд. Папрасіце адпраўніка абагуліць яго.",
+ "No search results for “{query}”" : "Няма вынікаў пошуку па запыце \"{query}\"",
+ "Search for files" : "Пошук файлаў",
+ "Clipboard is not available" : "Буфер абмену недаступны",
+ "WebDAV URL copied" : "URL-адрас WebDAV скапіяваны",
+ "General" : "Агульныя",
+ "All files" : "Усе файлы",
+ "Personal files" : "Асабістыя файлы",
+ "Appearance" : "Знешні выгляд",
+ "Show file extensions" : "Паказваць пашырэнні файлаў",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адрас WebDAV",
+ "Copy" : "Капіяваць",
+ "Warnings" : "Папярэджанні",
+ "Keyboard shortcuts" : "Спалучэнні клавіш",
+ "File actions" : "Дзеянні з файламі",
+ "Rename" : "Перайменаваць",
+ "Delete" : "Выдаліць",
+ "Manage tags" : "Кіраванне тэгамі",
+ "Select all files" : "Выбраць усе файлы",
+ "Navigation" : "Навігацыя",
+ "You" : "Вы",
+ "Error while loading the file data" : "Памылка пры загрузцы даных файла",
+ "Owner" : "Уладальнік",
+ "Remove from favorites" : "Выдаліць з абранага",
+ "Add to favorites" : "У абранае",
+ "Tags" : "Тэгі",
+ "Unable to create new file from template" : "Немагчыма стварыць новы файл з шаблона",
+ "Pick a template for {name}" : "Выберыце шаблон для {name}",
+ "Create a new file with the selected template" : "Стварыць файл на падставе выбранага шаблона",
+ "Creating file" : "Стварэнне файла",
+ "Save as {displayName}" : "Захаваць як {displayName}",
+ "Save as …" : "Захаваць як …",
+ "Converting files …" : "Канвертацыя файлаў …",
+ "Converting file …" : "Канвертацыя файла …",
+ "File successfully converted" : "Файл паспяхова сканвертаваны",
+ "Delete permanently" : "Выдаліць назаўжды",
+ "Delete file" : "Выдаліць файл",
+ "Delete files" : "Выдаліць файлы",
+ "Delete folder" : "Выдаліць папку",
+ "Delete folders" : "Выдаліць папкі",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы збіраецеся назаўжды выдаліць {count} элемент","Вы збіраецеся назаўжды выдаліць {count} элементы","Вы збіраецеся назаўжды выдаліць {count} элементаў","Вы збіраецеся назаўжды выдаліць {count} элементаў"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Вы збіраецеся выдаліць {count} элемент","Вы збіраецеся выдаліць {count} элементы","Вы збіраецеся выдаліць {count} элементаў","Вы збіраецеся выдаліць {count} элементаў"],
+ "Confirm deletion" : "Пацвердзіць выдаленне",
+ "Cancel" : "Скасаваць",
+ "Download" : "Спампаваць",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перамяшчэнне \"{source}\" у \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Капіяванне \"{source}\" у \"{destination}\" …",
+ "This file/folder is already in that directory" : "Гэты файл/папка ўжо знаходзіцца ў гэтым каталогу",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "A file or folder with that name already exists in this folder" : "Файл або папка з такой назвай ужо існуе ў гэтай папцы",
+ "The files are locked" : "Файлы заблакіраваны",
+ "The file does not exist anymore" : "Файл больш не існуе",
+ "Choose destination" : "Выберыце прызначэнне",
+ "Copy to {target}" : "Капіяваць у {target}",
+ "Move to {target}" : "Перамясціць у {target}",
+ "Move" : "Перамясціць",
+ "Move or copy" : "Перамясціць або капіяваць",
+ "Open folder {displayName}" : "Адкрыць папку {displayName}",
+ "Open locally" : "Адкрыць лакальна",
+ "Open file locally" : "Адкрыць файл лакальна",
+ "Today" : "Сёння",
+ "Last 7 days" : "Апошнія 7 дзён",
+ "Last 30 days" : "Апошнія 30 дзён",
+ "This year ({year})" : "Гэты год ({year})",
+ "Last year ({year})" : "Мінулы год ({year})",
+ "Documents" : "Дакументы",
+ "Spreadsheets" : "Табліцы",
+ "Presentations" : "Прэзентацыі",
+ "PDFs" : "PDF-файлы",
+ "Folders" : "Папкі",
+ "Audio" : "Аўдыя",
+ "Images" : "Відарысы",
+ "Videos" : "Відэа",
+ "Created new folder \"{name}\"" : "Створана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Немагчыма ініцыялізаваць каталог шаблонаў",
+ "Create templates folder" : "Стварыць папку шаблонаў",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонаў",
+ "In folder" : "У папцы",
+ "One of the dropped files could not be processed" : "Адзін з перацягнутых файлаў не ўдалося апрацаваць",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш браўзер не падтрымлівае Filesystem API. Каталогі не будуць запампаваныя",
+ "No files to upload" : "Няма файлаў для запампоўвання",
+ "Unable to create the directory {directory}" : "Немагчыма стварыць папку {directory}",
+ "Some files could not be uploaded" : "Некаторыя файлы не ўдалося запампаваць",
+ "Files uploaded successfully" : "Файлы паспяхова запампаваныя",
+ "No files to process" : "Няма файлаў для апрацоўкі",
+ "Some files could not be copied" : "Некаторыя файлы не ўдалося скапіяваць",
+ "Some files could not be moved" : "Некаторыя файлы не ўдалося перамясціць",
+ "Files copied successfully" : "Файлы паспяхова скапіяваны",
+ "Files moved successfully" : "Файлы паспяхова перамешчаны",
+ "Conflicts resolution skipped" : "Рашэнне канфліктаў прапушчана",
+ "Upload cancelled" : "Запампоўванне скасавана",
+ "Could not rename \"{oldName}\"" : "Не атрымалася перайменаваць \"{oldName}\"",
+ "Unexpected error: {error}" : "Нечаканая памылка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файлы","%n файлаў","%n файлаў"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папкі","%n папак","%n папак"],
+ "_%n hidden_::_%n hidden_" : ["%n схаваны","%n схаваныя","%n схаваных","%n схаваных"],
+ "Filename must not be empty." : "Назва файла не можа быць пустой.",
+ "No favorites yet" : "Пакуль няма абраных",
+ "List of your files and folders." : "Спіс вашых файлаў і папак.",
+ "List of your files and folders that are not shared." : "Спіс вашых неабагуленых файлаў і папак.",
+ "No personal files found" : "Асабістых файлаў не знойдзена",
+ "Files that are not shared will show up here." : "Тут будуць адлюстроўвацца неабагуленыя файлы.",
+ "Recent" : "Нядаўнія",
+ "List of recently modified files and folders." : "Спіс нядаўна змененых файлаў і папак.",
+ "No recently modified files" : "Няма нядаўна змененых файлаў",
+ "Files and folders you recently modified will show up here." : "Тут будуць адлюстроўвацца нядаўна змененыя вамі файлы і папкі.",
+ "Search" : "Пошук",
+ "File could not be found" : "Файл не знойдзены",
+ "Close" : "Закрыць",
+ "Could not create folder \"{dir}\"" : "Не ўдалося стварыць папку \"{dir}\"",
+ "This will stop your current uploads." : "Гэта спыніць вашы бягучыя запампоўкі.",
+ "Upload cancelled." : "Запампоўванне скасавана.",
+ "Processing files …" : "Апрацоўка файлаў …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Немагчыма запампаваць {filename}, бо гэта каталог або ён мае памер 0 байтаў",
+ "An unknown error has occurred" : "Узнікла невядомая памылка",
+ "File could not be uploaded" : "Не ўдалося запампаваць файл",
+ "Uploading …" : "Запампоўванне …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Запампоўванне … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
+ "Set reminder" : "Задаць напамін",
+ "Edit locally" : "Рэдагаваць лакальна",
+ "Open" : "Адкрыць",
+ "Unable to determine date" : "Немагчыма вызначыць дату",
+ "copy" : "копія",
+ "{newName} already exists" : "{newName} ужо існуе",
+ "{dirs} and {files}" : "{dirs} і {files}",
+ "_Uploading %n file_::_Uploading %n files_" : ["Запампоўванне %n файла","Запампоўванне %n файлаў","Запампоўванне %n файлаў","Запампоўванне %n файлаў"],
+ "New" : "Новы",
+ "{used}%" : "{used}%",
+ "{used} used" : "Выкарыстана {used}",
+ "Path" : "Шлях",
+ "Upload file" : "Запампаваць файл",
+ "WebDAV URL copied to clipboard" : "URL-адрас WebDAV скапіяваны ў буфер абмену",
+ "Copy to clipboard" : "Капіяваць у буфер абмену",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Move cancelled" : "Перамяшчэнне скасавана",
+ "Photos and images" : "Фота і відарысы",
+ "New folder creation cancelled" : "Стварэнне новай папкі скасавана",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папкі","{folderCount} папак","{folderCount} папак"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файлы","{fileCount} файлаў","{fileCount} файлаў"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл і {folderCount} папка","1 файл і {folderCount} папкі","1 файл і {folderCount} папак","1 файл і {folderCount} папак"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл і 1 папка","{fileCount} файлы і 1 папка","{fileCount} файлаў і 1 папка","{fileCount} файлаў і 1 папка"],
+ "All folders" : "Усе папкі",
+ "Personal Files" : "Асабістыя файлы",
+ "Text file" : "Тэкставы файл",
+ "%1$s (renamed)" : "%1$s (перайменаваны)",
+ "Rename a file" : "Перайменаваць файл",
+ "Delete a file" : "Выдаліць файл",
+ "Deselect all files" : "Скасаваць выбар усіх файлаў",
+ "Select a range of files" : "Выберыце дыяпазон файлаў"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files/l10n/be.json b/apps/files/l10n/be.json
index 3f70a0783fe..7cc4d30cdac 100644
--- a/apps/files/l10n/be.json
+++ b/apps/files/l10n/be.json
@@ -1,4 +1,256 @@
{ "translations": {
- "Settings" : "Налады"
+ "Added to favorites" : "Дададзены ў абранае",
+ "Removed from favorites" : "Выдалены з абранага",
+ "You added {file} to your favorites" : "Вы дадалі {file} у абранае",
+ "You removed {file} from your favorites" : "Вы выдалілі {file} з абранага",
+ "Favorites" : "Абранае",
+ "File changes" : "Змены ў файлах",
+ "Created by {user}" : "Створаны карыстальнікам {user}",
+ "Changed by {user}" : "Зменены карыстальнікам {user}",
+ "Deleted by {user}" : "Выдалены карыстальнікам {user}",
+ "Restored by {user}" : "Адноўлены карыстальнікам {user}",
+ "Renamed by {user}" : "Перайменаваны карыстальнікам {user}",
+ "Moved by {user}" : "Перамешчаны карыстальнікам {user}",
+ "\"remote account\"" : "\"аддалены ўліковы запіс\"",
+ "You created {file}" : "Вы стварылі {file}",
+ "You created an encrypted file in {file}" : "Вы стварылі зашыфраваны файл у {file}",
+ "{user} created {file}" : "{user} стварыў(-ла) {file}",
+ "{user} created an encrypted file in {file}" : "{user} стварыў(-ла) зашыфраваны файл у {file}",
+ "You changed {file}" : "Вы змянілі {file}",
+ "You changed an encrypted file in {file}" : "Вы змянілі зашыфраваны файл у {file}",
+ "{user} changed {file}" : "{user} змяніў(-ла) {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змяніў(-ла) зашыфраваны файл у {file}",
+ "You deleted {file}" : "Вы выдалілі {file}",
+ "You deleted an encrypted file in {file}" : "Вы выдалілі зашыфраваны файл у {file}",
+ "{user} deleted {file}" : "{user} выдаліў(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} выдаліў(-ла) зашыфраваны файл у {file}",
+ "You restored {file}" : "Вы аднавілі {file}",
+ "{user} restored {file}" : "{user} аднавіў(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы перайменавалі {oldfile} (схаваны) у {newfile} (схаваны)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы перайменавалі {oldfile} (схаваны) у {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы перайменавалі {oldfile} у {newfile} (схаваны)",
+ "You renamed {oldfile} to {newfile}" : "Вы перайменавалі {oldfile} у {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} (схаваны) у {newfile} (схаваны)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перайменаваў(-ла) {oldfile} (схаваны) ў {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перайменаваў(-ла) {oldfile} у {newfile} (схаваны)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перайменаваў(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Вы перамясцілі {oldfile} у {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перамясціў(-ла) {oldfile} у {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл быў дададзены або выдалены з <strong>абраных</strong>",
+ "Files" : "Файлы",
+ "Folder not found" : "Папка не знойдзена",
+ "The file cannot be found" : "Файл не знойдзены",
+ "The destination path does not exist: %1$s" : "Шлях прызначэння не існуе: %1$s",
+ "Favorite files" : "Абраныя файлы",
+ "No favorites" : "Няма абраных",
+ "More favorites" : "Больш абраных",
+ "Accept" : "Прыняць",
+ "Reject" : "Адхіліць",
+ "in %s" : "у %s",
+ "Files compatibility" : "Сумяшчальнасць файлаў",
+ "File Management" : "Кіраванне файламі",
+ "Home" : "Дадому",
+ "Target folder does not exist any more" : "Мэтавая папка больш не існуе",
+ "Reload current directory" : "Перазагрузіць бягучы каталог",
+ "Go to the \"{dir}\" directory" : "Перайсці да каталога \"{dir}\"",
+ "Drag and drop files here to upload" : "Перацягніце файлы сюды, каб запампаваць іх",
+ "Favorite" : "Абранае",
+ "Back" : "Назад",
+ "File is loading" : "Файл загружаецца",
+ "Folder is loading" : "Папка загружаецца",
+ "Filename" : "Назва файла",
+ "Folder name" : "Назва папкі",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" перайменаваны ў \"{newName}\"",
+ "Rename file" : "Перайменаваць файл",
+ "Folder" : "Папка",
+ "Unknown file type" : "Невядомы тып файла",
+ "{ext} image" : "Відарыс {ext}",
+ "{ext} video" : "Відэа {ext}",
+ "{ext} audio" : "Аўдыя {ext} ",
+ "{ext} text" : "Тэкст {ext}",
+ "Pending" : "У чаканні",
+ "Unknown date" : "Невядомая дата",
+ "Clear filter" : "Ачысціць фільтр",
+ "Modified" : "Зменены",
+ "Type" : "Тып",
+ "Active filters" : "Актыўныя фільтры",
+ "Remove filter" : "Выдаліць фільтр",
+ "Name" : "Назва",
+ "File type" : "Тып файла",
+ "Size" : "Памер",
+ "Actions" : "Дзеянні",
+ "List of files and folders." : "Спіс файлаў і папак.",
+ "File not found" : "Файл не знойдзены",
+ "{usedQuotaByte} used" : "Выкарыстана {usedQuotaByte}",
+ "{used} of {quota} used" : "Выкарыстана {used} з {quota}",
+ "{relative}% used" : "Выкарыстана {relative}%",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Стварыць новую папку",
+ "This name is already in use." : "Гэта назва ўжо выкарыстоўваецца.",
+ "Create" : "Стварыць",
+ "Fill template fields" : "Запоўніце палі шаблону",
+ "Unknown error" : "Невядомая памылка",
+ "Change" : "Змяніць",
+ "New owner" : "Новы ўладальнік",
+ "Share" : "Абагуліць",
+ "Upload was cancelled by user" : "Карыстальнік скасаваў запампоўванне",
+ "Go back" : "Назад",
+ "Your files" : "Вашы файлы",
+ "File cannot be accessed" : "Немагчыма атрымаць доступ да файла",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Файл не знойдзены, або ў вас няма правоў на яго прагляд. Папрасіце адпраўніка абагуліць яго.",
+ "No search results for “{query}”" : "Няма вынікаў пошуку па запыце \"{query}\"",
+ "Search for files" : "Пошук файлаў",
+ "Clipboard is not available" : "Буфер абмену недаступны",
+ "WebDAV URL copied" : "URL-адрас WebDAV скапіяваны",
+ "General" : "Агульныя",
+ "All files" : "Усе файлы",
+ "Personal files" : "Асабістыя файлы",
+ "Appearance" : "Знешні выгляд",
+ "Show file extensions" : "Паказваць пашырэнні файлаў",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адрас WebDAV",
+ "Copy" : "Капіяваць",
+ "Warnings" : "Папярэджанні",
+ "Keyboard shortcuts" : "Спалучэнні клавіш",
+ "File actions" : "Дзеянні з файламі",
+ "Rename" : "Перайменаваць",
+ "Delete" : "Выдаліць",
+ "Manage tags" : "Кіраванне тэгамі",
+ "Select all files" : "Выбраць усе файлы",
+ "Navigation" : "Навігацыя",
+ "You" : "Вы",
+ "Error while loading the file data" : "Памылка пры загрузцы даных файла",
+ "Owner" : "Уладальнік",
+ "Remove from favorites" : "Выдаліць з абранага",
+ "Add to favorites" : "У абранае",
+ "Tags" : "Тэгі",
+ "Unable to create new file from template" : "Немагчыма стварыць новы файл з шаблона",
+ "Pick a template for {name}" : "Выберыце шаблон для {name}",
+ "Create a new file with the selected template" : "Стварыць файл на падставе выбранага шаблона",
+ "Creating file" : "Стварэнне файла",
+ "Save as {displayName}" : "Захаваць як {displayName}",
+ "Save as …" : "Захаваць як …",
+ "Converting files …" : "Канвертацыя файлаў …",
+ "Converting file …" : "Канвертацыя файла …",
+ "File successfully converted" : "Файл паспяхова сканвертаваны",
+ "Delete permanently" : "Выдаліць назаўжды",
+ "Delete file" : "Выдаліць файл",
+ "Delete files" : "Выдаліць файлы",
+ "Delete folder" : "Выдаліць папку",
+ "Delete folders" : "Выдаліць папкі",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы збіраецеся назаўжды выдаліць {count} элемент","Вы збіраецеся назаўжды выдаліць {count} элементы","Вы збіраецеся назаўжды выдаліць {count} элементаў","Вы збіраецеся назаўжды выдаліць {count} элементаў"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Вы збіраецеся выдаліць {count} элемент","Вы збіраецеся выдаліць {count} элементы","Вы збіраецеся выдаліць {count} элементаў","Вы збіраецеся выдаліць {count} элементаў"],
+ "Confirm deletion" : "Пацвердзіць выдаленне",
+ "Cancel" : "Скасаваць",
+ "Download" : "Спампаваць",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перамяшчэнне \"{source}\" у \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Капіяванне \"{source}\" у \"{destination}\" …",
+ "This file/folder is already in that directory" : "Гэты файл/папка ўжо знаходзіцца ў гэтым каталогу",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "A file or folder with that name already exists in this folder" : "Файл або папка з такой назвай ужо існуе ў гэтай папцы",
+ "The files are locked" : "Файлы заблакіраваны",
+ "The file does not exist anymore" : "Файл больш не існуе",
+ "Choose destination" : "Выберыце прызначэнне",
+ "Copy to {target}" : "Капіяваць у {target}",
+ "Move to {target}" : "Перамясціць у {target}",
+ "Move" : "Перамясціць",
+ "Move or copy" : "Перамясціць або капіяваць",
+ "Open folder {displayName}" : "Адкрыць папку {displayName}",
+ "Open locally" : "Адкрыць лакальна",
+ "Open file locally" : "Адкрыць файл лакальна",
+ "Today" : "Сёння",
+ "Last 7 days" : "Апошнія 7 дзён",
+ "Last 30 days" : "Апошнія 30 дзён",
+ "This year ({year})" : "Гэты год ({year})",
+ "Last year ({year})" : "Мінулы год ({year})",
+ "Documents" : "Дакументы",
+ "Spreadsheets" : "Табліцы",
+ "Presentations" : "Прэзентацыі",
+ "PDFs" : "PDF-файлы",
+ "Folders" : "Папкі",
+ "Audio" : "Аўдыя",
+ "Images" : "Відарысы",
+ "Videos" : "Відэа",
+ "Created new folder \"{name}\"" : "Створана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Немагчыма ініцыялізаваць каталог шаблонаў",
+ "Create templates folder" : "Стварыць папку шаблонаў",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонаў",
+ "In folder" : "У папцы",
+ "One of the dropped files could not be processed" : "Адзін з перацягнутых файлаў не ўдалося апрацаваць",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш браўзер не падтрымлівае Filesystem API. Каталогі не будуць запампаваныя",
+ "No files to upload" : "Няма файлаў для запампоўвання",
+ "Unable to create the directory {directory}" : "Немагчыма стварыць папку {directory}",
+ "Some files could not be uploaded" : "Некаторыя файлы не ўдалося запампаваць",
+ "Files uploaded successfully" : "Файлы паспяхова запампаваныя",
+ "No files to process" : "Няма файлаў для апрацоўкі",
+ "Some files could not be copied" : "Некаторыя файлы не ўдалося скапіяваць",
+ "Some files could not be moved" : "Некаторыя файлы не ўдалося перамясціць",
+ "Files copied successfully" : "Файлы паспяхова скапіяваны",
+ "Files moved successfully" : "Файлы паспяхова перамешчаны",
+ "Conflicts resolution skipped" : "Рашэнне канфліктаў прапушчана",
+ "Upload cancelled" : "Запампоўванне скасавана",
+ "Could not rename \"{oldName}\"" : "Не атрымалася перайменаваць \"{oldName}\"",
+ "Unexpected error: {error}" : "Нечаканая памылка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файлы","%n файлаў","%n файлаў"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папкі","%n папак","%n папак"],
+ "_%n hidden_::_%n hidden_" : ["%n схаваны","%n схаваныя","%n схаваных","%n схаваных"],
+ "Filename must not be empty." : "Назва файла не можа быць пустой.",
+ "No favorites yet" : "Пакуль няма абраных",
+ "List of your files and folders." : "Спіс вашых файлаў і папак.",
+ "List of your files and folders that are not shared." : "Спіс вашых неабагуленых файлаў і папак.",
+ "No personal files found" : "Асабістых файлаў не знойдзена",
+ "Files that are not shared will show up here." : "Тут будуць адлюстроўвацца неабагуленыя файлы.",
+ "Recent" : "Нядаўнія",
+ "List of recently modified files and folders." : "Спіс нядаўна змененых файлаў і папак.",
+ "No recently modified files" : "Няма нядаўна змененых файлаў",
+ "Files and folders you recently modified will show up here." : "Тут будуць адлюстроўвацца нядаўна змененыя вамі файлы і папкі.",
+ "Search" : "Пошук",
+ "File could not be found" : "Файл не знойдзены",
+ "Close" : "Закрыць",
+ "Could not create folder \"{dir}\"" : "Не ўдалося стварыць папку \"{dir}\"",
+ "This will stop your current uploads." : "Гэта спыніць вашы бягучыя запампоўкі.",
+ "Upload cancelled." : "Запампоўванне скасавана.",
+ "Processing files …" : "Апрацоўка файлаў …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Немагчыма запампаваць {filename}, бо гэта каталог або ён мае памер 0 байтаў",
+ "An unknown error has occurred" : "Узнікла невядомая памылка",
+ "File could not be uploaded" : "Не ўдалося запампаваць файл",
+ "Uploading …" : "Запампоўванне …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Запампоўванне … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
+ "Set reminder" : "Задаць напамін",
+ "Edit locally" : "Рэдагаваць лакальна",
+ "Open" : "Адкрыць",
+ "Unable to determine date" : "Немагчыма вызначыць дату",
+ "copy" : "копія",
+ "{newName} already exists" : "{newName} ужо існуе",
+ "{dirs} and {files}" : "{dirs} і {files}",
+ "_Uploading %n file_::_Uploading %n files_" : ["Запампоўванне %n файла","Запампоўванне %n файлаў","Запампоўванне %n файлаў","Запампоўванне %n файлаў"],
+ "New" : "Новы",
+ "{used}%" : "{used}%",
+ "{used} used" : "Выкарыстана {used}",
+ "Path" : "Шлях",
+ "Upload file" : "Запампаваць файл",
+ "WebDAV URL copied to clipboard" : "URL-адрас WebDAV скапіяваны ў буфер абмену",
+ "Copy to clipboard" : "Капіяваць у буфер абмену",
+ "Deletion cancelled" : "Выдаленне скасавана",
+ "Move cancelled" : "Перамяшчэнне скасавана",
+ "Photos and images" : "Фота і відарысы",
+ "New folder creation cancelled" : "Стварэнне новай папкі скасавана",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папкі","{folderCount} папак","{folderCount} папак"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файлы","{fileCount} файлаў","{fileCount} файлаў"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл і {folderCount} папка","1 файл і {folderCount} папкі","1 файл і {folderCount} папак","1 файл і {folderCount} папак"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл і 1 папка","{fileCount} файлы і 1 папка","{fileCount} файлаў і 1 папка","{fileCount} файлаў і 1 папка"],
+ "All folders" : "Усе папкі",
+ "Personal Files" : "Асабістыя файлы",
+ "Text file" : "Тэкставы файл",
+ "%1$s (renamed)" : "%1$s (перайменаваны)",
+ "Rename a file" : "Перайменаваць файл",
+ "Delete a file" : "Выдаліць файл",
+ "Deselect all files" : "Скасаваць выбар усіх файлаў",
+ "Select a range of files" : "Выберыце дыяпазон файлаў"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bg.js b/apps/files/l10n/bg.js
index 50761b91e0a..cdf702caf2e 100644
--- a/apps/files/l10n/bg.js
+++ b/apps/files/l10n/bg.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Временно хранилището не е налично",
- "Storage invalid" : "Невалидно хранилище",
- "Unknown error" : "Неизвестна грешка",
- "File could not be found" : "Файлът не може да бъде намерен",
- "Move or copy" : "Премести или копирай",
- "Download" : "Изтегли",
- "Delete" : "Изтрий",
- "Home" : "Домашен",
- "Close" : "Затвори",
- "Favorites" : "Любими",
- "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена",
- "This will stop your current uploads." : "Това ще прекрати всички ваши текущи процеси по качване на файлове.",
- "Upload cancelled." : "Качването е прекъснато.",
- "Processing files …" : "Обработване на файлове ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Дестинацията \"{dir}\" не съществува",
- "Not enough free space" : "Няма достатъчно свободно място",
- "An unknown error has occurred" : "Възникна неизвестна грешка",
- "Uploading …" : "Качване …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} от {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Качването на такъв файл не се поддържа",
- "Target folder does not exist any more" : "Дестинацията не съществува",
- "Operation is blocked by access control" : "Операцията се блокира от контрол на достъпа",
- "Error when assembling chunks, status code {status}" : "Грешка при асемлиране на парчетата, код {status}",
- "Actions" : "Действия",
- "Rename" : "Преименувай",
- "Copy" : "Копирай",
- "Choose target folder" : "Избор на папка",
- "Open" : "Отвори",
- "Delete file" : "Изтриване на файл",
- "Delete folder" : "Изтриване на папка",
- "Disconnect storage" : "Извади хранилището",
- "Leave this share" : "Напускане на споделянето",
- "Could not load info for file \"{file}\"" : "Информацията за файла \"{file}\" не може да бъде заредена",
- "Files" : "Файлове",
- "Details" : "Подробности",
- "Please select tag(s) to add to the selection" : "Моля, изберете етикет(и), който да добавите към селекцията",
- "Apply tag(s) to selection" : "Прилагане на етикет(и) към селекцията",
- "Select" : "Избери",
- "Pending" : "Чакащо",
- "Unable to determine date" : "Неуспешно установяване на дата",
- "This operation is forbidden" : "Операцията е забранена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора",
- "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен, дестинацията съществува",
- "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен",
- "copy" : "Копиране",
- "Could not copy \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде копиран, дестинацията съществува",
- "Could not copy \"{file}\"" : "Файлът \"{file}\" не може да бъде копиран",
- "Copied {origin} inside {destination}" : "Копирано {origin} в {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирано {origin} и {nbfiles} други файлове в {destination}",
- "{newName} already exists" : "{newName} вече съществува",
- "Could not rename \"{fileName}\", it does not exist any more" : "Файлът \"{fileName}\" не може да бъде преименуван защото не съществува",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" се ползва в директорията \"{dir}\". Моля, изберете друго име.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" не може да бъде преименуван",
- "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден",
- "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува",
- "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува",
- "Could not fetch file details \"{file}\"" : "Подробностите за файла „{file}“ не можаха да бъдат извлечени",
- "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Няма резултати от търсенето в други папки за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Въведете повече от два знака за търсене в други папки",
- "Name" : "Име",
- "Size" : "Размер",
- "Modified" : "Промяна",
- "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
- "_%n file_::_%n files_" : ["%n файл","%n файла"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"],
- "You don’t have permission to upload or create files here" : "Нямаш разрешение да създаваш или качваш файлове тук.",
- "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"],
- "New" : "Създай",
- "Select file range" : "Избери от файловете",
- "{used} of {quota} used" : "{used} от {quota} използвани",
- "{used} used" : "{used} използвани",
- "\"{name}\" is an invalid file name." : "\"{name}\" е непозволено име за файл.",
- "File name cannot be empty." : "Името на файла не може да бъде оставено празно.",
- "\"/\" is not allowed inside a file name." : "\"/\" е непозволен знак в името на файла.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" не е разрешен тип файл",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Хранилището на {owner} е запълнено и файловете вече не могат да се актуализират или синхронизират!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Вашето хранилище запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповата папка \"{mountPoint}“ е почти пълна ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Външното хранилище е \"{mountPoint}“ е почти пълно ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["съвпада с \"{filter}\"","съвпада с \"{filter}\""],
- "View in folder" : "Преглед в папката",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирай директната връзка (ще работи само за потребители с достъп до файла/папката)",
- "Path" : "Път",
- "_%n byte_::_%n bytes_" : ["%n байт","%n байта"],
- "Favorited" : "Отбелязано в любими",
- "Favorite" : "Любими",
- "You can only favorite a single file or folder at a time" : "Можете да предпочетете само един файл или папка наведнъж",
- "New folder" : "Нова папка",
- "Upload file" : "Качи файл",
- "Recent" : "Последни",
- "Not favorited" : "Премахни от любими",
- "Remove from favorites" : "Премахни от любимите",
- "Add to favorites" : "Добави към любимите",
- "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
"Added to favorites" : "Добавено към любимите",
"Removed from favorites" : "Премахни от любимите",
"You added {file} to your favorites" : "Добавихте {file} към любимите",
"You removed {file} from your favorites" : "Премахнахте {file} от любимите",
+ "Favorites" : "Любими",
"File changes" : "Файлови промени",
"Created by {user}" : "Създаден от {user}",
"Changed by {user}" : "Променен от {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Възстановен от {user}",
"Renamed by {user}" : "Преименуван от {user}",
"Moved by {user}" : "Преместен от {user}",
- "\"remote user\"" : "\"отдалечен потребител\"",
+ "\"remote account\"" : "\"профил за отдалечен достъп\"",
"You created {file}" : "Създадохте {file}",
"You created an encrypted file in {file}" : "Създадохте криптиран файл в {file}",
"{user} created {file}" : "{user} създаде {file}",
@@ -143,11 +40,11 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Преместихте {oldfile} в {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} премести {oldfile} в {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Добавяне или премахване на файл от <strong>любимите</strong> ви",
+ "Files" : "Файлове",
"A file or folder has been <strong>changed</strong>" : "<strong>Промяна</strong> на файл / папка",
"A favorite file or folder has been <strong>changed</strong>" : "Предпочетен файл или папка е <strong>променен</strong>",
- "All files" : "Всички файлове",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Качи (макс. %s)",
+ "Favorite files" : "Любими файлове",
+ "No favorites" : "Няма любими",
"Accept" : "Приемане",
"Reject" : "Откажи",
"Incoming ownership transfer from {user}" : "Входящо прехвърляне на собственост от {user}",
@@ -160,61 +57,223 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "Прехвърлянето на собственост на {path} към {user} е завършено.",
"in %s" : "в %s",
"File Management" : "Управление на файлове",
- "Transfer ownership of a file or folder" : "Прехвърляне на собственост на файл или папка",
- "Choose file or folder to transfer" : "Избор на файл или папка за прехвърляне",
- "Change" : "Промени",
- "New owner" : "Нов собственик",
- "Search users" : "Търсене за потребители",
+ "Home" : "Домашен",
+ "Target folder does not exist any more" : "Дестинацията не съществува",
+ "Reload current directory" : "Презареждане на текущата директория",
+ "Go to the \"{dir}\" directory" : "Отидете в директорията \"{dir}\"",
+ "Favorite" : "Любими",
+ "Filename" : "Име на файла",
+ "Folder name" : "Име на папка",
+ "Folder" : "Папка",
+ "Pending" : "Чакащо",
+ "Clear filter" : "Изчстиване на филтър",
+ "Modified" : "Промяна",
+ "Search everywhere" : "Търси навсякъде",
+ "Type" : "Тип",
+ "Active filters" : "Актижни филтри",
+ "Remove filter" : "Премахни филтър",
+ "Total rows summary" : "Обобщение на общия брой редове",
+ "Name" : "Име",
+ "Size" : "Размер",
+ "Actions" : "Действия",
+ "File not found" : "Файлът не е намерен",
+ "_{count} selected_::_{count} selected_" : ["{count} избрани","{count} избрани"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} използвано",
+ "{used} of {quota} used" : "{used} от {quota} използвани",
+ "{relative}% used" : "{relative}% използвано",
+ "Could not refresh storage stats" : "Статистиката за хранилище не можа да се обнови",
+ "Your storage is full, files can not be updated or synced anymore!" : "Хранилището е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
+ "New folder" : "Нова папка",
+ "Create new folder" : "Създай нова папка",
+ "Create" : "Създаване",
+ "Submit" : "Изпращане",
"Choose a file or folder to transfer" : "Избор на файл или папка за прехвърляне",
"Transfer" : "Прехвърли",
"Transfer {path} to {userid}" : "Прехвърляне на {path} към {userid}",
"Invalid path selected" : "Предоставен е невалиден път до файл.",
+ "Unknown error" : "Неизвестна грешка",
"Ownership transfer request sent" : "Изпратена заявка за прехвърляне на собствеността",
- "Cannot transfer ownership of a file or folder you don't own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате",
- "Tags" : "Етикети",
- "Unable to change the favourite state of the file" : "Не може да се промени състоянието за предпочитане на файла",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате",
+ "Transfer ownership of a file or folder" : "Прехвърляне на собственост на файл или папка",
+ "Choose file or folder to transfer" : "Избор на файл или папка за прехвърляне",
+ "Change" : "Промени",
+ "New owner" : "Нов собственик",
+ "Select file or folder to link to" : "Избор на файл или папка, към които да поставите връзка",
+ "Share" : "Споделяне",
+ "Shared by link" : "Споделени с връзка",
+ "Shared" : "Споделен",
+ "Switch to list view" : "Превключване към изглед на списък",
+ "Not enough free space" : "Няма достатъчно свободно място",
+ "Operation is blocked by access control" : "Операцията се блокира от контрол на достъпа",
+ "Loading current folder" : "Зареждане на текущата папка",
+ "Retry" : "Опитай отново",
+ "No files in here" : "Няма файлове",
+ "Upload some content or sync with your devices!" : "Качете съдържание или синхронизирайте с вашите устройства!",
+ "Go back" : "Назад",
+ "Views" : "Изгледи",
+ "Files settings" : "Настройки на файловете",
+ "File cannot be accessed" : "Файлът не е достъпен",
+ "Clipboard is not available" : "Клипбордът не е достъпен",
+ "General" : "Общи",
+ "All files" : "Всички файлове",
+ "Personal files" : "Лични файлове",
+ "Appearance" : "Изглед",
+ "Show hidden files" : "Показвай и скрити файлове",
+ "Crop image previews" : "Изрязване на визуализациите на изображение",
+ "Additional settings" : "Допълнителни настройки",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Копирай",
+ "Keyboard shortcuts" : "Бързи клавиши",
+ "File actions" : "Действия с файлове",
+ "Rename" : "Преименувай",
+ "Delete" : "Изтрий",
+ "Manage tags" : "Управление на маркери",
+ "Selection" : "Избор",
+ "Deselect all" : "Откажи всички избрани",
+ "Navigation" : "Навигация",
+ "View" : "Изглед",
+ "Toggle grid view" : "Превключи решетъчния изглед",
"Error while loading the file data" : "Грешка при зареждането на файловете.",
+ "Owner" : "Създател",
+ "Remove from favorites" : "Премахни от любимите",
+ "Add to favorites" : "Добави към любимите",
+ "Tags" : "Етикети",
+ "Blank" : "Празен",
+ "Unable to create new file from template" : "Не може да се създаде нов файл от шаблон",
"Pick a template for {name}" : "Избор на шаблон за {name}",
- "Cancel" : "Отказ",
- "Create" : "Създаване",
"Create a new file with the selected template" : "Създаване на нов файл с избрания шаблон",
"Creating file" : "Създаване на файл ",
- "Blank" : "Празен",
- "Unable to create new file from template" : "Не може да се създаде нов файл от шаблон",
- "Set up templates folder" : "Настройка на папка за шаблони",
- "Templates" : "Шаблони",
+ "_One file successfully converted_::_%n files successfully converted_" : ["Един файл е успешно преобразуван","%nфайловете са успешно преобразувани"],
+ "Files successfully converted" : "Файловете са успешно преобразувани",
+ "File successfully converted" : "Файлът е успешно преобразуван",
+ "Disconnect storage" : "Извади хранилището",
+ "Delete permanently" : "Изтрий завинаги",
+ "Delete file" : "Изтриване на файлове",
+ "Delete files" : "Изтриване на файлове",
+ "Delete folder" : "Изтриване на папка",
+ "Cancel" : "Отказ",
+ "Download" : "Изтегли",
+ "Move" : "Преместване",
+ "Move or copy" : "Премести или копирай",
+ "Open locally" : "Локално отваряне",
+ "Failed to redirect to client" : "Неуспешно пренасочване към клиент",
+ "Open file locally" : "Локално отваряне на файл",
+ "Details" : "Подробности",
+ "View in folder" : "Преглед в папката",
+ "Today" : "Днес",
+ "Last 7 days" : "Последни 7 дни",
+ "Last 30 days" : "Последните 30 дни",
+ "Documents" : "Документи",
+ "Folders" : "Папки",
+ "Audio" : "Аудио",
+ "Images" : "Изображения",
+ "Videos" : "Видеа",
"Unable to initialize the templates directory" : "Неуспешно инициализиране на директорията с шаблони",
- "%s used" : "%s използвани",
- "%s%% of %s used" : "%s%% от %s използвани",
- "%1$s of %2$s used" : "%1$s от %2$s използвани",
- "Settings" : "Настройки",
- "Show hidden files" : "Показвай и скрити файлове",
- "Crop image previews" : "Изрязване на визуализациите на изображение",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
- "Toggle %1$s sublist" : "Превключване на %1$s подсписък ",
- "Toggle grid view" : "Превключи решетъчния изглед",
- "No files in here" : "Няма файлове",
- "Upload some content or sync with your devices!" : "Качете съдържание или синхронизирайте с вашите устройства!",
+ "Templates" : "Шаблони",
+ "Search in folder: {folder}" : "Търси в папка: {folder}",
+ "Files uploaded successfully" : "Файловете са качени успешно",
+ "Some files could not be moved" : "Някои файлове не могат да бъдат преместени",
+ "Files copied successfully" : "Файловете са успешно копирани",
+ "Files moved successfully" : "Файловете са преместени успешно",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Файлът \"{oldName}\" не може да бъде преименуван защото не съществува",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{newName}\" се ползва в директорията \"{dir}\". Моля, изберете друго име.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" не може да бъде преименуван",
+ "This operation is forbidden" : "Операцията е забранена",
+ "Storage is temporarily not available" : "Временно хранилището не е налично",
+ "_%n file_::_%n files_" : ["%n файл","%n файла"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
+ "List of favorite files and folders." : "Списък с любими файлове и папки.",
+ "No favorites yet" : "Няма любими",
+ "Files and folders you mark as favorite will show up here" : "Файловете и папките които маркирате като любими ще се показват тук",
+ "No personal files found" : "Не са открити лични файлове",
+ "Recent" : "Последни",
+ "Search" : "Търсене",
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
"Upload too large" : "Прекалено голям файл за качване",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитвате да качите са по-големи от позволеното на сървъра.",
- "No favorites yet" : "Няма любими",
- "Files and folders you mark as favorite will show up here" : "Файловете и папките които маркирате като любими ще се показват тук",
- "Deleted files" : "Изтрити файлове",
- "Shares" : "Споделени",
- "Shared with others" : "Споделени с други",
- "Shared with you" : "Споделени с вас",
- "Shared by link" : "Споделени с връзка",
- "Deleted shares" : "Изтрити",
- "Pending shares" : "Чакащи споделяния",
+ "File could not be found" : "Файлът не може да бъде намерен",
+ "Show list view" : "Показване с изглед на списък",
+ "Show grid view" : "Показване в решетъчен изглед",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена",
+ "This will stop your current uploads." : "Това ще прекрати всички ваши текущи процеси по качване на файлове.",
+ "Upload cancelled." : "Качването е прекъснато.",
+ "Processing files …" : "Обработване на файлове ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Дестинацията \"{dir}\" не съществува",
+ "An unknown error has occurred" : "Възникна неизвестна грешка",
+ "File could not be uploaded" : " Файлът не може да бъде качен",
+ "Uploading …" : "Качване …",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} от {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Качването на такъв файл не се поддържа",
+ "Error when assembling chunks, status code {status}" : "Грешка при асемлиране на парчетата, код {status}",
+ "Choose target folder" : "Избор на папка",
+ "Edit locally" : "Локално редактиране",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Информацията за файла \"{file}\" не може да бъде заредена",
+ "Please select tag(s) to add to the selection" : "Моля, изберете етикет(и), който да добавите към селекцията",
+ "Apply tag(s) to selection" : "Прилагане на етикет(и) към селекцията",
+ "Select directory \"{dirName}\"" : "Избор на директория „{dirName}“",
+ "Select file \"{fileName}\"" : "Избор на файл \"{fileName}\"",
+ "Unable to determine date" : "Неуспешно установяване на дата",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора",
+ "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен, дестинацията съществува",
+ "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен",
+ "copy" : "Копиране",
+ "Could not copy \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде копиран, дестинацията съществува",
+ "Could not copy \"{file}\"" : "Файлът \"{file}\" не може да бъде копиран",
+ "Copied {origin} inside {destination}" : "Копирано {origin} в {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирано {origin} и {nbfiles} други файлове в {destination}",
+ "{newName} already exists" : "{newName} вече съществува",
+ "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден",
+ "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува",
+ "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува",
+ "Could not fetch file details \"{file}\"" : "Подробностите за файла „{file}“ не можаха да бъдат извлечени",
+ "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Няма резултати от търсенето в други папки за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Въведете повече от два знака за търсене в други папки",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"],
+ "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук",
+ "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"],
+ "New" : "Нов",
+ "New file/folder menu" : "Ново меню за файл/папка",
+ "Select file range" : "Избери от файловете",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} използвани",
+ "\"{name}\" is an invalid file name." : "\"{name}\" е непозволено име за файл.",
+ "File name cannot be empty." : "Името на файла не може да бъде оставено празно.",
+ "\"/\" is not allowed inside a file name." : "\"/\" е непозволен знак в името на файла.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" не е разрешен тип файл",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Хранилището на {owner} е запълнено и файловете вече не могат да се актуализират или синхронизират!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Вашето хранилище запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповата папка \"{mountPoint}“ е почти пълна ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Външното хранилище е \"{mountPoint}“ е почти пълно ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["съвпада с \"{filter}\"","съвпада с \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Директната връзка е копирана (ще работи само за хора, които имат достъп до този файл/папка)",
+ "Path" : "Път",
+ "_%n byte_::_%n bytes_" : ["%n байт","%n байта"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирай директна връзка (работи само за хора, които имат достъп до този файл/папка)",
+ "Upload file" : "Качи файл",
+ "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
+ "Upload (max. %s)" : "Качи (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "Действието „{displayName}“ е изпълнено успешно",
+ "\"{displayName}\" action failed" : "Действието „{displayName}“ е неуспешно",
+ "\"{displayName}\" batch action executed successfully" : " Пакетното действие „{displayName}“ е изпълнено успешно",
+ "WebDAV URL copied to clipboard" : "WebDAV URL адрес е копиран в клипборда",
+ "Copy to clipboard" : "Копиране в клипборда",
+ "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
+ "Open details" : "Отваряне на подробности",
+ "Personal Files" : "Лични файлове",
"Text file" : "Текстов файл",
- "New text file.txt" : "Текстов файл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Хранилището на {owner} е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
- "Your storage is full, files can not be updated or synced anymore!" : "Хранилището е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "]
+ "New text file.txt" : "Текстов файл.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/bg.json b/apps/files/l10n/bg.json
index 4cca19c2a23..85475bff136 100644
--- a/apps/files/l10n/bg.json
+++ b/apps/files/l10n/bg.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Временно хранилището не е налично",
- "Storage invalid" : "Невалидно хранилище",
- "Unknown error" : "Неизвестна грешка",
- "File could not be found" : "Файлът не може да бъде намерен",
- "Move or copy" : "Премести или копирай",
- "Download" : "Изтегли",
- "Delete" : "Изтрий",
- "Home" : "Домашен",
- "Close" : "Затвори",
- "Favorites" : "Любими",
- "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена",
- "This will stop your current uploads." : "Това ще прекрати всички ваши текущи процеси по качване на файлове.",
- "Upload cancelled." : "Качването е прекъснато.",
- "Processing files …" : "Обработване на файлове ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Дестинацията \"{dir}\" не съществува",
- "Not enough free space" : "Няма достатъчно свободно място",
- "An unknown error has occurred" : "Възникна неизвестна грешка",
- "Uploading …" : "Качване …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} от {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Качването на такъв файл не се поддържа",
- "Target folder does not exist any more" : "Дестинацията не съществува",
- "Operation is blocked by access control" : "Операцията се блокира от контрол на достъпа",
- "Error when assembling chunks, status code {status}" : "Грешка при асемлиране на парчетата, код {status}",
- "Actions" : "Действия",
- "Rename" : "Преименувай",
- "Copy" : "Копирай",
- "Choose target folder" : "Избор на папка",
- "Open" : "Отвори",
- "Delete file" : "Изтриване на файл",
- "Delete folder" : "Изтриване на папка",
- "Disconnect storage" : "Извади хранилището",
- "Leave this share" : "Напускане на споделянето",
- "Could not load info for file \"{file}\"" : "Информацията за файла \"{file}\" не може да бъде заредена",
- "Files" : "Файлове",
- "Details" : "Подробности",
- "Please select tag(s) to add to the selection" : "Моля, изберете етикет(и), който да добавите към селекцията",
- "Apply tag(s) to selection" : "Прилагане на етикет(и) към селекцията",
- "Select" : "Избери",
- "Pending" : "Чакащо",
- "Unable to determine date" : "Неуспешно установяване на дата",
- "This operation is forbidden" : "Операцията е забранена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора",
- "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен, дестинацията съществува",
- "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен",
- "copy" : "Копиране",
- "Could not copy \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде копиран, дестинацията съществува",
- "Could not copy \"{file}\"" : "Файлът \"{file}\" не може да бъде копиран",
- "Copied {origin} inside {destination}" : "Копирано {origin} в {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирано {origin} и {nbfiles} други файлове в {destination}",
- "{newName} already exists" : "{newName} вече съществува",
- "Could not rename \"{fileName}\", it does not exist any more" : "Файлът \"{fileName}\" не може да бъде преименуван защото не съществува",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" се ползва в директорията \"{dir}\". Моля, изберете друго име.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" не може да бъде преименуван",
- "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден",
- "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува",
- "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува",
- "Could not fetch file details \"{file}\"" : "Подробностите за файла „{file}“ не можаха да бъдат извлечени",
- "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Няма резултати от търсенето в други папки за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Въведете повече от два знака за търсене в други папки",
- "Name" : "Име",
- "Size" : "Размер",
- "Modified" : "Промяна",
- "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
- "_%n file_::_%n files_" : ["%n файл","%n файла"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"],
- "You don’t have permission to upload or create files here" : "Нямаш разрешение да създаваш или качваш файлове тук.",
- "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"],
- "New" : "Създай",
- "Select file range" : "Избери от файловете",
- "{used} of {quota} used" : "{used} от {quota} използвани",
- "{used} used" : "{used} използвани",
- "\"{name}\" is an invalid file name." : "\"{name}\" е непозволено име за файл.",
- "File name cannot be empty." : "Името на файла не може да бъде оставено празно.",
- "\"/\" is not allowed inside a file name." : "\"/\" е непозволен знак в името на файла.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" не е разрешен тип файл",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Хранилището на {owner} е запълнено и файловете вече не могат да се актуализират или синхронизират!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Вашето хранилище запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповата папка \"{mountPoint}“ е почти пълна ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Външното хранилище е \"{mountPoint}“ е почти пълно ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["съвпада с \"{filter}\"","съвпада с \"{filter}\""],
- "View in folder" : "Преглед в папката",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирай директната връзка (ще работи само за потребители с достъп до файла/папката)",
- "Path" : "Път",
- "_%n byte_::_%n bytes_" : ["%n байт","%n байта"],
- "Favorited" : "Отбелязано в любими",
- "Favorite" : "Любими",
- "You can only favorite a single file or folder at a time" : "Можете да предпочетете само един файл или папка наведнъж",
- "New folder" : "Нова папка",
- "Upload file" : "Качи файл",
- "Recent" : "Последни",
- "Not favorited" : "Премахни от любими",
- "Remove from favorites" : "Премахни от любимите",
- "Add to favorites" : "Добави към любимите",
- "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
"Added to favorites" : "Добавено към любимите",
"Removed from favorites" : "Премахни от любимите",
"You added {file} to your favorites" : "Добавихте {file} към любимите",
"You removed {file} from your favorites" : "Премахнахте {file} от любимите",
+ "Favorites" : "Любими",
"File changes" : "Файлови промени",
"Created by {user}" : "Създаден от {user}",
"Changed by {user}" : "Променен от {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Възстановен от {user}",
"Renamed by {user}" : "Преименуван от {user}",
"Moved by {user}" : "Преместен от {user}",
- "\"remote user\"" : "\"отдалечен потребител\"",
+ "\"remote account\"" : "\"профил за отдалечен достъп\"",
"You created {file}" : "Създадохте {file}",
"You created an encrypted file in {file}" : "Създадохте криптиран файл в {file}",
"{user} created {file}" : "{user} създаде {file}",
@@ -141,11 +38,11 @@
"You moved {oldfile} to {newfile}" : "Преместихте {oldfile} в {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} премести {oldfile} в {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Добавяне или премахване на файл от <strong>любимите</strong> ви",
+ "Files" : "Файлове",
"A file or folder has been <strong>changed</strong>" : "<strong>Промяна</strong> на файл / папка",
"A favorite file or folder has been <strong>changed</strong>" : "Предпочетен файл или папка е <strong>променен</strong>",
- "All files" : "Всички файлове",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Качи (макс. %s)",
+ "Favorite files" : "Любими файлове",
+ "No favorites" : "Няма любими",
"Accept" : "Приемане",
"Reject" : "Откажи",
"Incoming ownership transfer from {user}" : "Входящо прехвърляне на собственост от {user}",
@@ -158,61 +55,223 @@
"The ownership transfer of {path} from {user} has completed." : "Прехвърлянето на собственост на {path} към {user} е завършено.",
"in %s" : "в %s",
"File Management" : "Управление на файлове",
- "Transfer ownership of a file or folder" : "Прехвърляне на собственост на файл или папка",
- "Choose file or folder to transfer" : "Избор на файл или папка за прехвърляне",
- "Change" : "Промени",
- "New owner" : "Нов собственик",
- "Search users" : "Търсене за потребители",
+ "Home" : "Домашен",
+ "Target folder does not exist any more" : "Дестинацията не съществува",
+ "Reload current directory" : "Презареждане на текущата директория",
+ "Go to the \"{dir}\" directory" : "Отидете в директорията \"{dir}\"",
+ "Favorite" : "Любими",
+ "Filename" : "Име на файла",
+ "Folder name" : "Име на папка",
+ "Folder" : "Папка",
+ "Pending" : "Чакащо",
+ "Clear filter" : "Изчстиване на филтър",
+ "Modified" : "Промяна",
+ "Search everywhere" : "Търси навсякъде",
+ "Type" : "Тип",
+ "Active filters" : "Актижни филтри",
+ "Remove filter" : "Премахни филтър",
+ "Total rows summary" : "Обобщение на общия брой редове",
+ "Name" : "Име",
+ "Size" : "Размер",
+ "Actions" : "Действия",
+ "File not found" : "Файлът не е намерен",
+ "_{count} selected_::_{count} selected_" : ["{count} избрани","{count} избрани"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} използвано",
+ "{used} of {quota} used" : "{used} от {quota} използвани",
+ "{relative}% used" : "{relative}% използвано",
+ "Could not refresh storage stats" : "Статистиката за хранилище не можа да се обнови",
+ "Your storage is full, files can not be updated or synced anymore!" : "Хранилището е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
+ "New folder" : "Нова папка",
+ "Create new folder" : "Създай нова папка",
+ "Create" : "Създаване",
+ "Submit" : "Изпращане",
"Choose a file or folder to transfer" : "Избор на файл или папка за прехвърляне",
"Transfer" : "Прехвърли",
"Transfer {path} to {userid}" : "Прехвърляне на {path} към {userid}",
"Invalid path selected" : "Предоставен е невалиден път до файл.",
+ "Unknown error" : "Неизвестна грешка",
"Ownership transfer request sent" : "Изпратена заявка за прехвърляне на собствеността",
- "Cannot transfer ownership of a file or folder you don't own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате",
- "Tags" : "Етикети",
- "Unable to change the favourite state of the file" : "Не може да се промени състоянието за предпочитане на файла",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате",
+ "Transfer ownership of a file or folder" : "Прехвърляне на собственост на файл или папка",
+ "Choose file or folder to transfer" : "Избор на файл или папка за прехвърляне",
+ "Change" : "Промени",
+ "New owner" : "Нов собственик",
+ "Select file or folder to link to" : "Избор на файл или папка, към които да поставите връзка",
+ "Share" : "Споделяне",
+ "Shared by link" : "Споделени с връзка",
+ "Shared" : "Споделен",
+ "Switch to list view" : "Превключване към изглед на списък",
+ "Not enough free space" : "Няма достатъчно свободно място",
+ "Operation is blocked by access control" : "Операцията се блокира от контрол на достъпа",
+ "Loading current folder" : "Зареждане на текущата папка",
+ "Retry" : "Опитай отново",
+ "No files in here" : "Няма файлове",
+ "Upload some content or sync with your devices!" : "Качете съдържание или синхронизирайте с вашите устройства!",
+ "Go back" : "Назад",
+ "Views" : "Изгледи",
+ "Files settings" : "Настройки на файловете",
+ "File cannot be accessed" : "Файлът не е достъпен",
+ "Clipboard is not available" : "Клипбордът не е достъпен",
+ "General" : "Общи",
+ "All files" : "Всички файлове",
+ "Personal files" : "Лични файлове",
+ "Appearance" : "Изглед",
+ "Show hidden files" : "Показвай и скрити файлове",
+ "Crop image previews" : "Изрязване на визуализациите на изображение",
+ "Additional settings" : "Допълнителни настройки",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Копирай",
+ "Keyboard shortcuts" : "Бързи клавиши",
+ "File actions" : "Действия с файлове",
+ "Rename" : "Преименувай",
+ "Delete" : "Изтрий",
+ "Manage tags" : "Управление на маркери",
+ "Selection" : "Избор",
+ "Deselect all" : "Откажи всички избрани",
+ "Navigation" : "Навигация",
+ "View" : "Изглед",
+ "Toggle grid view" : "Превключи решетъчния изглед",
"Error while loading the file data" : "Грешка при зареждането на файловете.",
+ "Owner" : "Създател",
+ "Remove from favorites" : "Премахни от любимите",
+ "Add to favorites" : "Добави към любимите",
+ "Tags" : "Етикети",
+ "Blank" : "Празен",
+ "Unable to create new file from template" : "Не може да се създаде нов файл от шаблон",
"Pick a template for {name}" : "Избор на шаблон за {name}",
- "Cancel" : "Отказ",
- "Create" : "Създаване",
"Create a new file with the selected template" : "Създаване на нов файл с избрания шаблон",
"Creating file" : "Създаване на файл ",
- "Blank" : "Празен",
- "Unable to create new file from template" : "Не може да се създаде нов файл от шаблон",
- "Set up templates folder" : "Настройка на папка за шаблони",
- "Templates" : "Шаблони",
+ "_One file successfully converted_::_%n files successfully converted_" : ["Един файл е успешно преобразуван","%nфайловете са успешно преобразувани"],
+ "Files successfully converted" : "Файловете са успешно преобразувани",
+ "File successfully converted" : "Файлът е успешно преобразуван",
+ "Disconnect storage" : "Извади хранилището",
+ "Delete permanently" : "Изтрий завинаги",
+ "Delete file" : "Изтриване на файлове",
+ "Delete files" : "Изтриване на файлове",
+ "Delete folder" : "Изтриване на папка",
+ "Cancel" : "Отказ",
+ "Download" : "Изтегли",
+ "Move" : "Преместване",
+ "Move or copy" : "Премести или копирай",
+ "Open locally" : "Локално отваряне",
+ "Failed to redirect to client" : "Неуспешно пренасочване към клиент",
+ "Open file locally" : "Локално отваряне на файл",
+ "Details" : "Подробности",
+ "View in folder" : "Преглед в папката",
+ "Today" : "Днес",
+ "Last 7 days" : "Последни 7 дни",
+ "Last 30 days" : "Последните 30 дни",
+ "Documents" : "Документи",
+ "Folders" : "Папки",
+ "Audio" : "Аудио",
+ "Images" : "Изображения",
+ "Videos" : "Видеа",
"Unable to initialize the templates directory" : "Неуспешно инициализиране на директорията с шаблони",
- "%s used" : "%s използвани",
- "%s%% of %s used" : "%s%% от %s използвани",
- "%1$s of %2$s used" : "%1$s от %2$s използвани",
- "Settings" : "Настройки",
- "Show hidden files" : "Показвай и скрити файлове",
- "Crop image previews" : "Изрязване на визуализациите на изображение",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
- "Toggle %1$s sublist" : "Превключване на %1$s подсписък ",
- "Toggle grid view" : "Превключи решетъчния изглед",
- "No files in here" : "Няма файлове",
- "Upload some content or sync with your devices!" : "Качете съдържание или синхронизирайте с вашите устройства!",
+ "Templates" : "Шаблони",
+ "Search in folder: {folder}" : "Търси в папка: {folder}",
+ "Files uploaded successfully" : "Файловете са качени успешно",
+ "Some files could not be moved" : "Някои файлове не могат да бъдат преместени",
+ "Files copied successfully" : "Файловете са успешно копирани",
+ "Files moved successfully" : "Файловете са преместени успешно",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Файлът \"{oldName}\" не може да бъде преименуван защото не съществува",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{newName}\" се ползва в директорията \"{dir}\". Моля, изберете друго име.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" не може да бъде преименуван",
+ "This operation is forbidden" : "Операцията е забранена",
+ "Storage is temporarily not available" : "Временно хранилището не е налично",
+ "_%n file_::_%n files_" : ["%n файл","%n файла"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
+ "List of favorite files and folders." : "Списък с любими файлове и папки.",
+ "No favorites yet" : "Няма любими",
+ "Files and folders you mark as favorite will show up here" : "Файловете и папките които маркирате като любими ще се показват тук",
+ "No personal files found" : "Не са открити лични файлове",
+ "Recent" : "Последни",
+ "Search" : "Търсене",
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
"Upload too large" : "Прекалено голям файл за качване",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитвате да качите са по-големи от позволеното на сървъра.",
- "No favorites yet" : "Няма любими",
- "Files and folders you mark as favorite will show up here" : "Файловете и папките които маркирате като любими ще се показват тук",
- "Deleted files" : "Изтрити файлове",
- "Shares" : "Споделени",
- "Shared with others" : "Споделени с други",
- "Shared with you" : "Споделени с вас",
- "Shared by link" : "Споделени с връзка",
- "Deleted shares" : "Изтрити",
- "Pending shares" : "Чакащи споделяния",
+ "File could not be found" : "Файлът не може да бъде намерен",
+ "Show list view" : "Показване с изглед на списък",
+ "Show grid view" : "Показване в решетъчен изглед",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена",
+ "This will stop your current uploads." : "Това ще прекрати всички ваши текущи процеси по качване на файлове.",
+ "Upload cancelled." : "Качването е прекъснато.",
+ "Processing files …" : "Обработване на файлове ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Дестинацията \"{dir}\" не съществува",
+ "An unknown error has occurred" : "Възникна неизвестна грешка",
+ "File could not be uploaded" : " Файлът не може да бъде качен",
+ "Uploading …" : "Качване …",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} от {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Качването на такъв файл не се поддържа",
+ "Error when assembling chunks, status code {status}" : "Грешка при асемлиране на парчетата, код {status}",
+ "Choose target folder" : "Избор на папка",
+ "Edit locally" : "Локално редактиране",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Информацията за файла \"{file}\" не може да бъде заредена",
+ "Please select tag(s) to add to the selection" : "Моля, изберете етикет(и), който да добавите към селекцията",
+ "Apply tag(s) to selection" : "Прилагане на етикет(и) към селекцията",
+ "Select directory \"{dirName}\"" : "Избор на директория „{dirName}“",
+ "Select file \"{fileName}\"" : "Избор на файл \"{fileName}\"",
+ "Unable to determine date" : "Неуспешно установяване на дата",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора",
+ "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен, дестинацията съществува",
+ "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен",
+ "copy" : "Копиране",
+ "Could not copy \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде копиран, дестинацията съществува",
+ "Could not copy \"{file}\"" : "Файлът \"{file}\" не може да бъде копиран",
+ "Copied {origin} inside {destination}" : "Копирано {origin} в {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирано {origin} и {nbfiles} други файлове в {destination}",
+ "{newName} already exists" : "{newName} вече съществува",
+ "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден",
+ "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува",
+ "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува",
+ "Could not fetch file details \"{file}\"" : "Подробностите за файла „{file}“ не можаха да бъдат извлечени",
+ "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Няма резултати от търсенето в други папки за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Въведете повече от два знака за търсене в други папки",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"],
+ "You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук",
+ "_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"],
+ "New" : "Нов",
+ "New file/folder menu" : "Ново меню за файл/папка",
+ "Select file range" : "Избери от файловете",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} използвани",
+ "\"{name}\" is an invalid file name." : "\"{name}\" е непозволено име за файл.",
+ "File name cannot be empty." : "Името на файла не може да бъде оставено празно.",
+ "\"/\" is not allowed inside a file name." : "\"/\" е непозволен знак в името на файла.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" не е разрешен тип файл",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Хранилището на {owner} е запълнено и файловете вече не могат да се актуализират или синхронизират!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Вашето хранилище запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповата папка \"{mountPoint}“ е почти пълна ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Външното хранилище е \"{mountPoint}“ е почти пълно ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["съвпада с \"{filter}\"","съвпада с \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Директната връзка е копирана (ще работи само за хора, които имат достъп до този файл/папка)",
+ "Path" : "Път",
+ "_%n byte_::_%n bytes_" : ["%n байт","%n байта"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирай директна връзка (работи само за хора, които имат достъп до този файл/папка)",
+ "Upload file" : "Качи файл",
+ "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
+ "Upload (max. %s)" : "Качи (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "Действието „{displayName}“ е изпълнено успешно",
+ "\"{displayName}\" action failed" : "Действието „{displayName}“ е неуспешно",
+ "\"{displayName}\" batch action executed successfully" : " Пакетното действие „{displayName}“ е изпълнено успешно",
+ "WebDAV URL copied to clipboard" : "WebDAV URL адрес е копиран в клипборда",
+ "Copy to clipboard" : "Копиране в клипборда",
+ "Use this address to access your Files via WebDAV" : "Ползвайте този адрес за достъп до файловете си чрез WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
+ "Open details" : "Отваряне на подробности",
+ "Personal Files" : "Лични файлове",
"Text file" : "Текстов файл",
- "New text file.txt" : "Текстов файл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Хранилището на {owner} е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
- "Your storage is full, files can not be updated or synced anymore!" : "Хранилището е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
- "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "]
+ "New text file.txt" : "Текстов файл.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js
deleted file mode 100644
index 43a8fc62fa6..00000000000
--- a/apps/files/l10n/bn_BD.js
+++ /dev/null
@@ -1,65 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "সংরক্ষণের স্থান নেই",
- "Storage invalid" : "সংরক্ষণাগার বৈধ নয়",
- "Unknown error" : "অজানা জটিলতা",
- "Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।",
- "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।",
- "There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইলটি php.ini তে বর্ণিত upload_max_filesize নির্দেশিত আয়তন অতিক্রম করছেঃ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "আপলোড করা ফাইলটি HTML ফর্মে উল্লিখিত MAX_FILE_SIZE নির্ধারিত ফাইলের সর্বোচ্চ আকার অতিক্রম করতে চলেছে ",
- "The uploaded file was only partially uploaded" : "আপলোড করা ফাইলটি আংশিক আপলোড করা হয়েছে",
- "No file was uploaded" : "কোন ফাইল আপলোড করা হয় নি",
- "Missing a temporary folder" : "অস্থায়ী ফোল্ডারটি হারানো গিয়েছে",
- "Failed to write to disk" : "ডিস্কে লিখতে ব্যর্থ",
- "Not enough storage available" : "সংরক্ষণের যথেষ্ট জায়গা প্রাপ্তব্য নয়",
- "Invalid directory." : "ভুল ডিরেক্টরি",
- "Files" : "ফাইল",
- "All files" : "সব ফাইল",
- "Home" : "নিবাস",
- "Close" : "বন্ধ",
- "Favorites" : "প্রিয়জন",
- "Upload cancelled." : "আপলোড বাতিল করা হয়েছে।",
- "Uploading..." : "আপলোড করা হচ্ছে..........",
- "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
- "Actions" : "পদক্ষেপসমূহ",
- "Download" : "ডাউনলোড",
- "Rename" : "পূনঃনামকরণ",
- "Delete" : "মুছে",
- "Unshare" : "ভাগাভাগি বাতিল ",
- "Details" : "বিস্তারিত",
- "Pending" : "মুলতুবি",
- "Name" : "রাম",
- "Size" : "আকার",
- "Modified" : "পরিবর্তিত",
- "_Uploading %n file_::_Uploading %n files_" : ["%n ফাইল আপলোড হচ্ছে","%n ফাইল আপলোড হচ্ছে"],
- "New" : "নতুন",
- "\"{name}\" is an invalid file name." : "\"{name}\" টি একটি অননুমোদিত ফাইল নাম।",
- "File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।",
- "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ",
- "Favorite" : "প্রিয়জন",
- "Folder" : "ফোল্ডার",
- "New folder" : "নব ফােলডার",
- "Upload" : "আপলোড",
- "A new file or folder has been <strong>created</strong>" : "একটি ফাইল বা ফোলডার <strong>তৈরি</strong> করা হয়েছে",
- "A file or folder has been <strong>changed</strong>" : "একটি ফাইল বা ফোলডার <strong>পরিবরতন</strong> করা হয়েছে",
- "A file or folder has been <strong>deleted</strong>" : "একটি ফাইল বা ফোলডার <strong>মোছা</strong> হয়েছে",
- "You created %1$s" : "আপনি তৈরি করেছেন %1$s",
- "%2$s created %1$s" : "%2$s তৈরি হয়েছে %1$s",
- "%1$s was created in a public folder" : "একটি পাবলিক ফোল্ডারে %1$s তৈরী করা হয়েছে",
- "You changed %1$s" : "আপনি পরিবরতন করেছেন %1$s",
- "%2$s changed %1$s" : "%2$s পরিবরতন করেছে %1$s",
- "You deleted %1$s" : "আপনি ডিলিট করেছেন %1$s",
- "%2$s deleted %1$s" : "%2$s ডিলিট করেছে %1$s",
- "File handling" : "ফাইল হ্যার্ডলিং",
- "Maximum upload size" : "আপলোডের সর্বোচ্চ আকার",
- "max. possible: " : "অনুমোদিত সর্বোচ্চ আকার",
- "Save" : "সংরক্ষণ",
- "Settings" : "নিয়ামকসমূহ",
- "WebDAV" : "WebDAV",
- "Upload too large" : "আপলোডের আকারটি অনেক বড়",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
- "Text file" : "টেক্সট ফাইল"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json
deleted file mode 100644
index dc114d13a17..00000000000
--- a/apps/files/l10n/bn_BD.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{ "translations": {
- "Storage not available" : "সংরক্ষণের স্থান নেই",
- "Storage invalid" : "সংরক্ষণাগার বৈধ নয়",
- "Unknown error" : "অজানা জটিলতা",
- "Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।",
- "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।",
- "There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইলটি php.ini তে বর্ণিত upload_max_filesize নির্দেশিত আয়তন অতিক্রম করছেঃ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "আপলোড করা ফাইলটি HTML ফর্মে উল্লিখিত MAX_FILE_SIZE নির্ধারিত ফাইলের সর্বোচ্চ আকার অতিক্রম করতে চলেছে ",
- "The uploaded file was only partially uploaded" : "আপলোড করা ফাইলটি আংশিক আপলোড করা হয়েছে",
- "No file was uploaded" : "কোন ফাইল আপলোড করা হয় নি",
- "Missing a temporary folder" : "অস্থায়ী ফোল্ডারটি হারানো গিয়েছে",
- "Failed to write to disk" : "ডিস্কে লিখতে ব্যর্থ",
- "Not enough storage available" : "সংরক্ষণের যথেষ্ট জায়গা প্রাপ্তব্য নয়",
- "Invalid directory." : "ভুল ডিরেক্টরি",
- "Files" : "ফাইল",
- "All files" : "সব ফাইল",
- "Home" : "নিবাস",
- "Close" : "বন্ধ",
- "Favorites" : "প্রিয়জন",
- "Upload cancelled." : "আপলোড বাতিল করা হয়েছে।",
- "Uploading..." : "আপলোড করা হচ্ছে..........",
- "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
- "Actions" : "পদক্ষেপসমূহ",
- "Download" : "ডাউনলোড",
- "Rename" : "পূনঃনামকরণ",
- "Delete" : "মুছে",
- "Unshare" : "ভাগাভাগি বাতিল ",
- "Details" : "বিস্তারিত",
- "Pending" : "মুলতুবি",
- "Name" : "রাম",
- "Size" : "আকার",
- "Modified" : "পরিবর্তিত",
- "_Uploading %n file_::_Uploading %n files_" : ["%n ফাইল আপলোড হচ্ছে","%n ফাইল আপলোড হচ্ছে"],
- "New" : "নতুন",
- "\"{name}\" is an invalid file name." : "\"{name}\" টি একটি অননুমোদিত ফাইল নাম।",
- "File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।",
- "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ",
- "Favorite" : "প্রিয়জন",
- "Folder" : "ফোল্ডার",
- "New folder" : "নব ফােলডার",
- "Upload" : "আপলোড",
- "A new file or folder has been <strong>created</strong>" : "একটি ফাইল বা ফোলডার <strong>তৈরি</strong> করা হয়েছে",
- "A file or folder has been <strong>changed</strong>" : "একটি ফাইল বা ফোলডার <strong>পরিবরতন</strong> করা হয়েছে",
- "A file or folder has been <strong>deleted</strong>" : "একটি ফাইল বা ফোলডার <strong>মোছা</strong> হয়েছে",
- "You created %1$s" : "আপনি তৈরি করেছেন %1$s",
- "%2$s created %1$s" : "%2$s তৈরি হয়েছে %1$s",
- "%1$s was created in a public folder" : "একটি পাবলিক ফোল্ডারে %1$s তৈরী করা হয়েছে",
- "You changed %1$s" : "আপনি পরিবরতন করেছেন %1$s",
- "%2$s changed %1$s" : "%2$s পরিবরতন করেছে %1$s",
- "You deleted %1$s" : "আপনি ডিলিট করেছেন %1$s",
- "%2$s deleted %1$s" : "%2$s ডিলিট করেছে %1$s",
- "File handling" : "ফাইল হ্যার্ডলিং",
- "Maximum upload size" : "আপলোডের সর্বোচ্চ আকার",
- "max. possible: " : "অনুমোদিত সর্বোচ্চ আকার",
- "Save" : "সংরক্ষণ",
- "Settings" : "নিয়ামকসমূহ",
- "WebDAV" : "WebDAV",
- "Upload too large" : "আপলোডের আকারটি অনেক বড়",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
- "Text file" : "টেক্সট ফাইল"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/br.js b/apps/files/l10n/br.js
deleted file mode 100644
index 83dfea19712..00000000000
--- a/apps/files/l10n/br.js
+++ /dev/null
@@ -1,192 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "N'haller ket tizhout ar skor roadennoù evit ar poent",
- "Storage invalid" : "N'eo c'hall ket bezañ ar skor roadennoù-mañ",
- "Unknown error" : "Fazi dizanv",
- "File could not be found" : "N'eo ket bet kavet ar restr",
- "Move or copy" : "Dilec'hiañ pe eilañ",
- "Download" : "Pellgargañ",
- "Delete" : "Lemel",
- "Home" : "Degemer",
- "Close" : "Serriñ",
- "Favorites" : "Pennrolloù",
- "Could not create folder \"{dir}\"" : "Dibosupl eo krouiñ an teuliad \"{dir}\"",
- "This will stop your current uploads." : "Paouez a raio ho kasadennoù.",
- "Upload cancelled." : "Kasadenn nullet.",
- "Processing files …" : "Graet e vez war dro ar restroù ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Dibosupl eo kas {filename} evel emañ un teuliad pe ez eus 0 bytes anezhañ",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "N'eus ket trawalc'h a blas: o klask kas {size1} emaoc'h met n'eus nemet {size2} dieub",
- "Target folder \"{dir}\" does not exist any more" : "An teuliad \"{dir}\" n'eus ket anezhañ ken",
- "Not enough free space" : "N'eus ket trawalc'h a blas",
- "An unknown error has occurred" : "Ur fazi dizanv a zo bet",
- "Uploading …" : "O pellgas ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} diwar {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "N'haller ket pellgas seurt restroù",
- "Target folder does not exist any more" : "An teuliad n'eus ket anezhañ ken",
- "Error when assembling chunks, status code {status}" : "Ur fazi zo bet en ur dolpañ ar blokoù, kod stad {status}",
- "Actions" : "Oberoù",
- "Rename" : "Adenvel",
- "Copy" : "Eilañ",
- "Choose target folder" : "Dibab an teuliad moned",
- "Open" : "Digeriñ",
- "Delete file" : "Dilemel ar restr",
- "Delete folder" : "Dilemel an teuliad",
- "Disconnect storage" : "Digevreañ ar skor stokañ-mañ",
- "Leave this share" : "Laoskel ar rannadenn",
- "Could not load info for file \"{file}\"" : "Dibosupl eo kargañ titouroù ar restr \"{file}\"",
- "Files" : "Restroù",
- "Details" : "Munudoù",
- "Select" : "Dibab",
- "Pending" : "O c'hortoz",
- "Unable to determine date" : "Dibosupl eo resisaat an deiziat",
- "This operation is forbidden" : "Difennet eo an ober-mañ",
- "This directory is unavailable, please check the logs or contact the administrator" : "N'eus ket tu da dizhout an teuliad-mañ, lennit al logoù pe kit e darempred gant ar merour",
- "Could not move \"{file}\", target exists" : "Dibosupl eo diblasañ \"{file}\", ar bukenn zo anezhi",
- "Could not move \"{file}\"" : "Dibosupl eo diblasañ \"{file}\"",
- "copy" : "eilañ",
- "Could not copy \"{file}\", target exists" : "Dibosupl eo eilañ \"{file}\", ar bukenn zo anezhi",
- "Could not copy \"{file}\"" : "Dibosupl eo eilañ \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} eilet e-barzh {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ha {nbfiles} restr all eilet e-barzh {destination}",
- "{newName} already exists" : "{newName} zo anezhañ dija",
- "Could not rename \"{fileName}\", it does not exist any more" : "Dibosupl eo adenvel \"{fileName}\", n'eus ket anezhan ken",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "An anv \"{targetName}\" a zo implijet en teuliad \\\"{dir}\\\". Trugarez da zibab un anv all.",
- "Could not rename \"{fileName}\"" : "Dibosupl eo adenvel \"{fileName}\"",
- "Could not create file \"{file}\"" : "Dibosupl eo krouiñ ar restr \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Dibosupl eo krouiñ ar restr \"{file}\" peogwir ez eus anezhañ c'hoazh",
- "Could not create folder \"{dir}\" because it already exists" : "Dibosupl eo krouiñ an teuliad \"{dir}\" peogwir ez eus anezhañ c'hoazh",
- "Could not fetch file details \"{file}\"" : "Dibosupl eo adtapout munudoù ar restr \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Ur fazi zo bet en ur ziverkañ ar restr \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Disoc'h ebet e teuliadoù all evit {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Lakait muioc'h eget daou arouez evit klask e teuliadoù all",
- "Name" : "Anv",
- "Size" : "Ment",
- "Modified" : "Cheñchet",
- "_%n folder_::_%n folders_" : ["%nteuliad","%n deuliad","teuliadoù zo","an darn vrasañ eus an teuliadoù","%n teuliad"],
- "_%n file_::_%n files_" : ["%n restr","%n restr","restroù zo","an darn vrasañ eus ar restroù","%n restr"],
- "{dirs} and {files}" : "{dirs} ha {files}",
- "_including %n hidden_::_including %n hidden_" : [" %n koachet en o zouez","%n goachet en o zouez","koachet en o zouez","koachet en o zouez","koachet en o zouez %n"],
- "You don’t have permission to upload or create files here" : "N'och ket aotreet kas pe krouiñ restroù amañ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n restr o vezañ karget","%n restr o vezañ karget","restroù zo o vezañ karget","an darn vrasañ eus ar restroù o vezañ karget","%n restr o vezañ karget"],
- "New" : "Nevez",
- "Select file range" : "Dibab un tachad restroù",
- "{used} of {quota} used" : "{used} diwar {quota} implijet",
- "{used} used" : "{used} implijet",
- "\"{name}\" is an invalid file name." : "N'eo ket \"{name}\" un anv restr aotreet.",
- "File name cannot be empty." : "N'hall ket anv ur restr bezañ goullo.",
- "\"/\" is not allowed inside a file name." : "N'eo ket aotreet \"/\" e anv ur restr.",
- "\"{name}\" is not an allowed filetype" : "N'eo ket \"{name}\" un doare restr aotreet",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lec'h renkañ {owner} a zo kaji leun ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ho lec'h renkañ a zo kaji leun ({usedSpacePercent}%).",
- "View in folder" : "Diskwel en teuliad",
- "Copied!" : "Eilet eo !",
- "Copy direct link (only works for users who have access to this file/folder)" : "Eilañ al liamm eeun (nemet evit an implijourien aotreet da dizhout ar restr-mañ pe an teuliad-mañ)",
- "Path" : "Hent",
- "_%n byte_::_%n bytes_" : ["okted","okted","okted","okted","%n okted"],
- "Favorited" : "Lakaet evel pennroll",
- "Favorite" : "Pennrollañ",
- "You can only favorite a single file or folder at a time" : "Ne c'hallit ouzhpennañ nemet ur pennroll teuliad pe restr en un taol.",
- "New folder" : "Teuliad nevez",
- "Upload file" : "Pellgas ur restr",
- "Recent" : "Nevez",
- "Not favorited" : "N'eo ket bet pennrollet",
- "Remove from favorites" : "Diverkañañ eus ar pennrolloù",
- "Add to favorites" : "Ouzhpennañ er pennrolloù",
- "An error occurred while trying to update the tags" : "Ur fazi a zo bet en ur neveziñ ar c'hlavoù",
- "Added to favorites" : "Ouzhpennet er pennrolloù",
- "Removed from favorites" : "Diverket eus ar pennrolloù",
- "You added {file} to your favorites" : "Ouzhpennet ho peus {file} en ho pennrolloù",
- "You removed {file} from your favorites" : "Diverket ho peus {file} eus ho pennrolloù",
- "File changes" : "Cheñch ar restroù",
- "Created by {user}" : "Krouet gant {user}",
- "Changed by {user}" : "Cheñchet gant {user}",
- "Deleted by {user}" : "Dilemet gant {user}",
- "Restored by {user}" : "Adsavet gant {user}",
- "Renamed by {user}" : "Adanvet gant {user}",
- "Moved by {user}" : "Dilec'hiet gant {user}",
- "\"remote user\"" : "\"pell-implijer\"",
- "You created {file}" : "Krouet ho peus {file}",
- "You created an encrypted file in {file}" : "Ur restr sifret ho peus krouet e {file}",
- "{user} created {file}" : "{user} en.he deus krouet {file}",
- "{user} created an encrypted file in {file}" : " {file} a zo bet sifret gant {user}",
- "{file} was created in a public folder" : "{file} a zo bet krouet en un teuliad foran",
- "You changed {file}" : "Cheñchet ho peus {file}",
- "You changed an encrypted file in {file}" : "Ur restr sifret ho peus cheñchet e {file}",
- "{user} changed {file}" : "{file} a zo bet cheñchet gant {user}",
- "{user} changed an encrypted file in {file}" : "{file} a zo bet cheñchet gant {user}",
- "You deleted {file}" : "Dilemet ho peus {file}",
- "You deleted an encrypted file in {file}" : "Ur rest sufret e {file} ho peus dilemet.",
- "{user} deleted {file}" : "{user} en.he deus diverket {file}",
- "{user} deleted an encrypted file in {file}" : "Ur restr sifret e {file} a zo bet dilemet gant {user}",
- "You restored {file}" : "Adsavet ho peus {file}",
- "{user} restored {file}" : "{file} a zo bet adsavet gant {user}",
- "You renamed {oldfile} to {newfile}" : "Adanvet ho peus {oldfile} e {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{oldfile} a zo bet adanvet gant {user} e {newfile}",
- "You moved {oldfile} to {newfile}" : "Dilec'hiet ho peus {oldfile} e {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{oldfile} a zo bet dilec'hiet gant {user} e {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Ur restr a zo bet ouzhpennet pe ziverket en ho <strong>pennrolloù</strong>",
- "A file or folder has been <strong>changed</strong>" : "Ur restr pe un teuliad a zo bet <strong>cheñchet</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Unan eus ho restr pe teuliad karetañ a zo bet <strong>cheñchet</strong>",
- "All files" : "An holl restroù",
- "Unlimited" : "Didermenet",
- "Upload (max. %s)" : "Pellgas (max. %s)",
- "Accept" : "Asantiñ",
- "Reject" : "Nac'hañ",
- "Incoming ownership transfer from {user}" : "Treuzkas perc'henniezh a-berzh {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Asantiña rit {path} ?\n\nN. B. : Gallout a ra oberiadur an treuzkas padout betek 1 eur.",
- "Ownership transfer failed" : "C'hwitet eo bet an treuzkas perc'henniezh",
- "Your ownership transfer of {path} to {user} failed." : "Ho treuzkas perc'henniezh eus {path} da {user} en deus c'hwitet.",
- "The ownership transfer of {path} from {user} failed." : "An treuzkas perc'henniezh eus {path} da {user} en deus c'hwitet.",
- "Ownership transfer done" : "Treuzkas perc'hienniezh echu",
- "Your ownership transfer of {path} to {user} has completed." : "Ho treuzkas perc'henniezh eus {path} da {user} a zo echu.",
- "The ownership transfer of {path} from {user} has completed." : "An treuzkas perc'henniezh eus {path} da {user} a zo echu.",
- "in %s" : "e %s",
- "File Management" : "Meradur ar restr",
- "Transfer ownership of a file or folder" : "Treuzkas perc'henniezh ur restr pe un teuliad",
- "Choose file or folder to transfer" : "Dibabit ur restr pe un teuliad da dreuzkas",
- "Change" : "Cheñch",
- "New owner" : "Perc'henn nevez",
- "Search users" : "Klask implijourien",
- "Choose a file or folder to transfer" : "Dibabit ur restr pe un teuliad da dreuzkas",
- "Transfer" : "Treuzkas",
- "Transfer {path} to {userid}" : "Treuzkas {path} da {userid}",
- "Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
- "Ownership transfer request sent" : "Kaset eo bet ar goulenn treuzkas perc'henniezh",
- "Cannot transfer ownership of a file or folder you don't own" : "N'hallit ket treuzkas perc'henniezh ur restr pe un teuliad ma n'oc'h ket e berc'henn",
- "Tags" : "Klavioù",
- "Unable to change the favourite state of the file" : "Dibosupl eo cheñch stad pennroll ar restr",
- "Error while loading the file data" : "Ur fazi zo bet en ur gargañ roadennoùar restr",
- "Cancel" : "Arrest",
- "Create" : "Krouiñ",
- "%s used" : "%s implijet",
- "%s%% of %s used" : "%s%% diwar %s implijet",
- "%1$s of %2$s used" : "%1$s diwar%2$s implijet",
- "Settings" : "Arventennoù",
- "Show hidden files" : "Diskouez ar restroù koachet",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Implijit ar chomlec'h-mañ evit tizhout ho restroù dre WebDAV",
- "Toggle grid view" : "Gweredekat/Diweredekat an diskwel roued",
- "No files in here" : "Restr ebet amañ",
- "Upload some content or sync with your devices!" : "Pellgas endalc'hoù pe gempredañ ho mekanikoù!",
- "No entries found in this folder" : "Disoc'h ebet en teuliad-mañ",
- "Select all" : "Dibab pep tra",
- "Upload too large" : "Re bonner eo ar gasadenn",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Ar restroù a glaskit pellgas a ya dreist d'ar vent vrasañ aotreet gant ar servijer mañ.",
- "No favorites yet" : "Pennroll ebet evit ar poent",
- "Files and folders you mark as favorite will show up here" : "Ar restroù ha teuliadoù ouzhpennet en ho pennrolloù a vo diskwelet amañ",
- "Deleted files" : "Restroù dilemet",
- "Shares" : "Rannañ",
- "Shared with others" : "Rannet gant tud all",
- "Shared with you" : "Rannet ganeoc'h",
- "Shared by link" : "Rannet dre liamm",
- "Deleted shares" : "Rannañ dilemet",
- "Pending shares" : "Rannañ o c'hortoz",
- "Text file" : "Restr testenn",
- "New text file.txt" : "Restr testenn nevez rest.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Leun eo skor stokañ {owner}. Ne c'hall ket ar restroù bezañ na nevezet na kempredet ken !",
- "Your storage is full, files can not be updated or synced anymore!" : "Leun eo ho skor stokañ. Ne c'hall ket ar restroù bezañ na nevezet na kempredet ken !",
- "_matches '{filter}'_::_match '{filter}'_" : ["a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'"]
-},
-"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);");
diff --git a/apps/files/l10n/br.json b/apps/files/l10n/br.json
deleted file mode 100644
index 1285a0731db..00000000000
--- a/apps/files/l10n/br.json
+++ /dev/null
@@ -1,190 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "N'haller ket tizhout ar skor roadennoù evit ar poent",
- "Storage invalid" : "N'eo c'hall ket bezañ ar skor roadennoù-mañ",
- "Unknown error" : "Fazi dizanv",
- "File could not be found" : "N'eo ket bet kavet ar restr",
- "Move or copy" : "Dilec'hiañ pe eilañ",
- "Download" : "Pellgargañ",
- "Delete" : "Lemel",
- "Home" : "Degemer",
- "Close" : "Serriñ",
- "Favorites" : "Pennrolloù",
- "Could not create folder \"{dir}\"" : "Dibosupl eo krouiñ an teuliad \"{dir}\"",
- "This will stop your current uploads." : "Paouez a raio ho kasadennoù.",
- "Upload cancelled." : "Kasadenn nullet.",
- "Processing files …" : "Graet e vez war dro ar restroù ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Dibosupl eo kas {filename} evel emañ un teuliad pe ez eus 0 bytes anezhañ",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "N'eus ket trawalc'h a blas: o klask kas {size1} emaoc'h met n'eus nemet {size2} dieub",
- "Target folder \"{dir}\" does not exist any more" : "An teuliad \"{dir}\" n'eus ket anezhañ ken",
- "Not enough free space" : "N'eus ket trawalc'h a blas",
- "An unknown error has occurred" : "Ur fazi dizanv a zo bet",
- "Uploading …" : "O pellgas ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} diwar {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "N'haller ket pellgas seurt restroù",
- "Target folder does not exist any more" : "An teuliad n'eus ket anezhañ ken",
- "Error when assembling chunks, status code {status}" : "Ur fazi zo bet en ur dolpañ ar blokoù, kod stad {status}",
- "Actions" : "Oberoù",
- "Rename" : "Adenvel",
- "Copy" : "Eilañ",
- "Choose target folder" : "Dibab an teuliad moned",
- "Open" : "Digeriñ",
- "Delete file" : "Dilemel ar restr",
- "Delete folder" : "Dilemel an teuliad",
- "Disconnect storage" : "Digevreañ ar skor stokañ-mañ",
- "Leave this share" : "Laoskel ar rannadenn",
- "Could not load info for file \"{file}\"" : "Dibosupl eo kargañ titouroù ar restr \"{file}\"",
- "Files" : "Restroù",
- "Details" : "Munudoù",
- "Select" : "Dibab",
- "Pending" : "O c'hortoz",
- "Unable to determine date" : "Dibosupl eo resisaat an deiziat",
- "This operation is forbidden" : "Difennet eo an ober-mañ",
- "This directory is unavailable, please check the logs or contact the administrator" : "N'eus ket tu da dizhout an teuliad-mañ, lennit al logoù pe kit e darempred gant ar merour",
- "Could not move \"{file}\", target exists" : "Dibosupl eo diblasañ \"{file}\", ar bukenn zo anezhi",
- "Could not move \"{file}\"" : "Dibosupl eo diblasañ \"{file}\"",
- "copy" : "eilañ",
- "Could not copy \"{file}\", target exists" : "Dibosupl eo eilañ \"{file}\", ar bukenn zo anezhi",
- "Could not copy \"{file}\"" : "Dibosupl eo eilañ \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} eilet e-barzh {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ha {nbfiles} restr all eilet e-barzh {destination}",
- "{newName} already exists" : "{newName} zo anezhañ dija",
- "Could not rename \"{fileName}\", it does not exist any more" : "Dibosupl eo adenvel \"{fileName}\", n'eus ket anezhan ken",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "An anv \"{targetName}\" a zo implijet en teuliad \\\"{dir}\\\". Trugarez da zibab un anv all.",
- "Could not rename \"{fileName}\"" : "Dibosupl eo adenvel \"{fileName}\"",
- "Could not create file \"{file}\"" : "Dibosupl eo krouiñ ar restr \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Dibosupl eo krouiñ ar restr \"{file}\" peogwir ez eus anezhañ c'hoazh",
- "Could not create folder \"{dir}\" because it already exists" : "Dibosupl eo krouiñ an teuliad \"{dir}\" peogwir ez eus anezhañ c'hoazh",
- "Could not fetch file details \"{file}\"" : "Dibosupl eo adtapout munudoù ar restr \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Ur fazi zo bet en ur ziverkañ ar restr \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Disoc'h ebet e teuliadoù all evit {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Lakait muioc'h eget daou arouez evit klask e teuliadoù all",
- "Name" : "Anv",
- "Size" : "Ment",
- "Modified" : "Cheñchet",
- "_%n folder_::_%n folders_" : ["%nteuliad","%n deuliad","teuliadoù zo","an darn vrasañ eus an teuliadoù","%n teuliad"],
- "_%n file_::_%n files_" : ["%n restr","%n restr","restroù zo","an darn vrasañ eus ar restroù","%n restr"],
- "{dirs} and {files}" : "{dirs} ha {files}",
- "_including %n hidden_::_including %n hidden_" : [" %n koachet en o zouez","%n goachet en o zouez","koachet en o zouez","koachet en o zouez","koachet en o zouez %n"],
- "You don’t have permission to upload or create files here" : "N'och ket aotreet kas pe krouiñ restroù amañ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n restr o vezañ karget","%n restr o vezañ karget","restroù zo o vezañ karget","an darn vrasañ eus ar restroù o vezañ karget","%n restr o vezañ karget"],
- "New" : "Nevez",
- "Select file range" : "Dibab un tachad restroù",
- "{used} of {quota} used" : "{used} diwar {quota} implijet",
- "{used} used" : "{used} implijet",
- "\"{name}\" is an invalid file name." : "N'eo ket \"{name}\" un anv restr aotreet.",
- "File name cannot be empty." : "N'hall ket anv ur restr bezañ goullo.",
- "\"/\" is not allowed inside a file name." : "N'eo ket aotreet \"/\" e anv ur restr.",
- "\"{name}\" is not an allowed filetype" : "N'eo ket \"{name}\" un doare restr aotreet",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lec'h renkañ {owner} a zo kaji leun ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ho lec'h renkañ a zo kaji leun ({usedSpacePercent}%).",
- "View in folder" : "Diskwel en teuliad",
- "Copied!" : "Eilet eo !",
- "Copy direct link (only works for users who have access to this file/folder)" : "Eilañ al liamm eeun (nemet evit an implijourien aotreet da dizhout ar restr-mañ pe an teuliad-mañ)",
- "Path" : "Hent",
- "_%n byte_::_%n bytes_" : ["okted","okted","okted","okted","%n okted"],
- "Favorited" : "Lakaet evel pennroll",
- "Favorite" : "Pennrollañ",
- "You can only favorite a single file or folder at a time" : "Ne c'hallit ouzhpennañ nemet ur pennroll teuliad pe restr en un taol.",
- "New folder" : "Teuliad nevez",
- "Upload file" : "Pellgas ur restr",
- "Recent" : "Nevez",
- "Not favorited" : "N'eo ket bet pennrollet",
- "Remove from favorites" : "Diverkañañ eus ar pennrolloù",
- "Add to favorites" : "Ouzhpennañ er pennrolloù",
- "An error occurred while trying to update the tags" : "Ur fazi a zo bet en ur neveziñ ar c'hlavoù",
- "Added to favorites" : "Ouzhpennet er pennrolloù",
- "Removed from favorites" : "Diverket eus ar pennrolloù",
- "You added {file} to your favorites" : "Ouzhpennet ho peus {file} en ho pennrolloù",
- "You removed {file} from your favorites" : "Diverket ho peus {file} eus ho pennrolloù",
- "File changes" : "Cheñch ar restroù",
- "Created by {user}" : "Krouet gant {user}",
- "Changed by {user}" : "Cheñchet gant {user}",
- "Deleted by {user}" : "Dilemet gant {user}",
- "Restored by {user}" : "Adsavet gant {user}",
- "Renamed by {user}" : "Adanvet gant {user}",
- "Moved by {user}" : "Dilec'hiet gant {user}",
- "\"remote user\"" : "\"pell-implijer\"",
- "You created {file}" : "Krouet ho peus {file}",
- "You created an encrypted file in {file}" : "Ur restr sifret ho peus krouet e {file}",
- "{user} created {file}" : "{user} en.he deus krouet {file}",
- "{user} created an encrypted file in {file}" : " {file} a zo bet sifret gant {user}",
- "{file} was created in a public folder" : "{file} a zo bet krouet en un teuliad foran",
- "You changed {file}" : "Cheñchet ho peus {file}",
- "You changed an encrypted file in {file}" : "Ur restr sifret ho peus cheñchet e {file}",
- "{user} changed {file}" : "{file} a zo bet cheñchet gant {user}",
- "{user} changed an encrypted file in {file}" : "{file} a zo bet cheñchet gant {user}",
- "You deleted {file}" : "Dilemet ho peus {file}",
- "You deleted an encrypted file in {file}" : "Ur rest sufret e {file} ho peus dilemet.",
- "{user} deleted {file}" : "{user} en.he deus diverket {file}",
- "{user} deleted an encrypted file in {file}" : "Ur restr sifret e {file} a zo bet dilemet gant {user}",
- "You restored {file}" : "Adsavet ho peus {file}",
- "{user} restored {file}" : "{file} a zo bet adsavet gant {user}",
- "You renamed {oldfile} to {newfile}" : "Adanvet ho peus {oldfile} e {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{oldfile} a zo bet adanvet gant {user} e {newfile}",
- "You moved {oldfile} to {newfile}" : "Dilec'hiet ho peus {oldfile} e {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{oldfile} a zo bet dilec'hiet gant {user} e {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Ur restr a zo bet ouzhpennet pe ziverket en ho <strong>pennrolloù</strong>",
- "A file or folder has been <strong>changed</strong>" : "Ur restr pe un teuliad a zo bet <strong>cheñchet</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Unan eus ho restr pe teuliad karetañ a zo bet <strong>cheñchet</strong>",
- "All files" : "An holl restroù",
- "Unlimited" : "Didermenet",
- "Upload (max. %s)" : "Pellgas (max. %s)",
- "Accept" : "Asantiñ",
- "Reject" : "Nac'hañ",
- "Incoming ownership transfer from {user}" : "Treuzkas perc'henniezh a-berzh {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Asantiña rit {path} ?\n\nN. B. : Gallout a ra oberiadur an treuzkas padout betek 1 eur.",
- "Ownership transfer failed" : "C'hwitet eo bet an treuzkas perc'henniezh",
- "Your ownership transfer of {path} to {user} failed." : "Ho treuzkas perc'henniezh eus {path} da {user} en deus c'hwitet.",
- "The ownership transfer of {path} from {user} failed." : "An treuzkas perc'henniezh eus {path} da {user} en deus c'hwitet.",
- "Ownership transfer done" : "Treuzkas perc'hienniezh echu",
- "Your ownership transfer of {path} to {user} has completed." : "Ho treuzkas perc'henniezh eus {path} da {user} a zo echu.",
- "The ownership transfer of {path} from {user} has completed." : "An treuzkas perc'henniezh eus {path} da {user} a zo echu.",
- "in %s" : "e %s",
- "File Management" : "Meradur ar restr",
- "Transfer ownership of a file or folder" : "Treuzkas perc'henniezh ur restr pe un teuliad",
- "Choose file or folder to transfer" : "Dibabit ur restr pe un teuliad da dreuzkas",
- "Change" : "Cheñch",
- "New owner" : "Perc'henn nevez",
- "Search users" : "Klask implijourien",
- "Choose a file or folder to transfer" : "Dibabit ur restr pe un teuliad da dreuzkas",
- "Transfer" : "Treuzkas",
- "Transfer {path} to {userid}" : "Treuzkas {path} da {userid}",
- "Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
- "Ownership transfer request sent" : "Kaset eo bet ar goulenn treuzkas perc'henniezh",
- "Cannot transfer ownership of a file or folder you don't own" : "N'hallit ket treuzkas perc'henniezh ur restr pe un teuliad ma n'oc'h ket e berc'henn",
- "Tags" : "Klavioù",
- "Unable to change the favourite state of the file" : "Dibosupl eo cheñch stad pennroll ar restr",
- "Error while loading the file data" : "Ur fazi zo bet en ur gargañ roadennoùar restr",
- "Cancel" : "Arrest",
- "Create" : "Krouiñ",
- "%s used" : "%s implijet",
- "%s%% of %s used" : "%s%% diwar %s implijet",
- "%1$s of %2$s used" : "%1$s diwar%2$s implijet",
- "Settings" : "Arventennoù",
- "Show hidden files" : "Diskouez ar restroù koachet",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Implijit ar chomlec'h-mañ evit tizhout ho restroù dre WebDAV",
- "Toggle grid view" : "Gweredekat/Diweredekat an diskwel roued",
- "No files in here" : "Restr ebet amañ",
- "Upload some content or sync with your devices!" : "Pellgas endalc'hoù pe gempredañ ho mekanikoù!",
- "No entries found in this folder" : "Disoc'h ebet en teuliad-mañ",
- "Select all" : "Dibab pep tra",
- "Upload too large" : "Re bonner eo ar gasadenn",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Ar restroù a glaskit pellgas a ya dreist d'ar vent vrasañ aotreet gant ar servijer mañ.",
- "No favorites yet" : "Pennroll ebet evit ar poent",
- "Files and folders you mark as favorite will show up here" : "Ar restroù ha teuliadoù ouzhpennet en ho pennrolloù a vo diskwelet amañ",
- "Deleted files" : "Restroù dilemet",
- "Shares" : "Rannañ",
- "Shared with others" : "Rannet gant tud all",
- "Shared with you" : "Rannet ganeoc'h",
- "Shared by link" : "Rannet dre liamm",
- "Deleted shares" : "Rannañ dilemet",
- "Pending shares" : "Rannañ o c'hortoz",
- "Text file" : "Restr testenn",
- "New text file.txt" : "Restr testenn nevez rest.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Leun eo skor stokañ {owner}. Ne c'hall ket ar restroù bezañ na nevezet na kempredet ken !",
- "Your storage is full, files can not be updated or synced anymore!" : "Leun eo ho skor stokañ. Ne c'hall ket ar restroù bezañ na nevezet na kempredet ken !",
- "_matches '{filter}'_::_match '{filter}'_" : ["a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'","a zo par da '{filter}'"]
-},"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js
deleted file mode 100644
index 30adf5d7b06..00000000000
--- a/apps/files/l10n/bs.js
+++ /dev/null
@@ -1,75 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "Pohrana je nedostupna",
- "Storage invalid" : "Pohrana je neispravna",
- "Unknown error" : "Nepoznata greška",
- "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.",
- "Invalid Token" : "Neispravan Znak",
- "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.",
- "There is no error, the file uploaded with success" : "Nema greške, datoteka je uspješno učitana.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Učitana datoteka prelazi maksimalnu dopuštenu veličinu datoteke upload_max_filesize navedenu u php. ini: ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi",
- "The uploaded file was only partially uploaded" : "Učitana datoteka je samo djelomično učitana",
- "No file was uploaded" : "Nijedna datoteka nije učitana.",
- "Missing a temporary folder" : "Nedostaje privremeni direktorij.",
- "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.",
- "Not enough storage available" : "Prostor za pohranu je nedovoljan",
- "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
- "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka",
- "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.",
- "Invalid directory." : "Neispravan direktorij.",
- "Files" : "Datoteke",
- "All files" : "Sve datoteke",
- "Home" : "Kuća",
- "Close" : "Zatvori",
- "Favorites" : "Favoriti",
- "Upload cancelled." : "Učitavanje je prekinuto.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
- "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Could not get result from server." : "Nemoguće dobiti rezultat od servera.",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
- "Actions" : "Radnje",
- "Download" : "Preuzmi",
- "Rename" : "Preimenuj",
- "Delete" : "Izbriši",
- "Disconnect storage" : "Diskonektuj pohranu",
- "Unshare" : "Prestani dijeliti",
- "Select" : "Izaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Nemoguće odrediti datum",
- "Name" : "Ime",
- "Size" : "Veličina",
- "Modified" : "Izmijenjeno",
- "_%n folder_::_%n folders_" : ["direktorij","direktoriji","direktoriji"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteke","%n datoteke"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "You don’t have permission to upload or create files here" : "Ovdje niste ovlašteni učitavati ili kreirati datoteke",
- "_Uploading %n file_::_Uploading %n files_" : ["Prenosim %n datoteku","Prenosim %n datoteke","Prenosim %n datoteke"],
- "New" : "Novo",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.",
- "File name cannot be empty." : "Naziv datoteke ne može biti prazan",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaša pohrana je puna, datoteke više nije moguće ažurirati niti sinhronizirati!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
- "Favorited" : "Favorizovano",
- "Favorite" : "Favorit",
- "Folder" : "Direktorij",
- "New folder" : "Novi direktorij",
- "Upload" : "Učitaj",
- "Upload (max. %s)" : "Učitaj (max. %s)",
- "File handling" : "Obrada datoteke",
- "Maximum upload size" : "Maksimalna veličina učitavanja",
- "max. possible: " : "max. moguće: ",
- "Save" : "Spasi",
- "Settings" : "Postavke",
- "WebDAV" : "WebDAV",
- "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
- "Select all" : "Označi sve",
- "Upload too large" : "Učitavanje je preveliko",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.",
- "No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje",
- "Text file" : "Tekstualna datoteka"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json
deleted file mode 100644
index 1d06dca2da8..00000000000
--- a/apps/files/l10n/bs.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{ "translations": {
- "Storage not available" : "Pohrana je nedostupna",
- "Storage invalid" : "Pohrana je neispravna",
- "Unknown error" : "Nepoznata greška",
- "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.",
- "Invalid Token" : "Neispravan Znak",
- "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.",
- "There is no error, the file uploaded with success" : "Nema greške, datoteka je uspješno učitana.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Učitana datoteka prelazi maksimalnu dopuštenu veličinu datoteke upload_max_filesize navedenu u php. ini: ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi",
- "The uploaded file was only partially uploaded" : "Učitana datoteka je samo djelomično učitana",
- "No file was uploaded" : "Nijedna datoteka nije učitana.",
- "Missing a temporary folder" : "Nedostaje privremeni direktorij.",
- "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.",
- "Not enough storage available" : "Prostor za pohranu je nedovoljan",
- "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.",
- "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka",
- "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.",
- "Invalid directory." : "Neispravan direktorij.",
- "Files" : "Datoteke",
- "All files" : "Sve datoteke",
- "Home" : "Kuća",
- "Close" : "Zatvori",
- "Favorites" : "Favoriti",
- "Upload cancelled." : "Učitavanje je prekinuto.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta",
- "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo",
- "Could not get result from server." : "Nemoguće dobiti rezultat od servera.",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
- "Actions" : "Radnje",
- "Download" : "Preuzmi",
- "Rename" : "Preimenuj",
- "Delete" : "Izbriši",
- "Disconnect storage" : "Diskonektuj pohranu",
- "Unshare" : "Prestani dijeliti",
- "Select" : "Izaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Nemoguće odrediti datum",
- "Name" : "Ime",
- "Size" : "Veličina",
- "Modified" : "Izmijenjeno",
- "_%n folder_::_%n folders_" : ["direktorij","direktoriji","direktoriji"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteke","%n datoteke"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "You don’t have permission to upload or create files here" : "Ovdje niste ovlašteni učitavati ili kreirati datoteke",
- "_Uploading %n file_::_Uploading %n files_" : ["Prenosim %n datoteku","Prenosim %n datoteke","Prenosim %n datoteke"],
- "New" : "Novo",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.",
- "File name cannot be empty." : "Naziv datoteke ne može biti prazan",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaša pohrana je puna, datoteke više nije moguće ažurirati niti sinhronizirati!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)",
- "Favorited" : "Favorizovano",
- "Favorite" : "Favorit",
- "Folder" : "Direktorij",
- "New folder" : "Novi direktorij",
- "Upload" : "Učitaj",
- "Upload (max. %s)" : "Učitaj (max. %s)",
- "File handling" : "Obrada datoteke",
- "Maximum upload size" : "Maksimalna veličina učitavanja",
- "max. possible: " : "max. moguće: ",
- "Save" : "Spasi",
- "Settings" : "Postavke",
- "WebDAV" : "WebDAV",
- "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
- "Select all" : "Označi sve",
- "Upload too large" : "Učitavanje je preveliko",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.",
- "No favorites" : "Nema favorita",
- "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje",
- "Text file" : "Tekstualna datoteka"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index 23693501aba..ecfa5a70eb0 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -1,51 +1,365 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "L'emmagatzematge no està disponible temporalment",
- "Storage invalid" : "L'emmagatzematge no és vàlid",
+ "Added to favorites" : "S'ha afegit als preferits",
+ "Removed from favorites" : "S'ha suprimit dels preferits",
+ "You added {file} to your favorites" : "Heu afegit {file} als preferits",
+ "You removed {file} from your favorites" : "Heu suprimit {file} dels preferits",
+ "Favorites" : "Preferits",
+ "File changes" : "Canvis del fitxer",
+ "Created by {user}" : "{user} l'ha creat",
+ "Changed by {user}" : "{user} l'ha modificat",
+ "Deleted by {user}" : "{user} l'ha suprimit",
+ "Restored by {user}" : "{user} l'ha restaurat",
+ "Renamed by {user}" : "{user} n'ha canviat el nom",
+ "Moved by {user}" : "{user} l'ha desplaçat",
+ "\"remote account\"" : "«compte remot»",
+ "You created {file}" : "Heu creat {file}",
+ "You created an encrypted file in {file}" : "Heu creat el fitxer xifrat {file}",
+ "{user} created {file}" : "{user} ha creat {file}",
+ "{user} created an encrypted file in {file}" : "{user} ha creat el fitxer xifrat {file}",
+ "{file} was created in a public folder" : "S'ha creat {file} en una carpeta pública",
+ "You changed {file}" : "Heu modificat {file}",
+ "You changed an encrypted file in {file}" : "Heu modificat el fitxer xifrat {file}",
+ "{user} changed {file}" : "{user} ha modificat {file}",
+ "{user} changed an encrypted file in {file}" : "{user} ha modificat el fitxer xifrat {file}",
+ "You deleted {file}" : "Heu suprimit {file}",
+ "You deleted an encrypted file in {file}" : "Heu suprimit el fitxer xifrat {file}",
+ "{user} deleted {file}" : "{user} ha suprimit {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} ha suprimit el fitxer xifrat {file}",
+ "You restored {file}" : "Heu restaurat {file}",
+ "{user} restored {file}" : "{user} ha restaurat {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Heu canviat el nom de {oldfile} (ocult) a {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} a {newfile} (ocult)",
+ "You renamed {oldfile} to {newfile}" : "Heu canviat el nom de {oldfile} a {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} a {newfile} (ocult)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} ha canviat el nom de {oldfile} a {newfile}",
+ "You moved {oldfile} to {newfile}" : "Heu desplaçat {oldfile} a {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} ha desplaçat {oldfile} a {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "S'ha afegit o suprimit un fitxer dels <strong>preferits</strong>",
+ "Files" : "Fitxers",
+ "A file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta",
+ "A favorite file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta dels preferits",
+ "Failed to authorize" : "No s'ha pogut autoritzar",
+ "Invalid folder path" : "Camí de la carpeta no vàlid",
+ "Folder not found" : "No s'ha trobat la carpeta",
+ "The file cannot be found" : "No s'ha trobat el fitxer",
+ "The destination path does not exist: %1$s" : "El camí de destí no existeix: %1$s",
+ "You do not have permission to create a file at the specified location" : "No teniu permís per crear fitxers a la ubicació especificada",
+ "The file could not be converted." : "No s'ha pogut convertir el fitxer.",
+ "Could not get relative path to converted file" : "No s'ha pogut obtenir el camí relatiu al fitxer convertit",
+ "Favorite files" : "Fitxers preferits",
+ "No favorites" : "No hi ha preferits",
+ "More favorites" : "Més preferits",
+ "Accept" : "Accepta",
+ "Reject" : "Rebutja",
+ "Incoming ownership transfer from {user}" : "{user} us ha enviat una transferència de propietat",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voleu acceptar {path}?\n\nNota: el procés de transferència després de l'acceptació pot durar fins a 1 hora.",
+ "Ownership transfer denied" : "S'ha denegat la transferència de la propietat",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} ha denegat la transferència de la propietat de {path}.",
+ "Ownership transfer failed" : "S'ha produït un error en transferir la propietat",
+ "Your ownership transfer of {path} to {user} failed." : "S'ha produït un error en transferir la propietat de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "S'ha produït un error en transferir la propietat de {path} de {user}.",
+ "Ownership transfer done" : "La transferència de la propietat ha finalitzat",
+ "Your ownership transfer of {path} to {user} has completed." : "S'ha completat la transferència de propietat de {path} a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "S'ha completat la transferència de propietat de {path} de {user}.",
+ "in %s" : "%s",
+ "Transferred from %1$s on %2$s" : "S'ha transferit de %1$s a %2$s",
+ "Files compatibility" : "Compatibilitat de fitxers",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet restringir els noms de fitxers per garantir que els fitxers es puguin sincronitzar amb tots els clients. Per defecte es permeten tots els noms de fitxer vàlids a POSIX (per exemple, Linux o macOS).",
+ "Enforce Windows compatibility" : "Força la compatibilitat amb Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Això bloquejarà els noms de fitxer no vàlids als sistemes Windows, com ara l'ús de noms reservats o caràcters especials. Però això no força la compatibilitat de la distinció entre majúscules i minúscules.",
+ "File Management" : "Gestió de fitxers",
+ "Home" : "Inici",
+ "Target folder does not exist any more" : "La carpeta de destinació ja no existeix",
+ "Reload current directory" : "Torna a carregar la carpeta actual",
+ "Go to the \"{dir}\" directory" : "Ves a la carpeta «{dir}»",
+ "Current directory path" : "Camí de la carpeta actual",
+ "Your have used your space quota and cannot upload files anymore" : "Heu utilitzat la quota d'espai i ja no podeu pujar fitxers",
+ "You do not have permission to upload or create files here." : "No tens permís per pujar o crear arxius aquí.",
+ "Drag and drop files here to upload" : "Arrossegueu i deixeu anar fitxers aquí per a pujar-los",
+ "Favorite" : "En els preferits",
+ "Back" : "Torna",
+ "Toggle selection for file \"{displayName}\"" : "Canvia la selecció per al fitxer «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Canvia la selecció per a la carpeta «{displayName}»",
+ "File is loading" : "S'està carregant el fitxer",
+ "Folder is loading" : "S'està carregant la carpeta",
+ "Filename" : "Nom del fitxer",
+ "Folder name" : "Nom de la carpeta",
+ "This node is unavailable" : "Aquest node no està disponible",
+ "Another entry with the same name already exists." : "Ja existeix una altra entrada amb el mateix nom.",
+ "Invalid filename." : "Nom de fitxer no vàlid.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "S'ha canviat el nom de «{oldName}» a «{newName}»",
+ "Rename file" : "Canvia el nom del fitxer",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendent",
+ "Unknown date" : "Data desconeguda",
+ "Clear filter" : "Esborra el filtre",
+ "Modified" : "Darrera modificació",
+ "Search everywhere" : "Cerca a tot arreu",
+ "Type" : "Tipus",
+ "Active filters" : "Filtres actius",
+ "Remove filter" : "Suprimeix el filtre",
+ "Total rows summary" : "Resum de totes les files",
+ "Toggle selection for all files and folders" : "Canvia la selecció per a tots els fitxers i carpetes",
+ "Name" : "Nom",
+ "Size" : "Mida",
+ "Actions" : "Accions",
+ "(selected)" : "(seleccionat)",
+ "List of files and folders." : "Llista de fitxers i carpetes.",
+ "You have used your space quota and cannot upload files anymore." : "Heu utilitzat la quota d'espai i ja no podeu pujar fitxers.",
+ "Column headers with buttons are sortable." : "Les capçaleres de columna amb botons es poder ordenar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
+ "File not found" : "No s'ha trobat el fitxer",
+ "{usedQuotaByte} used" : "{usedQuotaByte} en ús",
+ "{used} of {quota} used" : "{used} de {quota} en ús",
+ "{relative}% used" : "{relative}% en ús",
+ "Could not refresh storage stats" : "No s'han pogut actualitzar les estadístiques d'emmagatzematge",
+ "Your storage is full, files can not be updated or synced anymore!" : "L'emmagatzematge està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
+ "Storage information" : "Informació d'emmagatzematge",
+ "Storage quota" : "Quota d'emmagatzematge",
+ "New folder" : "Carpeta nova",
+ "Create new folder" : "Crea una carpeta",
+ "This name is already in use." : "Aquest nom ja s'utilitza.",
+ "Create" : "Crea",
+ "Fill template fields" : "Ompliu els camps de la plantilla",
+ "Submitting fields …" : "S'estan enviant camps …",
+ "Submit" : "Envia",
+ "Choose a file or folder to transfer" : "Trieu el fitxer o carpeta que voleu transferir",
+ "Transfer" : "Transfereix",
+ "Transfer {path} to {userid}" : "Transfereix {path} a {userid}",
+ "Invalid path selected" : "El camí seleccionat no és vàlid",
"Unknown error" : "Error desconegut",
- "File could not be found" : "No s'ha pogut trobar el fitxer",
- "Move or copy" : "Mou o copia",
- "Download" : "Baixa",
+ "Ownership transfer request sent" : "S'ha enviat la sol·licitud de transferència de propietat",
+ "Cannot transfer ownership of a file or folder you do not own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre",
+ "Transfer ownership of a file or folder" : "Transferència de la propietat d'un fitxer o carpeta",
+ "Choose file or folder to transfer" : "Tria el fitxer o carpeta que voleu transferir",
+ "Change" : "Canvia",
+ "New owner" : "Propietari nou",
+ "Keep {old}" : "Mantenir {old}",
+ "Keep without extension" : "Mantenir sense extensió",
+ "Use {new}" : "Utilitza {new}",
+ "Remove extension" : "Suprimeix l'extensió",
+ "Change file extension" : "Canvia l'extensió del fitxer",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Canviar l'extensió del fitxer de \"{old}\" a \"{new}\" pot fer que el fitxer sigui il·legible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Suprimeix l'extensió de fitxer \"{old}\" pot fer que el fitxer sigui il·legible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Afegir l'extensió del fitxer \"{new}\" pot fer que el fitxer sigui il·legible.",
+ "Do not show this dialog again." : "No torneu a mostrar aquest diàleg.",
+ "Select file or folder to link to" : "Seleccioneu el fitxer o la carpeta que voleu enllaçar",
+ "Choose {file}" : "Tria {file}",
+ "Share" : "Comparteix",
+ "Shared by link" : "S'ha compartit amb un enllaç",
+ "Shared" : "S'ha compartit",
+ "Switch to list view" : "Canvia a la visualització de llista",
+ "Switch to grid view" : "Canvia a la visualització de quadrícula",
+ "The file could not be found" : "No s'ha pogut trobar el fitxer",
+ "Upload was cancelled by user" : "L'usuari ha cancel·lat la pujada",
+ "Not enough free space" : "No hi ha prou espai lliure",
+ "Operation is blocked by access control" : "L'operació està blocada pel control d'accés",
+ "Error during upload: {message}" : "S'ha produït un error durant la pujada: {message}",
+ "Error during upload, status code {status}" : "S'ha produït un error durant la pujada, el codi d'estat és {status}",
+ "Unknown error during upload" : "S'ha produït un error desconegut durant la pujada",
+ "Loading current folder" : "S'està carregant la carpeta actual",
+ "Retry" : "Torna-ho a provar",
+ "No files in here" : "No hi ha cap fitxer aquí",
+ "Upload some content or sync with your devices!" : "Pugeu contingut o sincronitzeu els vostres dispositius!",
+ "Go back" : "Torna",
+ "Views" : "Vistes",
+ "Files settings" : "Paràmetres de Fitxers",
+ "Your files" : "Els vostres fitxers",
+ "Open in files" : "Obre a Fitxers",
+ "File cannot be accessed" : "No es pot accedir al fitxer",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "No s'ha trobat el fitxer o no teniu permisos per a visualitzar-lo. Demaneu al remitent que el comparteixi.",
+ "Clipboard is not available" : "El porta-retalls no està disponible",
+ "General" : "General",
+ "All files" : "Tots els fitxers",
+ "Personal files" : "Fitxers personals",
+ "Sort favorites first" : "Ordena primer els preferits",
+ "Sort folders before files" : "Ordena les carpetes abans dels fitxers",
+ "Appearance" : "Aparença",
+ "Show hidden files" : "Mostra els fitxers ocults",
+ "Crop image previews" : "Retalla les previsualitzacions de les imatges",
+ "Additional settings" : "Paràmetres addicionals",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copia",
+ "Warnings" : "Advertiments",
+ "Keyboard shortcuts" : "Dreceres de teclat",
+ "File actions" : "Arxivar accions",
+ "Rename" : "Canvia el nom",
"Delete" : "Suprimeix",
- "Home" : "Inici",
+ "Manage tags" : "Administrar les etiquetes",
+ "Selection" : "Selecció",
+ "Select all files" : "Seleccioneu tots els fitxers",
+ "Deselect all" : "No seleccionis res",
+ "Navigation" : "Navegació",
+ "View" : "Visualització",
+ "Toggle grid view" : "Canvia la visualització de quadrícula",
+ "Show those shortcuts" : "Mostra aquestes dreceres",
+ "You" : "Vós",
+ "Shared multiple times with different people" : "S'ha compartit diverses vegades amb persones diferents",
+ "Unable to change the favorite state of the file" : "No es pot canviar l'estat preferit del fitxer",
+ "Error while loading the file data" : "S'ha produït un error en carregar la informació del fitxer",
+ "Owner" : "Propietat",
+ "Remove from favorites" : "Suprimeix dels preferits",
+ "Add to favorites" : "Afegeix als preferits",
+ "Tags" : "Etiquetes",
+ "Blank" : "En blanc",
+ "Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
+ "Pick a template for {name}" : "Trieu una plantilla per a {name}",
+ "Create a new file with the selected template" : "Crea un fitxer amb la plantilla seleccionada",
+ "Creating file" : "S'està creant el fitxer",
+ "Save as {displayName}" : "Desa com a {displayName}",
+ "Save as …" : "Anomena i desa …",
+ "Converting files …" : "Convertint fitxers …",
+ "Failed to convert files: {message}" : "No s'han pogut convertir els fitxers: {message}",
+ "All files failed to be converted" : "No s'han pogut convertir tots els fitxers",
+ "One file could not be converted: {message}" : "No s'ha pogut convertir un fitxer: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["No s'ha pogut convertir un fitxer","No s’han pogut convertir %n fitxers"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un fitxer s'ha convertit correctament","%n fitxers s'han convertit correctament"],
+ "Files successfully converted" : "Els fitxers s'han convertit correctament",
+ "Failed to convert files" : "No s'han pogut convertir els fitxers",
+ "Converting file …" : "S'està convertint el fitxer …",
+ "File successfully converted" : "El fitxer s'ha convertit correctament",
+ "Failed to convert file: {message}" : "No s'ha pogut convertir el fitxer: {message}",
+ "Failed to convert file" : "No s'ha pogut convertir el fitxer",
+ "Leave this share" : "Abandona aquest element compartit",
+ "Leave these shares" : "Abandona aquests elements compartits",
+ "Disconnect storage" : "Desconnecta l'emmagatzematge",
+ "Disconnect storages" : "Desconnecta els emmagatzematges",
+ "Delete permanently" : "Suprimeix permanentment",
+ "Delete and unshare" : "Suprimeix i deixa de compartir",
+ "Delete file" : "Suprimeix el fitxer",
+ "Delete files" : "Suprimeix els fitxers",
+ "Delete folder" : "Suprimeix la carpeta",
+ "Delete folders" : "Suprimeix les carpetes",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Esteu a punt de suprimir permanentment {count} element","Esteu a punt de suprimir permanentment {count} elements"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Esteu a punt de suprimir {count} element","Esteu a punt de suprimir {count} elements"],
+ "Confirm deletion" : "Confirma la supressió",
+ "Cancel" : "Cancel·la",
+ "Download" : "Baixa",
+ "Moving \"{source}\" to \"{destination}\" …" : "S'està movent \"{source}\" a \"{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "S'està copiant \"{source}\" a \"{destination}” …",
+ "Destination is not a folder" : "La destinació no és una carpeta",
+ "This file/folder is already in that directory" : "Aquest fitxer o carpeta ja existeix en aquesta carpeta",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No podeu moure un fitxer o carpeta a la mateixa carpeta o a una subcarpeta de la mateixa carpeta",
+ "(copy)" : "(còpia)",
+ "(copy %n)" : "(còpia %n)",
+ "A file or folder with that name already exists in this folder" : "Ja existeix un fitxer o carpeta amb aquest nom en aquesta carpeta",
+ "The files are locked" : "Els fitxers estan blocats",
+ "The file does not exist anymore" : "El fitxer ja no existeix",
+ "Choose destination" : "Trieu una destinació",
+ "Copy to {target}" : "Copia a {target}",
+ "Move to {target}" : "Mou a {target}",
+ "Move" : "Mou",
+ "Move or copy operation failed" : "Error en l'operació de desplaçament o còpia",
+ "Move or copy" : "Mou o copia",
+ "Open folder {displayName}" : "Obre la carpeta {displayName}",
+ "Open in Files" : "Obre a Fitxers",
+ "Open locally" : "Obre en local",
+ "Failed to redirect to client" : "No s'ha pogut redirigir al client",
+ "Open file locally" : "Obre el fitxer en local",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Ara s'hauria d'obrir el fitxer al dispositiu. Si no és així, comproveu que teniu instal·lada l'aplicació d'escriptori.",
+ "Retry and close" : "Torna-ho a provar i tanca",
+ "Open online" : "Obre en línia",
+ "Details" : "Detalls",
+ "View in folder" : "Visualitza-ho en la carpeta",
+ "Today" : "Avui",
+ "Last 7 days" : "Últims 7 dies",
+ "Last 30 days" : "Últims 30 dies",
+ "This year ({year})" : "Aquest any ({year})",
+ "Last year ({year})" : "L'any passat ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Fulls de càlcul",
+ "Presentations" : "Presentacions",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetes",
+ "Audio" : "Àudio",
+ "Images" : "Imatges",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "S'ha creat la carpeta nova «{name}»",
+ "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
+ "Create templates folder" : "Crea una carpeta de plantilles",
+ "Templates" : "Plantilles",
+ "New template folder" : "Carpeta de plantilles nova",
+ "In folder" : "En la carpeta",
+ "Search in folder: {folder}" : "Cerca en la carpeta: {folder}",
+ "One of the dropped files could not be processed" : "No s'ha pogut processar un dels fitxers deixats caure",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "El vostre navegador no admet l'API del sistema de fitxers. Els directoris no es pujaran",
+ "No files to upload" : "No hi ha cap fitxer per pujar",
+ "Unable to create the directory {directory}" : "No s'ha pogut crear la carpeta {directory}",
+ "Some files could not be uploaded" : "No s'han pogut pujar alguns fitxers",
+ "Files uploaded successfully" : "Els fitxers s'han pujat correctament",
+ "No files to process" : "No hi ha cap fitxer per processar",
+ "Some files could not be copied" : "No s'han pogut copiar alguns fitxers",
+ "Some files could not be moved" : "No s'han pogut moure alguns fitxers",
+ "Files copied successfully" : "Els fitxers s'han copiat correctament",
+ "Files moved successfully" : "Els fitxers s'han mogut correctament",
+ "Conflicts resolution skipped" : "S'ha omès la resolució de conflictes",
+ "Upload cancelled" : "S'ha cancel·lat la pujada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No s'ha pogut canviar el nom de «{oldName}», ja no existeix",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nom «{newName}» ja està en ús en la carpeta «{dir}». Trieu un nom diferent.",
+ "Could not rename \"{oldName}\"" : "No s'ha pogut canviar el nom de «{oldName}»",
+ "This operation is forbidden" : "Aquesta operació no està permesa",
+ "Storage is temporarily not available" : "L'emmagatzematge no està disponible temporalment",
+ "Unexpected error: {error}" : "Error inesperat: {error}",
+ "_%n file_::_%n files_" : ["%n fitxer","%n fitxers"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
+ "Filename must not be empty." : "El nom del fitxer no ha d'estar buit.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no és permès dins d'un nom de fitxer.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" és un nom reservat i no és permès per als noms de fitxer.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no és un tipus de fitxer permès.",
+ "Filenames must not end with \"{extension}\"." : "Els noms de fitxer no han d'acabar amb \"{extension}\".",
+ "List of favorite files and folders." : "Llista de fitxers i carpetes preferits.",
+ "No favorites yet" : "Encara no teniu preferits",
+ "Files and folders you mark as favorite will show up here" : "Els fitxers i les carpetes que marqueu com a preferits es mostraran aquí",
+ "List of your files and folders." : "Llista dels vostres fitxers i carpetes.",
+ "List of your files and folders that are not shared." : "Llista dels vostres fitxers i carpetes que no compartiu.",
+ "No personal files found" : "No s'ha trobat cap fitxer personal",
+ "Files that are not shared will show up here." : "Els fitxers que no compartiu es mostraran aquí.",
+ "Recent" : "Recents",
+ "List of recently modified files and folders." : "Llista de fitxers i carpetes modificats recentment.",
+ "No recently modified files" : "No hi ha cap fitxer modificat recentment",
+ "Files and folders you recently modified will show up here." : "Els fitxers i les carpetes que heu modificat recentment es mostraran aquí.",
+ "Search" : "Cercar",
+ "No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
+ "Select all" : "Selecciona-ho tot",
+ "Upload too large" : "La pujada és massa gran",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que intenteu pujar superen la mida màxima de pujada de fitxers del servidor.",
+ "File could not be found" : "No s'ha pogut trobar el fitxer",
+ "Show list view" : "Mostra la visualització de llista",
+ "Show grid view" : "Mostra la visualització de graella",
"Close" : "Tanca",
- "Favorites" : "Preferits",
"Could not create folder \"{dir}\"" : "No s'ha pogut crear la carpeta «{dir}»",
"This will stop your current uploads." : "Això aturarà les pujades actuals.",
"Upload cancelled." : "S'ha cancel·lat la pujada.",
- "Processing files …" : "S'estan processant els fitxers...",
+ "Processing files …" : "S'estan processant els fitxers…",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "No s'ha pogut pujar {filename} perquè és una carpeta o té 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, esteu pujant {size1} però només teniu {size2} lliures",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, esteu pujant {size1}, però només teniu {size2} lliures",
"Target folder \"{dir}\" does not exist any more" : "La carpeta de destinació «{dir}» ja no existeix",
- "Not enough free space" : "No hi ha prou espai lliure",
"An unknown error has occurred" : "S'ha produït un error desconegut",
- "Uploading …" : "S'està pujant...",
+ "File could not be uploaded" : "No s'ha pogut pujar el fitxer",
+ "Uploading …" : "S'està pujant…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "S'està pujant… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "No s'admet la pujada aquest element",
- "Target folder does not exist any more" : "La carpeta de destinació ja no existeix",
- "Operation is blocked by access control" : "L'operació està blocada pel control d'accés",
"Error when assembling chunks, status code {status}" : "S'ha produït un error en recopilar els fragments, el codi d'estat és {status}",
- "Actions" : "Accions",
- "Rename" : "Canvia el nom",
- "Copy" : "Copia",
"Choose target folder" : "Trieu la carpeta de destinació",
+ "Set reminder" : "Defineix un recordatori",
+ "Edit locally" : "Edita localment",
"Open" : "Obre",
- "Delete file" : "Suprimeix el fitxer",
- "Delete folder" : "Suprimeix la carpeta",
- "Disconnect storage" : "Desconnecta l'emmagatzematge",
- "Leave this share" : "Abandona aquest element compartit",
"Could not load info for file \"{file}\"" : "No s'ha pogut carregar la informació del fitxer «{file}»",
- "Files" : "Fitxers",
- "Details" : "Detalls",
"Please select tag(s) to add to the selection" : "Seleccioneu les etiquetes que voleu afegir a la selecció",
"Apply tag(s) to selection" : "Aplica les etiquetes a la selecció",
- "Select" : "Selecciona",
- "Pending" : "Pendent",
+ "Select directory \"{dirName}\"" : "Selecciona la carpeta «{dirName}»",
+ "Select file \"{fileName}\"" : "Selecciona el fitxer «{fileName}»",
"Unable to determine date" : "No s'ha pogut determinar la data",
- "This operation is forbidden" : "Aquesta operació no està permesa",
- "This directory is unavailable, please check the logs or contact the administrator" : "Aquesta carpeta no està disponible. Consulteu els registres o poseu-vos en contacte amb l'administrador.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aquesta carpeta no està disponible. Consulteu els registres o contacteu amb l'administrador",
"Could not move \"{file}\", target exists" : "No s'ha pogut desplaçar «{file}», el fitxer de destinació ja existeix",
"Could not move \"{file}\"" : "No s'ha pogut desplaçar «{file}»",
"copy" : "còpia",
@@ -54,9 +368,6 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "S'ha copiat {origin} a {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "S'han copiat {origin} i {nbfiles} fitxers més a {destination}",
"{newName} already exists" : "{newName} ja existeix",
- "Could not rename \"{fileName}\", it does not exist any more" : "No s'ha pogut canviar el nom de «{fileName}», ja no existeix",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nom «{targetName}» ja està en ús en la carpeta «{dir}». Trieu un nom diferent.",
- "Could not rename \"{fileName}\"" : "No s'ha pogut canviar el nom de «{fileName}»",
"Could not create file \"{file}\"" : "No s'ha pogut crear el fitxer «{file}»",
"Could not create file \"{file}\" because it already exists" : "No s'ha pogut crear el fitxer «{file}» perquè ja existeix",
"Could not create folder \"{dir}\" because it already exists" : "No s'ha pogut crear la carpeta «{dir}» perquè ja existeix",
@@ -64,18 +375,14 @@ OC.L10N.register(
"Error deleting file \"{fileName}\"." : "S'ha produït un error en suprimir el fitxer «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "No hi ha cap resultat de cerca en altres carpetes per a {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduïu més de dos caràcters per a cercar en altres carpetes",
- "Name" : "Nom",
- "Size" : "Mida",
- "Modified" : "Darrera modificació",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
- "_%n file_::_%n files_" : ["%n fitxer","%n fitxers"],
"{dirs} and {files}" : "{dirs} i {files}",
"_including %n hidden_::_including %n hidden_" : ["incloent-hi %n element ocult","incloent-hi %n elements ocults"],
- "You don’t have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí",
+ "You do not have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí",
"_Uploading %n file_::_Uploading %n files_" : ["S'està pujant %n fitxer","S'estan pujant %n fitxers"],
- "New" : "Nou",
+ "New" : "Crea",
+ "New file/folder menu" : "Menú de fitxer o carpeta nova",
"Select file range" : "Selecciona un interval de fitxers",
- "{used} of {quota} used" : "{used} de {quota} en ús",
+ "{used}%" : "{used}%",
"{used} used" : "{used} en ús",
"\"{name}\" is an invalid file name." : "«{name}» no és un nom de fitxer vàlid.",
"File name cannot be empty." : "El nom del fitxer no pot estar buit.",
@@ -90,131 +397,62 @@ OC.L10N.register(
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'emmagatzematge extern «{mountPoint}» està gairebé ple ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "L'emmagatzematge està gairebé ple ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincideix amb «{filter}»","coincideixen amb «{filter}»"],
- "View in folder" : "Visualitza-ho a la carpeta",
- "Copied!" : "S'ha copiat!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copia l'enllaç directe (només funciona per als usuaris que tinguin accés a aquest fitxer o carpeta)",
- "Path" : "Ruta",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "S'ha copiat l'enllaç directe (només funciona per a les persones que tenen accés a aquest fitxer o carpeta)",
+ "Path" : "Camí",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "S'ha afegit als preferits",
- "Favorite" : "Preferits",
- "You can only favorite a single file or folder at a time" : "Només podeu afegir als preferits un fitxer o carpeta alhora",
- "New folder" : "Crea una carpeta",
+ "Favored" : "Afavorit",
+ "Favor" : "Afavorir",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copia l'enllaç directe (només funciona per a les persones que tinguin accés a aquest fitxer o carpeta)",
"Upload file" : "Puja un fitxer",
- "Recent" : "Recents",
- "Not favorited" : "S'ha suprimit dels preferits",
- "Remove from favorites" : "Suprimeix dels preferits",
- "Add to favorites" : "Afegeix als preferits",
+ "Not favored" : "No afavorit",
"An error occurred while trying to update the tags" : "S'ha produït un error en intentar actualitzar les etiquetes",
- "Added to favorites" : "S'ha afegit als preferits",
- "Removed from favorites" : "S'ha suprimit dels preferits",
- "You added {file} to your favorites" : "Heu afegit {file} als preferits",
- "You removed {file} from your favorites" : "Heu suprimit {file} dels preferits",
- "File changes" : "Canvis al fitxer",
- "Created by {user}" : "Creat per {user}",
- "Changed by {user}" : "Modificat per {user}",
- "Deleted by {user}" : "Suprimit per {user}",
- "Restored by {user}" : "Restaurat per {user}",
- "Renamed by {user}" : "Canvi de nom per {user}",
- "Moved by {user}" : "Desplaçat per {user}",
- "\"remote user\"" : "«usuari remot»",
- "You created {file}" : "Heu creat {file}",
- "You created an encrypted file in {file}" : "Heu creat un fitxer xifrat a {file}",
- "{user} created {file}" : "{user} ha creat {file}",
- "{user} created an encrypted file in {file}" : "{user} ha creat un fitxer xifrat a {file}",
- "{file} was created in a public folder" : "S'ha creat {file} en una carpeta pública",
- "You changed {file}" : "Heu modificat {file}",
- "You changed an encrypted file in {file}" : "Heu modificat un fitxer xifrat a {file}",
- "{user} changed {file}" : "{user} ha modificat {file}",
- "{user} changed an encrypted file in {file}" : "{user} ha modificat un fitxer xifrat a {file}",
- "You deleted {file}" : "Heu suprimit {file}",
- "You deleted an encrypted file in {file}" : "Heu suprimit un fitxer xifrat a {file}",
- "{user} deleted {file}" : "{user} ha suprimit {file}",
- "{user} deleted an encrypted file in {file}" : "{user} ha suprimit un fitxer xifrat a {file}",
- "You restored {file}" : "Heu restaurat {file}",
- "{user} restored {file}" : "{user} ha restaurat {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Heu canviat el nom de {oldfile} (ocult) a {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} a {newfile} (ocult)",
- "You renamed {oldfile} to {newfile}" : "Heu canviat el nom de {oldfile} a {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} a {newfile} (ocult)",
- "{user} renamed {oldfile} to {newfile}" : "{user} ha canviat el nom de {oldfile} a {newfile}",
- "You moved {oldfile} to {newfile}" : "Heu desplaçat {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} ha desplaçat {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "S'ha afegit o suprimit un fitxer dels <strong>preferits</strong>",
- "A file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta",
- "A favorite file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta dels preferits",
- "All files" : "Tots els fitxers",
- "Unlimited" : "Il·limitat",
"Upload (max. %s)" : "Puja (màx. %s)",
- "Accept" : "Accepta",
- "Reject" : "Rebutja",
- "Incoming ownership transfer from {user}" : "{user} us ha enviat una transferència de propietat",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voleu acceptar {path}?\n\nNota: el procés de transferència després de l'acceptació pot durar fins a 1 hora.",
- "Ownership transfer failed" : "S'ha produït un error en transferir la propietat",
- "Your ownership transfer of {path} to {user} failed." : "S'ha produït un error en transferir la propietat de {path} a {user}.",
- "The ownership transfer of {path} from {user} failed." : "S'ha produït un error en transferir la propietat de {path} de {user}.",
- "Ownership transfer done" : "La transferència de la propietat ha finalitzat",
- "Your ownership transfer of {path} to {user} has completed." : "S'ha completat la transferència de propietat de {path} a {user}.",
- "The ownership transfer of {path} from {user} has completed." : "S'ha completat la transferència de propietat de {path} de {user}.",
- "in %s" : "%s",
- "File Management" : "Gestió de fitxers",
- "Transfer ownership of a file or folder" : "Transferiu la propietat d'un fitxer o carpeta",
- "Choose file or folder to transfer" : "Tria el fitxer o carpeta que s'ha de transferir",
- "Change" : "Canvia",
- "New owner" : "Propietari nou",
- "Search users" : "Cerqueu usuaris",
- "Choose a file or folder to transfer" : "Trieu el fitxer o carpeta que vulgueu transferir",
- "Transfer" : "Transfereix",
- "Transfer {path} to {userid}" : "Transfereix {path} a {userid}",
- "Invalid path selected" : "El camí seleccionat no és vàlid",
- "Ownership transfer request sent" : "S'ha enviat la sol·licitud de transferència de propietat",
- "Cannot transfer ownership of a file or folder you don't own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre",
- "Tags" : "Etiquetes",
- "Unable to change the favourite state of the file" : "No s'ha pogut canviar l'estat de preferit del fitxer",
- "Error while loading the file data" : "S'ha produït un error en carregar la informació del fitxer",
- "Pick a template for {name}" : "Trieu una plantilla per a {name}",
- "Cancel" : "Cancel·la",
- "Create" : "Crea",
- "Create a new file with the selected template" : "Crea un fitxer amb la plantilla seleccionada",
- "Creating file" : "S'està creant el fitxer",
- "Blank" : "En blanc",
- "Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
- "Set up templates folder" : "Configura la carpeta de plantilles",
- "Templates" : "Plantilles",
- "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
- "%s used" : "%s en ús",
- "%s%% of %s used" : "%s%% de %s en ús",
- "%1$s of %2$s used" : "%1$s de %2$s en ús",
- "Settings" : "Paràmetres",
- "Show hidden files" : "Mostra els fitxers ocults",
- "Crop image previews" : "Retalla les previsualitzacions de les imatges",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "L'acció «{displayName}» s'ha executat correctament",
+ "\"{displayName}\" action failed" : "S'ha produït un error en l'acció «{displayName}»",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ha fallat en alguns elements",
+ "\"{displayName}\" batch action executed successfully" : "L'acció per lots «{displayName}» s'ha executat correctament",
+ "Submitting fields…" : "S'estan enviant camps…",
+ "Filter filenames…" : "Filtra els noms de fitxer…",
+ "WebDAV URL copied to clipboard" : "S'ha copiat l'URL de WebDAV al porta-retalls",
+ "Enable the grid view" : "Habilita la visualització de quadrícula",
+ "Enable folder tree" : "Habilita l'arbre de carpetes",
+ "Copy to clipboard" : "Copia-ho al porta-retalls",
"Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
- "Toggle %1$s sublist" : "Commuta la subllista de %1$s",
- "Toggle grid view" : "Canvia la vista de quadrícula",
- "No files in here" : "No hi ha fitxers aquí",
- "Upload some content or sync with your devices!" : "Pugeu contingut o sincronitzeu els vostres dispositius!",
- "No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
- "Select all" : "Selecciona-ho tot",
- "Upload too large" : "La pujada és massa gran",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que intenteu pujar superen la mida màxima de pujada de fitxers del servidor.",
- "No favorites yet" : "Encara no teniu preferits",
- "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els fitxers i carpetes que marqueu com a preferits",
- "Deleted files" : "Fitxers suprimits",
- "Shares" : "Elements compartits",
- "Shared with others" : "Compartit amb altres usuaris",
- "Shared with you" : "Compartit amb vós",
- "Shared by link" : "Compartit amb un enllaç",
- "Deleted shares" : "Suprimit",
- "Pending shares" : "Pendent",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
+ "Deletion cancelled" : "S'ha cancel·lat la supressió",
+ "Move cancelled" : "S'ha cancel·lat el desplaçament",
+ "Cancelled move or copy of \"{filename}\"." : "S'ha cancel·lat el moviment o la còpia de \"{filename}\".",
+ "Cancelled move or copy operation" : "S'ha cancel·lat l'operació de desplaçament o còpia",
+ "Open details" : "Obre els detalls",
+ "Photos and images" : "Fotografies i imatges",
+ "New folder creation cancelled" : "S'ha cancel·lat la creació de carpetes noves",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fitxer","{fileCount} fitxers"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fitxer i {folderCount} carpeta","1 fitxer i {folderCount} carpetes"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fitxer i 1 carpeta","{fileCount} fitxers i 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fitxers i {folderCount} carpetes",
+ "All folders" : "Totes les carpetes",
+ "Personal Files" : "FItxers personals",
"Text file" : "Fitxer de text",
"New text file.txt" : "Fitxer de text nou.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'emmagatzematge de l'usuari {owner} està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "La carpeta de grup «{mountPoint}» està plena, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'emmagatzematge extern «{mountPoint}» està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "Your storage is full, files can not be updated or synced anymore!" : "L'emmagatzematge està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincideix amb «{filter}»","coincideixen amb «{filter}»"]
+ "Filter file names …" : "Filtra els noms dels fitxers …",
+ "Prevent warning dialogs from open or reenable them." : "Eviteu que s'obrin els diàlegs d'advertència o torneu-los a habilitar.",
+ "Show a warning dialog when changing a file extension." : "Mostra un diàleg d'avís quan es canvia una extensió de fitxer.",
+ "Speed up your Files experience with these quick shortcuts." : "Accelereu l'experiència Fitxers amb aquestes dreceres ràpides.",
+ "Open the actions menu for a file" : "Obre el menú d'accions per un fitxer",
+ "Rename a file" : "Canvia el nom del fitxer",
+ "Delete a file" : "Suprimeix el fitxer",
+ "Favorite or remove a file from favorites" : "Marca com a preferit o suprimeix un fitxer dels preferits",
+ "Manage tags for a file" : "Administra les etiquetes d'un fitxer",
+ "Deselect all files" : "Desseleccioneu tots els fitxers",
+ "Select or deselect a file" : "Seleccioneu o deseleccioneu un fitxer",
+ "Select a range of files" : "Seleccioneu un rang de fitxers",
+ "Navigate to the parent folder" : "Navegueu a la carpeta principal",
+ "Navigate to the file above" : "Navegueu al fitxer de dalt",
+ "Navigate to the file below" : "Navegueu fins al fitxer següent",
+ "Navigate to the file on the left (in grid mode)" : "Navegueu fins al fitxer de l'esquerra (en mode de quadrícula)",
+ "Navigate to the file on the right (in grid mode)" : "Navegueu fins al fitxer de la dreta (en mode de quadrícula)",
+ "Toggle the grid view" : "Commuta la vista de la quadrícula",
+ "Open the sidebar for a file" : "Obriu la barra lateral d'un fitxer"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index 755516e4ff0..77b41cb2c28 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -1,49 +1,363 @@
{ "translations": {
- "Storage is temporarily not available" : "L'emmagatzematge no està disponible temporalment",
- "Storage invalid" : "L'emmagatzematge no és vàlid",
+ "Added to favorites" : "S'ha afegit als preferits",
+ "Removed from favorites" : "S'ha suprimit dels preferits",
+ "You added {file} to your favorites" : "Heu afegit {file} als preferits",
+ "You removed {file} from your favorites" : "Heu suprimit {file} dels preferits",
+ "Favorites" : "Preferits",
+ "File changes" : "Canvis del fitxer",
+ "Created by {user}" : "{user} l'ha creat",
+ "Changed by {user}" : "{user} l'ha modificat",
+ "Deleted by {user}" : "{user} l'ha suprimit",
+ "Restored by {user}" : "{user} l'ha restaurat",
+ "Renamed by {user}" : "{user} n'ha canviat el nom",
+ "Moved by {user}" : "{user} l'ha desplaçat",
+ "\"remote account\"" : "«compte remot»",
+ "You created {file}" : "Heu creat {file}",
+ "You created an encrypted file in {file}" : "Heu creat el fitxer xifrat {file}",
+ "{user} created {file}" : "{user} ha creat {file}",
+ "{user} created an encrypted file in {file}" : "{user} ha creat el fitxer xifrat {file}",
+ "{file} was created in a public folder" : "S'ha creat {file} en una carpeta pública",
+ "You changed {file}" : "Heu modificat {file}",
+ "You changed an encrypted file in {file}" : "Heu modificat el fitxer xifrat {file}",
+ "{user} changed {file}" : "{user} ha modificat {file}",
+ "{user} changed an encrypted file in {file}" : "{user} ha modificat el fitxer xifrat {file}",
+ "You deleted {file}" : "Heu suprimit {file}",
+ "You deleted an encrypted file in {file}" : "Heu suprimit el fitxer xifrat {file}",
+ "{user} deleted {file}" : "{user} ha suprimit {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} ha suprimit el fitxer xifrat {file}",
+ "You restored {file}" : "Heu restaurat {file}",
+ "{user} restored {file}" : "{user} ha restaurat {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Heu canviat el nom de {oldfile} (ocult) a {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} a {newfile} (ocult)",
+ "You renamed {oldfile} to {newfile}" : "Heu canviat el nom de {oldfile} a {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} a {newfile} (ocult)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} ha canviat el nom de {oldfile} a {newfile}",
+ "You moved {oldfile} to {newfile}" : "Heu desplaçat {oldfile} a {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} ha desplaçat {oldfile} a {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "S'ha afegit o suprimit un fitxer dels <strong>preferits</strong>",
+ "Files" : "Fitxers",
+ "A file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta",
+ "A favorite file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta dels preferits",
+ "Failed to authorize" : "No s'ha pogut autoritzar",
+ "Invalid folder path" : "Camí de la carpeta no vàlid",
+ "Folder not found" : "No s'ha trobat la carpeta",
+ "The file cannot be found" : "No s'ha trobat el fitxer",
+ "The destination path does not exist: %1$s" : "El camí de destí no existeix: %1$s",
+ "You do not have permission to create a file at the specified location" : "No teniu permís per crear fitxers a la ubicació especificada",
+ "The file could not be converted." : "No s'ha pogut convertir el fitxer.",
+ "Could not get relative path to converted file" : "No s'ha pogut obtenir el camí relatiu al fitxer convertit",
+ "Favorite files" : "Fitxers preferits",
+ "No favorites" : "No hi ha preferits",
+ "More favorites" : "Més preferits",
+ "Accept" : "Accepta",
+ "Reject" : "Rebutja",
+ "Incoming ownership transfer from {user}" : "{user} us ha enviat una transferència de propietat",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voleu acceptar {path}?\n\nNota: el procés de transferència després de l'acceptació pot durar fins a 1 hora.",
+ "Ownership transfer denied" : "S'ha denegat la transferència de la propietat",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} ha denegat la transferència de la propietat de {path}.",
+ "Ownership transfer failed" : "S'ha produït un error en transferir la propietat",
+ "Your ownership transfer of {path} to {user} failed." : "S'ha produït un error en transferir la propietat de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "S'ha produït un error en transferir la propietat de {path} de {user}.",
+ "Ownership transfer done" : "La transferència de la propietat ha finalitzat",
+ "Your ownership transfer of {path} to {user} has completed." : "S'ha completat la transferència de propietat de {path} a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "S'ha completat la transferència de propietat de {path} de {user}.",
+ "in %s" : "%s",
+ "Transferred from %1$s on %2$s" : "S'ha transferit de %1$s a %2$s",
+ "Files compatibility" : "Compatibilitat de fitxers",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet restringir els noms de fitxers per garantir que els fitxers es puguin sincronitzar amb tots els clients. Per defecte es permeten tots els noms de fitxer vàlids a POSIX (per exemple, Linux o macOS).",
+ "Enforce Windows compatibility" : "Força la compatibilitat amb Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Això bloquejarà els noms de fitxer no vàlids als sistemes Windows, com ara l'ús de noms reservats o caràcters especials. Però això no força la compatibilitat de la distinció entre majúscules i minúscules.",
+ "File Management" : "Gestió de fitxers",
+ "Home" : "Inici",
+ "Target folder does not exist any more" : "La carpeta de destinació ja no existeix",
+ "Reload current directory" : "Torna a carregar la carpeta actual",
+ "Go to the \"{dir}\" directory" : "Ves a la carpeta «{dir}»",
+ "Current directory path" : "Camí de la carpeta actual",
+ "Your have used your space quota and cannot upload files anymore" : "Heu utilitzat la quota d'espai i ja no podeu pujar fitxers",
+ "You do not have permission to upload or create files here." : "No tens permís per pujar o crear arxius aquí.",
+ "Drag and drop files here to upload" : "Arrossegueu i deixeu anar fitxers aquí per a pujar-los",
+ "Favorite" : "En els preferits",
+ "Back" : "Torna",
+ "Toggle selection for file \"{displayName}\"" : "Canvia la selecció per al fitxer «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Canvia la selecció per a la carpeta «{displayName}»",
+ "File is loading" : "S'està carregant el fitxer",
+ "Folder is loading" : "S'està carregant la carpeta",
+ "Filename" : "Nom del fitxer",
+ "Folder name" : "Nom de la carpeta",
+ "This node is unavailable" : "Aquest node no està disponible",
+ "Another entry with the same name already exists." : "Ja existeix una altra entrada amb el mateix nom.",
+ "Invalid filename." : "Nom de fitxer no vàlid.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "S'ha canviat el nom de «{oldName}» a «{newName}»",
+ "Rename file" : "Canvia el nom del fitxer",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendent",
+ "Unknown date" : "Data desconeguda",
+ "Clear filter" : "Esborra el filtre",
+ "Modified" : "Darrera modificació",
+ "Search everywhere" : "Cerca a tot arreu",
+ "Type" : "Tipus",
+ "Active filters" : "Filtres actius",
+ "Remove filter" : "Suprimeix el filtre",
+ "Total rows summary" : "Resum de totes les files",
+ "Toggle selection for all files and folders" : "Canvia la selecció per a tots els fitxers i carpetes",
+ "Name" : "Nom",
+ "Size" : "Mida",
+ "Actions" : "Accions",
+ "(selected)" : "(seleccionat)",
+ "List of files and folders." : "Llista de fitxers i carpetes.",
+ "You have used your space quota and cannot upload files anymore." : "Heu utilitzat la quota d'espai i ja no podeu pujar fitxers.",
+ "Column headers with buttons are sortable." : "Les capçaleres de columna amb botons es poder ordenar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
+ "File not found" : "No s'ha trobat el fitxer",
+ "{usedQuotaByte} used" : "{usedQuotaByte} en ús",
+ "{used} of {quota} used" : "{used} de {quota} en ús",
+ "{relative}% used" : "{relative}% en ús",
+ "Could not refresh storage stats" : "No s'han pogut actualitzar les estadístiques d'emmagatzematge",
+ "Your storage is full, files can not be updated or synced anymore!" : "L'emmagatzematge està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
+ "Storage information" : "Informació d'emmagatzematge",
+ "Storage quota" : "Quota d'emmagatzematge",
+ "New folder" : "Carpeta nova",
+ "Create new folder" : "Crea una carpeta",
+ "This name is already in use." : "Aquest nom ja s'utilitza.",
+ "Create" : "Crea",
+ "Fill template fields" : "Ompliu els camps de la plantilla",
+ "Submitting fields …" : "S'estan enviant camps …",
+ "Submit" : "Envia",
+ "Choose a file or folder to transfer" : "Trieu el fitxer o carpeta que voleu transferir",
+ "Transfer" : "Transfereix",
+ "Transfer {path} to {userid}" : "Transfereix {path} a {userid}",
+ "Invalid path selected" : "El camí seleccionat no és vàlid",
"Unknown error" : "Error desconegut",
- "File could not be found" : "No s'ha pogut trobar el fitxer",
- "Move or copy" : "Mou o copia",
- "Download" : "Baixa",
+ "Ownership transfer request sent" : "S'ha enviat la sol·licitud de transferència de propietat",
+ "Cannot transfer ownership of a file or folder you do not own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre",
+ "Transfer ownership of a file or folder" : "Transferència de la propietat d'un fitxer o carpeta",
+ "Choose file or folder to transfer" : "Tria el fitxer o carpeta que voleu transferir",
+ "Change" : "Canvia",
+ "New owner" : "Propietari nou",
+ "Keep {old}" : "Mantenir {old}",
+ "Keep without extension" : "Mantenir sense extensió",
+ "Use {new}" : "Utilitza {new}",
+ "Remove extension" : "Suprimeix l'extensió",
+ "Change file extension" : "Canvia l'extensió del fitxer",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Canviar l'extensió del fitxer de \"{old}\" a \"{new}\" pot fer que el fitxer sigui il·legible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Suprimeix l'extensió de fitxer \"{old}\" pot fer que el fitxer sigui il·legible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Afegir l'extensió del fitxer \"{new}\" pot fer que el fitxer sigui il·legible.",
+ "Do not show this dialog again." : "No torneu a mostrar aquest diàleg.",
+ "Select file or folder to link to" : "Seleccioneu el fitxer o la carpeta que voleu enllaçar",
+ "Choose {file}" : "Tria {file}",
+ "Share" : "Comparteix",
+ "Shared by link" : "S'ha compartit amb un enllaç",
+ "Shared" : "S'ha compartit",
+ "Switch to list view" : "Canvia a la visualització de llista",
+ "Switch to grid view" : "Canvia a la visualització de quadrícula",
+ "The file could not be found" : "No s'ha pogut trobar el fitxer",
+ "Upload was cancelled by user" : "L'usuari ha cancel·lat la pujada",
+ "Not enough free space" : "No hi ha prou espai lliure",
+ "Operation is blocked by access control" : "L'operació està blocada pel control d'accés",
+ "Error during upload: {message}" : "S'ha produït un error durant la pujada: {message}",
+ "Error during upload, status code {status}" : "S'ha produït un error durant la pujada, el codi d'estat és {status}",
+ "Unknown error during upload" : "S'ha produït un error desconegut durant la pujada",
+ "Loading current folder" : "S'està carregant la carpeta actual",
+ "Retry" : "Torna-ho a provar",
+ "No files in here" : "No hi ha cap fitxer aquí",
+ "Upload some content or sync with your devices!" : "Pugeu contingut o sincronitzeu els vostres dispositius!",
+ "Go back" : "Torna",
+ "Views" : "Vistes",
+ "Files settings" : "Paràmetres de Fitxers",
+ "Your files" : "Els vostres fitxers",
+ "Open in files" : "Obre a Fitxers",
+ "File cannot be accessed" : "No es pot accedir al fitxer",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "No s'ha trobat el fitxer o no teniu permisos per a visualitzar-lo. Demaneu al remitent que el comparteixi.",
+ "Clipboard is not available" : "El porta-retalls no està disponible",
+ "General" : "General",
+ "All files" : "Tots els fitxers",
+ "Personal files" : "Fitxers personals",
+ "Sort favorites first" : "Ordena primer els preferits",
+ "Sort folders before files" : "Ordena les carpetes abans dels fitxers",
+ "Appearance" : "Aparença",
+ "Show hidden files" : "Mostra els fitxers ocults",
+ "Crop image previews" : "Retalla les previsualitzacions de les imatges",
+ "Additional settings" : "Paràmetres addicionals",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copia",
+ "Warnings" : "Advertiments",
+ "Keyboard shortcuts" : "Dreceres de teclat",
+ "File actions" : "Arxivar accions",
+ "Rename" : "Canvia el nom",
"Delete" : "Suprimeix",
- "Home" : "Inici",
+ "Manage tags" : "Administrar les etiquetes",
+ "Selection" : "Selecció",
+ "Select all files" : "Seleccioneu tots els fitxers",
+ "Deselect all" : "No seleccionis res",
+ "Navigation" : "Navegació",
+ "View" : "Visualització",
+ "Toggle grid view" : "Canvia la visualització de quadrícula",
+ "Show those shortcuts" : "Mostra aquestes dreceres",
+ "You" : "Vós",
+ "Shared multiple times with different people" : "S'ha compartit diverses vegades amb persones diferents",
+ "Unable to change the favorite state of the file" : "No es pot canviar l'estat preferit del fitxer",
+ "Error while loading the file data" : "S'ha produït un error en carregar la informació del fitxer",
+ "Owner" : "Propietat",
+ "Remove from favorites" : "Suprimeix dels preferits",
+ "Add to favorites" : "Afegeix als preferits",
+ "Tags" : "Etiquetes",
+ "Blank" : "En blanc",
+ "Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
+ "Pick a template for {name}" : "Trieu una plantilla per a {name}",
+ "Create a new file with the selected template" : "Crea un fitxer amb la plantilla seleccionada",
+ "Creating file" : "S'està creant el fitxer",
+ "Save as {displayName}" : "Desa com a {displayName}",
+ "Save as …" : "Anomena i desa …",
+ "Converting files …" : "Convertint fitxers …",
+ "Failed to convert files: {message}" : "No s'han pogut convertir els fitxers: {message}",
+ "All files failed to be converted" : "No s'han pogut convertir tots els fitxers",
+ "One file could not be converted: {message}" : "No s'ha pogut convertir un fitxer: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["No s'ha pogut convertir un fitxer","No s’han pogut convertir %n fitxers"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un fitxer s'ha convertit correctament","%n fitxers s'han convertit correctament"],
+ "Files successfully converted" : "Els fitxers s'han convertit correctament",
+ "Failed to convert files" : "No s'han pogut convertir els fitxers",
+ "Converting file …" : "S'està convertint el fitxer …",
+ "File successfully converted" : "El fitxer s'ha convertit correctament",
+ "Failed to convert file: {message}" : "No s'ha pogut convertir el fitxer: {message}",
+ "Failed to convert file" : "No s'ha pogut convertir el fitxer",
+ "Leave this share" : "Abandona aquest element compartit",
+ "Leave these shares" : "Abandona aquests elements compartits",
+ "Disconnect storage" : "Desconnecta l'emmagatzematge",
+ "Disconnect storages" : "Desconnecta els emmagatzematges",
+ "Delete permanently" : "Suprimeix permanentment",
+ "Delete and unshare" : "Suprimeix i deixa de compartir",
+ "Delete file" : "Suprimeix el fitxer",
+ "Delete files" : "Suprimeix els fitxers",
+ "Delete folder" : "Suprimeix la carpeta",
+ "Delete folders" : "Suprimeix les carpetes",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Esteu a punt de suprimir permanentment {count} element","Esteu a punt de suprimir permanentment {count} elements"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Esteu a punt de suprimir {count} element","Esteu a punt de suprimir {count} elements"],
+ "Confirm deletion" : "Confirma la supressió",
+ "Cancel" : "Cancel·la",
+ "Download" : "Baixa",
+ "Moving \"{source}\" to \"{destination}\" …" : "S'està movent \"{source}\" a \"{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "S'està copiant \"{source}\" a \"{destination}” …",
+ "Destination is not a folder" : "La destinació no és una carpeta",
+ "This file/folder is already in that directory" : "Aquest fitxer o carpeta ja existeix en aquesta carpeta",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No podeu moure un fitxer o carpeta a la mateixa carpeta o a una subcarpeta de la mateixa carpeta",
+ "(copy)" : "(còpia)",
+ "(copy %n)" : "(còpia %n)",
+ "A file or folder with that name already exists in this folder" : "Ja existeix un fitxer o carpeta amb aquest nom en aquesta carpeta",
+ "The files are locked" : "Els fitxers estan blocats",
+ "The file does not exist anymore" : "El fitxer ja no existeix",
+ "Choose destination" : "Trieu una destinació",
+ "Copy to {target}" : "Copia a {target}",
+ "Move to {target}" : "Mou a {target}",
+ "Move" : "Mou",
+ "Move or copy operation failed" : "Error en l'operació de desplaçament o còpia",
+ "Move or copy" : "Mou o copia",
+ "Open folder {displayName}" : "Obre la carpeta {displayName}",
+ "Open in Files" : "Obre a Fitxers",
+ "Open locally" : "Obre en local",
+ "Failed to redirect to client" : "No s'ha pogut redirigir al client",
+ "Open file locally" : "Obre el fitxer en local",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Ara s'hauria d'obrir el fitxer al dispositiu. Si no és així, comproveu que teniu instal·lada l'aplicació d'escriptori.",
+ "Retry and close" : "Torna-ho a provar i tanca",
+ "Open online" : "Obre en línia",
+ "Details" : "Detalls",
+ "View in folder" : "Visualitza-ho en la carpeta",
+ "Today" : "Avui",
+ "Last 7 days" : "Últims 7 dies",
+ "Last 30 days" : "Últims 30 dies",
+ "This year ({year})" : "Aquest any ({year})",
+ "Last year ({year})" : "L'any passat ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Fulls de càlcul",
+ "Presentations" : "Presentacions",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetes",
+ "Audio" : "Àudio",
+ "Images" : "Imatges",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "S'ha creat la carpeta nova «{name}»",
+ "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
+ "Create templates folder" : "Crea una carpeta de plantilles",
+ "Templates" : "Plantilles",
+ "New template folder" : "Carpeta de plantilles nova",
+ "In folder" : "En la carpeta",
+ "Search in folder: {folder}" : "Cerca en la carpeta: {folder}",
+ "One of the dropped files could not be processed" : "No s'ha pogut processar un dels fitxers deixats caure",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "El vostre navegador no admet l'API del sistema de fitxers. Els directoris no es pujaran",
+ "No files to upload" : "No hi ha cap fitxer per pujar",
+ "Unable to create the directory {directory}" : "No s'ha pogut crear la carpeta {directory}",
+ "Some files could not be uploaded" : "No s'han pogut pujar alguns fitxers",
+ "Files uploaded successfully" : "Els fitxers s'han pujat correctament",
+ "No files to process" : "No hi ha cap fitxer per processar",
+ "Some files could not be copied" : "No s'han pogut copiar alguns fitxers",
+ "Some files could not be moved" : "No s'han pogut moure alguns fitxers",
+ "Files copied successfully" : "Els fitxers s'han copiat correctament",
+ "Files moved successfully" : "Els fitxers s'han mogut correctament",
+ "Conflicts resolution skipped" : "S'ha omès la resolució de conflictes",
+ "Upload cancelled" : "S'ha cancel·lat la pujada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No s'ha pogut canviar el nom de «{oldName}», ja no existeix",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nom «{newName}» ja està en ús en la carpeta «{dir}». Trieu un nom diferent.",
+ "Could not rename \"{oldName}\"" : "No s'ha pogut canviar el nom de «{oldName}»",
+ "This operation is forbidden" : "Aquesta operació no està permesa",
+ "Storage is temporarily not available" : "L'emmagatzematge no està disponible temporalment",
+ "Unexpected error: {error}" : "Error inesperat: {error}",
+ "_%n file_::_%n files_" : ["%n fitxer","%n fitxers"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
+ "Filename must not be empty." : "El nom del fitxer no ha d'estar buit.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no és permès dins d'un nom de fitxer.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" és un nom reservat i no és permès per als noms de fitxer.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no és un tipus de fitxer permès.",
+ "Filenames must not end with \"{extension}\"." : "Els noms de fitxer no han d'acabar amb \"{extension}\".",
+ "List of favorite files and folders." : "Llista de fitxers i carpetes preferits.",
+ "No favorites yet" : "Encara no teniu preferits",
+ "Files and folders you mark as favorite will show up here" : "Els fitxers i les carpetes que marqueu com a preferits es mostraran aquí",
+ "List of your files and folders." : "Llista dels vostres fitxers i carpetes.",
+ "List of your files and folders that are not shared." : "Llista dels vostres fitxers i carpetes que no compartiu.",
+ "No personal files found" : "No s'ha trobat cap fitxer personal",
+ "Files that are not shared will show up here." : "Els fitxers que no compartiu es mostraran aquí.",
+ "Recent" : "Recents",
+ "List of recently modified files and folders." : "Llista de fitxers i carpetes modificats recentment.",
+ "No recently modified files" : "No hi ha cap fitxer modificat recentment",
+ "Files and folders you recently modified will show up here." : "Els fitxers i les carpetes que heu modificat recentment es mostraran aquí.",
+ "Search" : "Cercar",
+ "No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
+ "Select all" : "Selecciona-ho tot",
+ "Upload too large" : "La pujada és massa gran",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que intenteu pujar superen la mida màxima de pujada de fitxers del servidor.",
+ "File could not be found" : "No s'ha pogut trobar el fitxer",
+ "Show list view" : "Mostra la visualització de llista",
+ "Show grid view" : "Mostra la visualització de graella",
"Close" : "Tanca",
- "Favorites" : "Preferits",
"Could not create folder \"{dir}\"" : "No s'ha pogut crear la carpeta «{dir}»",
"This will stop your current uploads." : "Això aturarà les pujades actuals.",
"Upload cancelled." : "S'ha cancel·lat la pujada.",
- "Processing files …" : "S'estan processant els fitxers...",
+ "Processing files …" : "S'estan processant els fitxers…",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "No s'ha pogut pujar {filename} perquè és una carpeta o té 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, esteu pujant {size1} però només teniu {size2} lliures",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, esteu pujant {size1}, però només teniu {size2} lliures",
"Target folder \"{dir}\" does not exist any more" : "La carpeta de destinació «{dir}» ja no existeix",
- "Not enough free space" : "No hi ha prou espai lliure",
"An unknown error has occurred" : "S'ha produït un error desconegut",
- "Uploading …" : "S'està pujant...",
+ "File could not be uploaded" : "No s'ha pogut pujar el fitxer",
+ "Uploading …" : "S'està pujant…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "S'està pujant… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "No s'admet la pujada aquest element",
- "Target folder does not exist any more" : "La carpeta de destinació ja no existeix",
- "Operation is blocked by access control" : "L'operació està blocada pel control d'accés",
"Error when assembling chunks, status code {status}" : "S'ha produït un error en recopilar els fragments, el codi d'estat és {status}",
- "Actions" : "Accions",
- "Rename" : "Canvia el nom",
- "Copy" : "Copia",
"Choose target folder" : "Trieu la carpeta de destinació",
+ "Set reminder" : "Defineix un recordatori",
+ "Edit locally" : "Edita localment",
"Open" : "Obre",
- "Delete file" : "Suprimeix el fitxer",
- "Delete folder" : "Suprimeix la carpeta",
- "Disconnect storage" : "Desconnecta l'emmagatzematge",
- "Leave this share" : "Abandona aquest element compartit",
"Could not load info for file \"{file}\"" : "No s'ha pogut carregar la informació del fitxer «{file}»",
- "Files" : "Fitxers",
- "Details" : "Detalls",
"Please select tag(s) to add to the selection" : "Seleccioneu les etiquetes que voleu afegir a la selecció",
"Apply tag(s) to selection" : "Aplica les etiquetes a la selecció",
- "Select" : "Selecciona",
- "Pending" : "Pendent",
+ "Select directory \"{dirName}\"" : "Selecciona la carpeta «{dirName}»",
+ "Select file \"{fileName}\"" : "Selecciona el fitxer «{fileName}»",
"Unable to determine date" : "No s'ha pogut determinar la data",
- "This operation is forbidden" : "Aquesta operació no està permesa",
- "This directory is unavailable, please check the logs or contact the administrator" : "Aquesta carpeta no està disponible. Consulteu els registres o poseu-vos en contacte amb l'administrador.",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aquesta carpeta no està disponible. Consulteu els registres o contacteu amb l'administrador",
"Could not move \"{file}\", target exists" : "No s'ha pogut desplaçar «{file}», el fitxer de destinació ja existeix",
"Could not move \"{file}\"" : "No s'ha pogut desplaçar «{file}»",
"copy" : "còpia",
@@ -52,9 +366,6 @@
"Copied {origin} inside {destination}" : "S'ha copiat {origin} a {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "S'han copiat {origin} i {nbfiles} fitxers més a {destination}",
"{newName} already exists" : "{newName} ja existeix",
- "Could not rename \"{fileName}\", it does not exist any more" : "No s'ha pogut canviar el nom de «{fileName}», ja no existeix",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nom «{targetName}» ja està en ús en la carpeta «{dir}». Trieu un nom diferent.",
- "Could not rename \"{fileName}\"" : "No s'ha pogut canviar el nom de «{fileName}»",
"Could not create file \"{file}\"" : "No s'ha pogut crear el fitxer «{file}»",
"Could not create file \"{file}\" because it already exists" : "No s'ha pogut crear el fitxer «{file}» perquè ja existeix",
"Could not create folder \"{dir}\" because it already exists" : "No s'ha pogut crear la carpeta «{dir}» perquè ja existeix",
@@ -62,18 +373,14 @@
"Error deleting file \"{fileName}\"." : "S'ha produït un error en suprimir el fitxer «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "No hi ha cap resultat de cerca en altres carpetes per a {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduïu més de dos caràcters per a cercar en altres carpetes",
- "Name" : "Nom",
- "Size" : "Mida",
- "Modified" : "Darrera modificació",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
- "_%n file_::_%n files_" : ["%n fitxer","%n fitxers"],
"{dirs} and {files}" : "{dirs} i {files}",
"_including %n hidden_::_including %n hidden_" : ["incloent-hi %n element ocult","incloent-hi %n elements ocults"],
- "You don’t have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí",
+ "You do not have permission to upload or create files here" : "No teniu permís per a pujar o crear fitxers aquí",
"_Uploading %n file_::_Uploading %n files_" : ["S'està pujant %n fitxer","S'estan pujant %n fitxers"],
- "New" : "Nou",
+ "New" : "Crea",
+ "New file/folder menu" : "Menú de fitxer o carpeta nova",
"Select file range" : "Selecciona un interval de fitxers",
- "{used} of {quota} used" : "{used} de {quota} en ús",
+ "{used}%" : "{used}%",
"{used} used" : "{used} en ús",
"\"{name}\" is an invalid file name." : "«{name}» no és un nom de fitxer vàlid.",
"File name cannot be empty." : "El nom del fitxer no pot estar buit.",
@@ -88,131 +395,62 @@
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'emmagatzematge extern «{mountPoint}» està gairebé ple ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "L'emmagatzematge està gairebé ple ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincideix amb «{filter}»","coincideixen amb «{filter}»"],
- "View in folder" : "Visualitza-ho a la carpeta",
- "Copied!" : "S'ha copiat!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copia l'enllaç directe (només funciona per als usuaris que tinguin accés a aquest fitxer o carpeta)",
- "Path" : "Ruta",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "S'ha copiat l'enllaç directe (només funciona per a les persones que tenen accés a aquest fitxer o carpeta)",
+ "Path" : "Camí",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "S'ha afegit als preferits",
- "Favorite" : "Preferits",
- "You can only favorite a single file or folder at a time" : "Només podeu afegir als preferits un fitxer o carpeta alhora",
- "New folder" : "Crea una carpeta",
+ "Favored" : "Afavorit",
+ "Favor" : "Afavorir",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copia l'enllaç directe (només funciona per a les persones que tinguin accés a aquest fitxer o carpeta)",
"Upload file" : "Puja un fitxer",
- "Recent" : "Recents",
- "Not favorited" : "S'ha suprimit dels preferits",
- "Remove from favorites" : "Suprimeix dels preferits",
- "Add to favorites" : "Afegeix als preferits",
+ "Not favored" : "No afavorit",
"An error occurred while trying to update the tags" : "S'ha produït un error en intentar actualitzar les etiquetes",
- "Added to favorites" : "S'ha afegit als preferits",
- "Removed from favorites" : "S'ha suprimit dels preferits",
- "You added {file} to your favorites" : "Heu afegit {file} als preferits",
- "You removed {file} from your favorites" : "Heu suprimit {file} dels preferits",
- "File changes" : "Canvis al fitxer",
- "Created by {user}" : "Creat per {user}",
- "Changed by {user}" : "Modificat per {user}",
- "Deleted by {user}" : "Suprimit per {user}",
- "Restored by {user}" : "Restaurat per {user}",
- "Renamed by {user}" : "Canvi de nom per {user}",
- "Moved by {user}" : "Desplaçat per {user}",
- "\"remote user\"" : "«usuari remot»",
- "You created {file}" : "Heu creat {file}",
- "You created an encrypted file in {file}" : "Heu creat un fitxer xifrat a {file}",
- "{user} created {file}" : "{user} ha creat {file}",
- "{user} created an encrypted file in {file}" : "{user} ha creat un fitxer xifrat a {file}",
- "{file} was created in a public folder" : "S'ha creat {file} en una carpeta pública",
- "You changed {file}" : "Heu modificat {file}",
- "You changed an encrypted file in {file}" : "Heu modificat un fitxer xifrat a {file}",
- "{user} changed {file}" : "{user} ha modificat {file}",
- "{user} changed an encrypted file in {file}" : "{user} ha modificat un fitxer xifrat a {file}",
- "You deleted {file}" : "Heu suprimit {file}",
- "You deleted an encrypted file in {file}" : "Heu suprimit un fitxer xifrat a {file}",
- "{user} deleted {file}" : "{user} ha suprimit {file}",
- "{user} deleted an encrypted file in {file}" : "{user} ha suprimit un fitxer xifrat a {file}",
- "You restored {file}" : "Heu restaurat {file}",
- "{user} restored {file}" : "{user} ha restaurat {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Heu canviat el nom de {oldfile} (ocult) a {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Heu canviat el nom de {oldfile} a {newfile} (ocult)",
- "You renamed {oldfile} to {newfile}" : "Heu canviat el nom de {oldfile} a {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile} (ocult)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ha canviat el nom de {oldfile} (ocult) a {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ha canviat el nom de {oldfile} a {newfile} (ocult)",
- "{user} renamed {oldfile} to {newfile}" : "{user} ha canviat el nom de {oldfile} a {newfile}",
- "You moved {oldfile} to {newfile}" : "Heu desplaçat {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} ha desplaçat {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "S'ha afegit o suprimit un fitxer dels <strong>preferits</strong>",
- "A file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta",
- "A favorite file or folder has been <strong>changed</strong>" : "S'ha <strong>modificat</strong> un fitxer o carpeta dels preferits",
- "All files" : "Tots els fitxers",
- "Unlimited" : "Il·limitat",
"Upload (max. %s)" : "Puja (màx. %s)",
- "Accept" : "Accepta",
- "Reject" : "Rebutja",
- "Incoming ownership transfer from {user}" : "{user} us ha enviat una transferència de propietat",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voleu acceptar {path}?\n\nNota: el procés de transferència després de l'acceptació pot durar fins a 1 hora.",
- "Ownership transfer failed" : "S'ha produït un error en transferir la propietat",
- "Your ownership transfer of {path} to {user} failed." : "S'ha produït un error en transferir la propietat de {path} a {user}.",
- "The ownership transfer of {path} from {user} failed." : "S'ha produït un error en transferir la propietat de {path} de {user}.",
- "Ownership transfer done" : "La transferència de la propietat ha finalitzat",
- "Your ownership transfer of {path} to {user} has completed." : "S'ha completat la transferència de propietat de {path} a {user}.",
- "The ownership transfer of {path} from {user} has completed." : "S'ha completat la transferència de propietat de {path} de {user}.",
- "in %s" : "%s",
- "File Management" : "Gestió de fitxers",
- "Transfer ownership of a file or folder" : "Transferiu la propietat d'un fitxer o carpeta",
- "Choose file or folder to transfer" : "Tria el fitxer o carpeta que s'ha de transferir",
- "Change" : "Canvia",
- "New owner" : "Propietari nou",
- "Search users" : "Cerqueu usuaris",
- "Choose a file or folder to transfer" : "Trieu el fitxer o carpeta que vulgueu transferir",
- "Transfer" : "Transfereix",
- "Transfer {path} to {userid}" : "Transfereix {path} a {userid}",
- "Invalid path selected" : "El camí seleccionat no és vàlid",
- "Ownership transfer request sent" : "S'ha enviat la sol·licitud de transferència de propietat",
- "Cannot transfer ownership of a file or folder you don't own" : "No es pot transferir la propietat d'un fitxer o carpeta que no és vostre",
- "Tags" : "Etiquetes",
- "Unable to change the favourite state of the file" : "No s'ha pogut canviar l'estat de preferit del fitxer",
- "Error while loading the file data" : "S'ha produït un error en carregar la informació del fitxer",
- "Pick a template for {name}" : "Trieu una plantilla per a {name}",
- "Cancel" : "Cancel·la",
- "Create" : "Crea",
- "Create a new file with the selected template" : "Crea un fitxer amb la plantilla seleccionada",
- "Creating file" : "S'està creant el fitxer",
- "Blank" : "En blanc",
- "Unable to create new file from template" : "No s'ha pogut crear el fitxer a partir de la plantilla",
- "Set up templates folder" : "Configura la carpeta de plantilles",
- "Templates" : "Plantilles",
- "Unable to initialize the templates directory" : "No s'ha pogut inicialitzar la carpeta de plantilles",
- "%s used" : "%s en ús",
- "%s%% of %s used" : "%s%% de %s en ús",
- "%1$s of %2$s used" : "%1$s de %2$s en ús",
- "Settings" : "Paràmetres",
- "Show hidden files" : "Mostra els fitxers ocults",
- "Crop image previews" : "Retalla les previsualitzacions de les imatges",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "L'acció «{displayName}» s'ha executat correctament",
+ "\"{displayName}\" action failed" : "S'ha produït un error en l'acció «{displayName}»",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ha fallat en alguns elements",
+ "\"{displayName}\" batch action executed successfully" : "L'acció per lots «{displayName}» s'ha executat correctament",
+ "Submitting fields…" : "S'estan enviant camps…",
+ "Filter filenames…" : "Filtra els noms de fitxer…",
+ "WebDAV URL copied to clipboard" : "S'ha copiat l'URL de WebDAV al porta-retalls",
+ "Enable the grid view" : "Habilita la visualització de quadrícula",
+ "Enable folder tree" : "Habilita l'arbre de carpetes",
+ "Copy to clipboard" : "Copia-ho al porta-retalls",
"Use this address to access your Files via WebDAV" : "Utilitzeu aquesta adreça per a accedir als vostres fitxers mitjançant WebDAV",
- "Toggle %1$s sublist" : "Commuta la subllista de %1$s",
- "Toggle grid view" : "Canvia la vista de quadrícula",
- "No files in here" : "No hi ha fitxers aquí",
- "Upload some content or sync with your devices!" : "Pugeu contingut o sincronitzeu els vostres dispositius!",
- "No entries found in this folder" : "No s'ha trobat cap entrada en aquesta carpeta",
- "Select all" : "Selecciona-ho tot",
- "Upload too large" : "La pujada és massa gran",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que intenteu pujar superen la mida màxima de pujada de fitxers del servidor.",
- "No favorites yet" : "Encara no teniu preferits",
- "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els fitxers i carpetes que marqueu com a preferits",
- "Deleted files" : "Fitxers suprimits",
- "Shares" : "Elements compartits",
- "Shared with others" : "Compartit amb altres usuaris",
- "Shared with you" : "Compartit amb vós",
- "Shared by link" : "Compartit amb un enllaç",
- "Deleted shares" : "Suprimit",
- "Pending shares" : "Pendent",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si heu habilitat l'autenticació de doble factor, podeu crear i utilitzar una nova contrasenya d'aplicació fent clic aquí.",
+ "Deletion cancelled" : "S'ha cancel·lat la supressió",
+ "Move cancelled" : "S'ha cancel·lat el desplaçament",
+ "Cancelled move or copy of \"{filename}\"." : "S'ha cancel·lat el moviment o la còpia de \"{filename}\".",
+ "Cancelled move or copy operation" : "S'ha cancel·lat l'operació de desplaçament o còpia",
+ "Open details" : "Obre els detalls",
+ "Photos and images" : "Fotografies i imatges",
+ "New folder creation cancelled" : "S'ha cancel·lat la creació de carpetes noves",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fitxer","{fileCount} fitxers"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fitxer i {folderCount} carpeta","1 fitxer i {folderCount} carpetes"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fitxer i 1 carpeta","{fileCount} fitxers i 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fitxers i {folderCount} carpetes",
+ "All folders" : "Totes les carpetes",
+ "Personal Files" : "FItxers personals",
"Text file" : "Fitxer de text",
"New text file.txt" : "Fitxer de text nou.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'emmagatzematge de l'usuari {owner} està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "La carpeta de grup «{mountPoint}» està plena, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'emmagatzematge extern «{mountPoint}» està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "Your storage is full, files can not be updated or synced anymore!" : "L'emmagatzematge està ple, els fitxers ja no es poden actualitzar ni sincronitzar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincideix amb «{filter}»","coincideixen amb «{filter}»"]
+ "Filter file names …" : "Filtra els noms dels fitxers …",
+ "Prevent warning dialogs from open or reenable them." : "Eviteu que s'obrin els diàlegs d'advertència o torneu-los a habilitar.",
+ "Show a warning dialog when changing a file extension." : "Mostra un diàleg d'avís quan es canvia una extensió de fitxer.",
+ "Speed up your Files experience with these quick shortcuts." : "Accelereu l'experiència Fitxers amb aquestes dreceres ràpides.",
+ "Open the actions menu for a file" : "Obre el menú d'accions per un fitxer",
+ "Rename a file" : "Canvia el nom del fitxer",
+ "Delete a file" : "Suprimeix el fitxer",
+ "Favorite or remove a file from favorites" : "Marca com a preferit o suprimeix un fitxer dels preferits",
+ "Manage tags for a file" : "Administra les etiquetes d'un fitxer",
+ "Deselect all files" : "Desseleccioneu tots els fitxers",
+ "Select or deselect a file" : "Seleccioneu o deseleccioneu un fitxer",
+ "Select a range of files" : "Seleccioneu un rang de fitxers",
+ "Navigate to the parent folder" : "Navegueu a la carpeta principal",
+ "Navigate to the file above" : "Navegueu al fitxer de dalt",
+ "Navigate to the file below" : "Navegueu fins al fitxer següent",
+ "Navigate to the file on the left (in grid mode)" : "Navegueu fins al fitxer de l'esquerra (en mode de quadrícula)",
+ "Navigate to the file on the right (in grid mode)" : "Navegueu fins al fitxer de la dreta (en mode de quadrícula)",
+ "Toggle the grid view" : "Commuta la vista de la quadrícula",
+ "Open the sidebar for a file" : "Obriu la barra lateral d'un fitxer"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js
index 04de93eb73b..f2465a705f0 100644
--- a/apps/files/l10n/cs.js
+++ b/apps/files/l10n/cs.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
- "Storage invalid" : "Neplatné úložiště",
- "Unknown error" : "Neznámá chyba",
- "File could not be found" : "Soubor se nedaří nalézt",
- "Move or copy" : "Přesunout nebo zkopírovat",
- "Download" : "Stáhnout",
- "Delete" : "Smazat",
- "Home" : "Domů",
- "Close" : "Zavřít",
- "Favorites" : "Oblíbené",
- "Could not create folder \"{dir}\"" : "Složku „{dir}“ nelze vytvořit",
- "This will stop your current uploads." : "Toto zastaví stávající nahrávání.",
- "Upload cancelled." : "Nahrávání zrušeno.",
- "Processing files …" : "Zpracovávání souborů…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Soubor {filename} nelze nahrát, protože je to buď adresář nebo má velikost nula bajtů",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedostatek volného místa pro uložení – velikost nahrávaných dat je {size1}, volné kapacity úložiště ale zbývá už jen {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Cílová složka „{dir}“ už neexistuje",
- "Not enough free space" : "Nedostatek volného prostoru",
- "An unknown error has occurred" : "Vyskytla se neznámá chyba",
- "Uploading …" : "Nahrávání…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nahrání této položky není podporováno",
- "Target folder does not exist any more" : "Cílová složka už neexistuje",
- "Operation is blocked by access control" : "Operace je blokována řízením přístupu",
- "Error when assembling chunks, status code {status}" : "Chyba při kompletaci shluků, kód chyby {status}",
- "Actions" : "Akce",
- "Rename" : "Přejmenovat",
- "Copy" : "Kopírovat",
- "Choose target folder" : "Zvolte cílovou složku",
- "Open" : "Otevřít",
- "Delete file" : "Smazat soubor",
- "Delete folder" : "Smazat složku",
- "Disconnect storage" : "Odpojit úložiště",
- "Leave this share" : "Opustit toto sdílení",
- "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor „{file}“",
- "Files" : "Soubory",
- "Details" : "Podrobnosti",
- "Please select tag(s) to add to the selection" : "Vyberte štítky které přidat do výběru",
- "Apply tag(s) to selection" : "Uplatnit štítky na výběr",
- "Select" : "Vybrat",
- "Pending" : "Nevyřízené",
- "Unable to determine date" : "Nelze určit datum",
- "This operation is forbidden" : "Tato operace je zakázána",
- "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
- "Could not move \"{file}\", target exists" : "„{file}“ nelze přesunout – cíl už existuje",
- "Could not move \"{file}\"" : "„{file}“ nelze přesunout",
- "copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Nelze kopírovat „{file}“, cíl už existuje",
- "Could not copy \"{file}\"" : "Nelze kopírovat „{file}“",
- "Copied {origin} inside {destination}" : "{origin} zkopírován do {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} a {nbfiles} dalších souborů zkopírováno do {destination}",
- "{newName} already exists" : "{newName} už existuje",
- "Could not rename \"{fileName}\", it does not exist any more" : "„{fileName}“ nelze přejmenovat – už neexistuje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Název „{targetName}“ je už použitý ve složce „{dir}“. Zvolte jiný název.",
- "Could not rename \"{fileName}\"" : "„{fileName}“ nelze přejmenovat",
- "Could not create file \"{file}\"" : "Soubor „{file}“ nelze vytvořit",
- "Could not create file \"{file}\" because it already exists" : "Soubor „{file}“ nelze vytvořit, protože zde už existuje",
- "Could not create folder \"{dir}\" because it already exists" : "Složku „{dir}“ nelze vytvořit, protože už existuje",
- "Could not fetch file details \"{file}\"" : "Nedaří se získat podrobnosti o souboru „{file}“",
- "Error deleting file \"{fileName}\"." : "Chyba při mazání souboru „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Žádné výsledky hledání v ostatních složkách pro {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Pokud chcete hledat v ostatních složkách, zadejte více než dva znaky",
- "Name" : "Název",
- "Size" : "Velikost",
- "Modified" : "Změněno",
- "_%n folder_::_%n folders_" : ["%n složka","%n složky","%n složek","%n složky"],
- "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů","%n soubory"],
- "{dirs} and {files}" : "{dirs} a {files}",
- "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"],
- "You don’t have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory",
- "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"],
- "New" : "Nový",
- "Select file range" : "Vybrat rozsah souborů",
- "{used} of {quota} used" : "Využito {used} z {quota} ",
- "{used} used" : "{used} využito",
- "\"{name}\" is an invalid file name." : "„{name}“ není platným názvem souboru.",
- "File name cannot be empty." : "Je třeba vyplnit název souboru.",
- "\"/\" is not allowed inside a file name." : "„/“ není povolený znak v názvu souboru.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ není povolený typ souboru",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložiště uživatele {owner} je zaplněné – nelze aktualizovat ani synchronizovat soubory!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložiště je plné – nelze aktualizovat ani synchronizovat soubory!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úložiště {owner} je téměř plné ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinová složka „{mountPoint}“ je téměř plná ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externí úložiště „{mountPoint}“ je téměř plné ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložiště je téměř plné ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["shoduje se s „{filter}“","shodují se s „{filter}“","shoduje se s „{filter}“","shodují se s „{filter}“"],
- "View in folder" : "Zobrazit ve složce",
- "Copied!" : "Zkopírováno!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Zkopírovat přímý odkaz (funguje pouze pro uživatele, kteří mají přístup k tomuto souboru/složce)",
- "Path" : "Popis umístění",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
- "Favorited" : "Přidáno mezi oblíbené",
- "Favorite" : "Oblíbené",
- "You can only favorite a single file or folder at a time" : "Do oblíbených lze soubory a složky zařazovat jen jednotlivě",
- "New folder" : "Nová složka",
- "Upload file" : "Nahrát soubor",
- "Recent" : "Nedávné",
- "Not favorited" : "Nepřidáno do oblíbených",
- "Remove from favorites" : "Odebrat z oblíbených",
- "Add to favorites" : "Přidat do oblíbených",
- "An error occurred while trying to update the tags" : "Při pokusu o úpravu štítků došlo k chybě",
"Added to favorites" : "Přidáno do oblíbených",
"Removed from favorites" : "Odebráno z oblíbených",
"You added {file} to your favorites" : "Do svých oblíbených jste přidali {file}",
"You removed {file} from your favorites" : "Odstranili jste {file} ze svých oblíbených",
+ "Favorites" : "Oblíbené",
"File changes" : "Změny souboru",
"Created by {user}" : "Vytvořil(a) {user}",
"Changed by {user}" : "Změnil(a) {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Obnovil(a) {user}",
"Renamed by {user}" : "Přejmenováno uživatelem {user}",
"Moved by {user}" : "Přesunuto uživatelem {user}",
- "\"remote user\"" : "„federovaný uživatel“",
+ "\"remote account\"" : "„vzdálený účet“",
"You created {file}" : "Vytvořili jste {file}",
"You created an encrypted file in {file}" : "Vytvořili jste šifrovaný soubor v {file}",
"{user} created {file}" : "{user} vytvořil(a) {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Přesunuli jste {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} přesunul(a) {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Soubor byl přidán, nebo odstraněn z vašich <strong>oblíbených</strong>",
+ "Files" : "Soubory",
"A file or folder has been <strong>changed</strong>" : "Soubor nebo složka byla <strong>změněna</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Oblíbený soubor nebo složka byla <strong>změněna</strong>",
- "All files" : "Všechny soubory",
- "Unlimited" : "Neomezeně",
- "Upload (max. %s)" : "Nahrát (max. %s)",
+ "Failed to authorize" : "Nepodařilo se získat pověření",
+ "Invalid folder path" : "Neplatný popis umístění složky",
+ "Folder not found" : "Složka nenalezena",
+ "The file cannot be found" : "Soubor není možné nalézt",
+ "The destination path does not exist: %1$s" : "Cílový popis umístění neexistuje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nemáte oprávnění pro vytvoření souboru v určeném umístění",
+ "The file could not be converted." : "Soubor nebylo možné převést.",
+ "Could not get relative path to converted file" : "Nepodařilo se získat vztažený popis umístění převáděného souboru",
+ "Favorite files" : "Oblíbené soubory",
+ "No favorites" : "Žádné oblíbené",
+ "More favorites" : "Další oblíbené",
"Accept" : "Přijmout",
"Reject" : "Odmítnout",
"Incoming ownership transfer from {user}" : "Příchozí převedení vlastnictví od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Chcete přijmout {path}?\n\nPozn.: Proces převedení může trvat až hodinu po přijmutí.",
+ "Ownership transfer denied" : "Převedení vlastnictví odepřeno",
+ "Your ownership transfer of {path} was denied by {user}." : "Převedení vašeho vlastnictví {path} bylo odepřeno {user}.",
"Ownership transfer failed" : "Převedení vlastnictví se nezdařilo",
"Your ownership transfer of {path} to {user} failed." : "Převedení vlastnictví {path} od vás na {user} se nezdařilo.",
"The ownership transfer of {path} from {user} failed." : "Převedení vlastnictví {path} od {user} se nezdařilo.",
@@ -159,62 +67,414 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Převedení vámi vlastněného {path} na {user} dokončeno.",
"The ownership transfer of {path} from {user} has completed." : "Převedení vlastnictví {path} od {user} dokončeno.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Převedeno z %1$s na %2$s",
+ "Files compatibility" : "Kompatibilita souborů",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Umožňuje omezit názvy souborů aby bylo zajištěno, že soubory bude možné synchronizovat se všemi klienty. Ve výchozím stavu jsou povoleny veškeré názvy souborů, splňující standard POSIX (např. Linux nebo macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po povolení názvů souborů, kompatibilních s Windows, stávající soubory už nebude možné změnit, ale je možné je přejmenovat na platné nové názvy jejich vlastníkem.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Po povolení tohoto natavení je také možné soubory stěhovat automaticky. Další informace viz dokumentace k příkazu occ.",
+ "Enforce Windows compatibility" : "Vynutit kompatibilitu s Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Toto bude blokovat použití názvů souborů, které nejsou platné na strojích s Windows, jako je použití vyhrazených názvů nebo speciálních znaků. Ale nevynutí kompatibilitu v případě rozlišování malých/VELKÝCH písmen.",
"File Management" : "Správa souboru",
- "Transfer ownership of a file or folder" : "Převést vlastnictví souboru či složky",
- "Choose file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
- "Change" : "Změnit",
- "New owner" : "Nový vlastník",
- "Search users" : "Hledat uživatele",
+ "Home" : "Domů",
+ "Target folder does not exist any more" : "Cílová složka už neexistuje",
+ "Reload current directory" : "Znovu načíst stávající složku",
+ "Go to the \"{dir}\" directory" : "Přejít do složky „{dir}“",
+ "Current directory path" : "Stávající popis umístění složky",
+ "Your have used your space quota and cannot upload files anymore" : "Využili jste celou svou kvótu na prostor a už nemůžete nahrávat další soubory",
+ "You do not have permission to upload or create files here." : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory.",
+ "Drag and drop files here to upload" : "Soubory nahrajete jejich přetažením sem",
+ "Favorite" : "Oblíbené",
+ "Back" : "Zpět",
+ "Toggle selection for file \"{displayName}\"" : "Vybrat / zrušit výběr souboru „{displayName}“",
+ "Toggle selection for folder \"{displayName}\"" : "Vybrat / zrušit výběr složky „{displayName}“",
+ "File is loading" : "Soubor je načítán",
+ "Folder is loading" : "Složka se načítá",
+ "Filename" : "Soubor",
+ "Folder name" : "Název složky",
+ "This node is unavailable" : "Tento uzel není k dispozici",
+ "Another entry with the same name already exists." : "Už existuje jiná položka se stejným názvem.",
+ "Invalid filename." : "Neplatný název souboru.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Přejmenováno „{oldName}“ na „{newName}",
+ "Rename file" : "Přejmenovat soubor",
+ "Folder" : "Složka",
+ "Unknown file type" : "Neznámý typ souboru",
+ "{ext} image" : "{ext}obrázek",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Nevyřízené",
+ "Unknown date" : "Neznámé datum",
+ "Clear filter" : "Vyčistit filtr",
+ "Modified" : "Změněno",
+ "Search everywhere" : "Hledat všude",
+ "Type" : "Typ",
+ "Active filters" : "Zapnuté filtry",
+ "Remove filter" : "Odebrat filtr",
+ "Total rows summary" : "Celkový souhrn řádek",
+ "Toggle selection for all files and folders" : "Vybrat / zrušit výběr všech souborů a složek",
+ "Name" : "Název",
+ "File type" : "Typ souboru",
+ "Size" : "Velikost",
+ "Actions" : "Akce",
+ "(selected)" : "(vybráno)",
+ "List of files and folders." : "Seznam souborů a složek.",
+ "You have used your space quota and cannot upload files anymore." : "Využili jste celou svou kvótu na prostor a už nemůžete nahrávat další soubory.",
+ "Column headers with buttons are sortable." : "Podle těch sloupců, které mají v záhlaví tlačítko, je možné řadit.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
+ "File not found" : "Soubor nenalezen",
+ "_{count} selected_::_{count} selected_" : ["vybráno {count}","vybráno {count}","vybráno {count}","vybráno {count}"],
+ "Search scope options" : "Předvolby rozsahu prohledávaného",
+ "{usedQuotaByte} used" : "{usedQuotaByte} využito",
+ "{used} of {quota} used" : "Využito {used} z {quota} ",
+ "{relative}% used" : "{relative}% využito",
+ "Could not refresh storage stats" : "Nedaří se znovu načíst statistiky úložiště",
+ "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložiště je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
+ "Storage information" : "Informace o úložišti",
+ "Storage quota" : "Kvóta úložiště",
+ "New folder" : "Nová složka",
+ "Create new folder" : "Vytvořit novou složku",
+ "This name is already in use." : "Tento název už je využíván.",
+ "Create" : "Vytvořit",
+ "Files starting with a dot are hidden by default" : "Soubory, kterých názvy začínají tečkou, jsou ve výchozím stavu skryté",
+ "Fill template fields" : "Vyplňte kolonky šablony",
+ "Submitting fields …" : "Odesílání kolonek…",
+ "Submit" : "Odeslat",
"Choose a file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
"Transfer" : "Převést",
"Transfer {path} to {userid}" : "Převést {path} na {userid}",
"Invalid path selected" : "Vybrán neplatný popis umístění",
+ "Unknown error" : "Neznámá chyba",
"Ownership transfer request sent" : "Žádost o převedení vlastnictví zaslána",
- "Cannot transfer ownership of a file or folder you don't own" : "Není možné převést vlastnictví souboru či složky, které nejste vlastníky",
- "Tags" : "Značky",
- "Unable to change the favourite state of the file" : "Nedaří se změnit stav „oblíbené“ souboru",
+ "Cannot transfer ownership of a file or folder you do not own" : "Není možné převést vlastnictví souboru či složky, kterých nejste vlastníky",
+ "Transfer ownership of a file or folder" : "Převést vlastnictví souboru či složky",
+ "Choose file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
+ "Change" : "Změnit",
+ "New owner" : "Nový vlastník",
+ "Keep {old}" : "Ponechat {old}",
+ "Keep without extension" : "Ponechat bez přípony",
+ "Use {new}" : "Použít {new}",
+ "Remove extension" : "Odebrat příponu",
+ "Change file extension" : "Změnit příponu souboru",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Změna přípony souboru z „{old}“ na „{new}“ může soubor znečitelnit.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odebrání přípony souboru „{old}“ může soubor znečitelnit.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Přidání přípony souboru „{new}“ může soubor znečitelnit.",
+ "Do not show this dialog again." : "Nezobrazovat tento dialog znovu.",
+ "Select file or folder to link to" : "Vyberte soubor nebo složku na kterou odkazovat",
+ "Choose {file}" : "Zvolit {file}",
+ "Share" : "Nasdílet",
+ "Shared by link" : "Sdíleno pomocí odkazu",
+ "Shared" : "Sdíleno",
+ "Switch to list view" : "Přepnout do zobrazení v seznamu",
+ "Switch to grid view" : "Přepnout do zobrazení v mřížce",
+ "The file could not be found" : "Soubor nebylo možné najít",
+ "Upload was cancelled by user" : "Odeslání bylo zrušeno uživatelem",
+ "Not enough free space" : "Nedostatek volného prostoru",
+ "Operation is blocked by access control" : "Operace je blokována řízením přístupu",
+ "Error during upload: {message}" : "Chyba při nahrávání: {message}",
+ "Error during upload, status code {status}" : "Chyba při nahrávání – stavový kód {status}",
+ "Unknown error during upload" : "Neznámá chyba při nahrávání",
+ "Loading current folder" : "Načítá se stávající složka",
+ "Retry" : "Zkusit znovu",
+ "No files in here" : "Žádné soubory",
+ "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo proveďte synchronizaci se svými zařízeními!",
+ "Go back" : "Jít zpět",
+ "Views" : "Zobrazení",
+ "Files settings" : "Nastavení pro Soubory",
+ "Your files" : "Vaše soubory",
+ "Open in files" : "Otevřít v aplikaci Soubory",
+ "File cannot be accessed" : "K souboru se nedaří přistoupit",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Soubor se nepodařilo nalézt nebo nemáte oprávnění pro jeho zobrazení – požádejte odesilatele, aby vám ho nasdílel.",
+ "No search results for “{query}”" : "Nic nenalezeno pro „{query}“",
+ "Search for files" : "Hledat soubory",
+ "Clipboard is not available" : "Schránka není k dispozici",
+ "General" : "Obecné",
+ "Default view" : "Výchozí pohled",
+ "All files" : "Všechny soubory",
+ "Personal files" : "Osobní soubory",
+ "Sort favorites first" : "Seřadit od oblíbených",
+ "Sort folders before files" : "Při řazení zobrazovat složky a pak až soubory",
+ "Appearance" : "Vzhled",
+ "Show hidden files" : "Zobrazit skryté soubory",
+ "Show file type column" : "Zobrazovat sloupec Typ souboru",
+ "Crop image previews" : "Oříznout náhledy obrázků",
+ "Additional settings" : "Další nastavení",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopírovat",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "U vašeho účtu je zapnuté dvoufázové ověřování a proto pro připojení externího WebDAV klienta bude třeba použít heslo pro konkrétní aplikaci.",
+ "Warnings" : "Varování",
+ "Keyboard shortcuts" : "Klávesové zkratky",
+ "File actions" : "Akce ohledně souboru",
+ "Rename" : "Přejmenovat",
+ "Delete" : "Smazat",
+ "Manage tags" : "Spravovat štítky",
+ "Selection" : "Výběr",
+ "Select all files" : "Vybrat všechny soubory",
+ "Deselect all" : "Zrušit označení všeho",
+ "Navigation" : "Pohyb",
+ "View" : "Zobrazit",
+ "Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
+ "Show those shortcuts" : "Zobrazit tyto zkratky",
+ "You" : "Vy",
+ "Shared multiple times with different people" : "Nasdílet několikrát různým lidem",
+ "Unable to change the favorite state of the file" : "Nebylo možné změnit stav zařazení mezi oblíbené souboru",
"Error while loading the file data" : "Chyba při načítání dat souboru",
+ "Owner" : "Vlastník",
+ "Remove from favorites" : "Odebrat z oblíbených",
+ "Add to favorites" : "Přidat do oblíbených",
+ "Tags" : "Štítky",
+ "Blank" : "Prázdný",
+ "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
"Pick a template for {name}" : "Vyberte si šablonu pro {name}",
- "Cancel" : "Storno",
- "Create" : "Vytvořit",
"Create a new file with the selected template" : "Vytvořit nový soubor ze zvolené šablony",
"Creating file" : "Vytváření souboru",
- "Blank" : "Prázdný",
- "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
- "Set up templates folder" : "Vytvořit složku pro šablony",
- "Templates" : "Šablony",
+ "Save as {displayName}" : "Uložit jako {displayName}",
+ "Save as …" : "Uložit jako…",
+ "Converting files …" : "Převádění souborů…",
+ "Failed to convert files: {message}" : "Nepodařilo se převést soubory: {message}",
+ "All files failed to be converted" : "Žádný ze souborů se nepodařilo převést",
+ "One file could not be converted: {message}" : "Jeden soubor nebylo možné převést: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Jeden soubor nebylo možné převést","%n soubory nebylo možné převést","%n souborů nebylo možné převést","%n soubory nebylo možné převést"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Jeden soubor úspěšně převeden","%n soubory úspěšně převedeny","%n souborů úspěšně převedeno","%n soubory úspěšně převedeny"],
+ "Files successfully converted" : "Soubory úspěšně převedeny",
+ "Failed to convert files" : "Nepodařilo se převést soubory",
+ "Converting file …" : "Převádění souboru…",
+ "File successfully converted" : "Soubor úspěšně převeden",
+ "Failed to convert file: {message}" : "Nepodařilo se převést soubor: {message}",
+ "Failed to convert file" : "Nepodařilo se převést soubor",
+ "Leave this share" : "Opustit toto sdílení",
+ "Leave these shares" : "Opustit tato sdílení",
+ "Disconnect storage" : "Odpojit úložiště",
+ "Disconnect storages" : "Odpojit úložiště",
+ "Delete permanently" : "Nevratně smazat",
+ "Delete and unshare" : "Smazat a zrušit sdílení",
+ "Delete file" : "Smazat soubor",
+ "Delete files" : "Smazat soubory",
+ "Delete folder" : "Smazat složku",
+ "Delete folders" : "Smazat složky",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Chystáte se trvale smazat {count} položku","Chystáte se trvale smazat {count} položky","Chystáte se trvale smazat {count} položek","Chystáte se trvale smazat {count} položky"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Chystáte se smazat {count} položku","Chystáte se smazat {count} položky","Chystáte se smazat {count} položek","Chystáte se smazat {count} položky"],
+ "Confirm deletion" : "Potvrdit smazání",
+ "Cancel" : "Storno",
+ "Download" : "Stáhnout",
+ "Moving \"{source}\" to \"{destination}\" …" : "Přesouvání „{source}“ do „{destination}“ …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopírování „{source}“ do „{destination}“ …",
+ "Destination is not a folder" : "Cíl není složka",
+ "This file/folder is already in that directory" : "V oné složce se už daný soubor/složka nachází",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Není možné přesunout soubor/složku do sebe samé nebo do své vlastní podložky",
+ "(copy)" : "(zkopírovat)",
+ "(copy %n)" : "(zkopírovat %n)",
+ "A file or folder with that name already exists in this folder" : "V této složce už existuje stejnojmenný soubor či složka",
+ "The files are locked" : "Soubory jsou zamknuty",
+ "The file does not exist anymore" : "Soubor už neexistuje",
+ "Choose destination" : "Vyberte cíl",
+ "Copy to {target}" : "Zkopírovat do {target}",
+ "Move to {target}" : "Přesunout do {target}",
+ "Move" : "Přesunout",
+ "Move or copy operation failed" : "Operace přesunu či zkopírování se nezdařila",
+ "Move or copy" : "Přesunout nebo zkopírovat",
+ "Open folder {displayName}" : "Otevřít složku {displayName}",
+ "Open in Files" : "Otevřít v Souborech",
+ "Open locally" : "Otevřít lokálně",
+ "Failed to redirect to client" : "Nepodařilo se přesměrovat klienta",
+ "Open file locally" : "Otevřít soubor lokálně",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Soubor by se nyní měl otevřít na vašem zařízení. Pokud ne, zkontrolujte, zda máte nainstalovanou desktopovou aplikaci.",
+ "Retry and close" : "Zkusit znovu a zavřít",
+ "Open online" : "Otevřít online",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Zobrazit ve složce",
+ "Today" : "Dnes",
+ "Last 7 days" : "Uplynulých 7 dnů",
+ "Last 30 days" : "Uplynulých 30 dnů",
+ "This year ({year})" : "Tento rok ({year})",
+ "Last year ({year})" : "Minulý rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Tabulky",
+ "Presentations" : "Prezentace",
+ "PDFs" : "PDF dokumenty",
+ "Folders" : "Složky",
+ "Audio" : "Zvuk",
+ "Images" : "Obrázky",
+ "Videos" : "Videa",
+ "Created new folder \"{name}\"" : "Vytvořena nová složka „{name}“",
"Unable to initialize the templates directory" : "Nepodařilo se vytvořit složku pro šablony",
- "%s used" : "%s použito",
- "%s%% of %s used" : "%s%% z %s použito",
- "%1$s of %2$s used" : "%1$s z %2$s použito",
- "Settings" : "Nastavení",
- "Show hidden files" : "Zobrazit skryté soubory",
- "Crop image previews" : "Oříznout náhledy obrázků",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
- "Toggle %1$s sublist" : "Přepnout %1$s podseznam",
- "Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
- "No files in here" : "Žádné soubory",
- "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo proveďte synchronizaci se svými zařízeními!",
+ "Create templates folder" : "Vytvořit složku pro šablony",
+ "Templates" : "Šablony",
+ "New template folder" : "Nová složka šablon",
+ "In folder" : "Ve složce",
+ "Search in all files" : "Hledat ve všech souborech",
+ "Search in folder: {folder}" : "Hledat ve složce: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z přetažených souborů se nepodařilo zpracovat",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vámi využívaný prohlížeč nepodporuje aplikační program. rozhraní pro přístup k souborovému systému (Filesytem API). Složky nebudou nahrány",
+ "No files to upload" : "Žádné soubory k nahrání",
+ "Unable to create the directory {directory}" : "Nepodařilo se vytvořit složku {directory}",
+ "Some files could not be uploaded" : "Některé soubory nebylo možné nahrát",
+ "Files uploaded successfully" : "Soubor úspěšně nahrán",
+ "No files to process" : "Žádné soubory ke zpracování",
+ "Some files could not be copied" : "Některé soubory nebylo možné zkopírovat",
+ "Some files could not be moved" : "Některé soubory nebylo možné přesunout",
+ "Files copied successfully" : "Soubory úspěšně zkopírovány",
+ "Files moved successfully" : "Soubory úspěšně přesunuty",
+ "Conflicts resolution skipped" : "Řešení kolizí přeskočeno",
+ "Upload cancelled" : "Nahrávání zrušeno",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Není možné přejmenovat „{oldName}“ – už neexistuje",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Název „{newName}“ je už použitý ve složce „{dir}“. Zvolte jiný název.",
+ "Could not rename \"{oldName}\"" : "„{oldName}“ se nepodařilo přejmenovat",
+ "This operation is forbidden" : "Tato operace je zakázána",
+ "Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
+ "Unexpected error: {error}" : "Neočekávaná chyby: {error}",
+ "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů","%n soubory"],
+ "_%n folder_::_%n folders_" : ["%n složka","%n složky","%n složek","%n složky"],
+ "_%n hidden_::_%n hidden_" : ["%n skrytý","%n skryté","%n skrytých","%n skryté"],
+ "Filename must not be empty." : "Je třeba vyplnit název souboru.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ není v názvu souboru možné použít.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ je vyhrazeným názvem a není povoleno k použití pro názvy souborů.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ není povoleným typem souboru.",
+ "Filenames must not end with \"{extension}\"." : "Je třeba, aby názvy souborů nekončily na „{extension}“.",
+ "List of favorite files and folders." : "Seznam oblíbených souborů a složek.",
+ "No favorites yet" : "Zatím nic oblíbeného",
+ "Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
+ "List of your files and folders." : "Seznam vašich souborů a složek.",
+ "List of your files and folders that are not shared." : "Seznam vašich souborů a složek, které nejsou sdíleny.",
+ "No personal files found" : "Nenalezeny žádné osobní soubory",
+ "Files that are not shared will show up here." : "Soubory, které nejsou nikomu sdíleny se zobrazí zde.",
+ "Recent" : "Nedávné",
+ "List of recently modified files and folders." : "Seznam nedávno změněných souborů a složek.",
+ "No recently modified files" : "Žádné nedávno změněné soubory.",
+ "Files and folders you recently modified will show up here." : "Zde budou zobrazeny soubory a složky, které jste nedávno změnili.",
+ "Search" : "Hledat",
+ "Search results within your files." : "Výsledky hledání ve vašich souborech.",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Upload too large" : "Nahrávaná data jsou příliš objemná",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte nahrát, překračují limit velikosti nahrávání na tomto serveru.",
- "No favorites yet" : "Zatím nic oblíbeného",
- "Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
- "Deleted files" : "Smazané soubory",
- "Shares" : "Sdílení",
- "Shared with others" : "Sdíleno s ostatními",
- "Shared with you" : "Sdíleno s vámi",
- "Shared by link" : "Sdíleno pomocí odkazu",
- "Deleted shares" : "Smazaná sdílení",
- "Pending shares" : "Čekající sdílení",
+ "File could not be found" : "Soubor se nedaří nalézt",
+ "Show list view" : "Zobrazit v seznamu",
+ "Show grid view" : "Zobrazit v mřížce",
+ "Close" : "Zavřít",
+ "Could not create folder \"{dir}\"" : "Složku „{dir}“ nelze vytvořit",
+ "This will stop your current uploads." : "Toto zastaví stávající nahrávání.",
+ "Upload cancelled." : "Nahrávání zrušeno.",
+ "Processing files …" : "Zpracovávání souborů…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Soubor {filename} nelze nahrát, protože je to buď adresář nebo má velikost nula bajtů",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedostatek volného místa pro uložení – velikost nahrávaných dat je {size1}, volné kapacity úložiště ale zbývá už jen {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Cílová složka „{dir}“ už neexistuje",
+ "An unknown error has occurred" : "Vyskytla se neznámá chyba",
+ "File could not be uploaded" : "Soubor se nepodařilo nahrát",
+ "Uploading …" : "Nahrávání…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Nahrávání… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Nahrání této položky není podporováno",
+ "Error when assembling chunks, status code {status}" : "Chyba při kompletaci shluků, kód chyby {status}",
+ "Choose target folder" : "Zvolte cílovou složku",
+ "Set reminder" : "Nastavit připomínku",
+ "Edit locally" : "Upravit lokálně",
+ "Open" : "Otevřít",
+ "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor „{file}“",
+ "Please select tag(s) to add to the selection" : "Vyberte štítky které přidat do výběru",
+ "Apply tag(s) to selection" : "Uplatnit štítky na výběr",
+ "Select directory \"{dirName}\"" : "Vybrat složku „{dirName}“",
+ "Select file \"{fileName}\"" : "Vybrat soubor „{fileName}“",
+ "Unable to determine date" : "Nelze určit datum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
+ "Could not move \"{file}\", target exists" : "„{file}“ nelze přesunout – cíl už existuje",
+ "Could not move \"{file}\"" : "„{file}“ nelze přesunout",
+ "copy" : "kopie",
+ "Could not copy \"{file}\", target exists" : "Nelze kopírovat „{file}“, cíl už existuje",
+ "Could not copy \"{file}\"" : "Nelze kopírovat „{file}“",
+ "Copied {origin} inside {destination}" : "{origin} zkopírován do {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} a {nbfiles} dalších souborů zkopírováno do {destination}",
+ "{newName} already exists" : "{newName} už existuje",
+ "Could not create file \"{file}\"" : "Soubor „{file}“ nelze vytvořit",
+ "Could not create file \"{file}\" because it already exists" : "Soubor „{file}“ nelze vytvořit, protože zde už existuje",
+ "Could not create folder \"{dir}\" because it already exists" : "Složku „{dir}“ nelze vytvořit, protože už existuje",
+ "Could not fetch file details \"{file}\"" : "Nedaří se získat podrobnosti o souboru „{file}“",
+ "Error deleting file \"{fileName}\"." : "Chyba při mazání souboru „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Žádné výsledky hledání v ostatních složkách pro {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Pokud chcete hledat v ostatních složkách, zadejte více než dva znaky",
+ "{dirs} and {files}" : "{dirs} a {files}",
+ "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"],
+ "You do not have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory",
+ "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"],
+ "New" : "Nové",
+ "New file/folder menu" : "Nabídka souboru/složky",
+ "Select file range" : "Vybrat rozsah souborů",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} využito",
+ "\"{name}\" is an invalid file name." : "„{name}“ není platným názvem souboru.",
+ "File name cannot be empty." : "Je třeba vyplnit název souboru.",
+ "\"/\" is not allowed inside a file name." : "„/“ není povolený znak v názvu souboru.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ není povolený typ souboru",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložiště uživatele {owner} je zaplněné – nelze aktualizovat ani synchronizovat soubory!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložiště je plné – nelze aktualizovat ani synchronizovat soubory!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úložiště {owner} je téměř plné ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinová složka „{mountPoint}“ je téměř plná ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externí úložiště „{mountPoint}“ je téměř plné ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložiště je téměř plné ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["shoduje se s „{filter}“","shodují se s „{filter}“","shoduje se s „{filter}“","shodují se s „{filter}“"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Přímý odkaz byl zkopírován (funguje pouze pro osoby, které mají přístup k tomuto souboru/složce)",
+ "Path" : "Popis umístění",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
+ "Favored" : "Zařazeno mezi oblíbené",
+ "Favor" : "Zařadit mezi oblíbené",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Zkopírovat přímý odkaz (funguje pouze pro osoby, které mají přístup k tomuto souboru/složce)",
+ "Upload file" : "Nahrát soubor",
+ "Not favored" : "Není v oblíbených",
+ "An error occurred while trying to update the tags" : "Při pokusu o úpravu štítků došlo k chybě",
+ "Upload (max. %s)" : "Nahrát (max. %s)",
+ "\"{displayName}\" action executed successfully" : "akce „{displayName}“ úspěšně vykonána",
+ "\"{displayName}\" action failed" : "akce „{displayName}“ se nezdařila",
+ "\"{displayName}\" failed on some elements" : "„{displayName}“ se pro některé prvky nezdařilo",
+ "\"{displayName}\" batch action executed successfully" : "Hromadná akce „{displayName}“ úspěšně vykonána",
+ "Submitting fields…" : "Odesílání kolonek…",
+ "Filter filenames…" : "Filtrovat názvy souborů…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL zkopírována do schránky",
+ "Enable the grid view" : "Zapnout zobrazení v mřížce",
+ "Enable folder tree" : "Zapnout strom složek",
+ "Copy to clipboard" : "Zkopírovat do schránky",
+ "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
+ "Deletion cancelled" : "Mazání zrušeno",
+ "Move cancelled" : "Přesunutí zrušeno",
+ "Cancelled move or copy of \"{filename}\"." : "Přesunutí nebo zkopírování „{filename}“ zrušeno.",
+ "Cancelled move or copy operation" : "Operace přesunutí či zkopírování zrušena",
+ "Open details" : "Otevřít podrobnosti",
+ "Photos and images" : "Fotky a obrázky",
+ "New folder creation cancelled" : "Vytváření nové složky zrušeno",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} složka","{folderCount} složky","{folderCount} složek","{folderCount} složky"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} soubor","{fileCount} soubory","{fileCount} souborů","{fileCount} soubory"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 soubor a {folderCount} složka","1 soubor a {folderCount} složky","1 soubor a {folderCount} složek","1 soubor a {folderCount} složky"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} soubor a 1 složka","{fileCount} soubory a 1 složka","{fileCount} souborů a 1 složka","{fileCount} soubory a 1 složka"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} souborů a {folderCount} složek",
+ "All folders" : "Všechny složky",
+ "Personal Files" : "Osobní soubory",
"Text file" : "Textový soubor",
"New text file.txt" : "Nový textový soubor.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložiště uživatele {owner} je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložiště je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
- "_matches '{filter}'_::_match '{filter}'_" : ["odpovídá „{filter}“","odpovídají „{filter}“","odpovídá „{filter}“","odpovídají „{filter}“"]
+ "%1$s (renamed)" : "%1$s (přejmenované)",
+ "renamed file" : "přejmenovaný soubor",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po povolení názvů souborů, kompatibilních s Windows, stávající soubory už nebude možné změnit, ale je možné je přejmenovat na platné nové názvy jejich vlastníkem.",
+ "Filter file names …" : "Filtrovat názvy souborů…",
+ "Prevent warning dialogs from open or reenable them." : "Zabránit dialogům s varováními v otevírání nebo znovupovolení.",
+ "Show a warning dialog when changing a file extension." : "Při měnění přípony souboru zobrazit varovný dialog.",
+ "Speed up your Files experience with these quick shortcuts." : "Zrychlete svůj dojem ze Souborů pomocí těchto rychlých zkratek.",
+ "Open the actions menu for a file" : "Otevřít nabídku akcí pro soubor",
+ "Rename a file" : "Přejmenovat soubor",
+ "Delete a file" : "Smazat soubor",
+ "Favorite or remove a file from favorites" : "Zařadit mezi oblíbené (nebo odebrat)",
+ "Manage tags for a file" : "Spravovat štítky pro soubor",
+ "Deselect all files" : "Zrušit výběr všech souborů",
+ "Select or deselect a file" : "Vybrat/zrušit výběr souboru",
+ "Select a range of files" : "Vybrat rozsah souborů",
+ "Navigate to the parent folder" : "Přejít do nadřazené složky",
+ "Navigate to the file above" : "Přejít na soubor výše",
+ "Navigate to the file below" : "Přejít na soubor níže",
+ "Navigate to the file on the left (in grid mode)" : "Přejít na soubor vlevo (v režimu mřížky)",
+ "Navigate to the file on the right (in grid mode)" : "Přejít na soubor vpravo (v režimu mřížky)",
+ "Toggle the grid view" : "Vyp/zap. zobrazení v mřížce",
+ "Open the sidebar for a file" : "Otevřít postranní panel pro soubor"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json
index b4f1544199b..124743aebde 100644
--- a/apps/files/l10n/cs.json
+++ b/apps/files/l10n/cs.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
- "Storage invalid" : "Neplatné úložiště",
- "Unknown error" : "Neznámá chyba",
- "File could not be found" : "Soubor se nedaří nalézt",
- "Move or copy" : "Přesunout nebo zkopírovat",
- "Download" : "Stáhnout",
- "Delete" : "Smazat",
- "Home" : "Domů",
- "Close" : "Zavřít",
- "Favorites" : "Oblíbené",
- "Could not create folder \"{dir}\"" : "Složku „{dir}“ nelze vytvořit",
- "This will stop your current uploads." : "Toto zastaví stávající nahrávání.",
- "Upload cancelled." : "Nahrávání zrušeno.",
- "Processing files …" : "Zpracovávání souborů…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Soubor {filename} nelze nahrát, protože je to buď adresář nebo má velikost nula bajtů",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedostatek volného místa pro uložení – velikost nahrávaných dat je {size1}, volné kapacity úložiště ale zbývá už jen {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Cílová složka „{dir}“ už neexistuje",
- "Not enough free space" : "Nedostatek volného prostoru",
- "An unknown error has occurred" : "Vyskytla se neznámá chyba",
- "Uploading …" : "Nahrávání…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nahrání této položky není podporováno",
- "Target folder does not exist any more" : "Cílová složka už neexistuje",
- "Operation is blocked by access control" : "Operace je blokována řízením přístupu",
- "Error when assembling chunks, status code {status}" : "Chyba při kompletaci shluků, kód chyby {status}",
- "Actions" : "Akce",
- "Rename" : "Přejmenovat",
- "Copy" : "Kopírovat",
- "Choose target folder" : "Zvolte cílovou složku",
- "Open" : "Otevřít",
- "Delete file" : "Smazat soubor",
- "Delete folder" : "Smazat složku",
- "Disconnect storage" : "Odpojit úložiště",
- "Leave this share" : "Opustit toto sdílení",
- "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor „{file}“",
- "Files" : "Soubory",
- "Details" : "Podrobnosti",
- "Please select tag(s) to add to the selection" : "Vyberte štítky které přidat do výběru",
- "Apply tag(s) to selection" : "Uplatnit štítky na výběr",
- "Select" : "Vybrat",
- "Pending" : "Nevyřízené",
- "Unable to determine date" : "Nelze určit datum",
- "This operation is forbidden" : "Tato operace je zakázána",
- "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
- "Could not move \"{file}\", target exists" : "„{file}“ nelze přesunout – cíl už existuje",
- "Could not move \"{file}\"" : "„{file}“ nelze přesunout",
- "copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Nelze kopírovat „{file}“, cíl už existuje",
- "Could not copy \"{file}\"" : "Nelze kopírovat „{file}“",
- "Copied {origin} inside {destination}" : "{origin} zkopírován do {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} a {nbfiles} dalších souborů zkopírováno do {destination}",
- "{newName} already exists" : "{newName} už existuje",
- "Could not rename \"{fileName}\", it does not exist any more" : "„{fileName}“ nelze přejmenovat – už neexistuje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Název „{targetName}“ je už použitý ve složce „{dir}“. Zvolte jiný název.",
- "Could not rename \"{fileName}\"" : "„{fileName}“ nelze přejmenovat",
- "Could not create file \"{file}\"" : "Soubor „{file}“ nelze vytvořit",
- "Could not create file \"{file}\" because it already exists" : "Soubor „{file}“ nelze vytvořit, protože zde už existuje",
- "Could not create folder \"{dir}\" because it already exists" : "Složku „{dir}“ nelze vytvořit, protože už existuje",
- "Could not fetch file details \"{file}\"" : "Nedaří se získat podrobnosti o souboru „{file}“",
- "Error deleting file \"{fileName}\"." : "Chyba při mazání souboru „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Žádné výsledky hledání v ostatních složkách pro {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Pokud chcete hledat v ostatních složkách, zadejte více než dva znaky",
- "Name" : "Název",
- "Size" : "Velikost",
- "Modified" : "Změněno",
- "_%n folder_::_%n folders_" : ["%n složka","%n složky","%n složek","%n složky"],
- "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů","%n soubory"],
- "{dirs} and {files}" : "{dirs} a {files}",
- "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"],
- "You don’t have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory",
- "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"],
- "New" : "Nový",
- "Select file range" : "Vybrat rozsah souborů",
- "{used} of {quota} used" : "Využito {used} z {quota} ",
- "{used} used" : "{used} využito",
- "\"{name}\" is an invalid file name." : "„{name}“ není platným názvem souboru.",
- "File name cannot be empty." : "Je třeba vyplnit název souboru.",
- "\"/\" is not allowed inside a file name." : "„/“ není povolený znak v názvu souboru.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ není povolený typ souboru",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložiště uživatele {owner} je zaplněné – nelze aktualizovat ani synchronizovat soubory!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložiště je plné – nelze aktualizovat ani synchronizovat soubory!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úložiště {owner} je téměř plné ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinová složka „{mountPoint}“ je téměř plná ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externí úložiště „{mountPoint}“ je téměř plné ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložiště je téměř plné ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["shoduje se s „{filter}“","shodují se s „{filter}“","shoduje se s „{filter}“","shodují se s „{filter}“"],
- "View in folder" : "Zobrazit ve složce",
- "Copied!" : "Zkopírováno!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Zkopírovat přímý odkaz (funguje pouze pro uživatele, kteří mají přístup k tomuto souboru/složce)",
- "Path" : "Popis umístění",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
- "Favorited" : "Přidáno mezi oblíbené",
- "Favorite" : "Oblíbené",
- "You can only favorite a single file or folder at a time" : "Do oblíbených lze soubory a složky zařazovat jen jednotlivě",
- "New folder" : "Nová složka",
- "Upload file" : "Nahrát soubor",
- "Recent" : "Nedávné",
- "Not favorited" : "Nepřidáno do oblíbených",
- "Remove from favorites" : "Odebrat z oblíbených",
- "Add to favorites" : "Přidat do oblíbených",
- "An error occurred while trying to update the tags" : "Při pokusu o úpravu štítků došlo k chybě",
"Added to favorites" : "Přidáno do oblíbených",
"Removed from favorites" : "Odebráno z oblíbených",
"You added {file} to your favorites" : "Do svých oblíbených jste přidali {file}",
"You removed {file} from your favorites" : "Odstranili jste {file} ze svých oblíbených",
+ "Favorites" : "Oblíbené",
"File changes" : "Změny souboru",
"Created by {user}" : "Vytvořil(a) {user}",
"Changed by {user}" : "Změnil(a) {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Obnovil(a) {user}",
"Renamed by {user}" : "Přejmenováno uživatelem {user}",
"Moved by {user}" : "Přesunuto uživatelem {user}",
- "\"remote user\"" : "„federovaný uživatel“",
+ "\"remote account\"" : "„vzdálený účet“",
"You created {file}" : "Vytvořili jste {file}",
"You created an encrypted file in {file}" : "Vytvořili jste šifrovaný soubor v {file}",
"{user} created {file}" : "{user} vytvořil(a) {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Přesunuli jste {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} přesunul(a) {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Soubor byl přidán, nebo odstraněn z vašich <strong>oblíbených</strong>",
+ "Files" : "Soubory",
"A file or folder has been <strong>changed</strong>" : "Soubor nebo složka byla <strong>změněna</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Oblíbený soubor nebo složka byla <strong>změněna</strong>",
- "All files" : "Všechny soubory",
- "Unlimited" : "Neomezeně",
- "Upload (max. %s)" : "Nahrát (max. %s)",
+ "Failed to authorize" : "Nepodařilo se získat pověření",
+ "Invalid folder path" : "Neplatný popis umístění složky",
+ "Folder not found" : "Složka nenalezena",
+ "The file cannot be found" : "Soubor není možné nalézt",
+ "The destination path does not exist: %1$s" : "Cílový popis umístění neexistuje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nemáte oprávnění pro vytvoření souboru v určeném umístění",
+ "The file could not be converted." : "Soubor nebylo možné převést.",
+ "Could not get relative path to converted file" : "Nepodařilo se získat vztažený popis umístění převáděného souboru",
+ "Favorite files" : "Oblíbené soubory",
+ "No favorites" : "Žádné oblíbené",
+ "More favorites" : "Další oblíbené",
"Accept" : "Přijmout",
"Reject" : "Odmítnout",
"Incoming ownership transfer from {user}" : "Příchozí převedení vlastnictví od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Chcete přijmout {path}?\n\nPozn.: Proces převedení může trvat až hodinu po přijmutí.",
+ "Ownership transfer denied" : "Převedení vlastnictví odepřeno",
+ "Your ownership transfer of {path} was denied by {user}." : "Převedení vašeho vlastnictví {path} bylo odepřeno {user}.",
"Ownership transfer failed" : "Převedení vlastnictví se nezdařilo",
"Your ownership transfer of {path} to {user} failed." : "Převedení vlastnictví {path} od vás na {user} se nezdařilo.",
"The ownership transfer of {path} from {user} failed." : "Převedení vlastnictví {path} od {user} se nezdařilo.",
@@ -157,62 +65,414 @@
"Your ownership transfer of {path} to {user} has completed." : "Převedení vámi vlastněného {path} na {user} dokončeno.",
"The ownership transfer of {path} from {user} has completed." : "Převedení vlastnictví {path} od {user} dokončeno.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Převedeno z %1$s na %2$s",
+ "Files compatibility" : "Kompatibilita souborů",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Umožňuje omezit názvy souborů aby bylo zajištěno, že soubory bude možné synchronizovat se všemi klienty. Ve výchozím stavu jsou povoleny veškeré názvy souborů, splňující standard POSIX (např. Linux nebo macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po povolení názvů souborů, kompatibilních s Windows, stávající soubory už nebude možné změnit, ale je možné je přejmenovat na platné nové názvy jejich vlastníkem.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Po povolení tohoto natavení je také možné soubory stěhovat automaticky. Další informace viz dokumentace k příkazu occ.",
+ "Enforce Windows compatibility" : "Vynutit kompatibilitu s Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Toto bude blokovat použití názvů souborů, které nejsou platné na strojích s Windows, jako je použití vyhrazených názvů nebo speciálních znaků. Ale nevynutí kompatibilitu v případě rozlišování malých/VELKÝCH písmen.",
"File Management" : "Správa souboru",
- "Transfer ownership of a file or folder" : "Převést vlastnictví souboru či složky",
- "Choose file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
- "Change" : "Změnit",
- "New owner" : "Nový vlastník",
- "Search users" : "Hledat uživatele",
+ "Home" : "Domů",
+ "Target folder does not exist any more" : "Cílová složka už neexistuje",
+ "Reload current directory" : "Znovu načíst stávající složku",
+ "Go to the \"{dir}\" directory" : "Přejít do složky „{dir}“",
+ "Current directory path" : "Stávající popis umístění složky",
+ "Your have used your space quota and cannot upload files anymore" : "Využili jste celou svou kvótu na prostor a už nemůžete nahrávat další soubory",
+ "You do not have permission to upload or create files here." : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory.",
+ "Drag and drop files here to upload" : "Soubory nahrajete jejich přetažením sem",
+ "Favorite" : "Oblíbené",
+ "Back" : "Zpět",
+ "Toggle selection for file \"{displayName}\"" : "Vybrat / zrušit výběr souboru „{displayName}“",
+ "Toggle selection for folder \"{displayName}\"" : "Vybrat / zrušit výběr složky „{displayName}“",
+ "File is loading" : "Soubor je načítán",
+ "Folder is loading" : "Složka se načítá",
+ "Filename" : "Soubor",
+ "Folder name" : "Název složky",
+ "This node is unavailable" : "Tento uzel není k dispozici",
+ "Another entry with the same name already exists." : "Už existuje jiná položka se stejným názvem.",
+ "Invalid filename." : "Neplatný název souboru.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Přejmenováno „{oldName}“ na „{newName}",
+ "Rename file" : "Přejmenovat soubor",
+ "Folder" : "Složka",
+ "Unknown file type" : "Neznámý typ souboru",
+ "{ext} image" : "{ext}obrázek",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Nevyřízené",
+ "Unknown date" : "Neznámé datum",
+ "Clear filter" : "Vyčistit filtr",
+ "Modified" : "Změněno",
+ "Search everywhere" : "Hledat všude",
+ "Type" : "Typ",
+ "Active filters" : "Zapnuté filtry",
+ "Remove filter" : "Odebrat filtr",
+ "Total rows summary" : "Celkový souhrn řádek",
+ "Toggle selection for all files and folders" : "Vybrat / zrušit výběr všech souborů a složek",
+ "Name" : "Název",
+ "File type" : "Typ souboru",
+ "Size" : "Velikost",
+ "Actions" : "Akce",
+ "(selected)" : "(vybráno)",
+ "List of files and folders." : "Seznam souborů a složek.",
+ "You have used your space quota and cannot upload files anymore." : "Využili jste celou svou kvótu na prostor a už nemůžete nahrávat další soubory.",
+ "Column headers with buttons are sortable." : "Podle těch sloupců, které mají v záhlaví tlačítko, je možné řadit.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
+ "File not found" : "Soubor nenalezen",
+ "_{count} selected_::_{count} selected_" : ["vybráno {count}","vybráno {count}","vybráno {count}","vybráno {count}"],
+ "Search scope options" : "Předvolby rozsahu prohledávaného",
+ "{usedQuotaByte} used" : "{usedQuotaByte} využito",
+ "{used} of {quota} used" : "Využito {used} z {quota} ",
+ "{relative}% used" : "{relative}% využito",
+ "Could not refresh storage stats" : "Nedaří se znovu načíst statistiky úložiště",
+ "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložiště je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
+ "Storage information" : "Informace o úložišti",
+ "Storage quota" : "Kvóta úložiště",
+ "New folder" : "Nová složka",
+ "Create new folder" : "Vytvořit novou složku",
+ "This name is already in use." : "Tento název už je využíván.",
+ "Create" : "Vytvořit",
+ "Files starting with a dot are hidden by default" : "Soubory, kterých názvy začínají tečkou, jsou ve výchozím stavu skryté",
+ "Fill template fields" : "Vyplňte kolonky šablony",
+ "Submitting fields …" : "Odesílání kolonek…",
+ "Submit" : "Odeslat",
"Choose a file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
"Transfer" : "Převést",
"Transfer {path} to {userid}" : "Převést {path} na {userid}",
"Invalid path selected" : "Vybrán neplatný popis umístění",
+ "Unknown error" : "Neznámá chyba",
"Ownership transfer request sent" : "Žádost o převedení vlastnictví zaslána",
- "Cannot transfer ownership of a file or folder you don't own" : "Není možné převést vlastnictví souboru či složky, které nejste vlastníky",
- "Tags" : "Značky",
- "Unable to change the favourite state of the file" : "Nedaří se změnit stav „oblíbené“ souboru",
+ "Cannot transfer ownership of a file or folder you do not own" : "Není možné převést vlastnictví souboru či složky, kterých nejste vlastníky",
+ "Transfer ownership of a file or folder" : "Převést vlastnictví souboru či složky",
+ "Choose file or folder to transfer" : "Zvolte soubor nebo složku k převedení",
+ "Change" : "Změnit",
+ "New owner" : "Nový vlastník",
+ "Keep {old}" : "Ponechat {old}",
+ "Keep without extension" : "Ponechat bez přípony",
+ "Use {new}" : "Použít {new}",
+ "Remove extension" : "Odebrat příponu",
+ "Change file extension" : "Změnit příponu souboru",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Změna přípony souboru z „{old}“ na „{new}“ může soubor znečitelnit.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odebrání přípony souboru „{old}“ může soubor znečitelnit.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Přidání přípony souboru „{new}“ může soubor znečitelnit.",
+ "Do not show this dialog again." : "Nezobrazovat tento dialog znovu.",
+ "Select file or folder to link to" : "Vyberte soubor nebo složku na kterou odkazovat",
+ "Choose {file}" : "Zvolit {file}",
+ "Share" : "Nasdílet",
+ "Shared by link" : "Sdíleno pomocí odkazu",
+ "Shared" : "Sdíleno",
+ "Switch to list view" : "Přepnout do zobrazení v seznamu",
+ "Switch to grid view" : "Přepnout do zobrazení v mřížce",
+ "The file could not be found" : "Soubor nebylo možné najít",
+ "Upload was cancelled by user" : "Odeslání bylo zrušeno uživatelem",
+ "Not enough free space" : "Nedostatek volného prostoru",
+ "Operation is blocked by access control" : "Operace je blokována řízením přístupu",
+ "Error during upload: {message}" : "Chyba při nahrávání: {message}",
+ "Error during upload, status code {status}" : "Chyba při nahrávání – stavový kód {status}",
+ "Unknown error during upload" : "Neznámá chyba při nahrávání",
+ "Loading current folder" : "Načítá se stávající složka",
+ "Retry" : "Zkusit znovu",
+ "No files in here" : "Žádné soubory",
+ "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo proveďte synchronizaci se svými zařízeními!",
+ "Go back" : "Jít zpět",
+ "Views" : "Zobrazení",
+ "Files settings" : "Nastavení pro Soubory",
+ "Your files" : "Vaše soubory",
+ "Open in files" : "Otevřít v aplikaci Soubory",
+ "File cannot be accessed" : "K souboru se nedaří přistoupit",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Soubor se nepodařilo nalézt nebo nemáte oprávnění pro jeho zobrazení – požádejte odesilatele, aby vám ho nasdílel.",
+ "No search results for “{query}”" : "Nic nenalezeno pro „{query}“",
+ "Search for files" : "Hledat soubory",
+ "Clipboard is not available" : "Schránka není k dispozici",
+ "General" : "Obecné",
+ "Default view" : "Výchozí pohled",
+ "All files" : "Všechny soubory",
+ "Personal files" : "Osobní soubory",
+ "Sort favorites first" : "Seřadit od oblíbených",
+ "Sort folders before files" : "Při řazení zobrazovat složky a pak až soubory",
+ "Appearance" : "Vzhled",
+ "Show hidden files" : "Zobrazit skryté soubory",
+ "Show file type column" : "Zobrazovat sloupec Typ souboru",
+ "Crop image previews" : "Oříznout náhledy obrázků",
+ "Additional settings" : "Další nastavení",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopírovat",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "U vašeho účtu je zapnuté dvoufázové ověřování a proto pro připojení externího WebDAV klienta bude třeba použít heslo pro konkrétní aplikaci.",
+ "Warnings" : "Varování",
+ "Keyboard shortcuts" : "Klávesové zkratky",
+ "File actions" : "Akce ohledně souboru",
+ "Rename" : "Přejmenovat",
+ "Delete" : "Smazat",
+ "Manage tags" : "Spravovat štítky",
+ "Selection" : "Výběr",
+ "Select all files" : "Vybrat všechny soubory",
+ "Deselect all" : "Zrušit označení všeho",
+ "Navigation" : "Pohyb",
+ "View" : "Zobrazit",
+ "Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
+ "Show those shortcuts" : "Zobrazit tyto zkratky",
+ "You" : "Vy",
+ "Shared multiple times with different people" : "Nasdílet několikrát různým lidem",
+ "Unable to change the favorite state of the file" : "Nebylo možné změnit stav zařazení mezi oblíbené souboru",
"Error while loading the file data" : "Chyba při načítání dat souboru",
+ "Owner" : "Vlastník",
+ "Remove from favorites" : "Odebrat z oblíbených",
+ "Add to favorites" : "Přidat do oblíbených",
+ "Tags" : "Štítky",
+ "Blank" : "Prázdný",
+ "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
"Pick a template for {name}" : "Vyberte si šablonu pro {name}",
- "Cancel" : "Storno",
- "Create" : "Vytvořit",
"Create a new file with the selected template" : "Vytvořit nový soubor ze zvolené šablony",
"Creating file" : "Vytváření souboru",
- "Blank" : "Prázdný",
- "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony",
- "Set up templates folder" : "Vytvořit složku pro šablony",
- "Templates" : "Šablony",
+ "Save as {displayName}" : "Uložit jako {displayName}",
+ "Save as …" : "Uložit jako…",
+ "Converting files …" : "Převádění souborů…",
+ "Failed to convert files: {message}" : "Nepodařilo se převést soubory: {message}",
+ "All files failed to be converted" : "Žádný ze souborů se nepodařilo převést",
+ "One file could not be converted: {message}" : "Jeden soubor nebylo možné převést: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Jeden soubor nebylo možné převést","%n soubory nebylo možné převést","%n souborů nebylo možné převést","%n soubory nebylo možné převést"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Jeden soubor úspěšně převeden","%n soubory úspěšně převedeny","%n souborů úspěšně převedeno","%n soubory úspěšně převedeny"],
+ "Files successfully converted" : "Soubory úspěšně převedeny",
+ "Failed to convert files" : "Nepodařilo se převést soubory",
+ "Converting file …" : "Převádění souboru…",
+ "File successfully converted" : "Soubor úspěšně převeden",
+ "Failed to convert file: {message}" : "Nepodařilo se převést soubor: {message}",
+ "Failed to convert file" : "Nepodařilo se převést soubor",
+ "Leave this share" : "Opustit toto sdílení",
+ "Leave these shares" : "Opustit tato sdílení",
+ "Disconnect storage" : "Odpojit úložiště",
+ "Disconnect storages" : "Odpojit úložiště",
+ "Delete permanently" : "Nevratně smazat",
+ "Delete and unshare" : "Smazat a zrušit sdílení",
+ "Delete file" : "Smazat soubor",
+ "Delete files" : "Smazat soubory",
+ "Delete folder" : "Smazat složku",
+ "Delete folders" : "Smazat složky",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Chystáte se trvale smazat {count} položku","Chystáte se trvale smazat {count} položky","Chystáte se trvale smazat {count} položek","Chystáte se trvale smazat {count} položky"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Chystáte se smazat {count} položku","Chystáte se smazat {count} položky","Chystáte se smazat {count} položek","Chystáte se smazat {count} položky"],
+ "Confirm deletion" : "Potvrdit smazání",
+ "Cancel" : "Storno",
+ "Download" : "Stáhnout",
+ "Moving \"{source}\" to \"{destination}\" …" : "Přesouvání „{source}“ do „{destination}“ …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopírování „{source}“ do „{destination}“ …",
+ "Destination is not a folder" : "Cíl není složka",
+ "This file/folder is already in that directory" : "V oné složce se už daný soubor/složka nachází",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Není možné přesunout soubor/složku do sebe samé nebo do své vlastní podložky",
+ "(copy)" : "(zkopírovat)",
+ "(copy %n)" : "(zkopírovat %n)",
+ "A file or folder with that name already exists in this folder" : "V této složce už existuje stejnojmenný soubor či složka",
+ "The files are locked" : "Soubory jsou zamknuty",
+ "The file does not exist anymore" : "Soubor už neexistuje",
+ "Choose destination" : "Vyberte cíl",
+ "Copy to {target}" : "Zkopírovat do {target}",
+ "Move to {target}" : "Přesunout do {target}",
+ "Move" : "Přesunout",
+ "Move or copy operation failed" : "Operace přesunu či zkopírování se nezdařila",
+ "Move or copy" : "Přesunout nebo zkopírovat",
+ "Open folder {displayName}" : "Otevřít složku {displayName}",
+ "Open in Files" : "Otevřít v Souborech",
+ "Open locally" : "Otevřít lokálně",
+ "Failed to redirect to client" : "Nepodařilo se přesměrovat klienta",
+ "Open file locally" : "Otevřít soubor lokálně",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Soubor by se nyní měl otevřít na vašem zařízení. Pokud ne, zkontrolujte, zda máte nainstalovanou desktopovou aplikaci.",
+ "Retry and close" : "Zkusit znovu a zavřít",
+ "Open online" : "Otevřít online",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Zobrazit ve složce",
+ "Today" : "Dnes",
+ "Last 7 days" : "Uplynulých 7 dnů",
+ "Last 30 days" : "Uplynulých 30 dnů",
+ "This year ({year})" : "Tento rok ({year})",
+ "Last year ({year})" : "Minulý rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Tabulky",
+ "Presentations" : "Prezentace",
+ "PDFs" : "PDF dokumenty",
+ "Folders" : "Složky",
+ "Audio" : "Zvuk",
+ "Images" : "Obrázky",
+ "Videos" : "Videa",
+ "Created new folder \"{name}\"" : "Vytvořena nová složka „{name}“",
"Unable to initialize the templates directory" : "Nepodařilo se vytvořit složku pro šablony",
- "%s used" : "%s použito",
- "%s%% of %s used" : "%s%% z %s použito",
- "%1$s of %2$s used" : "%1$s z %2$s použito",
- "Settings" : "Nastavení",
- "Show hidden files" : "Zobrazit skryté soubory",
- "Crop image previews" : "Oříznout náhledy obrázků",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
- "Toggle %1$s sublist" : "Přepnout %1$s podseznam",
- "Toggle grid view" : "Vyp/zap. zobrazení v mřížce",
- "No files in here" : "Žádné soubory",
- "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo proveďte synchronizaci se svými zařízeními!",
+ "Create templates folder" : "Vytvořit složku pro šablony",
+ "Templates" : "Šablony",
+ "New template folder" : "Nová složka šablon",
+ "In folder" : "Ve složce",
+ "Search in all files" : "Hledat ve všech souborech",
+ "Search in folder: {folder}" : "Hledat ve složce: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z přetažených souborů se nepodařilo zpracovat",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vámi využívaný prohlížeč nepodporuje aplikační program. rozhraní pro přístup k souborovému systému (Filesytem API). Složky nebudou nahrány",
+ "No files to upload" : "Žádné soubory k nahrání",
+ "Unable to create the directory {directory}" : "Nepodařilo se vytvořit složku {directory}",
+ "Some files could not be uploaded" : "Některé soubory nebylo možné nahrát",
+ "Files uploaded successfully" : "Soubor úspěšně nahrán",
+ "No files to process" : "Žádné soubory ke zpracování",
+ "Some files could not be copied" : "Některé soubory nebylo možné zkopírovat",
+ "Some files could not be moved" : "Některé soubory nebylo možné přesunout",
+ "Files copied successfully" : "Soubory úspěšně zkopírovány",
+ "Files moved successfully" : "Soubory úspěšně přesunuty",
+ "Conflicts resolution skipped" : "Řešení kolizí přeskočeno",
+ "Upload cancelled" : "Nahrávání zrušeno",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Není možné přejmenovat „{oldName}“ – už neexistuje",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Název „{newName}“ je už použitý ve složce „{dir}“. Zvolte jiný název.",
+ "Could not rename \"{oldName}\"" : "„{oldName}“ se nepodařilo přejmenovat",
+ "This operation is forbidden" : "Tato operace je zakázána",
+ "Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
+ "Unexpected error: {error}" : "Neočekávaná chyby: {error}",
+ "_%n file_::_%n files_" : ["%n soubor","%n soubory","%n souborů","%n soubory"],
+ "_%n folder_::_%n folders_" : ["%n složka","%n složky","%n složek","%n složky"],
+ "_%n hidden_::_%n hidden_" : ["%n skrytý","%n skryté","%n skrytých","%n skryté"],
+ "Filename must not be empty." : "Je třeba vyplnit název souboru.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ není v názvu souboru možné použít.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ je vyhrazeným názvem a není povoleno k použití pro názvy souborů.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ není povoleným typem souboru.",
+ "Filenames must not end with \"{extension}\"." : "Je třeba, aby názvy souborů nekončily na „{extension}“.",
+ "List of favorite files and folders." : "Seznam oblíbených souborů a složek.",
+ "No favorites yet" : "Zatím nic oblíbeného",
+ "Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
+ "List of your files and folders." : "Seznam vašich souborů a složek.",
+ "List of your files and folders that are not shared." : "Seznam vašich souborů a složek, které nejsou sdíleny.",
+ "No personal files found" : "Nenalezeny žádné osobní soubory",
+ "Files that are not shared will show up here." : "Soubory, které nejsou nikomu sdíleny se zobrazí zde.",
+ "Recent" : "Nedávné",
+ "List of recently modified files and folders." : "Seznam nedávno změněných souborů a složek.",
+ "No recently modified files" : "Žádné nedávno změněné soubory.",
+ "Files and folders you recently modified will show up here." : "Zde budou zobrazeny soubory a složky, které jste nedávno změnili.",
+ "Search" : "Hledat",
+ "Search results within your files." : "Výsledky hledání ve vašich souborech.",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Upload too large" : "Nahrávaná data jsou příliš objemná",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte nahrát, překračují limit velikosti nahrávání na tomto serveru.",
- "No favorites yet" : "Zatím nic oblíbeného",
- "Files and folders you mark as favorite will show up here" : "Zde budou zobrazeny soubory a složky, které označíte jako oblíbené",
- "Deleted files" : "Smazané soubory",
- "Shares" : "Sdílení",
- "Shared with others" : "Sdíleno s ostatními",
- "Shared with you" : "Sdíleno s vámi",
- "Shared by link" : "Sdíleno pomocí odkazu",
- "Deleted shares" : "Smazaná sdílení",
- "Pending shares" : "Čekající sdílení",
+ "File could not be found" : "Soubor se nedaří nalézt",
+ "Show list view" : "Zobrazit v seznamu",
+ "Show grid view" : "Zobrazit v mřížce",
+ "Close" : "Zavřít",
+ "Could not create folder \"{dir}\"" : "Složku „{dir}“ nelze vytvořit",
+ "This will stop your current uploads." : "Toto zastaví stávající nahrávání.",
+ "Upload cancelled." : "Nahrávání zrušeno.",
+ "Processing files …" : "Zpracovávání souborů…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Soubor {filename} nelze nahrát, protože je to buď adresář nebo má velikost nula bajtů",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedostatek volného místa pro uložení – velikost nahrávaných dat je {size1}, volné kapacity úložiště ale zbývá už jen {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Cílová složka „{dir}“ už neexistuje",
+ "An unknown error has occurred" : "Vyskytla se neznámá chyba",
+ "File could not be uploaded" : "Soubor se nepodařilo nahrát",
+ "Uploading …" : "Nahrávání…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Nahrávání… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Nahrání této položky není podporováno",
+ "Error when assembling chunks, status code {status}" : "Chyba při kompletaci shluků, kód chyby {status}",
+ "Choose target folder" : "Zvolte cílovou složku",
+ "Set reminder" : "Nastavit připomínku",
+ "Edit locally" : "Upravit lokálně",
+ "Open" : "Otevřít",
+ "Could not load info for file \"{file}\"" : "Nepodařilo se načíst informace pro soubor „{file}“",
+ "Please select tag(s) to add to the selection" : "Vyberte štítky které přidat do výběru",
+ "Apply tag(s) to selection" : "Uplatnit štítky na výběr",
+ "Select directory \"{dirName}\"" : "Vybrat složku „{dirName}“",
+ "Select file \"{fileName}\"" : "Vybrat soubor „{fileName}“",
+ "Unable to determine date" : "Nelze určit datum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
+ "Could not move \"{file}\", target exists" : "„{file}“ nelze přesunout – cíl už existuje",
+ "Could not move \"{file}\"" : "„{file}“ nelze přesunout",
+ "copy" : "kopie",
+ "Could not copy \"{file}\", target exists" : "Nelze kopírovat „{file}“, cíl už existuje",
+ "Could not copy \"{file}\"" : "Nelze kopírovat „{file}“",
+ "Copied {origin} inside {destination}" : "{origin} zkopírován do {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} a {nbfiles} dalších souborů zkopírováno do {destination}",
+ "{newName} already exists" : "{newName} už existuje",
+ "Could not create file \"{file}\"" : "Soubor „{file}“ nelze vytvořit",
+ "Could not create file \"{file}\" because it already exists" : "Soubor „{file}“ nelze vytvořit, protože zde už existuje",
+ "Could not create folder \"{dir}\" because it already exists" : "Složku „{dir}“ nelze vytvořit, protože už existuje",
+ "Could not fetch file details \"{file}\"" : "Nedaří se získat podrobnosti o souboru „{file}“",
+ "Error deleting file \"{fileName}\"." : "Chyba při mazání souboru „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Žádné výsledky hledání v ostatních složkách pro {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Pokud chcete hledat v ostatních složkách, zadejte více než dva znaky",
+ "{dirs} and {files}" : "{dirs} a {files}",
+ "_including %n hidden_::_including %n hidden_" : ["včetně %n skrytého","včetně %n skrytých","včetně %n skrytých","včetně %n skrytých"],
+ "You do not have permission to upload or create files here" : "Nemáte oprávnění sem nahrávat nebo zde vytvářet soubory",
+ "_Uploading %n file_::_Uploading %n files_" : ["Nahrává se %n soubor","Nahrávají se %n soubory","Nahrává se %n souborů","Nahrávají se %n soubory"],
+ "New" : "Nové",
+ "New file/folder menu" : "Nabídka souboru/složky",
+ "Select file range" : "Vybrat rozsah souborů",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} využito",
+ "\"{name}\" is an invalid file name." : "„{name}“ není platným názvem souboru.",
+ "File name cannot be empty." : "Je třeba vyplnit název souboru.",
+ "\"/\" is not allowed inside a file name." : "„/“ není povolený znak v názvu souboru.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ není povolený typ souboru",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložiště uživatele {owner} je zaplněné – nelze aktualizovat ani synchronizovat soubory!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložiště je plné – nelze aktualizovat ani synchronizovat soubory!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úložiště {owner} je téměř plné ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinová složka „{mountPoint}“ je téměř plná ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externí úložiště „{mountPoint}“ je téměř plné ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložiště je téměř plné ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["shoduje se s „{filter}“","shodují se s „{filter}“","shoduje se s „{filter}“","shodují se s „{filter}“"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Přímý odkaz byl zkopírován (funguje pouze pro osoby, které mají přístup k tomuto souboru/složce)",
+ "Path" : "Popis umístění",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
+ "Favored" : "Zařazeno mezi oblíbené",
+ "Favor" : "Zařadit mezi oblíbené",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Zkopírovat přímý odkaz (funguje pouze pro osoby, které mají přístup k tomuto souboru/složce)",
+ "Upload file" : "Nahrát soubor",
+ "Not favored" : "Není v oblíbených",
+ "An error occurred while trying to update the tags" : "Při pokusu o úpravu štítků došlo k chybě",
+ "Upload (max. %s)" : "Nahrát (max. %s)",
+ "\"{displayName}\" action executed successfully" : "akce „{displayName}“ úspěšně vykonána",
+ "\"{displayName}\" action failed" : "akce „{displayName}“ se nezdařila",
+ "\"{displayName}\" failed on some elements" : "„{displayName}“ se pro některé prvky nezdařilo",
+ "\"{displayName}\" batch action executed successfully" : "Hromadná akce „{displayName}“ úspěšně vykonána",
+ "Submitting fields…" : "Odesílání kolonek…",
+ "Filter filenames…" : "Filtrovat názvy souborů…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL zkopírována do schránky",
+ "Enable the grid view" : "Zapnout zobrazení v mřížce",
+ "Enable folder tree" : "Zapnout strom složek",
+ "Copy to clipboard" : "Zkopírovat do schránky",
+ "Use this address to access your Files via WebDAV" : "Tuto adresu použijte pro přístup k vašim souborům prostřednictvím protokolu WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Pokud jste zapnuli 2FA (dvoufaktorovou autentizaci), je třeba kliknutím sem vytvořit a použít nové heslo pro aplikaci.",
+ "Deletion cancelled" : "Mazání zrušeno",
+ "Move cancelled" : "Přesunutí zrušeno",
+ "Cancelled move or copy of \"{filename}\"." : "Přesunutí nebo zkopírování „{filename}“ zrušeno.",
+ "Cancelled move or copy operation" : "Operace přesunutí či zkopírování zrušena",
+ "Open details" : "Otevřít podrobnosti",
+ "Photos and images" : "Fotky a obrázky",
+ "New folder creation cancelled" : "Vytváření nové složky zrušeno",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} složka","{folderCount} složky","{folderCount} složek","{folderCount} složky"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} soubor","{fileCount} soubory","{fileCount} souborů","{fileCount} soubory"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 soubor a {folderCount} složka","1 soubor a {folderCount} složky","1 soubor a {folderCount} složek","1 soubor a {folderCount} složky"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} soubor a 1 složka","{fileCount} soubory a 1 složka","{fileCount} souborů a 1 složka","{fileCount} soubory a 1 složka"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} souborů a {folderCount} složek",
+ "All folders" : "Všechny složky",
+ "Personal Files" : "Osobní soubory",
"Text file" : "Textový soubor",
"New text file.txt" : "Nový textový soubor.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložiště uživatele {owner} je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Skupinová složka „{mountPoint}“ je plná, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externí úložiště „{mountPoint}“ je plné, soubory už nadále není možné aktualizovat nebo synchronizovat!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložiště je plné – soubory už proto nelze aktualizovat ani synchronizovat!",
- "_matches '{filter}'_::_match '{filter}'_" : ["odpovídá „{filter}“","odpovídají „{filter}“","odpovídá „{filter}“","odpovídají „{filter}“"]
+ "%1$s (renamed)" : "%1$s (přejmenované)",
+ "renamed file" : "přejmenovaný soubor",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po povolení názvů souborů, kompatibilních s Windows, stávající soubory už nebude možné změnit, ale je možné je přejmenovat na platné nové názvy jejich vlastníkem.",
+ "Filter file names …" : "Filtrovat názvy souborů…",
+ "Prevent warning dialogs from open or reenable them." : "Zabránit dialogům s varováními v otevírání nebo znovupovolení.",
+ "Show a warning dialog when changing a file extension." : "Při měnění přípony souboru zobrazit varovný dialog.",
+ "Speed up your Files experience with these quick shortcuts." : "Zrychlete svůj dojem ze Souborů pomocí těchto rychlých zkratek.",
+ "Open the actions menu for a file" : "Otevřít nabídku akcí pro soubor",
+ "Rename a file" : "Přejmenovat soubor",
+ "Delete a file" : "Smazat soubor",
+ "Favorite or remove a file from favorites" : "Zařadit mezi oblíbené (nebo odebrat)",
+ "Manage tags for a file" : "Spravovat štítky pro soubor",
+ "Deselect all files" : "Zrušit výběr všech souborů",
+ "Select or deselect a file" : "Vybrat/zrušit výběr souboru",
+ "Select a range of files" : "Vybrat rozsah souborů",
+ "Navigate to the parent folder" : "Přejít do nadřazené složky",
+ "Navigate to the file above" : "Přejít na soubor výše",
+ "Navigate to the file below" : "Přejít na soubor níže",
+ "Navigate to the file on the left (in grid mode)" : "Přejít na soubor vlevo (v režimu mřížky)",
+ "Navigate to the file on the right (in grid mode)" : "Přejít na soubor vpravo (v režimu mřížky)",
+ "Toggle the grid view" : "Vyp/zap. zobrazení v mřížce",
+ "Open the sidebar for a file" : "Otevřít postranní panel pro soubor"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
} \ No newline at end of file
diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js
deleted file mode 100644
index 075164ddee4..00000000000
--- a/apps/files/l10n/cy_GB.js
+++ /dev/null
@@ -1,45 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "No file was uploaded. Unknown error" : "Ni lwythwyd ffeil i fyny. Gwall anhysbys.",
- "There is no error, the file uploaded with success" : "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb MAX_FILE_SIZE bennwyd yn y ffurflen HTML",
- "The uploaded file was only partially uploaded" : "Dim ond yn rhannol y llwythwyd y ffeil i fyny",
- "No file was uploaded" : "Ni lwythwyd ffeil i fyny",
- "Missing a temporary folder" : "Plygell dros dro yn eisiau",
- "Failed to write to disk" : "Methwyd ysgrifennu i'r ddisg",
- "Not enough storage available" : "Dim digon o le storio ar gael",
- "Invalid directory." : "Cyfeiriadur annilys.",
- "Files" : "Ffeiliau",
- "Home" : "Cartref",
- "Close" : "Cau",
- "Upload cancelled." : "Diddymwyd llwytho i fyny.",
- "Uploading..." : "Yn llwytho i fyny...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.",
- "Actions" : "Gweithredoedd",
- "Download" : "Llwytho i lawr",
- "Rename" : "Ailenwi",
- "Delete" : "Dileu",
- "Unshare" : "Dad-rannu",
- "Details" : "Manylion",
- "Pending" : "I ddod",
- "Name" : "Enw",
- "Size" : "Maint",
- "Modified" : "Addaswyd",
- "New" : "Newydd",
- "File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.",
- "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)",
- "Folder" : "Plygell",
- "Upload" : "Llwytho i fyny",
- "File handling" : "Trafod ffeiliau",
- "Maximum upload size" : "Maint mwyaf llwytho i fyny",
- "max. possible: " : "mwyaf. posib:",
- "Save" : "Cadw",
- "Settings" : "Gosodiadau",
- "Upload too large" : "Maint llwytho i fyny'n rhy fawr",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.",
- "Text file" : "Ffeil destun"
-},
-"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json
deleted file mode 100644
index 698a79a2d9a..00000000000
--- a/apps/files/l10n/cy_GB.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{ "translations": {
- "No file was uploaded. Unknown error" : "Ni lwythwyd ffeil i fyny. Gwall anhysbys.",
- "There is no error, the file uploaded with success" : "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb MAX_FILE_SIZE bennwyd yn y ffurflen HTML",
- "The uploaded file was only partially uploaded" : "Dim ond yn rhannol y llwythwyd y ffeil i fyny",
- "No file was uploaded" : "Ni lwythwyd ffeil i fyny",
- "Missing a temporary folder" : "Plygell dros dro yn eisiau",
- "Failed to write to disk" : "Methwyd ysgrifennu i'r ddisg",
- "Not enough storage available" : "Dim digon o le storio ar gael",
- "Invalid directory." : "Cyfeiriadur annilys.",
- "Files" : "Ffeiliau",
- "Home" : "Cartref",
- "Close" : "Cau",
- "Upload cancelled." : "Diddymwyd llwytho i fyny.",
- "Uploading..." : "Yn llwytho i fyny...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.",
- "Actions" : "Gweithredoedd",
- "Download" : "Llwytho i lawr",
- "Rename" : "Ailenwi",
- "Delete" : "Dileu",
- "Unshare" : "Dad-rannu",
- "Details" : "Manylion",
- "Pending" : "I ddod",
- "Name" : "Enw",
- "Size" : "Maint",
- "Modified" : "Addaswyd",
- "New" : "Newydd",
- "File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.",
- "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)",
- "Folder" : "Plygell",
- "Upload" : "Llwytho i fyny",
- "File handling" : "Trafod ffeiliau",
- "Maximum upload size" : "Maint mwyaf llwytho i fyny",
- "max. possible: " : "mwyaf. posib:",
- "Save" : "Cadw",
- "Settings" : "Gosodiadau",
- "Upload too large" : "Maint llwytho i fyny'n rhy fawr",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.",
- "Text file" : "Ffeil destun"
-},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index f785a7e5a26..40408fb8ac1 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
- "Storage invalid" : "Lagerplads er ugyldig",
- "Unknown error" : "Ukendt fejl",
- "File could not be found" : "Filen kunne ikke findes",
- "Move or copy" : "Flyt eller kopier",
- "Download" : "Hent",
- "Delete" : "Slet",
- "Home" : "Hjem",
- "Close" : "Luk",
- "Favorites" : "Foretrukne",
- "Could not create folder \"{dir}\"" : "Kunne ikke oprette mappen \"{dir}\"",
- "This will stop your current uploads." : "Dette vil stoppe din nuværende uploads.",
- "Upload cancelled." : "Upload afbrudt.",
- "Processing files …" : "Behandler filer...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage",
- "Target folder \"{dir}\" does not exist any more" : "Destinationsmappen \"{dir}\" findes ikke længere",
- "Not enough free space" : "Ikke nok fri plads",
- "An unknown error has occurred" : "En ukendt fejl er opstået",
- "Uploading …" : "Uploader ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Upload af dette er ikke supporteret",
- "Target folder does not exist any more" : "Destinationsmappen findes ikke længere",
- "Operation is blocked by access control" : "Operationen blev blokeret af adgangskontrollen",
- "Error when assembling chunks, status code {status}" : "Fejl ved montering af klumper, statuskode {status}",
- "Actions" : "Handlinger",
- "Rename" : "Omdøb",
- "Copy" : "Kopier",
- "Choose target folder" : "Vælg destinationsmappe",
- "Open" : "Åbn",
- "Delete file" : "Slet fil",
- "Delete folder" : "Slet mappe",
- "Disconnect storage" : "Frakobl lager",
- "Leave this share" : "Forlad dette delte drev",
- "Could not load info for file \"{file}\"" : "Kunne ikke indlæse information for filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Please select tag(s) to add to the selection" : "Vælg venligst tag(s) for at tilføje til udvalget",
- "Apply tag(s) to selection" : "Anvend tag(s) på markeringen",
- "Select" : "Vælg",
- "Pending" : "Afventer",
- "Unable to determine date" : "Kan ikke fastslå datoen",
- "This operation is forbidden" : "Denne operation er forbudt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
- "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn",
- "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
- "copy" : "kopiér",
- "Could not copy \"{file}\", target exists" : "Kunne ikke kopiere \"{file}\" - der findes allerede en fil med dette navn",
- "Could not copy \"{file}\"" : "Kunne ikke kopiere \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopirede {origin} ind i {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "kopierede {origin} og {nbfiles} andre filer ind i {destination}",
- "{newName} already exists" : "{newName} eksistere allerede",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kunne ikke omdøbe \"{fileName}\", den findes ikke længere",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{targetName}\" bruges allerede i mappen \"{dir}\". Vælg et andet navn.",
- "Could not rename \"{fileName}\"" : "Kunne ikke omdøbe \"{fileName}\"",
- "Could not create file \"{file}\"" : "Kunne ikke oprette filen \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Kunne ikke oprette filen \"{file}\", da den allerede findes",
- "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke oprette mappen \"{dir}\", da den allerede findes",
- "Could not fetch file details \"{file}\"" : "Kunne ikke hente filoplysningerne \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søgeresultater i andre mapper efter {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Indtast mere end to tegn for at søge i andre mapper",
- "Name" : "Navn",
- "Size" : "Størrelse",
- "Modified" : "Ændret",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"],
- "You don’t have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her",
- "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"],
- "New" : "Ny",
- "Select file range" : "Vælg filområde",
- "{used} of {quota} used" : "{used} af {quota} brugt",
- "{used} used" : "{used} brugt",
- "\"{name}\" is an invalid file name." : "'{name}' er et ugyldigt filnavn.",
- "File name cannot be empty." : "Filnavnet kan ikke stå tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" er ikke tilladt i et filnavn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tilladt filtype",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen af {owner} er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fyldt, filer kan ikke længere opdateres eller synkroniseres!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Din lagerplads er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Opbevaring af {owner} er næsten fuld ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er næsten fuld ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Eksternt lager \"{mountPoint}\" er næsten fyldt ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Din lagerplads er næsten fuld ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
- "View in folder" : "Vis i mappe",
- "Copied!" : "Kopieret",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopier direkte link (virker kun for brugere der har adgang til denne fil/mappe)",
- "Path" : "Sti",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Gjort til foretrukken",
- "Favorite" : "Foretrukken",
- "You can only favorite a single file or folder at a time" : "Du kan kun favorisere en enkelt fil eller mappe ad gangen",
- "New folder" : "Ny mappe",
- "Upload file" : "Upload fil",
- "Recent" : "Seneste",
- "Not favorited" : "Ingen foretrukne",
- "Remove from favorites" : "Fjern fra favoritter",
- "Add to favorites" : "Tilføj til favoritter",
- "An error occurred while trying to update the tags" : "Der opstod en fejl under forsøg på at opdatere mærkerne",
"Added to favorites" : "Tilføjet til favoritter",
"Removed from favorites" : "Fjernet fra favoritter",
"You added {file} to your favorites" : "Du har tilføjet {file} til dine favoritter",
"You removed {file} from your favorites" : "Du har fjernet {file} fra dine favoritter",
+ "Favorites" : "Foretrukne",
"File changes" : "Fil ændringer",
"Created by {user}" : "Oprettet af {user}",
"Changed by {user}" : "Ændret af {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Gendannet af {user}",
"Renamed by {user}" : "Omdøbt af {user}",
"Moved by {user}" : "Flyttet af {user}",
- "\"remote user\"" : "\"ekstern bruger\"",
+ "\"remote account\"" : "\"fjernkonto\"",
"You created {file}" : "Du har oprettet {file}",
"You created an encrypted file in {file}" : "Du har oprettet en krypteret fil i {file}",
"{user} created {file}" : "{user} oprettede {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Du flyttede {oldfile} til {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttede {oldfile} til {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil er blevet tilføjet eller fjernet fra dine <strong>favoritter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe er blevet <strong>ændret</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favoritfil eller -mappe er blevet <strong>ændret</strong>",
- "All files" : "Alle filer",
- "Unlimited" : "Ubegrænset",
- "Upload (max. %s)" : "Upload (max. %s)",
+ "Failed to authorize" : "Kunne ikke godkende",
+ "Invalid folder path" : "Ugyldig mappesti",
+ "Folder not found" : "Mappe ikke fundet",
+ "The file cannot be found" : "Filen kan ikke findes",
+ "The destination path does not exist: %1$s" : "Destinationsstien eksisterer ikke: %1$s",
+ "You do not have permission to create a file at the specified location" : "Du har ikke tilladelse til at oprette en fil på den angivne placering",
+ "The file could not be converted." : "Filen kunne ikke konverteres.",
+ "Could not get relative path to converted file" : "Kunne ikke hente relativ sti til konverteret fil",
+ "Favorite files" : "Favoriser filer",
+ "No favorites" : "Ingen foretrukne",
+ "More favorites" : "Flere favoritter",
"Accept" : "Accepter",
"Reject" : "Afvis",
"Incoming ownership transfer from {user}" : "Indgående ejerskabsoverførsel fra {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vil du acceptere {path}?\n\nBemærk: Overførselsprocessen efter accept kan tage op til 1 time.",
+ "Ownership transfer denied" : "Ejerskabsoverdragelse mislykkedes",
+ "Your ownership transfer of {path} was denied by {user}." : "Dit ejerskaboverdragelse af {path} blev afvist af {user}.",
"Ownership transfer failed" : "Overførsel af ejerskab mislykkedes",
"Your ownership transfer of {path} to {user} failed." : "Din ejerskabsoverførsel af {path} til {user} mislykkedes.",
"The ownership transfer of {path} from {user} failed." : "Ejerskabsoverførslen af {path} fra {user} mislykkedes.",
@@ -159,62 +67,391 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Din ejerskabsoverførsel af {path} til {user} er fuldført.",
"The ownership transfer of {path} from {user} has completed." : "Ejerskabsoverførslen af {path} fra {user} er fuldført.",
"in %s" : "i %s",
+ "Transferred from %1$s on %2$s" : "Overført fra %1$s den %2$s",
+ "Files compatibility" : "Filkompatibilitet",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillad at begrænse filnavne for at sikre at filer kan synkroniseres med alle klienter. Som standard er alle filnavne der er gyldige på POSIX (fx Linux eller macOS) tilladte.",
+ "Enforce Windows compatibility" : "Styrk Windows kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dette vil blokere filnavne der ikke er gyldige på Windows systemer, såsom brug af reserverede navne eller specielle karakterer. Men dette vil ikke styrke kompatibiliteten af versalfølsomhed.",
"File Management" : "Filhåndtering",
- "Transfer ownership of a file or folder" : "Overfør ejerskab af en fil eller mappe",
- "Choose file or folder to transfer" : "Vælg fil eller mappe til overførsel",
- "Change" : "Ændr",
- "New owner" : "Ny ejer",
- "Search users" : "Søg efter brugere",
+ "Home" : "Hjem",
+ "Target folder does not exist any more" : "Destinationsmappen findes ikke længere",
+ "Reload current directory" : "Genindlæs den aktuelle mappe",
+ "Go to the \"{dir}\" directory" : "Gå til mappen \"{dir}\"",
+ "Current directory path" : "Nuværende mappesti",
+ "Your have used your space quota and cannot upload files anymore" : "Du har brugt din pladskvote og kan ikke længere uploade filer",
+ "You do not have permission to upload or create files here." : "Du har ikke rettigheder til at uploade eller oprette filer her.",
+ "Drag and drop files here to upload" : "Træk filer hertil for at uploade",
+ "Favorite" : "Foretrukken",
+ "Back" : "Tilbage",
+ "Toggle selection for file \"{displayName}\"" : "Skift markering for fil \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Skift markering for mappe \"{displayName}\"",
+ "File is loading" : "Filen indlæses",
+ "Folder is loading" : "Mappen indlæses",
+ "Filename" : "Filnavn",
+ "Folder name" : "Mappenavn",
+ "This node is unavailable" : "Denne node er ikke tilgængelig ",
+ "Another entry with the same name already exists." : "En anden indførsel med det samme navn eksisterer allerede.",
+ "Invalid filename." : "Ugyldigt filnavn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Omdøbte \"{oldName}\" til \"{newName}\"",
+ "Rename file" : "Omdøb fil",
+ "Folder" : "Mappe",
+ "Pending" : "Afventer",
+ "Unknown date" : "Ukendt dato",
+ "Clear filter" : "Ryd filter",
+ "Modified" : "Ændret",
+ "Search everywhere" : "Søg overalt",
+ "Type" : "Type",
+ "Active filters" : "Aktive filtre",
+ "Remove filter" : "Fjern filter",
+ "Total rows summary" : "Samlet række antal",
+ "Toggle selection for all files and folders" : "Skift markering for alle filer og mapper",
+ "Name" : "Navn",
+ "Size" : "Størrelse",
+ "Actions" : "Handlinger",
+ "(selected)" : "(valgt)",
+ "List of files and folders." : "Liste med filer og mapper.",
+ "You have used your space quota and cannot upload files anymore." : "Du har opbrugt din plads kvote og kan ikke uploade flere filer.",
+ "Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper er sorterbare.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Hele listen er ikke hentet, af hensyn til størrelsen. Listen vil blive hentet løbende som du kører igennem listen.",
+ "File not found" : "Filen blev ikke fundet",
+ "{usedQuotaByte} used" : "{usedQuotaByte} brugt",
+ "{used} of {quota} used" : "{used} af {quota} brugt",
+ "{relative}% used" : "{relative}% brugt",
+ "Could not refresh storage stats" : "Kunne ikke opdatere lageroplysninger",
+ "Your storage is full, files can not be updated or synced anymore!" : "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!",
+ "Storage information" : "Lagringsinformation",
+ "Storage quota" : "Lagerkvote",
+ "New folder" : "Ny mappe",
+ "Create new folder" : "Opret ny mappe",
+ "This name is already in use." : "Dette navn er allerede i brug.",
+ "Create" : "Opret",
+ "Fill template fields" : "Udfyld skabelonfelter",
+ "Submitting fields …" : "Sender felter …",
+ "Submit" : "Tilføj",
"Choose a file or folder to transfer" : "Vælg en fil eller mappe til overførsel",
"Transfer" : "Overfør",
"Transfer {path} to {userid}" : "Overfør {path} til {userid}",
"Invalid path selected" : "Ugyldig filsti valgt",
+ "Unknown error" : "Ukendt fejl",
"Ownership transfer request sent" : "Anmodning om ejerskabsoverdragelse sendt",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer",
- "Tags" : "Mærker",
- "Unable to change the favourite state of the file" : "Kan ikke ændre favorittilstanden for filen",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer",
+ "Transfer ownership of a file or folder" : "Overfør ejerskab af en fil eller mappe",
+ "Choose file or folder to transfer" : "Vælg fil eller mappe til overførsel",
+ "Change" : "Ændr",
+ "New owner" : "Ny ejer",
+ "Keep {old}" : "Behold {old}",
+ "Keep without extension" : "Behold uden endelse",
+ "Use {new}" : "Anvend {new}",
+ "Remove extension" : "Fjern endelsen",
+ "Change file extension" : "Skift filendelsen",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ændring af filendelsen fra \"{old}\" til \"{new}\" kan gøre filen ulæsbar.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Fjernelse af filendelsen \"{old}\" kan gøre filen ulæsbar.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Tilføjelse af filendelsen \"{new}\" kan efterlade gøre ulæsbar.",
+ "Do not show this dialog again." : "Vis ikke denne dialog igen.",
+ "Select file or folder to link to" : "Vælg fil eller mappe at linke til",
+ "Choose {file}" : "Vælg {file}",
+ "Share" : "Del",
+ "Shared by link" : "Delt via link",
+ "Shared" : "Delt",
+ "Switch to list view" : "Skift til listevisning",
+ "Switch to grid view" : "Skift til gittervisning",
+ "The file could not be found" : "Filen kunne ikke findes",
+ "Upload was cancelled by user" : "Upload var annulleret af bruger",
+ "Not enough free space" : "Ikke nok fri plads",
+ "Operation is blocked by access control" : "Operationen blev blokeret af adgangskontrollen",
+ "Error during upload: {message}" : "Fejl under upload: {message}",
+ "Error during upload, status code {status}" : "Fejl under upload, statuskode {status}",
+ "Unknown error during upload" : "Ukendt fejl under upload",
+ "Loading current folder" : "Indlæser aktuelle mappe",
+ "Retry" : "Prøv igen",
+ "No files in here" : "Her er ingen filer",
+ "Upload some content or sync with your devices!" : "Upload indhold eller synkroniser med dine enheder!",
+ "Go back" : "Gå tilbage",
+ "Views" : "Visninger",
+ "Files settings" : "indstillinger for filer",
+ "Your files" : "Dine filer",
+ "Open in files" : "Åben i Filer",
+ "File cannot be accessed" : "Filen kan ikke tilgås",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen kunne ikke findes eller du har ikke tilladelser til at se den. Bed afsenderen om at dele den.",
+ "Clipboard is not available" : "Udklipsholderen er ikke tilgængelig",
+ "General" : "Generelt",
+ "All files" : "Alle filer",
+ "Personal files" : "Personlige filer",
+ "Sort favorites first" : "Vis favoritter først",
+ "Sort folders before files" : "Sorter mapper før filer",
+ "Appearance" : "Udseende",
+ "Show hidden files" : "Vis skjulte filer",
+ "Crop image previews" : "Beskær forhåndsvisninger af billeder",
+ "Additional settings" : "Yderligere indstillinger",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopier",
+ "Warnings" : "Advarsler",
+ "Keyboard shortcuts" : "Tastaturgenveje",
+ "Rename" : "Omdøb",
+ "Delete" : "Slet",
+ "Manage tags" : "Administrer tags",
+ "Selection" : "Valg",
+ "Select all files" : "Vælg alle filer",
+ "Deselect all" : "Fravælg alle",
+ "Navigation" : "Navigation",
+ "View" : "Vis",
+ "Toggle grid view" : "Vis som liste",
+ "Show those shortcuts" : "Vis disse genveje",
+ "You" : "Dig",
+ "Shared multiple times with different people" : "Delt flere gange med forskellige mennesker",
+ "Unable to change the favorite state of the file" : "Kan ikke ændre favoritstatus for filen",
"Error while loading the file data" : "Fejl under indlæsning af fildata",
+ "Owner" : "Ejer",
+ "Remove from favorites" : "Fjern fra favoritter",
+ "Add to favorites" : "Tilføj til favoritter",
+ "Tags" : "Tags",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kan ikke oprette ny fil fra skabelonen",
"Pick a template for {name}" : "Vælg en skabelon til {name}",
- "Cancel" : "annuller",
- "Create" : "Opret",
"Create a new file with the selected template" : "Opret en ny fil med den valgte skabelon",
"Creating file" : "Opretter fil",
- "Blank" : "Tom",
- "Unable to create new file from template" : "Kan ikke oprette ny fil fra skabelonen",
- "Set up templates folder" : "Opsæt skabelonmappen",
- "Templates" : "Skabeloner",
+ "Save as {displayName}" : "Gem som {displayName}",
+ "Save as …" : "Gem som ...",
+ "Converting files …" : "Konverterer filer ...",
+ "Failed to convert files: {message}" : "Kunne ikke konvertere filer: {message}",
+ "All files failed to be converted" : "Alle filer kunne ikke konverteres",
+ "One file could not be converted: {message}" : "En fil kunne ikke konverteres: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["En fil kunne ikke konverteres","%n filer kunne ikke konverteres"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["En fil konverteret","%n filer konverteret"],
+ "Files successfully converted" : "Filer konverteret",
+ "Failed to convert files" : "Kunne ikke konvertere filer",
+ "Converting file …" : "Konverterer fil ...",
+ "File successfully converted" : "Filen konverteret",
+ "Failed to convert file: {message}" : "Kunne ikke konvertere fil: {message}",
+ "Failed to convert file" : "Kunne ikke konvertere fil",
+ "Leave this share" : "Forlad dette delte drev",
+ "Leave these shares" : "Forlad disse delinger",
+ "Disconnect storage" : "Frakobl lager",
+ "Disconnect storages" : "Frakobl lagerne",
+ "Delete permanently" : "Slet permanent",
+ "Delete and unshare" : "Slet og fjern deling",
+ "Delete file" : "Slet fil",
+ "Delete files" : "Slet filer",
+ "Delete folder" : "Slet mappe",
+ "Delete folders" : "Slet mapper",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du er ved at slette {count} element permanent","Du er ved at slette {count} elementer permanent"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du er ved at slette {count} element","Du er ved at slette {count} elementer"],
+ "Confirm deletion" : "Bekræft sletning",
+ "Cancel" : "annuller",
+ "Download" : "Download",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierer \"{source}\" til \"{destination}\" …",
+ "Destination is not a folder" : "Destinationen er ikke en mappe",
+ "This file/folder is already in that directory" : "Filen/mappen er allerede i denne mappe",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe ind i sig selv, eller til en mappe inden i sig selv",
+ "(copy)" : "(kopier)",
+ "(copy %n)" : "(kopier %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mappe med det navn findes allerede i denne mappe",
+ "The files are locked" : "Filerne er låste",
+ "The file does not exist anymore" : "Filen findes ikke længere",
+ "Choose destination" : "Vælg destination",
+ "Copy to {target}" : "Kopier til {target}",
+ "Move to {target}" : "Flyt til {target}",
+ "Move" : "Flyt",
+ "Move or copy operation failed" : "Flytte- eller kopioperationen fejlede",
+ "Move or copy" : "Flyt eller kopier",
+ "Open folder {displayName}" : "Åben mappe {displayName}",
+ "Open in Files" : "Åben i Filer",
+ "Open locally" : "Åben lokalt",
+ "Failed to redirect to client" : "Kunne ikke omdirigere til klienten",
+ "Open file locally" : "Åben fil lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen bør nu åbne på dit apparat. Hvis den ikke gør det, så kontroller venligst at desktop app'en er installeret.",
+ "Retry and close" : "Forsøg igen og luk",
+ "Open online" : "Åben online",
+ "Details" : "Detaljer",
+ "View in folder" : "Vis i mappe",
+ "Today" : "I dag",
+ "Last 7 days" : "Sidste 7 dage",
+ "Last 30 days" : "Sidste 30 dage",
+ "This year ({year})" : "Dette år ({year})",
+ "Last year ({year})" : "Sidste år ({year})",
+ "Documents" : "Dokumenter",
+ "Spreadsheets" : "Regneark",
+ "Presentations" : "Præsentationer",
+ "PDFs" : "PDFer",
+ "Folders" : "Mapper",
+ "Audio" : "Lyd",
+ "Images" : "Billeder",
+ "Videos" : "Videoer",
+ "Created new folder \"{name}\"" : "Oprettede ny mappe \"{name}\"",
"Unable to initialize the templates directory" : "Kan ikke initialisere skabelonmappen",
- "%s used" : "%s brugt",
- "%s%% of %s used" : "%s%% af %s brugt",
- "%1$s of %2$s used" : "%1$s af %2$s brugt",
- "Settings" : "Indstillinger",
- "Show hidden files" : "Vis skjulte filer",
- "Crop image previews" : "Beskær forhåndsvisninger af billeder",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
- "Toggle %1$s sublist" : "Skift %1$s underliste",
- "Toggle grid view" : "Vis som gitter",
- "No files in here" : "Her er ingen filer",
- "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
+ "Create templates folder" : "Opret skabelonmappe",
+ "Templates" : "Skabeloner",
+ "New template folder" : "Ny skabelonmappe",
+ "In folder" : "I mappe",
+ "Search in folder: {folder}" : "Søg i mappe: {folder}",
+ "One of the dropped files could not be processed" : "En af de trukne filer kunne ikke behandles",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din browser understøtter ikke Filesystem-API'en. Mapper vil ikke bliver uploadet",
+ "No files to upload" : "Ingen filer til upload",
+ "Unable to create the directory {directory}" : "Kunne ikke oprette mappen {directory}",
+ "Some files could not be uploaded" : "Nogle filer kunne ikke uploades",
+ "Files uploaded successfully" : "Filer uploadet succesfuldt",
+ "No files to process" : "Ingen filer til at behandle",
+ "Some files could not be copied" : "Nogle filer kunne ikke blive kopieret",
+ "Some files could not be moved" : "Nogle filer kunne ikke flyttes",
+ "Files copied successfully" : "Filer kopieret succesfuldt",
+ "Files moved successfully" : "Filer flyttet succesfuldt",
+ "Conflicts resolution skipped" : "Konfliktløsning sprunget over",
+ "Upload cancelled" : "Upload annulleret",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunne ikke omdøbe \"{oldName}\", da den findes ikke længere",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{newName}\" bruges allerede i mappen \"{dir}\". Vælg et andet navn.",
+ "Could not rename \"{oldName}\"" : "Kunne ikke omdøbe \"{oldName}\"",
+ "This operation is forbidden" : "Denne operation er forbudt",
+ "Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
+ "Unexpected error: {error}" : "Uventet fejl: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
+ "Filename must not be empty." : "Filnavnet må ikke være tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er ikke tilladt i et filnavn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er et reserveret navn og er ikke tilladt til filnavne.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ikke en tilladt filtype.",
+ "Filenames must not end with \"{extension}\"." : "Filnavne må ikke slutte med \"{extension}\".",
+ "List of favorite files and folders." : "Liste med favoritfiler og -mapper.",
+ "No favorites yet" : "Ingen foretrukne endnu",
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
+ "List of your files and folders." : "Liste med dine filer og mapper.",
+ "List of your files and folders that are not shared." : "Liste med dine filer og mapper, der ikke er delt.",
+ "No personal files found" : "Ingen personlige filer fundet",
+ "Files that are not shared will show up here." : "Filer der ikke er delt vil blive vist her.",
+ "Recent" : "Seneste",
+ "List of recently modified files and folders." : "Liste med nyligt ændrede filer og mapper.",
+ "No recently modified files" : "Ingen filer er ændret for nyligt",
+ "Files and folders you recently modified will show up here." : "Filer og mapper som du har ændret for nyligt, vil blive vist her.",
+ "Search" : "Søg",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
"Upload too large" : "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
- "No favorites yet" : "Ingen foretrukne endnu",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
- "Deleted files" : "Slettede filer",
- "Shares" : "Delinger",
- "Shared with others" : "Delt med andre",
- "Shared with you" : "Delt med dig",
- "Shared by link" : "Delt via link",
- "Deleted shares" : "Slettede delinger",
- "Pending shares" : "Afventende delinger",
+ "File could not be found" : "Filen kunne ikke findes",
+ "Show list view" : "Vis som liste",
+ "Show grid view" : "Vis som gitter",
+ "Close" : "Luk",
+ "Could not create folder \"{dir}\"" : "Kunne ikke oprette mappen \"{dir}\"",
+ "This will stop your current uploads." : "Dette vil stoppe din nuværende uploads.",
+ "Upload cancelled." : "Upload afbrudt.",
+ "Processing files …" : "Behandler filer...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke uploade {filename} da det er enten en mappe eller indeholder 0 bytes.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkelig fri plads. Du uplaoder {size1} men der er kun {size2} tilbage",
+ "Target folder \"{dir}\" does not exist any more" : "Destinationsmappen \"{dir}\" findes ikke længere",
+ "An unknown error has occurred" : "En ukendt fejl er opstået",
+ "File could not be uploaded" : "Filen kunne ikke uploades",
+ "Uploading …" : "Uploader ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploader … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upload af dette er ikke supporteret",
+ "Error when assembling chunks, status code {status}" : "Fejl ved montering af klumper, statuskode {status}",
+ "Choose target folder" : "Vælg destinationsmappe",
+ "Set reminder" : "Sæt påmindelse",
+ "Edit locally" : "Rediger lokalt",
+ "Open" : "Åbn",
+ "Could not load info for file \"{file}\"" : "Kunne ikke indlæse information for filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Vælg venligst tag(s) for at tilføje til markeringen",
+ "Apply tag(s) to selection" : "Anvend tag(s) på markeringen",
+ "Select directory \"{dirName}\"" : "Vælg mappe \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Vælg fil \"{fileName}\"",
+ "Unable to determine date" : "Kan ikke fastslå datoen",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
+ "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - filen findes allerede",
+ "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
+ "copy" : "kopier",
+ "Could not copy \"{file}\", target exists" : "Kunne ikke kopiere \"{file}\" - der findes allerede en fil med dette navn",
+ "Could not copy \"{file}\"" : "Kunne ikke kopiere \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopirede {origin} ind i {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "kopierede {origin} og {nbfiles} andre filer ind i {destination}",
+ "{newName} already exists" : "{newName} eksisterer allerede",
+ "Could not create file \"{file}\"" : "Kunne ikke oprette filen \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Kunne ikke oprette filen \"{file}\", da den allerede findes",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke oprette mappen \"{dir}\", da den allerede findes",
+ "Could not fetch file details \"{file}\"" : "Kunne ikke hente filoplysningerne \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søgeresultater i andre mapper efter {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Indtast mere end to tegn for at søge i andre mapper",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"],
+ "You do not have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"],
+ "New" : "Nyt",
+ "New file/folder menu" : "Ny fil/mappe menu",
+ "Select file range" : "Vælg filområde",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} brugt",
+ "\"{name}\" is an invalid file name." : "'{name}' er et ugyldigt filnavn.",
+ "File name cannot be empty." : "Filnavnet kan ikke stå tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" er ikke tilladt i et filnavn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tilladt filtype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen af {owner} er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fyldt, filer kan ikke længere opdateres eller synkroniseres!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Din lagerplads er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Opbevaring af {owner} er næsten fuld ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er næsten fuld ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Eksternt lager \"{mountPoint}\" er næsten fyldt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Din lagerplads er næsten fuld ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Linket er kopieret (dette link kan kun anvendes af brugere med adgang til denne fil/mappe)",
+ "Path" : "Sti",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Favored" : "Foretrukken",
+ "Favor" : "Foretræk",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopier direkte link (virker kun for brugere der har adgang til denne fil/mappe)",
+ "Upload file" : "Upload fil",
+ "Not favored" : "Ikke foretrukket",
+ "An error occurred while trying to update the tags" : "Der opstod en fejl under forsøg på at opdatere mærkerne",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-handling blev udført korrekt",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-handling mislykkedes",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" fejlede på nogle elementer",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\"-handling blev udført korrekt",
+ "Submitting fields…" : "Sender felter...",
+ "Filter filenames…" : "Filtrer filnavne...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL kopieret til udklipsholder",
+ "Enable the grid view" : "Aktiver gittervisning",
+ "Enable folder tree" : "Aktiver mappetræ",
+ "Copy to clipboard" : "Kopier til udklipsholder",
+ "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
+ "Deletion cancelled" : "Sletning annulleret",
+ "Move cancelled" : "Flytning annulleret",
+ "Cancelled move or copy of \"{filename}\"." : "Annullerede flytning eller kopiering af \"{filename}\".",
+ "Cancelled move or copy operation" : "Flytning eller kopiering er annulleret",
+ "Open details" : "Mere information",
+ "Photos and images" : "Fotos og billeder",
+ "New folder creation cancelled" : "Oprettelse af ny mappe annulleret",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mapper","1 fil og {folderCount} mapper"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil og 1 mapper","{fileCount} filer og 1 mapper"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer og {folderCount} mapper",
+ "All folders" : "Alle mapper",
+ "Personal Files" : "Personlige filer",
"Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekst file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Opbevaringspladsen tilhørende {owner} er fyldt op - filer kan ikke længere opdateres eller synkroniseres!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fuldt, filer kan ikke længere opdateres eller synkroniseres!",
- "Your storage is full, files can not be updated or synced anymore!" : "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!",
- "_matches '{filter}'_::_match '{filter}'_" : ["match '{filter}'","match '{filter}'"]
+ "New text file.txt" : "Ny tekstfil.txt",
+ "Filter file names …" : "Filtrer filnavne ...",
+ "Prevent warning dialogs from open or reenable them." : "Forhindr advarselsdialoger i at åbner, eller genaktiver dem.",
+ "Show a warning dialog when changing a file extension." : "Vis en advarselsdialog når en filendelse ændres.",
+ "Speed up your Files experience with these quick shortcuts." : "Øg hastigheden for din filoplevelse med disse hurtig-genveje.",
+ "Open the actions menu for a file" : "Åben handlingsmenuen for en fil",
+ "Rename a file" : "Omdøb en fil",
+ "Delete a file" : "Slet en fil",
+ "Favorite or remove a file from favorites" : "Favoriser fil eller fjern favorisering af filer",
+ "Manage tags for a file" : "Styr tags for en fil",
+ "Deselect all files" : "Fravælg eller filer",
+ "Select or deselect a file" : "Vælg eller fravælg en fil",
+ "Select a range of files" : "Vælg et område af filer",
+ "Navigate to the parent folder" : "Naviger til den overordnede mappe",
+ "Navigate to the file above" : "Naviger til filen ovenover",
+ "Navigate to the file below" : "Naviger til filen nedenunder",
+ "Navigate to the file on the left (in grid mode)" : "Naviger til filen til venstre (i gittertilstand)",
+ "Navigate to the file on the right (in grid mode)" : "Naviger til filen til højre (i gittertilstand)",
+ "Toggle the grid view" : "Skift gittervisningen",
+ "Open the sidebar for a file" : "Åben sidebjælken for en fil"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index f6c86bdb887..eb731f27a99 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
- "Storage invalid" : "Lagerplads er ugyldig",
- "Unknown error" : "Ukendt fejl",
- "File could not be found" : "Filen kunne ikke findes",
- "Move or copy" : "Flyt eller kopier",
- "Download" : "Hent",
- "Delete" : "Slet",
- "Home" : "Hjem",
- "Close" : "Luk",
- "Favorites" : "Foretrukne",
- "Could not create folder \"{dir}\"" : "Kunne ikke oprette mappen \"{dir}\"",
- "This will stop your current uploads." : "Dette vil stoppe din nuværende uploads.",
- "Upload cancelled." : "Upload afbrudt.",
- "Processing files …" : "Behandler filer...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage",
- "Target folder \"{dir}\" does not exist any more" : "Destinationsmappen \"{dir}\" findes ikke længere",
- "Not enough free space" : "Ikke nok fri plads",
- "An unknown error has occurred" : "En ukendt fejl er opstået",
- "Uploading …" : "Uploader ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Upload af dette er ikke supporteret",
- "Target folder does not exist any more" : "Destinationsmappen findes ikke længere",
- "Operation is blocked by access control" : "Operationen blev blokeret af adgangskontrollen",
- "Error when assembling chunks, status code {status}" : "Fejl ved montering af klumper, statuskode {status}",
- "Actions" : "Handlinger",
- "Rename" : "Omdøb",
- "Copy" : "Kopier",
- "Choose target folder" : "Vælg destinationsmappe",
- "Open" : "Åbn",
- "Delete file" : "Slet fil",
- "Delete folder" : "Slet mappe",
- "Disconnect storage" : "Frakobl lager",
- "Leave this share" : "Forlad dette delte drev",
- "Could not load info for file \"{file}\"" : "Kunne ikke indlæse information for filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Please select tag(s) to add to the selection" : "Vælg venligst tag(s) for at tilføje til udvalget",
- "Apply tag(s) to selection" : "Anvend tag(s) på markeringen",
- "Select" : "Vælg",
- "Pending" : "Afventer",
- "Unable to determine date" : "Kan ikke fastslå datoen",
- "This operation is forbidden" : "Denne operation er forbudt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
- "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn",
- "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
- "copy" : "kopiér",
- "Could not copy \"{file}\", target exists" : "Kunne ikke kopiere \"{file}\" - der findes allerede en fil med dette navn",
- "Could not copy \"{file}\"" : "Kunne ikke kopiere \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopirede {origin} ind i {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "kopierede {origin} og {nbfiles} andre filer ind i {destination}",
- "{newName} already exists" : "{newName} eksistere allerede",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kunne ikke omdøbe \"{fileName}\", den findes ikke længere",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{targetName}\" bruges allerede i mappen \"{dir}\". Vælg et andet navn.",
- "Could not rename \"{fileName}\"" : "Kunne ikke omdøbe \"{fileName}\"",
- "Could not create file \"{file}\"" : "Kunne ikke oprette filen \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Kunne ikke oprette filen \"{file}\", da den allerede findes",
- "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke oprette mappen \"{dir}\", da den allerede findes",
- "Could not fetch file details \"{file}\"" : "Kunne ikke hente filoplysningerne \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søgeresultater i andre mapper efter {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Indtast mere end to tegn for at søge i andre mapper",
- "Name" : "Navn",
- "Size" : "Størrelse",
- "Modified" : "Ændret",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"],
- "You don’t have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her",
- "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"],
- "New" : "Ny",
- "Select file range" : "Vælg filområde",
- "{used} of {quota} used" : "{used} af {quota} brugt",
- "{used} used" : "{used} brugt",
- "\"{name}\" is an invalid file name." : "'{name}' er et ugyldigt filnavn.",
- "File name cannot be empty." : "Filnavnet kan ikke stå tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" er ikke tilladt i et filnavn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tilladt filtype",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen af {owner} er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fyldt, filer kan ikke længere opdateres eller synkroniseres!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Din lagerplads er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Opbevaring af {owner} er næsten fuld ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er næsten fuld ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Eksternt lager \"{mountPoint}\" er næsten fyldt ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Din lagerplads er næsten fuld ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
- "View in folder" : "Vis i mappe",
- "Copied!" : "Kopieret",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopier direkte link (virker kun for brugere der har adgang til denne fil/mappe)",
- "Path" : "Sti",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Gjort til foretrukken",
- "Favorite" : "Foretrukken",
- "You can only favorite a single file or folder at a time" : "Du kan kun favorisere en enkelt fil eller mappe ad gangen",
- "New folder" : "Ny mappe",
- "Upload file" : "Upload fil",
- "Recent" : "Seneste",
- "Not favorited" : "Ingen foretrukne",
- "Remove from favorites" : "Fjern fra favoritter",
- "Add to favorites" : "Tilføj til favoritter",
- "An error occurred while trying to update the tags" : "Der opstod en fejl under forsøg på at opdatere mærkerne",
"Added to favorites" : "Tilføjet til favoritter",
"Removed from favorites" : "Fjernet fra favoritter",
"You added {file} to your favorites" : "Du har tilføjet {file} til dine favoritter",
"You removed {file} from your favorites" : "Du har fjernet {file} fra dine favoritter",
+ "Favorites" : "Foretrukne",
"File changes" : "Fil ændringer",
"Created by {user}" : "Oprettet af {user}",
"Changed by {user}" : "Ændret af {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Gendannet af {user}",
"Renamed by {user}" : "Omdøbt af {user}",
"Moved by {user}" : "Flyttet af {user}",
- "\"remote user\"" : "\"ekstern bruger\"",
+ "\"remote account\"" : "\"fjernkonto\"",
"You created {file}" : "Du har oprettet {file}",
"You created an encrypted file in {file}" : "Du har oprettet en krypteret fil i {file}",
"{user} created {file}" : "{user} oprettede {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Du flyttede {oldfile} til {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttede {oldfile} til {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil er blevet tilføjet eller fjernet fra dine <strong>favoritter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe er blevet <strong>ændret</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favoritfil eller -mappe er blevet <strong>ændret</strong>",
- "All files" : "Alle filer",
- "Unlimited" : "Ubegrænset",
- "Upload (max. %s)" : "Upload (max. %s)",
+ "Failed to authorize" : "Kunne ikke godkende",
+ "Invalid folder path" : "Ugyldig mappesti",
+ "Folder not found" : "Mappe ikke fundet",
+ "The file cannot be found" : "Filen kan ikke findes",
+ "The destination path does not exist: %1$s" : "Destinationsstien eksisterer ikke: %1$s",
+ "You do not have permission to create a file at the specified location" : "Du har ikke tilladelse til at oprette en fil på den angivne placering",
+ "The file could not be converted." : "Filen kunne ikke konverteres.",
+ "Could not get relative path to converted file" : "Kunne ikke hente relativ sti til konverteret fil",
+ "Favorite files" : "Favoriser filer",
+ "No favorites" : "Ingen foretrukne",
+ "More favorites" : "Flere favoritter",
"Accept" : "Accepter",
"Reject" : "Afvis",
"Incoming ownership transfer from {user}" : "Indgående ejerskabsoverførsel fra {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vil du acceptere {path}?\n\nBemærk: Overførselsprocessen efter accept kan tage op til 1 time.",
+ "Ownership transfer denied" : "Ejerskabsoverdragelse mislykkedes",
+ "Your ownership transfer of {path} was denied by {user}." : "Dit ejerskaboverdragelse af {path} blev afvist af {user}.",
"Ownership transfer failed" : "Overførsel af ejerskab mislykkedes",
"Your ownership transfer of {path} to {user} failed." : "Din ejerskabsoverførsel af {path} til {user} mislykkedes.",
"The ownership transfer of {path} from {user} failed." : "Ejerskabsoverførslen af {path} fra {user} mislykkedes.",
@@ -157,62 +65,391 @@
"Your ownership transfer of {path} to {user} has completed." : "Din ejerskabsoverførsel af {path} til {user} er fuldført.",
"The ownership transfer of {path} from {user} has completed." : "Ejerskabsoverførslen af {path} fra {user} er fuldført.",
"in %s" : "i %s",
+ "Transferred from %1$s on %2$s" : "Overført fra %1$s den %2$s",
+ "Files compatibility" : "Filkompatibilitet",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillad at begrænse filnavne for at sikre at filer kan synkroniseres med alle klienter. Som standard er alle filnavne der er gyldige på POSIX (fx Linux eller macOS) tilladte.",
+ "Enforce Windows compatibility" : "Styrk Windows kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dette vil blokere filnavne der ikke er gyldige på Windows systemer, såsom brug af reserverede navne eller specielle karakterer. Men dette vil ikke styrke kompatibiliteten af versalfølsomhed.",
"File Management" : "Filhåndtering",
- "Transfer ownership of a file or folder" : "Overfør ejerskab af en fil eller mappe",
- "Choose file or folder to transfer" : "Vælg fil eller mappe til overførsel",
- "Change" : "Ændr",
- "New owner" : "Ny ejer",
- "Search users" : "Søg efter brugere",
+ "Home" : "Hjem",
+ "Target folder does not exist any more" : "Destinationsmappen findes ikke længere",
+ "Reload current directory" : "Genindlæs den aktuelle mappe",
+ "Go to the \"{dir}\" directory" : "Gå til mappen \"{dir}\"",
+ "Current directory path" : "Nuværende mappesti",
+ "Your have used your space quota and cannot upload files anymore" : "Du har brugt din pladskvote og kan ikke længere uploade filer",
+ "You do not have permission to upload or create files here." : "Du har ikke rettigheder til at uploade eller oprette filer her.",
+ "Drag and drop files here to upload" : "Træk filer hertil for at uploade",
+ "Favorite" : "Foretrukken",
+ "Back" : "Tilbage",
+ "Toggle selection for file \"{displayName}\"" : "Skift markering for fil \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Skift markering for mappe \"{displayName}\"",
+ "File is loading" : "Filen indlæses",
+ "Folder is loading" : "Mappen indlæses",
+ "Filename" : "Filnavn",
+ "Folder name" : "Mappenavn",
+ "This node is unavailable" : "Denne node er ikke tilgængelig ",
+ "Another entry with the same name already exists." : "En anden indførsel med det samme navn eksisterer allerede.",
+ "Invalid filename." : "Ugyldigt filnavn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Omdøbte \"{oldName}\" til \"{newName}\"",
+ "Rename file" : "Omdøb fil",
+ "Folder" : "Mappe",
+ "Pending" : "Afventer",
+ "Unknown date" : "Ukendt dato",
+ "Clear filter" : "Ryd filter",
+ "Modified" : "Ændret",
+ "Search everywhere" : "Søg overalt",
+ "Type" : "Type",
+ "Active filters" : "Aktive filtre",
+ "Remove filter" : "Fjern filter",
+ "Total rows summary" : "Samlet række antal",
+ "Toggle selection for all files and folders" : "Skift markering for alle filer og mapper",
+ "Name" : "Navn",
+ "Size" : "Størrelse",
+ "Actions" : "Handlinger",
+ "(selected)" : "(valgt)",
+ "List of files and folders." : "Liste med filer og mapper.",
+ "You have used your space quota and cannot upload files anymore." : "Du har opbrugt din plads kvote og kan ikke uploade flere filer.",
+ "Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper er sorterbare.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Hele listen er ikke hentet, af hensyn til størrelsen. Listen vil blive hentet løbende som du kører igennem listen.",
+ "File not found" : "Filen blev ikke fundet",
+ "{usedQuotaByte} used" : "{usedQuotaByte} brugt",
+ "{used} of {quota} used" : "{used} af {quota} brugt",
+ "{relative}% used" : "{relative}% brugt",
+ "Could not refresh storage stats" : "Kunne ikke opdatere lageroplysninger",
+ "Your storage is full, files can not be updated or synced anymore!" : "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!",
+ "Storage information" : "Lagringsinformation",
+ "Storage quota" : "Lagerkvote",
+ "New folder" : "Ny mappe",
+ "Create new folder" : "Opret ny mappe",
+ "This name is already in use." : "Dette navn er allerede i brug.",
+ "Create" : "Opret",
+ "Fill template fields" : "Udfyld skabelonfelter",
+ "Submitting fields …" : "Sender felter …",
+ "Submit" : "Tilføj",
"Choose a file or folder to transfer" : "Vælg en fil eller mappe til overførsel",
"Transfer" : "Overfør",
"Transfer {path} to {userid}" : "Overfør {path} til {userid}",
"Invalid path selected" : "Ugyldig filsti valgt",
+ "Unknown error" : "Ukendt fejl",
"Ownership transfer request sent" : "Anmodning om ejerskabsoverdragelse sendt",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer",
- "Tags" : "Mærker",
- "Unable to change the favourite state of the file" : "Kan ikke ændre favorittilstanden for filen",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan ikke overføre ejerskab af en fil eller mappe, du ikke ejer",
+ "Transfer ownership of a file or folder" : "Overfør ejerskab af en fil eller mappe",
+ "Choose file or folder to transfer" : "Vælg fil eller mappe til overførsel",
+ "Change" : "Ændr",
+ "New owner" : "Ny ejer",
+ "Keep {old}" : "Behold {old}",
+ "Keep without extension" : "Behold uden endelse",
+ "Use {new}" : "Anvend {new}",
+ "Remove extension" : "Fjern endelsen",
+ "Change file extension" : "Skift filendelsen",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ændring af filendelsen fra \"{old}\" til \"{new}\" kan gøre filen ulæsbar.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Fjernelse af filendelsen \"{old}\" kan gøre filen ulæsbar.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Tilføjelse af filendelsen \"{new}\" kan efterlade gøre ulæsbar.",
+ "Do not show this dialog again." : "Vis ikke denne dialog igen.",
+ "Select file or folder to link to" : "Vælg fil eller mappe at linke til",
+ "Choose {file}" : "Vælg {file}",
+ "Share" : "Del",
+ "Shared by link" : "Delt via link",
+ "Shared" : "Delt",
+ "Switch to list view" : "Skift til listevisning",
+ "Switch to grid view" : "Skift til gittervisning",
+ "The file could not be found" : "Filen kunne ikke findes",
+ "Upload was cancelled by user" : "Upload var annulleret af bruger",
+ "Not enough free space" : "Ikke nok fri plads",
+ "Operation is blocked by access control" : "Operationen blev blokeret af adgangskontrollen",
+ "Error during upload: {message}" : "Fejl under upload: {message}",
+ "Error during upload, status code {status}" : "Fejl under upload, statuskode {status}",
+ "Unknown error during upload" : "Ukendt fejl under upload",
+ "Loading current folder" : "Indlæser aktuelle mappe",
+ "Retry" : "Prøv igen",
+ "No files in here" : "Her er ingen filer",
+ "Upload some content or sync with your devices!" : "Upload indhold eller synkroniser med dine enheder!",
+ "Go back" : "Gå tilbage",
+ "Views" : "Visninger",
+ "Files settings" : "indstillinger for filer",
+ "Your files" : "Dine filer",
+ "Open in files" : "Åben i Filer",
+ "File cannot be accessed" : "Filen kan ikke tilgås",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen kunne ikke findes eller du har ikke tilladelser til at se den. Bed afsenderen om at dele den.",
+ "Clipboard is not available" : "Udklipsholderen er ikke tilgængelig",
+ "General" : "Generelt",
+ "All files" : "Alle filer",
+ "Personal files" : "Personlige filer",
+ "Sort favorites first" : "Vis favoritter først",
+ "Sort folders before files" : "Sorter mapper før filer",
+ "Appearance" : "Udseende",
+ "Show hidden files" : "Vis skjulte filer",
+ "Crop image previews" : "Beskær forhåndsvisninger af billeder",
+ "Additional settings" : "Yderligere indstillinger",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopier",
+ "Warnings" : "Advarsler",
+ "Keyboard shortcuts" : "Tastaturgenveje",
+ "Rename" : "Omdøb",
+ "Delete" : "Slet",
+ "Manage tags" : "Administrer tags",
+ "Selection" : "Valg",
+ "Select all files" : "Vælg alle filer",
+ "Deselect all" : "Fravælg alle",
+ "Navigation" : "Navigation",
+ "View" : "Vis",
+ "Toggle grid view" : "Vis som liste",
+ "Show those shortcuts" : "Vis disse genveje",
+ "You" : "Dig",
+ "Shared multiple times with different people" : "Delt flere gange med forskellige mennesker",
+ "Unable to change the favorite state of the file" : "Kan ikke ændre favoritstatus for filen",
"Error while loading the file data" : "Fejl under indlæsning af fildata",
+ "Owner" : "Ejer",
+ "Remove from favorites" : "Fjern fra favoritter",
+ "Add to favorites" : "Tilføj til favoritter",
+ "Tags" : "Tags",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kan ikke oprette ny fil fra skabelonen",
"Pick a template for {name}" : "Vælg en skabelon til {name}",
- "Cancel" : "annuller",
- "Create" : "Opret",
"Create a new file with the selected template" : "Opret en ny fil med den valgte skabelon",
"Creating file" : "Opretter fil",
- "Blank" : "Tom",
- "Unable to create new file from template" : "Kan ikke oprette ny fil fra skabelonen",
- "Set up templates folder" : "Opsæt skabelonmappen",
- "Templates" : "Skabeloner",
+ "Save as {displayName}" : "Gem som {displayName}",
+ "Save as …" : "Gem som ...",
+ "Converting files …" : "Konverterer filer ...",
+ "Failed to convert files: {message}" : "Kunne ikke konvertere filer: {message}",
+ "All files failed to be converted" : "Alle filer kunne ikke konverteres",
+ "One file could not be converted: {message}" : "En fil kunne ikke konverteres: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["En fil kunne ikke konverteres","%n filer kunne ikke konverteres"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["En fil konverteret","%n filer konverteret"],
+ "Files successfully converted" : "Filer konverteret",
+ "Failed to convert files" : "Kunne ikke konvertere filer",
+ "Converting file …" : "Konverterer fil ...",
+ "File successfully converted" : "Filen konverteret",
+ "Failed to convert file: {message}" : "Kunne ikke konvertere fil: {message}",
+ "Failed to convert file" : "Kunne ikke konvertere fil",
+ "Leave this share" : "Forlad dette delte drev",
+ "Leave these shares" : "Forlad disse delinger",
+ "Disconnect storage" : "Frakobl lager",
+ "Disconnect storages" : "Frakobl lagerne",
+ "Delete permanently" : "Slet permanent",
+ "Delete and unshare" : "Slet og fjern deling",
+ "Delete file" : "Slet fil",
+ "Delete files" : "Slet filer",
+ "Delete folder" : "Slet mappe",
+ "Delete folders" : "Slet mapper",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du er ved at slette {count} element permanent","Du er ved at slette {count} elementer permanent"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du er ved at slette {count} element","Du er ved at slette {count} elementer"],
+ "Confirm deletion" : "Bekræft sletning",
+ "Cancel" : "annuller",
+ "Download" : "Download",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierer \"{source}\" til \"{destination}\" …",
+ "Destination is not a folder" : "Destinationen er ikke en mappe",
+ "This file/folder is already in that directory" : "Filen/mappen er allerede i denne mappe",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe ind i sig selv, eller til en mappe inden i sig selv",
+ "(copy)" : "(kopier)",
+ "(copy %n)" : "(kopier %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mappe med det navn findes allerede i denne mappe",
+ "The files are locked" : "Filerne er låste",
+ "The file does not exist anymore" : "Filen findes ikke længere",
+ "Choose destination" : "Vælg destination",
+ "Copy to {target}" : "Kopier til {target}",
+ "Move to {target}" : "Flyt til {target}",
+ "Move" : "Flyt",
+ "Move or copy operation failed" : "Flytte- eller kopioperationen fejlede",
+ "Move or copy" : "Flyt eller kopier",
+ "Open folder {displayName}" : "Åben mappe {displayName}",
+ "Open in Files" : "Åben i Filer",
+ "Open locally" : "Åben lokalt",
+ "Failed to redirect to client" : "Kunne ikke omdirigere til klienten",
+ "Open file locally" : "Åben fil lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen bør nu åbne på dit apparat. Hvis den ikke gør det, så kontroller venligst at desktop app'en er installeret.",
+ "Retry and close" : "Forsøg igen og luk",
+ "Open online" : "Åben online",
+ "Details" : "Detaljer",
+ "View in folder" : "Vis i mappe",
+ "Today" : "I dag",
+ "Last 7 days" : "Sidste 7 dage",
+ "Last 30 days" : "Sidste 30 dage",
+ "This year ({year})" : "Dette år ({year})",
+ "Last year ({year})" : "Sidste år ({year})",
+ "Documents" : "Dokumenter",
+ "Spreadsheets" : "Regneark",
+ "Presentations" : "Præsentationer",
+ "PDFs" : "PDFer",
+ "Folders" : "Mapper",
+ "Audio" : "Lyd",
+ "Images" : "Billeder",
+ "Videos" : "Videoer",
+ "Created new folder \"{name}\"" : "Oprettede ny mappe \"{name}\"",
"Unable to initialize the templates directory" : "Kan ikke initialisere skabelonmappen",
- "%s used" : "%s brugt",
- "%s%% of %s used" : "%s%% af %s brugt",
- "%1$s of %2$s used" : "%1$s af %2$s brugt",
- "Settings" : "Indstillinger",
- "Show hidden files" : "Vis skjulte filer",
- "Crop image previews" : "Beskær forhåndsvisninger af billeder",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
- "Toggle %1$s sublist" : "Skift %1$s underliste",
- "Toggle grid view" : "Vis som gitter",
- "No files in here" : "Her er ingen filer",
- "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
+ "Create templates folder" : "Opret skabelonmappe",
+ "Templates" : "Skabeloner",
+ "New template folder" : "Ny skabelonmappe",
+ "In folder" : "I mappe",
+ "Search in folder: {folder}" : "Søg i mappe: {folder}",
+ "One of the dropped files could not be processed" : "En af de trukne filer kunne ikke behandles",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din browser understøtter ikke Filesystem-API'en. Mapper vil ikke bliver uploadet",
+ "No files to upload" : "Ingen filer til upload",
+ "Unable to create the directory {directory}" : "Kunne ikke oprette mappen {directory}",
+ "Some files could not be uploaded" : "Nogle filer kunne ikke uploades",
+ "Files uploaded successfully" : "Filer uploadet succesfuldt",
+ "No files to process" : "Ingen filer til at behandle",
+ "Some files could not be copied" : "Nogle filer kunne ikke blive kopieret",
+ "Some files could not be moved" : "Nogle filer kunne ikke flyttes",
+ "Files copied successfully" : "Filer kopieret succesfuldt",
+ "Files moved successfully" : "Filer flyttet succesfuldt",
+ "Conflicts resolution skipped" : "Konfliktløsning sprunget over",
+ "Upload cancelled" : "Upload annulleret",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunne ikke omdøbe \"{oldName}\", da den findes ikke længere",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{newName}\" bruges allerede i mappen \"{dir}\". Vælg et andet navn.",
+ "Could not rename \"{oldName}\"" : "Kunne ikke omdøbe \"{oldName}\"",
+ "This operation is forbidden" : "Denne operation er forbudt",
+ "Storage is temporarily not available" : "Lagerplads er midlertidigt ikke tilgængeligt",
+ "Unexpected error: {error}" : "Uventet fejl: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
+ "Filename must not be empty." : "Filnavnet må ikke være tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er ikke tilladt i et filnavn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er et reserveret navn og er ikke tilladt til filnavne.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ikke en tilladt filtype.",
+ "Filenames must not end with \"{extension}\"." : "Filnavne må ikke slutte med \"{extension}\".",
+ "List of favorite files and folders." : "Liste med favoritfiler og -mapper.",
+ "No favorites yet" : "Ingen foretrukne endnu",
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
+ "List of your files and folders." : "Liste med dine filer og mapper.",
+ "List of your files and folders that are not shared." : "Liste med dine filer og mapper, der ikke er delt.",
+ "No personal files found" : "Ingen personlige filer fundet",
+ "Files that are not shared will show up here." : "Filer der ikke er delt vil blive vist her.",
+ "Recent" : "Seneste",
+ "List of recently modified files and folders." : "Liste med nyligt ændrede filer og mapper.",
+ "No recently modified files" : "Ingen filer er ændret for nyligt",
+ "Files and folders you recently modified will show up here." : "Filer og mapper som du har ændret for nyligt, vil blive vist her.",
+ "Search" : "Søg",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
"Upload too large" : "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
- "No favorites yet" : "Ingen foretrukne endnu",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her",
- "Deleted files" : "Slettede filer",
- "Shares" : "Delinger",
- "Shared with others" : "Delt med andre",
- "Shared with you" : "Delt med dig",
- "Shared by link" : "Delt via link",
- "Deleted shares" : "Slettede delinger",
- "Pending shares" : "Afventende delinger",
+ "File could not be found" : "Filen kunne ikke findes",
+ "Show list view" : "Vis som liste",
+ "Show grid view" : "Vis som gitter",
+ "Close" : "Luk",
+ "Could not create folder \"{dir}\"" : "Kunne ikke oprette mappen \"{dir}\"",
+ "This will stop your current uploads." : "Dette vil stoppe din nuværende uploads.",
+ "Upload cancelled." : "Upload afbrudt.",
+ "Processing files …" : "Behandler filer...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke uploade {filename} da det er enten en mappe eller indeholder 0 bytes.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkelig fri plads. Du uplaoder {size1} men der er kun {size2} tilbage",
+ "Target folder \"{dir}\" does not exist any more" : "Destinationsmappen \"{dir}\" findes ikke længere",
+ "An unknown error has occurred" : "En ukendt fejl er opstået",
+ "File could not be uploaded" : "Filen kunne ikke uploades",
+ "Uploading …" : "Uploader ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploader … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upload af dette er ikke supporteret",
+ "Error when assembling chunks, status code {status}" : "Fejl ved montering af klumper, statuskode {status}",
+ "Choose target folder" : "Vælg destinationsmappe",
+ "Set reminder" : "Sæt påmindelse",
+ "Edit locally" : "Rediger lokalt",
+ "Open" : "Åbn",
+ "Could not load info for file \"{file}\"" : "Kunne ikke indlæse information for filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Vælg venligst tag(s) for at tilføje til markeringen",
+ "Apply tag(s) to selection" : "Anvend tag(s) på markeringen",
+ "Select directory \"{dirName}\"" : "Vælg mappe \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Vælg fil \"{fileName}\"",
+ "Unable to determine date" : "Kan ikke fastslå datoen",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren",
+ "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - filen findes allerede",
+ "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"",
+ "copy" : "kopier",
+ "Could not copy \"{file}\", target exists" : "Kunne ikke kopiere \"{file}\" - der findes allerede en fil med dette navn",
+ "Could not copy \"{file}\"" : "Kunne ikke kopiere \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopirede {origin} ind i {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "kopierede {origin} og {nbfiles} andre filer ind i {destination}",
+ "{newName} already exists" : "{newName} eksisterer allerede",
+ "Could not create file \"{file}\"" : "Kunne ikke oprette filen \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Kunne ikke oprette filen \"{file}\", da den allerede findes",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke oprette mappen \"{dir}\", da den allerede findes",
+ "Could not fetch file details \"{file}\"" : "Kunne ikke hente filoplysningerne \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søgeresultater i andre mapper efter {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Indtast mere end to tegn for at søge i andre mapper",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n skujlte inkluderet","%n skujlte inkluderet"],
+ "You do not have permission to upload or create files here" : "Du har ikke tilladelse til at uploade eller oprette filer her",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploader %n fil","Uploader %n filer"],
+ "New" : "Nyt",
+ "New file/folder menu" : "Ny fil/mappe menu",
+ "Select file range" : "Vælg filområde",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} brugt",
+ "\"{name}\" is an invalid file name." : "'{name}' er et ugyldigt filnavn.",
+ "File name cannot be empty." : "Filnavnet kan ikke stå tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" er ikke tilladt i et filnavn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tilladt filtype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen af {owner} er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fyldt, filer kan ikke længere opdateres eller synkroniseres!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Din lagerplads er fuld, filer kan ikke længere opdateres eller synkroniseres!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Opbevaring af {owner} er næsten fuld ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er næsten fuld ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Eksternt lager \"{mountPoint}\" er næsten fyldt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Din lagerplads er næsten fuld ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Linket er kopieret (dette link kan kun anvendes af brugere med adgang til denne fil/mappe)",
+ "Path" : "Sti",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Favored" : "Foretrukken",
+ "Favor" : "Foretræk",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopier direkte link (virker kun for brugere der har adgang til denne fil/mappe)",
+ "Upload file" : "Upload fil",
+ "Not favored" : "Ikke foretrukket",
+ "An error occurred while trying to update the tags" : "Der opstod en fejl under forsøg på at opdatere mærkerne",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-handling blev udført korrekt",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-handling mislykkedes",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" fejlede på nogle elementer",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\"-handling blev udført korrekt",
+ "Submitting fields…" : "Sender felter...",
+ "Filter filenames…" : "Filtrer filnavne...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL kopieret til udklipsholder",
+ "Enable the grid view" : "Aktiver gittervisning",
+ "Enable folder tree" : "Aktiver mappetræ",
+ "Copy to clipboard" : "Kopier til udklipsholder",
+ "Use this address to access your Files via WebDAV" : "Brug denne adresse til at få adgang til dine filer via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktiveret 2-faktor godkendelse, skal du oprette en app-token, ved at følge dette link.",
+ "Deletion cancelled" : "Sletning annulleret",
+ "Move cancelled" : "Flytning annulleret",
+ "Cancelled move or copy of \"{filename}\"." : "Annullerede flytning eller kopiering af \"{filename}\".",
+ "Cancelled move or copy operation" : "Flytning eller kopiering er annulleret",
+ "Open details" : "Mere information",
+ "Photos and images" : "Fotos og billeder",
+ "New folder creation cancelled" : "Oprettelse af ny mappe annulleret",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mapper","1 fil og {folderCount} mapper"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil og 1 mapper","{fileCount} filer og 1 mapper"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer og {folderCount} mapper",
+ "All folders" : "Alle mapper",
+ "Personal Files" : "Personlige filer",
"Text file" : "Tekstfil",
- "New text file.txt" : "Ny tekst file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Opbevaringspladsen tilhørende {owner} er fyldt op - filer kan ikke længere opdateres eller synkroniseres!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er fuld, filer kan ikke længere opdateres eller synkroniseres!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Eksternt lager \"{mountPoint}\" er fuldt, filer kan ikke længere opdateres eller synkroniseres!",
- "Your storage is full, files can not be updated or synced anymore!" : "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!",
- "_matches '{filter}'_::_match '{filter}'_" : ["match '{filter}'","match '{filter}'"]
+ "New text file.txt" : "Ny tekstfil.txt",
+ "Filter file names …" : "Filtrer filnavne ...",
+ "Prevent warning dialogs from open or reenable them." : "Forhindr advarselsdialoger i at åbner, eller genaktiver dem.",
+ "Show a warning dialog when changing a file extension." : "Vis en advarselsdialog når en filendelse ændres.",
+ "Speed up your Files experience with these quick shortcuts." : "Øg hastigheden for din filoplevelse med disse hurtig-genveje.",
+ "Open the actions menu for a file" : "Åben handlingsmenuen for en fil",
+ "Rename a file" : "Omdøb en fil",
+ "Delete a file" : "Slet en fil",
+ "Favorite or remove a file from favorites" : "Favoriser fil eller fjern favorisering af filer",
+ "Manage tags for a file" : "Styr tags for en fil",
+ "Deselect all files" : "Fravælg eller filer",
+ "Select or deselect a file" : "Vælg eller fravælg en fil",
+ "Select a range of files" : "Vælg et område af filer",
+ "Navigate to the parent folder" : "Naviger til den overordnede mappe",
+ "Navigate to the file above" : "Naviger til filen ovenover",
+ "Navigate to the file below" : "Naviger til filen nedenunder",
+ "Navigate to the file on the left (in grid mode)" : "Naviger til filen til venstre (i gittertilstand)",
+ "Navigate to the file on the right (in grid mode)" : "Naviger til filen til højre (i gittertilstand)",
+ "Toggle the grid view" : "Skift gittervisningen",
+ "Open the sidebar for a file" : "Åben sidebjælken for en fil"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 7a18a2f84a2..a8ddd02495c 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
- "Storage invalid" : "Speicher ungültig",
- "Unknown error" : "Unbekannter Fehler",
- "File could not be found" : "Datei konnte nicht gefunden werden",
- "Move or copy" : "Verschieben oder kopieren",
- "Download" : "Herunterladen",
- "Delete" : "Löschen",
- "Home" : "Home",
- "Close" : "Schließen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
- "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
- "Upload cancelled." : "Hochladen abgebrochen.",
- "Processing files …" : "Dateien werden verarbeitet…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
- "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
- "Not enough free space" : "Nicht genügend freier Speicherplatz",
- "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
- "Uploading …" : "Lade hoch…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
- "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
- "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
- "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
- "Actions" : "Aktionen",
- "Rename" : "Umbenennen",
- "Copy" : "Kopieren",
- "Choose target folder" : "Zielordner wählen",
- "Open" : "Öffnen",
- "Delete file" : "Datei löschen",
- "Delete folder" : "Ordner löschen",
- "Disconnect storage" : "Speicher trennen",
- "Leave this share" : "Diese Freigabe verlassen",
- "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
- "Files" : "Dateien",
- "Details" : "Details",
- "Please select tag(s) to add to the selection" : "Bitte wähle das/die Schlagwort(e) aus, das/die Du zur Auswahl hinzufügen möchtest",
- "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
- "Select" : "Auswählen",
- "Pending" : "Ausstehend",
- "Unable to determine date" : "Datum konnte nicht ermittelt werden",
- "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder den Administrator kontaktieren.",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
- "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
- "copy" : "Kopie",
- "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
- "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
- "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
- "{newName} already exists" : "{newName} existiert bereits",
- "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei \"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte einen anderen Namen verwenden.",
- "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
- "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert.",
- "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
- "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
- "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Gebe mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
- "Name" : "Name",
- "Size" : "Größe",
- "Modified" : "Geändert",
- "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "{dirs} and {files}" : "{dirs} und {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
- "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"],
- "New" : "Neu",
- "Select file range" : "Dateibereich auswählen",
- "{used} of {quota} used" : "{used} von {quota} verwendet",
- "{used} used" : "{used} verwendet",
- "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.",
- "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
- "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Dein Speicher ist beinahe voll ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
- "View in folder" : "In Ordner anzeigen",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Benutzer, die Zugriff auf diese(n) Datei/Ordner haben)",
- "Path" : "Pfad",
- "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
- "Favorited" : "Favorisiert",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Du kannst gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren",
- "New folder" : "Neuer Ordner",
- "Upload file" : "Datei hochladen",
- "Recent" : "Neueste",
- "Not favorited" : "Nicht favorisiert",
- "Remove from favorites" : "Von Favoriten entfernen",
- "Add to favorites" : "Zu den Favoriten hinzufügen",
- "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
- "You added {file} to your favorites" : "Du hast {file} zu Deinen Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Du hast {file} aus Deinen Favoriten entfernt",
+ "You added {file} to your favorites" : "Du hast {file} zu deinen Favoriten hinzugefügt",
+ "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten entfernt",
+ "Favorites" : "Favoriten",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Wiederhergestellt durch {user}",
"Renamed by {user}" : "Umbenannt durch {user}",
"Moved by {user}" : "Verschoben durch {user}",
- "\"remote user\"" : "„Externer Benutzer“",
+ "\"remote account\"" : "\"Entferntes Konto\"",
"You created {file}" : "Du hast {file} erstellt",
"You created an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} erstellt",
"{user} created {file}" : "{user} hat {file} erstellt",
@@ -142,16 +39,27 @@ OC.L10N.register(
"{user} renamed {oldfile} to {newfile}" : "{user} hat {oldfile} in {newfile} umbenannt",
"You moved {oldfile} to {newfile}" : "Du hast {oldfile} nach {newfile} verschoben",
"{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "Files" : "Dateien",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Eine favorisierte Datei oder ein Ordner wurde <strong>geändert</strong>",
- "All files" : "Alle Dateien",
- "Unlimited" : "Unbegrenzt",
- "Upload (max. %s)" : "Hochladen (max. %s)",
+ "Failed to authorize" : "Autorisierung fehlgeschlagen",
+ "Invalid folder path" : "Ungültiger Order-Pfad",
+ "Folder not found" : "Ordner nicht gefunden",
+ "The file cannot be found" : "Die Datei kann nicht gefunden werden",
+ "The destination path does not exist: %1$s" : "Der Zielpfad existiert nicht: %1$s",
+ "You do not have permission to create a file at the specified location" : "Keine Berechtigung, eine Datei am angegebenen Speicherort zu erstellen",
+ "The file could not be converted." : "Die Datei konnte nicht konvertiert werden.",
+ "Could not get relative path to converted file" : "Relativer Pfad zur konvertierten Datei konnte nicht ermittelt werden",
+ "Favorite files" : "Favorisierte Dateien",
+ "No favorites" : "Keine Favoriten",
+ "More favorites" : "Weitere Favoriten",
"Accept" : "Akzeptieren",
"Reject" : "Ablehnen",
"Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.",
+ "Ownership transfer denied" : "Besitzübertragung verweigert",
+ "Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Übertragen von %1$s auf %2$s",
+ "Files compatibility" : "Dateikompatibilität",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ermöglicht die Einschränkung von Dateinamen, um sicherzustellen, dass Dateien mit allen Clients synchronisiert werden können. Standardmäßig sind alle unter POSIX (z. B. Linux oder macOS) gültigen Dateinamen zulässig.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl „occ“.",
+ "Enforce Windows compatibility" : "Windows-Kompatibilität erzwingen",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dadurch werden Dateinamen blockiert, die auf Windows-Systemen unzulässig sind, z. B. reservierte Namen oder Sonderzeichen. Die Kompatibilität der Groß-/Kleinschreibung wird dadurch jedoch nicht erzwungen.",
"File Management" : "Dateiverwaltung",
- "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
- "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
- "Change" : "Ändern",
- "New owner" : "Neuer Besitzer",
- "Search users" : "Suche Benutzer",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
+ "Reload current directory" : "Aktuelles Verzeichnis neu laden",
+ "Go to the \"{dir}\" directory" : "In das Verzeichnis \"{dir}\" wechseln",
+ "Current directory path" : "Aktueller Verzeichnispfad",
+ "Your have used your space quota and cannot upload files anymore" : "Dein Speicherplatzkontigent ist aufgebraucht, du kannst keine weiteren Dateien hochladen.",
+ "You do not have permission to upload or create files here." : "Du hast nicht die Berechtigung, hier Dateien hochzuladen oder zu erstellen.",
+ "Drag and drop files here to upload" : "Dateien zum Hochladen hierher ziehen und ablegen",
+ "Favorite" : "Favorit",
+ "Back" : "Zurück",
+ "Toggle selection for file \"{displayName}\"" : "Auswahl für die Datei \"{displayName}\" umschalten",
+ "Toggle selection for folder \"{displayName}\"" : "Auswahl für den Ordner \"{displayName}\" umschalten",
+ "File is loading" : "Datei wird geladen",
+ "Folder is loading" : "Ordner wird geladen",
+ "Filename" : "Dateiname",
+ "Folder name" : "Ordnername",
+ "This node is unavailable" : "Dieser Knoten ist nicht verfügbar.",
+ "Another entry with the same name already exists." : "Ein anderer Eintrag mit diesem Namen existiert bereits.",
+ "Invalid filename." : "Ungültiger Dateiname.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt",
+ "Rename file" : "Datei umbenennen",
+ "Folder" : "Ordner",
+ "Unknown file type" : "Unbekannter Dateityp",
+ "{ext} image" : "{ext}-Bild",
+ "{ext} video" : "{ext}-Video",
+ "{ext} audio" : "{ext}-Audio",
+ "{ext} text" : "{ext}-Text",
+ "Pending" : "Ausstehend",
+ "Unknown date" : "Unbekanntes Datum",
+ "Clear filter" : "Filter zurücksetzen",
+ "Modified" : "Geändert",
+ "Search everywhere" : "Überall suchen",
+ "Type" : "Typ",
+ "Active filters" : "Aktive Filter",
+ "Remove filter" : "Filter entfernen",
+ "Total rows summary" : "Zusammenfassung aller Zeilen",
+ "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten",
+ "Name" : "Name",
+ "File type" : "Dateityp",
+ "Size" : "Größe",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: done" : "{displayName}: Abgeschlossen",
+ "{displayName}: failed" : "{displayName}: Fehlgeschlagen",
+ "Actions" : "Aktionen",
+ "(selected)" : "(ausgewählt)",
+ "List of files and folders." : "Liste der Dateien und Ordner",
+ "You have used your space quota and cannot upload files anymore." : "Dein Speicherplatzkontigent ist aufgebraucht, Du kannst keine weiteren Dateien hochladen.",
+ "Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden angezeigt, wenn du durch die Liste navigierst.",
+ "File not found" : "Datei nicht gefunden",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
+ "Search everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
+ "Search scope options" : "Suchbereichsoptionen",
+ "Search here" : "Hier suchen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
+ "{used} of {quota} used" : "{used} von {quota} verwendet",
+ "{relative}% used" : "{relative} % verwendet",
+ "Could not refresh storage stats" : "Die Speicherstatistik konnte nicht aktualisiert werden",
+ "Your storage is full, files can not be updated or synced anymore!" : "Der Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage information" : "Speicherinformation",
+ "Storage quota" : "Speicherkontingent",
+ "New folder" : "Neuer Ordner",
+ "Create new folder" : "Neuen Ordner erstellen",
+ "This name is already in use." : "Dieser Name wird bereits verwendet.",
+ "Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
+ "Fill template fields" : "Vorlagenfelder ausfüllen",
+ "Submitting fields …" : "Felder werden übermittelt …",
+ "Submit" : "Übermitteln",
"Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
"Transfer" : "Übertragen",
"Transfer {path} to {userid}" : "Übertrage {path} an {userid}",
"Invalid path selected" : "Ungültiger Dateipfad ausgewählt",
- "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes versandt",
- "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Du nicht besitzt, kann nicht übertragen werden",
- "Tags" : "Schlagworte",
- "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei konnte nicht geändert werden",
+ "Unknown error" : "Unbekannter Fehler",
+ "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes gesendet",
+ "Cannot transfer ownership of a file or folder you do not own" : "Der Besitz an einer Datei oder einem Ordner, der dir nicht gehört, kann nicht übertragen werden",
+ "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
+ "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
+ "Change" : "Ändern",
+ "New owner" : "Neuer Besitzer",
+ "Keep {old}" : "{old} behalten",
+ "Keep without extension" : "Ohne Erweiterung behalten",
+ "Use {new}" : "{new} verwenden",
+ "Remove extension" : "Dateierweiterung entfernen",
+ "Change file extension" : "Dateierweiterungen ändern",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ändern der Dateierweiterung von \"{old}\" zu \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Entfernen der Dateierweiterung \"{old}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Hinzufügen der Dateierweiterung \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Do not show this dialog again." : "Diesen Dialog nicht mehr anzeigen.",
+ "Select file or folder to link to" : "Datei oder Ordner zum Verknüpfen auswählen",
+ "Choose {file}" : "{file} auswählen",
+ "Share" : "Teilen",
+ "Shared by link" : "Über einen Link geteilt",
+ "Shared" : "Geteilt",
+ "Switch to list view" : "Zur Listenansicht wechseln",
+ "Switch to grid view" : "Zur Kachelansicht wechseln",
+ "The file could not be found" : "Die Datei konnte nicht gefunden werden",
+ "Upload was cancelled by user" : "Das Hochladen wurde vom Benutzer abgebrochen.",
+ "Not enough free space" : "Nicht genügend freier Speicherplatz",
+ "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
+ "Error during upload: {message}" : "Fehler beim Hochladen: {message}",
+ "Error during upload, status code {status}" : "Fehler beim Hochladen, Statuscode {status}",
+ "Unknown error during upload" : "unbekannte Fehler während des Hochladens",
+ "Loading current folder" : "Lade aktuellen Ordner",
+ "Retry" : "Wiederholen",
+ "No files in here" : "Keine Dateien vorhanden",
+ "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere sie mit deinen Geräten!",
+ "Go back" : "Zurückgehen",
+ "Views" : "Ansichten",
+ "Files settings" : "Dateien-Einstellungen",
+ "Your files" : "Deine Dateien",
+ "Open in files" : "In Dateien öffnen",
+ "File cannot be accessed" : "Auf die Datei kann nicht zugegriffen werden",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Die Datei konnte nicht gefunden werden oder Du hast keine Berechtigung, um sie anzuzeigen. Bitte den Absender, die Datei zu teilen.",
+ "No search results for “{query}”" : "Keine Suchergebnisse für \"{query}\"",
+ "Search for files" : "Nach Dateien suchen",
+ "Clipboard is not available" : "Zwischenablage ist nicht verfügbar",
+ "WebDAV URL copied" : "WebDAV-URL kopiert",
+ "General" : "Allgemein",
+ "Default view" : "Standardansicht",
+ "All files" : "Alle Dateien",
+ "Personal files" : "Persönliche Dateien",
+ "Sort favorites first" : "Favoriten zuerst sortieren",
+ "Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Folder tree" : "Ordnerbaum",
+ "Appearance" : "Aussehen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
+ "Show file type column" : "Dateityp-Spalte anzeigen",
+ "Show file extensions" : "Dateierweiterungen anzeigen",
+ "Crop image previews" : "Bildvorschauen zuschneiden",
+ "Additional settings" : "Zusätzliche Einstellungen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-URL",
+ "Copy" : "Kopieren",
+ "How to access files using WebDAV" : "So greifst du mit WebDAV auf Dateien zu",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für dein Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
+ "Warnings" : "Warnungen",
+ "Warn before changing a file extension" : "Vor der Änderung einer Dateierweiterung warnen",
+ "Warn before deleting files" : "Vor dem Löschen von Dateien warnen",
+ "Keyboard shortcuts" : "Tastaturkürzel",
+ "File actions" : "Dateiaktionen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Add or remove favorite" : "Favorit hinzufügen oder entfernen",
+ "Manage tags" : "Schlagworte verwalten",
+ "Selection" : "Auswahl",
+ "Select all files" : "Alle Dateien auswählen",
+ "Deselect all" : "Auswahl aufheben",
+ "Select or deselect" : "Aus- oder Abwählen",
+ "Select a range" : "Einen Bereich auswählen",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Zum übergeordneten Ordner wechseln",
+ "Go to file above" : "Zur Datei darüber wechseln",
+ "Go to file below" : "Zur Datei darunter wechseln",
+ "Go left in grid" : "Im Raster nach links gehen",
+ "Go right in grid" : "Im Raster nach rechts gehen",
+ "View" : "Ansehen",
+ "Toggle grid view" : "Rasteransicht umschalten",
+ "Open file sidebar" : "Datei-Seitenleiste öffnen",
+ "Show those shortcuts" : "Diese Tastaturkürzel anzeigen",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Mehrmals mit verschiedenen Personen geteilt",
+ "Unable to change the favorite state of the file" : "Der Favoriten-Status der Datei kann nicht geändert werden",
"Error while loading the file data" : "Fehler beim Laden der Datei-Daten",
+ "Owner" : "Besitzer",
+ "Remove from favorites" : "Aus Favoriten entfernen",
+ "Add to favorites" : "Zu den Favoriten hinzufügen",
+ "Tags" : "Schlagworte",
+ "Blank" : "Leer",
+ "Unable to create new file from template" : "Neue Datei konnte nicht aus Vorlage erstellt werden",
"Pick a template for {name}" : "Eine Vorlage für {name} wählen",
- "Cancel" : "Abbrechen",
- "Create" : "Erstellen",
"Create a new file with the selected template" : "Eine neue Datei anhand der ausgewählten Vorlage erstellen",
"Creating file" : "Datei erstellen",
- "Blank" : "Leer",
- "Unable to create new file from template" : "Neue Datei konnte nicht aus Vorlage erstellt werden",
- "Set up templates folder" : "Vorlagenordner einrichten",
- "Templates" : "Vorlagen",
+ "Save as {displayName}" : "Speichern als {displayName}",
+ "Save as …" : "Speichern als …",
+ "Converting files …" : "Dateien werden konvertiert …",
+ "Failed to convert files: {message}" : "Fehler beim Konvertieren der Dateien: {message}",
+ "All files failed to be converted" : "Alle Dateien konnten nicht konvertiert werden",
+ "One file could not be converted: {message}" : "Eine Datei konnte nicht konvertiert werden: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Eine Datei konnte nicht konvertiert werden","%n Dateien konnten nicht konvertiert werden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Eine Datei konvertiert","%n Dateien konvertiert"],
+ "Files successfully converted" : "Dateien konvertiert",
+ "Failed to convert files" : "Dateien konnten nicht konvertiert werden",
+ "Converting file …" : "Datei wird konvertiert …",
+ "File successfully converted" : "Datei konvertiert",
+ "Failed to convert file: {message}" : "Fehler beim Konvertieren der Datei: {message}",
+ "Failed to convert file" : "Datei konnte nicht konvertiert werden",
+ "Leave this share" : "Diese Freigabe verlassen",
+ "Leave these shares" : "Diese Freigaben verlassen",
+ "Disconnect storage" : "Speicher trennen",
+ "Disconnect storages" : "Speicher trennen",
+ "Delete permanently" : "Endgültig löschen",
+ "Delete and unshare" : "Löschen und nicht mehr teilen",
+ "Delete file" : "Datei löschen",
+ "Delete files" : "Dateien löschen",
+ "Delete folder" : "Ordner löschen",
+ "Delete folders" : "Ordner löschen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sie sind dabei, {count} Element endgültig zu löschen","Du bist dabei, {count} Elemente endgültig zu löschen."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sie sind dabei, {count} Element zu löschen","Du bist dabei, {count} Elemente zu löschen."],
+ "Confirm deletion" : "Löschen bestätigen",
+ "Cancel" : "Abbrechen",
+ "Download" : "Herunterladen",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
+ "Destination is not a folder" : "Ziel ist kein Ordner",
+ "This file/folder is already in that directory" : "Diese Datei oder Ordner ist bereits in diesem Verzeichnis vorhanden",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden.",
+ "(copy)" : "(Kopie)",
+ "(copy %n)" : "(Kopie %n)",
+ "A file or folder with that name already exists in this folder" : "In diesem Ordner ist bereits eine Datei oder ein Ordner mit diesem Namen vorhanden",
+ "The files are locked" : "Die Dateien sind gesperrt",
+ "The file does not exist anymore" : "Die Datei existiert nicht mehr",
+ "Choose destination" : "Ziel wählen",
+ "Copy to {target}" : "Nach {target} kopieren",
+ "Move to {target}" : "Nach {target} verschieben",
+ "Move" : "Verschieben",
+ "Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
+ "Move or copy" : "Verschieben oder kopieren",
+ "Open folder {displayName}" : "Ordner {displayName} öffnen",
+ "Open in Files" : "In \"Dateien\" öffnen",
+ "Open locally" : "Lokal öffnen",
+ "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
+ "Open file locally" : "Datei lokal öffnen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Die Datei sollte sich jetzt auf deinem Gerät öffnen. Wenn dies nicht der Fall ist, überprüfe, ob du die Desktop-App installiert hast.",
+ "Retry and close" : "Erneut versuchen und schließen",
+ "Open online" : "Online öffnen",
+ "Details" : "Details",
+ "View in folder" : "In Ordner anzeigen",
+ "Today" : "Heute",
+ "Last 7 days" : "Die letzten 7 Tage",
+ "Last 30 days" : "Die letzten 30 Tage",
+ "This year ({year})" : "Dieses Jahr ({year})",
+ "Last year ({year})" : "Letztes Jahr ({year})",
+ "Documents" : "Dokumente",
+ "Spreadsheets" : "Tabellenkalkulationen",
+ "Presentations" : "Präsentationen",
+ "PDFs" : "PDFs",
+ "Folders" : "Ordner",
+ "Audio" : "Audio",
+ "Images" : "Bilder",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Neuer Ordner \"{name}\" wurde erstellt",
"Unable to initialize the templates directory" : "Der Vorlagenordner konnte nicht initialisiert werden",
- "%s used" : "%s verwendet",
- "%s%% of %s used" : "%s%% von %s verwendet",
- "%1$s of %2$s used" : "%1$s von %2$s verwendet",
- "Settings" : "Einstellungen",
- "Show hidden files" : "Versteckte Dateien anzeigen",
- "Crop image previews" : "Bildvorschauen zuschneiden",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf Deine Dateien zuzugreifen",
- "Toggle %1$s sublist" : "Unterliste %1$s umschalten",
- "Toggle grid view" : "Rasteransicht umschalten",
- "No files in here" : "Keine Dateien vorhanden",
- "Upload some content or sync with your devices!" : "Inhalte hochladen oder mit Deinen Geräten synchronisieren!",
+ "Create templates folder" : "Vorlagenordner erstellen",
+ "Templates" : "Vorlagen",
+ "New template folder" : "Neuer Vorlagenordner",
+ "In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
+ "Search in folder: {folder}" : "Im Ordner suchen: {folder}",
+ "One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Dein Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen.",
+ "No files to upload" : "Keine Dateien zum Hochladen",
+ "Unable to create the directory {directory}" : "Der Ordner {directory} konnte nicht erstellt werden",
+ "Some files could not be uploaded" : "Einige Dateien konnten nicht hochgeladen werden",
+ "Files uploaded successfully" : "Dateien hochgeladen",
+ "No files to process" : "Keine Dateien zum Verarbeiten",
+ "Some files could not be copied" : "Einige Dateien konnten nicht kopiert werden",
+ "Some files could not be moved" : "Einige Dateien konnten nicht verschoben werden.",
+ "Files copied successfully" : "Dateien kopiert",
+ "Files moved successfully" : "Dateien verschoben",
+ "Conflicts resolution skipped" : "Konfliktlösung übersprungen",
+ "Upload cancelled" : "Hochladen abgebrochen",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" konnte nicht umbenannt werden, da es nicht mehr existiert.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{newName}“ wird bereits im Ordner \"{dir}“ verwendet. Bitte wähle einen anderen Namen.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" konnte nicht umbenannt werden.",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This folder is unavailable, please try again later or contact the administration" : "Dieser Ordner ist nicht verfügbar. Bitte später erneut versuchen oder an die Administration wenden",
+ "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
+ "Unexpected error: {error}" : "Unerwarteter Fehler: {error}",
+ "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
+ "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
+ "_%n hidden_::_%n hidden_" : ["%n versteckt","%n versteckt"],
+ "Filename must not be empty." : "Dateiname darf nicht leer sein.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ist innerhalb eines Dateinamens nicht zulässig.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ist ein reservierter Name und für Dateinamen nicht zulässig.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ist kein zulässiger Dateityp.",
+ "Filenames must not end with \"{extension}\"." : "Dateinamen dürfen nicht mit \"{extension}\" enden.",
+ "List of favorite files and folders." : "Liste der favorisierten Ordner und Dateien.",
+ "No favorites yet" : "Noch keine Favoriten vorhanden",
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier",
+ "List of your files and folders." : "Liste deiner Dateien und Ordner",
+ "List of your files and folders that are not shared." : "Liste deiner Dateien und Ordner, die nicht geteilt wurden.",
+ "No personal files found" : "Keine persönlichen Dateien gefunden",
+ "Files that are not shared will show up here." : "Dateien, die nicht geteilt wurden, werden hier angezeigt.",
+ "Recent" : "Neueste",
+ "List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner",
+ "No recently modified files" : "Keine kürzlich geänderten Dateien",
+ "Files and folders you recently modified will show up here." : "Die von dir kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
+ "Search" : "Suche",
+ "Search results within your files." : "Suchergebnisse innerhalb deiner Dateien.",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
- "No favorites yet" : "Noch keine Favoriten vorhanden",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier",
- "Deleted files" : "Gelöschte Dateien",
- "Shares" : "Freigaben",
- "Shared with others" : "Mit anderen geteilt",
- "Shared with you" : "Mit Dir geteilt",
- "Shared by link" : "Über einen Link geteilt",
- "Deleted shares" : "Gelöschte Freigaben",
- "Pending shares" : "Ausstehende Freigaben",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
+ "Show list view" : "Listenansicht anzeigen",
+ "Show grid view" : "Kachelansicht anzeigen",
+ "Close" : "Schließen",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
+ "Upload cancelled." : "Hochladen abgebrochen.",
+ "Processing files …" : "Dateien werden verarbeitet …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
+ "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
+ "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
+ "File could not be uploaded" : "Datei konnte nicht hochgeladen werden.",
+ "Uploading …" : "Lade hoch …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lade hoch … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
+ "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
+ "Choose target folder" : "Zielordner wählen",
+ "Set reminder" : "Erinnerung erstellen",
+ "Edit locally" : "Lokal bearbeiten",
+ "Open" : "Öffnen",
+ "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
+ "Please select tag(s) to add to the selection" : "Bitte das/die Schlagwort(e) auswählen, das/die zur Auswahl hinzugefügt werden soll(en)",
+ "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
+ "Select directory \"{dirName}\"" : "Verzeichnis \"{dirName}\" auswählen",
+ "Select file \"{fileName}\"" : "Datei \"{fileName}\" auswählen",
+ "Unable to determine date" : "Datum konnte nicht ermittelt werden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder die Administration kontaktieren.",
+ "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
+ "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
+ "copy" : "Kopie",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
+ "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
+ "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert.",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
+ "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
+ "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Gib mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen.",
+ "{dirs} and {files}" : "{dirs} und {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
+ "You do not have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"],
+ "New" : "Neu",
+ "New file/folder menu" : "Menü für neue Datei/Ordner",
+ "Select file range" : "Dateibereich auswählen",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used} verwendet",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ist kein gültiger Dateiname.",
+ "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" ist kein erlaubter Dateityp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Dein Speicher ist beinahe voll ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlink wurde kopiert (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Favored" : "Favorisiert",
+ "Favor" : "Favorisieren",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Direktlink kopieren (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Upload file" : "Datei hochladen",
+ "Not favored" : "Nicht favorisiert",
+ "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
+ "Upload (max. %s)" : "Hochladen (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Aktion \"{displayName}\" ausgeführt",
+ "\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
+ "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
+ "Submitting fields…" : "Felder werden übermittelt…",
+ "Filter filenames…" : "Dateinamen filtern…",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL in die Zwischenablage kopiert",
+ "Enable the grid view" : "Kachelansicht aktivieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Copy to clipboard" : "In die Zwischenablage kopieren",
+ "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
+ "Deletion cancelled" : "Löschen abgebrochen",
+ "Move cancelled" : "Verschieben abgebrochen",
+ "Cancelled move or copy of \"{filename}\"." : "Verschieben oder Kopieren von \"{filename}\" abgebrochen.",
+ "Cancelled move or copy operation" : "Verschieben oder Kopieren abgebrochen",
+ "Open details" : "Details öffnen",
+ "Photos and images" : "Fotos und Bilder",
+ "New folder creation cancelled" : "Erstellung des neuen Ordners abgebrochen",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} Datei und 1 Ordner","{fileCount} Dateien und 1 Ordner"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} Dateien und {folderCount} Ordner",
+ "All folders" : "Alle Ordner",
+ "Personal Files" : "Persönliche Dateien",
"Text file" : "Textdatei",
"New text file.txt" : "Neue Textdatei file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"]
+ "%1$s (renamed)" : "%1$s (umbenannt)",
+ "renamed file" : "Umbenannte Datei",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "Filter file names …" : "Dateinamen filtern …",
+ "Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
+ "Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
+ "Speed up your Files experience with these quick shortcuts." : "Mit diesen Schnellzugriffen schneller mit Dateien arbeiten.",
+ "Open the actions menu for a file" : "Aktionsmenü für eine Datei öffnen",
+ "Rename a file" : "Eine Datei umbenennen",
+ "Delete a file" : "Eine Datei löschen",
+ "Favorite or remove a file from favorites" : "Datei favorisieren oder aus den Favoriten entfernen",
+ "Manage tags for a file" : "Schlagworte für eine Datei verwalten",
+ "Deselect all files" : "Auswahl aller Dateien aufheben",
+ "Select or deselect a file" : "Auswählen oder Auswahl einer Datei aufheben",
+ "Select a range of files" : "Einen Bereich von Dateien auswählen",
+ "Navigate to the parent folder" : "Zum übergeordneten Ordner navigieren",
+ "Navigate to the file above" : "Zur obigen Datei navigieren",
+ "Navigate to the file below" : "Zur unteren Datei navigieren",
+ "Navigate to the file on the left (in grid mode)" : "Zur Datei links navigieren (in der Kachelansicht)",
+ "Navigate to the file on the right (in grid mode)" : "Zur Datei rechts navigieren (in der Kachelansicht)",
+ "Toggle the grid view" : "Kachelansicht umschalten",
+ "Open the sidebar for a file" : "Seitenleiste für eine Datei öffnen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 4c46221d76d..254f405cd12 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
- "Storage invalid" : "Speicher ungültig",
- "Unknown error" : "Unbekannter Fehler",
- "File could not be found" : "Datei konnte nicht gefunden werden",
- "Move or copy" : "Verschieben oder kopieren",
- "Download" : "Herunterladen",
- "Delete" : "Löschen",
- "Home" : "Home",
- "Close" : "Schließen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
- "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
- "Upload cancelled." : "Hochladen abgebrochen.",
- "Processing files …" : "Dateien werden verarbeitet…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
- "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
- "Not enough free space" : "Nicht genügend freier Speicherplatz",
- "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
- "Uploading …" : "Lade hoch…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
- "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
- "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
- "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
- "Actions" : "Aktionen",
- "Rename" : "Umbenennen",
- "Copy" : "Kopieren",
- "Choose target folder" : "Zielordner wählen",
- "Open" : "Öffnen",
- "Delete file" : "Datei löschen",
- "Delete folder" : "Ordner löschen",
- "Disconnect storage" : "Speicher trennen",
- "Leave this share" : "Diese Freigabe verlassen",
- "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
- "Files" : "Dateien",
- "Details" : "Details",
- "Please select tag(s) to add to the selection" : "Bitte wähle das/die Schlagwort(e) aus, das/die Du zur Auswahl hinzufügen möchtest",
- "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
- "Select" : "Auswählen",
- "Pending" : "Ausstehend",
- "Unable to determine date" : "Datum konnte nicht ermittelt werden",
- "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder den Administrator kontaktieren.",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
- "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
- "copy" : "Kopie",
- "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
- "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
- "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
- "{newName} already exists" : "{newName} existiert bereits",
- "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei \"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte einen anderen Namen verwenden.",
- "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
- "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert.",
- "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
- "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
- "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Gebe mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
- "Name" : "Name",
- "Size" : "Größe",
- "Modified" : "Geändert",
- "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "{dirs} and {files}" : "{dirs} und {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
- "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"],
- "New" : "Neu",
- "Select file range" : "Dateibereich auswählen",
- "{used} of {quota} used" : "{used} von {quota} verwendet",
- "{used} used" : "{used} verwendet",
- "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.",
- "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
- "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Dein Speicher ist beinahe voll ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
- "View in folder" : "In Ordner anzeigen",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Benutzer, die Zugriff auf diese(n) Datei/Ordner haben)",
- "Path" : "Pfad",
- "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
- "Favorited" : "Favorisiert",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Du kannst gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren",
- "New folder" : "Neuer Ordner",
- "Upload file" : "Datei hochladen",
- "Recent" : "Neueste",
- "Not favorited" : "Nicht favorisiert",
- "Remove from favorites" : "Von Favoriten entfernen",
- "Add to favorites" : "Zu den Favoriten hinzufügen",
- "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
- "You added {file} to your favorites" : "Du hast {file} zu Deinen Favoriten hinzugefügt",
- "You removed {file} from your favorites" : "Du hast {file} aus Deinen Favoriten entfernt",
+ "You added {file} to your favorites" : "Du hast {file} zu deinen Favoriten hinzugefügt",
+ "You removed {file} from your favorites" : "Du hast {file} aus deinen Favoriten entfernt",
+ "Favorites" : "Favoriten",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Wiederhergestellt durch {user}",
"Renamed by {user}" : "Umbenannt durch {user}",
"Moved by {user}" : "Verschoben durch {user}",
- "\"remote user\"" : "„Externer Benutzer“",
+ "\"remote account\"" : "\"Entferntes Konto\"",
"You created {file}" : "Du hast {file} erstellt",
"You created an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} erstellt",
"{user} created {file}" : "{user} hat {file} erstellt",
@@ -140,16 +37,27 @@
"{user} renamed {oldfile} to {newfile}" : "{user} hat {oldfile} in {newfile} umbenannt",
"You moved {oldfile} to {newfile}" : "Du hast {oldfile} nach {newfile} verschoben",
"{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "Files" : "Dateien",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Eine favorisierte Datei oder ein Ordner wurde <strong>geändert</strong>",
- "All files" : "Alle Dateien",
- "Unlimited" : "Unbegrenzt",
- "Upload (max. %s)" : "Hochladen (max. %s)",
+ "Failed to authorize" : "Autorisierung fehlgeschlagen",
+ "Invalid folder path" : "Ungültiger Order-Pfad",
+ "Folder not found" : "Ordner nicht gefunden",
+ "The file cannot be found" : "Die Datei kann nicht gefunden werden",
+ "The destination path does not exist: %1$s" : "Der Zielpfad existiert nicht: %1$s",
+ "You do not have permission to create a file at the specified location" : "Keine Berechtigung, eine Datei am angegebenen Speicherort zu erstellen",
+ "The file could not be converted." : "Die Datei konnte nicht konvertiert werden.",
+ "Could not get relative path to converted file" : "Relativer Pfad zur konvertierten Datei konnte nicht ermittelt werden",
+ "Favorite files" : "Favorisierte Dateien",
+ "No favorites" : "Keine Favoriten",
+ "More favorites" : "Weitere Favoriten",
"Accept" : "Akzeptieren",
"Reject" : "Ablehnen",
"Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.",
+ "Ownership transfer denied" : "Besitzübertragung verweigert",
+ "Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Übertragen von %1$s auf %2$s",
+ "Files compatibility" : "Dateikompatibilität",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ermöglicht die Einschränkung von Dateinamen, um sicherzustellen, dass Dateien mit allen Clients synchronisiert werden können. Standardmäßig sind alle unter POSIX (z. B. Linux oder macOS) gültigen Dateinamen zulässig.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl „occ“.",
+ "Enforce Windows compatibility" : "Windows-Kompatibilität erzwingen",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dadurch werden Dateinamen blockiert, die auf Windows-Systemen unzulässig sind, z. B. reservierte Namen oder Sonderzeichen. Die Kompatibilität der Groß-/Kleinschreibung wird dadurch jedoch nicht erzwungen.",
"File Management" : "Dateiverwaltung",
- "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
- "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
- "Change" : "Ändern",
- "New owner" : "Neuer Besitzer",
- "Search users" : "Suche Benutzer",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
+ "Reload current directory" : "Aktuelles Verzeichnis neu laden",
+ "Go to the \"{dir}\" directory" : "In das Verzeichnis \"{dir}\" wechseln",
+ "Current directory path" : "Aktueller Verzeichnispfad",
+ "Your have used your space quota and cannot upload files anymore" : "Dein Speicherplatzkontigent ist aufgebraucht, du kannst keine weiteren Dateien hochladen.",
+ "You do not have permission to upload or create files here." : "Du hast nicht die Berechtigung, hier Dateien hochzuladen oder zu erstellen.",
+ "Drag and drop files here to upload" : "Dateien zum Hochladen hierher ziehen und ablegen",
+ "Favorite" : "Favorit",
+ "Back" : "Zurück",
+ "Toggle selection for file \"{displayName}\"" : "Auswahl für die Datei \"{displayName}\" umschalten",
+ "Toggle selection for folder \"{displayName}\"" : "Auswahl für den Ordner \"{displayName}\" umschalten",
+ "File is loading" : "Datei wird geladen",
+ "Folder is loading" : "Ordner wird geladen",
+ "Filename" : "Dateiname",
+ "Folder name" : "Ordnername",
+ "This node is unavailable" : "Dieser Knoten ist nicht verfügbar.",
+ "Another entry with the same name already exists." : "Ein anderer Eintrag mit diesem Namen existiert bereits.",
+ "Invalid filename." : "Ungültiger Dateiname.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt",
+ "Rename file" : "Datei umbenennen",
+ "Folder" : "Ordner",
+ "Unknown file type" : "Unbekannter Dateityp",
+ "{ext} image" : "{ext}-Bild",
+ "{ext} video" : "{ext}-Video",
+ "{ext} audio" : "{ext}-Audio",
+ "{ext} text" : "{ext}-Text",
+ "Pending" : "Ausstehend",
+ "Unknown date" : "Unbekanntes Datum",
+ "Clear filter" : "Filter zurücksetzen",
+ "Modified" : "Geändert",
+ "Search everywhere" : "Überall suchen",
+ "Type" : "Typ",
+ "Active filters" : "Aktive Filter",
+ "Remove filter" : "Filter entfernen",
+ "Total rows summary" : "Zusammenfassung aller Zeilen",
+ "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten",
+ "Name" : "Name",
+ "File type" : "Dateityp",
+ "Size" : "Größe",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: done" : "{displayName}: Abgeschlossen",
+ "{displayName}: failed" : "{displayName}: Fehlgeschlagen",
+ "Actions" : "Aktionen",
+ "(selected)" : "(ausgewählt)",
+ "List of files and folders." : "Liste der Dateien und Ordner",
+ "You have used your space quota and cannot upload files anymore." : "Dein Speicherplatzkontigent ist aufgebraucht, Du kannst keine weiteren Dateien hochladen.",
+ "Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden angezeigt, wenn du durch die Liste navigierst.",
+ "File not found" : "Datei nicht gefunden",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
+ "Search everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
+ "Search scope options" : "Suchbereichsoptionen",
+ "Search here" : "Hier suchen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
+ "{used} of {quota} used" : "{used} von {quota} verwendet",
+ "{relative}% used" : "{relative} % verwendet",
+ "Could not refresh storage stats" : "Die Speicherstatistik konnte nicht aktualisiert werden",
+ "Your storage is full, files can not be updated or synced anymore!" : "Der Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage information" : "Speicherinformation",
+ "Storage quota" : "Speicherkontingent",
+ "New folder" : "Neuer Ordner",
+ "Create new folder" : "Neuen Ordner erstellen",
+ "This name is already in use." : "Dieser Name wird bereits verwendet.",
+ "Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
+ "Fill template fields" : "Vorlagenfelder ausfüllen",
+ "Submitting fields …" : "Felder werden übermittelt …",
+ "Submit" : "Übermitteln",
"Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
"Transfer" : "Übertragen",
"Transfer {path} to {userid}" : "Übertrage {path} an {userid}",
"Invalid path selected" : "Ungültiger Dateipfad ausgewählt",
- "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes versandt",
- "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Du nicht besitzt, kann nicht übertragen werden",
- "Tags" : "Schlagworte",
- "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei konnte nicht geändert werden",
+ "Unknown error" : "Unbekannter Fehler",
+ "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes gesendet",
+ "Cannot transfer ownership of a file or folder you do not own" : "Der Besitz an einer Datei oder einem Ordner, der dir nicht gehört, kann nicht übertragen werden",
+ "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
+ "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
+ "Change" : "Ändern",
+ "New owner" : "Neuer Besitzer",
+ "Keep {old}" : "{old} behalten",
+ "Keep without extension" : "Ohne Erweiterung behalten",
+ "Use {new}" : "{new} verwenden",
+ "Remove extension" : "Dateierweiterung entfernen",
+ "Change file extension" : "Dateierweiterungen ändern",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ändern der Dateierweiterung von \"{old}\" zu \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Entfernen der Dateierweiterung \"{old}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Hinzufügen der Dateierweiterung \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Do not show this dialog again." : "Diesen Dialog nicht mehr anzeigen.",
+ "Select file or folder to link to" : "Datei oder Ordner zum Verknüpfen auswählen",
+ "Choose {file}" : "{file} auswählen",
+ "Share" : "Teilen",
+ "Shared by link" : "Über einen Link geteilt",
+ "Shared" : "Geteilt",
+ "Switch to list view" : "Zur Listenansicht wechseln",
+ "Switch to grid view" : "Zur Kachelansicht wechseln",
+ "The file could not be found" : "Die Datei konnte nicht gefunden werden",
+ "Upload was cancelled by user" : "Das Hochladen wurde vom Benutzer abgebrochen.",
+ "Not enough free space" : "Nicht genügend freier Speicherplatz",
+ "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
+ "Error during upload: {message}" : "Fehler beim Hochladen: {message}",
+ "Error during upload, status code {status}" : "Fehler beim Hochladen, Statuscode {status}",
+ "Unknown error during upload" : "unbekannte Fehler während des Hochladens",
+ "Loading current folder" : "Lade aktuellen Ordner",
+ "Retry" : "Wiederholen",
+ "No files in here" : "Keine Dateien vorhanden",
+ "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere sie mit deinen Geräten!",
+ "Go back" : "Zurückgehen",
+ "Views" : "Ansichten",
+ "Files settings" : "Dateien-Einstellungen",
+ "Your files" : "Deine Dateien",
+ "Open in files" : "In Dateien öffnen",
+ "File cannot be accessed" : "Auf die Datei kann nicht zugegriffen werden",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Die Datei konnte nicht gefunden werden oder Du hast keine Berechtigung, um sie anzuzeigen. Bitte den Absender, die Datei zu teilen.",
+ "No search results for “{query}”" : "Keine Suchergebnisse für \"{query}\"",
+ "Search for files" : "Nach Dateien suchen",
+ "Clipboard is not available" : "Zwischenablage ist nicht verfügbar",
+ "WebDAV URL copied" : "WebDAV-URL kopiert",
+ "General" : "Allgemein",
+ "Default view" : "Standardansicht",
+ "All files" : "Alle Dateien",
+ "Personal files" : "Persönliche Dateien",
+ "Sort favorites first" : "Favoriten zuerst sortieren",
+ "Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Folder tree" : "Ordnerbaum",
+ "Appearance" : "Aussehen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
+ "Show file type column" : "Dateityp-Spalte anzeigen",
+ "Show file extensions" : "Dateierweiterungen anzeigen",
+ "Crop image previews" : "Bildvorschauen zuschneiden",
+ "Additional settings" : "Zusätzliche Einstellungen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-URL",
+ "Copy" : "Kopieren",
+ "How to access files using WebDAV" : "So greifst du mit WebDAV auf Dateien zu",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für dein Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
+ "Warnings" : "Warnungen",
+ "Warn before changing a file extension" : "Vor der Änderung einer Dateierweiterung warnen",
+ "Warn before deleting files" : "Vor dem Löschen von Dateien warnen",
+ "Keyboard shortcuts" : "Tastaturkürzel",
+ "File actions" : "Dateiaktionen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Add or remove favorite" : "Favorit hinzufügen oder entfernen",
+ "Manage tags" : "Schlagworte verwalten",
+ "Selection" : "Auswahl",
+ "Select all files" : "Alle Dateien auswählen",
+ "Deselect all" : "Auswahl aufheben",
+ "Select or deselect" : "Aus- oder Abwählen",
+ "Select a range" : "Einen Bereich auswählen",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Zum übergeordneten Ordner wechseln",
+ "Go to file above" : "Zur Datei darüber wechseln",
+ "Go to file below" : "Zur Datei darunter wechseln",
+ "Go left in grid" : "Im Raster nach links gehen",
+ "Go right in grid" : "Im Raster nach rechts gehen",
+ "View" : "Ansehen",
+ "Toggle grid view" : "Rasteransicht umschalten",
+ "Open file sidebar" : "Datei-Seitenleiste öffnen",
+ "Show those shortcuts" : "Diese Tastaturkürzel anzeigen",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Mehrmals mit verschiedenen Personen geteilt",
+ "Unable to change the favorite state of the file" : "Der Favoriten-Status der Datei kann nicht geändert werden",
"Error while loading the file data" : "Fehler beim Laden der Datei-Daten",
+ "Owner" : "Besitzer",
+ "Remove from favorites" : "Aus Favoriten entfernen",
+ "Add to favorites" : "Zu den Favoriten hinzufügen",
+ "Tags" : "Schlagworte",
+ "Blank" : "Leer",
+ "Unable to create new file from template" : "Neue Datei konnte nicht aus Vorlage erstellt werden",
"Pick a template for {name}" : "Eine Vorlage für {name} wählen",
- "Cancel" : "Abbrechen",
- "Create" : "Erstellen",
"Create a new file with the selected template" : "Eine neue Datei anhand der ausgewählten Vorlage erstellen",
"Creating file" : "Datei erstellen",
- "Blank" : "Leer",
- "Unable to create new file from template" : "Neue Datei konnte nicht aus Vorlage erstellt werden",
- "Set up templates folder" : "Vorlagenordner einrichten",
- "Templates" : "Vorlagen",
+ "Save as {displayName}" : "Speichern als {displayName}",
+ "Save as …" : "Speichern als …",
+ "Converting files …" : "Dateien werden konvertiert …",
+ "Failed to convert files: {message}" : "Fehler beim Konvertieren der Dateien: {message}",
+ "All files failed to be converted" : "Alle Dateien konnten nicht konvertiert werden",
+ "One file could not be converted: {message}" : "Eine Datei konnte nicht konvertiert werden: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Eine Datei konnte nicht konvertiert werden","%n Dateien konnten nicht konvertiert werden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Eine Datei konvertiert","%n Dateien konvertiert"],
+ "Files successfully converted" : "Dateien konvertiert",
+ "Failed to convert files" : "Dateien konnten nicht konvertiert werden",
+ "Converting file …" : "Datei wird konvertiert …",
+ "File successfully converted" : "Datei konvertiert",
+ "Failed to convert file: {message}" : "Fehler beim Konvertieren der Datei: {message}",
+ "Failed to convert file" : "Datei konnte nicht konvertiert werden",
+ "Leave this share" : "Diese Freigabe verlassen",
+ "Leave these shares" : "Diese Freigaben verlassen",
+ "Disconnect storage" : "Speicher trennen",
+ "Disconnect storages" : "Speicher trennen",
+ "Delete permanently" : "Endgültig löschen",
+ "Delete and unshare" : "Löschen und nicht mehr teilen",
+ "Delete file" : "Datei löschen",
+ "Delete files" : "Dateien löschen",
+ "Delete folder" : "Ordner löschen",
+ "Delete folders" : "Ordner löschen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sie sind dabei, {count} Element endgültig zu löschen","Du bist dabei, {count} Elemente endgültig zu löschen."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sie sind dabei, {count} Element zu löschen","Du bist dabei, {count} Elemente zu löschen."],
+ "Confirm deletion" : "Löschen bestätigen",
+ "Cancel" : "Abbrechen",
+ "Download" : "Herunterladen",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
+ "Destination is not a folder" : "Ziel ist kein Ordner",
+ "This file/folder is already in that directory" : "Diese Datei oder Ordner ist bereits in diesem Verzeichnis vorhanden",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden.",
+ "(copy)" : "(Kopie)",
+ "(copy %n)" : "(Kopie %n)",
+ "A file or folder with that name already exists in this folder" : "In diesem Ordner ist bereits eine Datei oder ein Ordner mit diesem Namen vorhanden",
+ "The files are locked" : "Die Dateien sind gesperrt",
+ "The file does not exist anymore" : "Die Datei existiert nicht mehr",
+ "Choose destination" : "Ziel wählen",
+ "Copy to {target}" : "Nach {target} kopieren",
+ "Move to {target}" : "Nach {target} verschieben",
+ "Move" : "Verschieben",
+ "Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
+ "Move or copy" : "Verschieben oder kopieren",
+ "Open folder {displayName}" : "Ordner {displayName} öffnen",
+ "Open in Files" : "In \"Dateien\" öffnen",
+ "Open locally" : "Lokal öffnen",
+ "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
+ "Open file locally" : "Datei lokal öffnen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Die Datei sollte sich jetzt auf deinem Gerät öffnen. Wenn dies nicht der Fall ist, überprüfe, ob du die Desktop-App installiert hast.",
+ "Retry and close" : "Erneut versuchen und schließen",
+ "Open online" : "Online öffnen",
+ "Details" : "Details",
+ "View in folder" : "In Ordner anzeigen",
+ "Today" : "Heute",
+ "Last 7 days" : "Die letzten 7 Tage",
+ "Last 30 days" : "Die letzten 30 Tage",
+ "This year ({year})" : "Dieses Jahr ({year})",
+ "Last year ({year})" : "Letztes Jahr ({year})",
+ "Documents" : "Dokumente",
+ "Spreadsheets" : "Tabellenkalkulationen",
+ "Presentations" : "Präsentationen",
+ "PDFs" : "PDFs",
+ "Folders" : "Ordner",
+ "Audio" : "Audio",
+ "Images" : "Bilder",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Neuer Ordner \"{name}\" wurde erstellt",
"Unable to initialize the templates directory" : "Der Vorlagenordner konnte nicht initialisiert werden",
- "%s used" : "%s verwendet",
- "%s%% of %s used" : "%s%% von %s verwendet",
- "%1$s of %2$s used" : "%1$s von %2$s verwendet",
- "Settings" : "Einstellungen",
- "Show hidden files" : "Versteckte Dateien anzeigen",
- "Crop image previews" : "Bildvorschauen zuschneiden",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf Deine Dateien zuzugreifen",
- "Toggle %1$s sublist" : "Unterliste %1$s umschalten",
- "Toggle grid view" : "Rasteransicht umschalten",
- "No files in here" : "Keine Dateien vorhanden",
- "Upload some content or sync with your devices!" : "Inhalte hochladen oder mit Deinen Geräten synchronisieren!",
+ "Create templates folder" : "Vorlagenordner erstellen",
+ "Templates" : "Vorlagen",
+ "New template folder" : "Neuer Vorlagenordner",
+ "In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
+ "Search in folder: {folder}" : "Im Ordner suchen: {folder}",
+ "One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Dein Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen.",
+ "No files to upload" : "Keine Dateien zum Hochladen",
+ "Unable to create the directory {directory}" : "Der Ordner {directory} konnte nicht erstellt werden",
+ "Some files could not be uploaded" : "Einige Dateien konnten nicht hochgeladen werden",
+ "Files uploaded successfully" : "Dateien hochgeladen",
+ "No files to process" : "Keine Dateien zum Verarbeiten",
+ "Some files could not be copied" : "Einige Dateien konnten nicht kopiert werden",
+ "Some files could not be moved" : "Einige Dateien konnten nicht verschoben werden.",
+ "Files copied successfully" : "Dateien kopiert",
+ "Files moved successfully" : "Dateien verschoben",
+ "Conflicts resolution skipped" : "Konfliktlösung übersprungen",
+ "Upload cancelled" : "Hochladen abgebrochen",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" konnte nicht umbenannt werden, da es nicht mehr existiert.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{newName}“ wird bereits im Ordner \"{dir}“ verwendet. Bitte wähle einen anderen Namen.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" konnte nicht umbenannt werden.",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This folder is unavailable, please try again later or contact the administration" : "Dieser Ordner ist nicht verfügbar. Bitte später erneut versuchen oder an die Administration wenden",
+ "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
+ "Unexpected error: {error}" : "Unerwarteter Fehler: {error}",
+ "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
+ "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
+ "_%n hidden_::_%n hidden_" : ["%n versteckt","%n versteckt"],
+ "Filename must not be empty." : "Dateiname darf nicht leer sein.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ist innerhalb eines Dateinamens nicht zulässig.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ist ein reservierter Name und für Dateinamen nicht zulässig.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ist kein zulässiger Dateityp.",
+ "Filenames must not end with \"{extension}\"." : "Dateinamen dürfen nicht mit \"{extension}\" enden.",
+ "List of favorite files and folders." : "Liste der favorisierten Ordner und Dateien.",
+ "No favorites yet" : "Noch keine Favoriten vorhanden",
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier",
+ "List of your files and folders." : "Liste deiner Dateien und Ordner",
+ "List of your files and folders that are not shared." : "Liste deiner Dateien und Ordner, die nicht geteilt wurden.",
+ "No personal files found" : "Keine persönlichen Dateien gefunden",
+ "Files that are not shared will show up here." : "Dateien, die nicht geteilt wurden, werden hier angezeigt.",
+ "Recent" : "Neueste",
+ "List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner",
+ "No recently modified files" : "Keine kürzlich geänderten Dateien",
+ "Files and folders you recently modified will show up here." : "Die von dir kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
+ "Search" : "Suche",
+ "Search results within your files." : "Suchergebnisse innerhalb deiner Dateien.",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
- "No favorites yet" : "Noch keine Favoriten vorhanden",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier",
- "Deleted files" : "Gelöschte Dateien",
- "Shares" : "Freigaben",
- "Shared with others" : "Mit anderen geteilt",
- "Shared with you" : "Mit Dir geteilt",
- "Shared by link" : "Über einen Link geteilt",
- "Deleted shares" : "Gelöschte Freigaben",
- "Pending shares" : "Ausstehende Freigaben",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
+ "Show list view" : "Listenansicht anzeigen",
+ "Show grid view" : "Kachelansicht anzeigen",
+ "Close" : "Schließen",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
+ "Upload cancelled." : "Hochladen abgebrochen.",
+ "Processing files …" : "Dateien werden verarbeitet …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
+ "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
+ "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
+ "File could not be uploaded" : "Datei konnte nicht hochgeladen werden.",
+ "Uploading …" : "Lade hoch …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lade hoch … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
+ "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
+ "Choose target folder" : "Zielordner wählen",
+ "Set reminder" : "Erinnerung erstellen",
+ "Edit locally" : "Lokal bearbeiten",
+ "Open" : "Öffnen",
+ "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
+ "Please select tag(s) to add to the selection" : "Bitte das/die Schlagwort(e) auswählen, das/die zur Auswahl hinzugefügt werden soll(en)",
+ "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
+ "Select directory \"{dirName}\"" : "Verzeichnis \"{dirName}\" auswählen",
+ "Select file \"{fileName}\"" : "Datei \"{fileName}\" auswählen",
+ "Unable to determine date" : "Datum konnte nicht ermittelt werden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder die Administration kontaktieren.",
+ "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
+ "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
+ "copy" : "Kopie",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
+ "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
+ "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert.",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
+ "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
+ "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Gib mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen.",
+ "{dirs} and {files}" : "{dirs} und {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
+ "You do not have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"],
+ "New" : "Neu",
+ "New file/folder menu" : "Menü für neue Datei/Ordner",
+ "Select file range" : "Dateibereich auswählen",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used} verwendet",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ist kein gültiger Dateiname.",
+ "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" ist kein erlaubter Dateityp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Dein Speicher ist beinahe voll ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlink wurde kopiert (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Favored" : "Favorisiert",
+ "Favor" : "Favorisieren",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Direktlink kopieren (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Upload file" : "Datei hochladen",
+ "Not favored" : "Nicht favorisiert",
+ "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
+ "Upload (max. %s)" : "Hochladen (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Aktion \"{displayName}\" ausgeführt",
+ "\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
+ "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
+ "Submitting fields…" : "Felder werden übermittelt…",
+ "Filter filenames…" : "Dateinamen filtern…",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL in die Zwischenablage kopiert",
+ "Enable the grid view" : "Kachelansicht aktivieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Copy to clipboard" : "In die Zwischenablage kopieren",
+ "Use this address to access your Files via WebDAV" : "Diese Adresse benutzen, um über WebDAV auf deine Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn du 2FA aktiviert hast, musst du ein neues App-Passwort erstellen und verwenden, indem du hier klickst.",
+ "Deletion cancelled" : "Löschen abgebrochen",
+ "Move cancelled" : "Verschieben abgebrochen",
+ "Cancelled move or copy of \"{filename}\"." : "Verschieben oder Kopieren von \"{filename}\" abgebrochen.",
+ "Cancelled move or copy operation" : "Verschieben oder Kopieren abgebrochen",
+ "Open details" : "Details öffnen",
+ "Photos and images" : "Fotos und Bilder",
+ "New folder creation cancelled" : "Erstellung des neuen Ordners abgebrochen",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} Datei und 1 Ordner","{fileCount} Dateien und 1 Ordner"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} Dateien und {folderCount} Ordner",
+ "All folders" : "Alle Ordner",
+ "Personal Files" : "Persönliche Dateien",
"Text file" : "Textdatei",
"New text file.txt" : "Neue Textdatei file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"]
+ "%1$s (renamed)" : "%1$s (umbenannt)",
+ "renamed file" : "Umbenannte Datei",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "Filter file names …" : "Dateinamen filtern …",
+ "Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
+ "Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
+ "Speed up your Files experience with these quick shortcuts." : "Mit diesen Schnellzugriffen schneller mit Dateien arbeiten.",
+ "Open the actions menu for a file" : "Aktionsmenü für eine Datei öffnen",
+ "Rename a file" : "Eine Datei umbenennen",
+ "Delete a file" : "Eine Datei löschen",
+ "Favorite or remove a file from favorites" : "Datei favorisieren oder aus den Favoriten entfernen",
+ "Manage tags for a file" : "Schlagworte für eine Datei verwalten",
+ "Deselect all files" : "Auswahl aller Dateien aufheben",
+ "Select or deselect a file" : "Auswählen oder Auswahl einer Datei aufheben",
+ "Select a range of files" : "Einen Bereich von Dateien auswählen",
+ "Navigate to the parent folder" : "Zum übergeordneten Ordner navigieren",
+ "Navigate to the file above" : "Zur obigen Datei navigieren",
+ "Navigate to the file below" : "Zur unteren Datei navigieren",
+ "Navigate to the file on the left (in grid mode)" : "Zur Datei links navigieren (in der Kachelansicht)",
+ "Navigate to the file on the right (in grid mode)" : "Zur Datei rechts navigieren (in der Kachelansicht)",
+ "Toggle the grid view" : "Kachelansicht umschalten",
+ "Open the sidebar for a file" : "Seitenleiste für eine Datei öffnen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 01edb061fd6..f5b58fcde18 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
- "Storage invalid" : "Speicher ungültig",
- "Unknown error" : "Unbekannter Fehler",
- "File could not be found" : "Datei konnte nicht gefunden werden",
- "Move or copy" : "Verschieben oder kopieren",
- "Download" : "Herunterladen",
- "Delete" : "Löschen",
- "Home" : "Home",
- "Close" : "Schließen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
- "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
- "Upload cancelled." : "Hochladen abgebrochen.",
- "Processing files …" : "Dateien werden verarbeitet…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
- "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
- "Not enough free space" : "Nicht genügend freier Speicherplatz",
- "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
- "Uploading …" : "Lade hoch …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
- "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
- "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
- "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
- "Actions" : "Aktionen",
- "Rename" : "Umbenennen",
- "Copy" : "Kopieren",
- "Choose target folder" : "Zielordner auswählen",
- "Open" : "Öffnen",
- "Delete file" : "Datei löschen",
- "Delete folder" : "Ordner löschen",
- "Disconnect storage" : "Speicher trennen",
- "Leave this share" : "Diese Freigabe verlassen",
- "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
- "Files" : "Dateien",
- "Details" : "Details",
- "Please select tag(s) to add to the selection" : "Bitte wählen Sie das/die Schlagwort(e) aus, das/die Sie zur Auswahl hinzufügen möchten",
- "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
- "Select" : "Auswählen",
- "Pending" : "Ausstehend",
- "Unable to determine date" : "Datum konnte nicht ermittelt werden",
- "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
- "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
- "copy" : "Kopie",
- "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
- "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
- "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
- "{newName} already exists" : "{newName} existiert bereits",
- "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei \"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte wählen Sie einen anderen Namen.",
- "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
- "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert",
- "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
- "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
- "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Geben Sie mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
- "Name" : "Name",
- "Size" : "Größe",
- "Modified" : "Geändert",
- "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "{dirs} and {files}" : "{dirs} und {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
- "You don’t have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"],
- "New" : "Neu",
- "Select file range" : "Dateibereich auswählen",
- "{used} of {quota} used" : "{used} von {quota} verwendet",
- "{used} used" : "{used} verwendet",
- "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.",
- "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
- "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ihr Speicher ist beinahe voll ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
- "View in folder" : "In Ordner anzeigen",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Benutzer, die Zugriff auf diese(n) Datei/Ordner haben)",
- "Path" : "Pfad",
- "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
- "Favorited" : "Favorisiert",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Sie können gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren",
- "New folder" : "Neuer Ordner",
- "Upload file" : "Datei hochladen",
- "Recent" : "Neueste",
- "Not favorited" : "Nicht favorisiert",
- "Remove from favorites" : "Von Favoriten entfernen",
- "Add to favorites" : "Zu den Favoriten hinzufügen",
- "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
"You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten entfernt",
+ "Favorites" : "Favoriten",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Wiederhergestellt durch {user}",
"Renamed by {user}" : "Umbenannt durch {user}",
"Moved by {user}" : "Verschoben durch {user}",
- "\"remote user\"" : "„Externer Benutzer“",
+ "\"remote account\"" : "\"Entferntes Konto\"",
"You created {file}" : "Sie haben {file} erstellt",
"You created an encrypted file in {file}" : "Sie haben eine verschlüsselte Datei in {file} erstellt",
"{user} created {file}" : "{user} hat {file} erstellt",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Sie haben {oldfile} nach {newfile} verschoben",
"{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben",
"A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Ihren <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "Files" : "Dateien",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Eine favorisierte Datei oder ein Ordner wurde <strong>geändert</strong>",
- "All files" : "Alle Dateien",
- "Unlimited" : "Unbegrenzt",
- "Upload (max. %s)" : "Hochladen (max. %s)",
+ "Failed to authorize" : "Autorisierung fehlgeschlagen",
+ "Invalid folder path" : "Ungültiger Order-Pfad",
+ "Folder not found" : "Ordner nicht gefunden",
+ "The file cannot be found" : "Die Datei kann nicht gefunden werden",
+ "The destination path does not exist: %1$s" : "Der Zielpfad existiert nicht: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sie haben nicht die Berechtigung, eine Datei am angegebenen Speicherort zu erstellen",
+ "The file could not be converted." : "Die Datei konnte nicht konvertiert werden.",
+ "Could not get relative path to converted file" : "Relativer Pfad zur konvertierten Datei konnte nicht ermittelt werden",
+ "Favorite files" : "Favorisierte Dateien",
+ "No favorites" : "Keine Favoriten",
+ "More favorites" : "Weitere Favoriten",
"Accept" : "Akzeptieren",
"Reject" : "Ablehnen",
"Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.",
+ "Ownership transfer denied" : "Besitzübertragung abgelehnt",
+ "Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Besitzübertragung von {path} vom Benutzer {user} ist fehlgeschlagen.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Übertragen von %1$s an %2$s",
+ "Files compatibility" : "Dateikompatibilität",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ermöglicht die Einschränkung von Dateinamen, um sicherzustellen, dass Dateien mit allen Clients synchronisiert werden können. Standardmäßig sind alle unter POSIX (z. B. Linux oder macOS) gültigen Dateinamen zulässig.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl \"occ“.",
+ "Enforce Windows compatibility" : "Windows-Kompatibilität erzwingen",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dadurch werden Dateinamen blockiert, die auf Windows-Systemen unzulässig sind, z. B. reservierte Namen oder Sonderzeichen. Die Kompatibilität der Groß-/Kleinschreibung wird dadurch jedoch nicht erzwungen.",
"File Management" : "Dateiverwaltung",
- "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
- "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
- "Change" : "Ändern",
- "New owner" : "Neuer Besitzer",
- "Search users" : "Suche Benutzer",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
+ "Reload current directory" : "Aktuelles Verzeichnis neu laden",
+ "Go to the \"{dir}\" directory" : "In das Verzeichnis \"{dir}\" wechseln",
+ "Current directory path" : "Aktueller Verzeichnispfad",
+ "Your have used your space quota and cannot upload files anymore" : "Ihr Speicherplatzkontigent ist aufgebraucht, Sie können keine weiteren Dateien hochladen",
+ "You do not have permission to upload or create files here." : "Sie haben nicht die Berechtigung, hier Dateien hochzuladen oder zu erstellen.",
+ "Drag and drop files here to upload" : "Dateien zum Hochladen hierher ziehen und ablegen",
+ "Favorite" : "Favorit",
+ "Back" : "Zurück",
+ "Toggle selection for file \"{displayName}\"" : "Auswahl für die Datei \"{displayName}\" umschalten",
+ "Toggle selection for folder \"{displayName}\"" : "Auswahl für den Ordner \"{displayName}\" umschalten",
+ "File is loading" : "Datei wird geladen",
+ "Folder is loading" : "Ordner wird geladen",
+ "Filename" : "Dateiname",
+ "Folder name" : "Ordnername",
+ "This node is unavailable" : "Dieser Knoten ist nicht verfügbar",
+ "Another entry with the same name already exists." : "Ein anderer Eintrag mit diesem Namen existiert bereits.",
+ "Invalid filename." : "Ungültiger Dateiname.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt",
+ "Rename file" : "Datei umbenennen",
+ "Folder" : "Ordner",
+ "Unknown file type" : "Unbekannter Dateityp",
+ "{ext} image" : "{ext}-Bild",
+ "{ext} video" : "{ext}-Video",
+ "{ext} audio" : "{ext}-Audio",
+ "{ext} text" : "{ext}-Text",
+ "Pending" : "Ausstehend",
+ "Unknown date" : "Unbekanntes Datum",
+ "Clear filter" : "Filter zurücksetzen",
+ "Modified" : "Geändert",
+ "Search everywhere" : "Überall suchen",
+ "Type" : "Typ",
+ "Active filters" : "Aktive Filter",
+ "Remove filter" : "Filter entfernen",
+ "Total rows summary" : "Zusammenfassung aller Zeilen",
+ "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten",
+ "Name" : "Name",
+ "File type" : "Dateityp",
+ "Size" : "Größe",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: done" : "{displayName}: Abgeschlossen",
+ "{displayName}: failed" : "{displayName}: Fehlgeschlagen",
+ "Actions" : "Aktionen",
+ "(selected)" : "(ausgewählt)",
+ "List of files and folders." : "Liste der Dateien und Ordner.",
+ "You have used your space quota and cannot upload files anymore." : "Ihr Speicherplatzkontigent ist aufgebraucht, Sie können keine weiteren Dateien hochladen.",
+ "Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
+ "File not found" : "Datei nicht gefunden",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
+ "Search everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
+ "Search scope options" : "Suchbereichsoptionen",
+ "Search here" : "Hier suchen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
+ "{used} of {quota} used" : "{used} von {quota} verwendet",
+ "{relative}% used" : "{relative} % verwendet",
+ "Could not refresh storage stats" : "Die Speicherstatistik konnte nicht aktualisiert werden",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage information" : "Speicherinformation",
+ "Storage quota" : "Speicherkontingent",
+ "New folder" : "Neuer Ordner",
+ "Create new folder" : "Neuen Ordner erstellen",
+ "This name is already in use." : "Dieser Name wird bereits verwendet.",
+ "Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
+ "Fill template fields" : "Vorlagenfelder ausfüllen",
+ "Submitting fields …" : "Felder werden übermittelt …",
+ "Submit" : "Übermitteln",
"Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
"Transfer" : "Übertragen",
"Transfer {path} to {userid}" : "Übertrage {path} an {userid}",
"Invalid path selected" : "Ungültiger Pfad ausgewählt",
+ "Unknown error" : "Unbekannter Fehler",
"Ownership transfer request sent" : "Anforderung für die Besitzübertragung versendet",
- "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Sie nicht besitzen, kann nicht übertragen werden",
- "Tags" : "Tags",
- "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei kann nicht geändert werden",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sie können den Besitz von Dateien oder Ordnern, die Sie nicht besitzen, nicht übertragen",
+ "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
+ "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
+ "Change" : "Ändern",
+ "New owner" : "Neuer Besitzer",
+ "Keep {old}" : "{old} behalten",
+ "Keep without extension" : "Ohne Erweiterung behalten",
+ "Use {new}" : "{new} verwenden",
+ "Remove extension" : "Dateierweiterung entfernen",
+ "Change file extension" : "Dateierweiterungen ändern",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ändern der Dateierweiterung von \"{old}\" zu \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Entfernen der Dateierweiterung \"{old}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Hinzufügen der Dateierweiterung \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Do not show this dialog again." : "Diesen Dialog nicht mehr anzeigen.",
+ "Select file or folder to link to" : "Datei oder Ordner zum Verknüpfen auswählen",
+ "Choose {file}" : "{file} auswählen",
+ "Share" : "Teilen",
+ "Shared by link" : "Über einen Link geteilt",
+ "Shared" : "Geteilt",
+ "Switch to list view" : "Zur Listenansicht wechseln",
+ "Switch to grid view" : "Zur Kachelansicht wechseln",
+ "The file could not be found" : "Die Datei konnte nicht gefunden werden",
+ "Upload was cancelled by user" : "Das Hochladen wurde vom Benutzer abgebrochen",
+ "Not enough free space" : "Nicht genügend freier Speicherplatz",
+ "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
+ "Error during upload: {message}" : "Fehler beim Hochladen: {message}",
+ "Error during upload, status code {status}" : "Fehler beim Hochladen, Statuscode {status}",
+ "Unknown error during upload" : "Unbekannter Fehler beim Hochladen",
+ "Loading current folder" : "Lade aktuellen Ordner",
+ "Retry" : "Wiederholen",
+ "No files in here" : "Keine Dateien vorhanden",
+ "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie Ihre Geräte!",
+ "Go back" : "Zurückgehen",
+ "Views" : "Ansichten",
+ "Files settings" : "Dateien-Einstellungen",
+ "Your files" : "Ihre Dateien",
+ "Open in files" : "In Dateien öffnen",
+ "File cannot be accessed" : "Auf die Datei kann nicht zugegriffen werden",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Die Datei konnte nicht gefunden werden oder Sie haben keine Berechtigungen, um sie anzuzeigen. Bitten Sie den Absender, die Datei zu teilen.",
+ "No search results for “{query}”" : "Keine Suchergebnisse für \"{query}\"",
+ "Search for files" : "Nach Dateien suchen",
+ "Clipboard is not available" : "Zwischenablage ist nicht verfügbar",
+ "WebDAV URL copied" : "WebDAV-URL kopiert",
+ "General" : "Allgemein",
+ "Default view" : "Standardansicht",
+ "All files" : "Alle Dateien",
+ "Personal files" : "Persönliche Dateien",
+ "Sort favorites first" : "Favoriten zuerst sortieren",
+ "Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Folder tree" : "Ordnerbaum",
+ "Appearance" : "Aussehen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
+ "Show file type column" : "Dateityp-Spalte anzeigen",
+ "Show file extensions" : "Dateierweiterungen anzeigen",
+ "Crop image previews" : "Bildvorschauen zuschneiden",
+ "Additional settings" : "Zusätzliche Einstellungen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-URL",
+ "Copy" : "Kopieren",
+ "How to access files using WebDAV" : "So greifen Sie mit WebDAV auf Dateien zu",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für Ihr Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
+ "Warnings" : "Warnungen",
+ "Warn before changing a file extension" : "Vor der Änderung einer Dateierweiterung warnen",
+ "Warn before deleting files" : "Vor dem Löschen von Dateien warnen",
+ "Keyboard shortcuts" : "Tastaturkürzel",
+ "File actions" : "Dateiaktionen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Add or remove favorite" : "Favorit hinzufügen oder entfernen",
+ "Manage tags" : "Schlagworte verwalten",
+ "Selection" : "Auswahl",
+ "Select all files" : "Alle Dateien auswählen",
+ "Deselect all" : "Auswahl aufheben",
+ "Select or deselect" : "Aus- oder abwählen",
+ "Select a range" : "Einen Bereich auswählen",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Zum übergeordneten Ordner wechseln",
+ "Go to file above" : "Zur Datei darüber wechseln",
+ "Go to file below" : "Zur Datei darunter wechseln",
+ "Go left in grid" : "Im Raster nach links gehen",
+ "Go right in grid" : "Im Raster nach rechts gehen",
+ "View" : "Ansicht",
+ "Toggle grid view" : "Kachelansicht umschalten",
+ "Open file sidebar" : "Datei-Seitenleiste öffnen",
+ "Show those shortcuts" : "Diese Tastaturkürzel anzeigen",
+ "You" : "Sie",
+ "Shared multiple times with different people" : "Mehrmals mit verschiedenen Personen geteilt",
+ "Unable to change the favorite state of the file" : "Der Favoriten-Status der Datei kann nicht geändert werden",
"Error while loading the file data" : "Fehler beim Laden der Datei-Daten",
+ "Owner" : "Besitzer",
+ "Remove from favorites" : "Von Favoriten entfernen",
+ "Add to favorites" : "Zu den Favoriten hinzufügen",
+ "Tags" : "Schlagworte",
+ "Blank" : "Leer",
+ "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
"Pick a template for {name}" : "Eine Vorlage für {name} wählen",
- "Cancel" : "Abbrechen",
- "Create" : "Erstellen",
"Create a new file with the selected template" : "Eine neue Datei anhand der ausgewählten Vorlage erstellen",
"Creating file" : "Datei erstellen",
- "Blank" : "Leer",
- "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
- "Set up templates folder" : "Vorlagenordner einrichten",
- "Templates" : "Vorlagen",
+ "Save as {displayName}" : "Speichern als {displayName}",
+ "Save as …" : "Speichern als …",
+ "Converting files …" : "Dateien werden konvertiert …",
+ "Failed to convert files: {message}" : "Fehler beim Konvertieren der Dateien: {message}",
+ "All files failed to be converted" : "Alle Dateien konnten nicht konvertiert werden",
+ "One file could not be converted: {message}" : "Eine Datei konnte nicht konvertiert werden: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Eine Datei konnte nicht konvertiert werden","%n Dateien konnten nicht konvertiert werden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Eine Datei konvertiert","%n Dateien konvertiert"],
+ "Files successfully converted" : "Dateien konvertiert",
+ "Failed to convert files" : "Dateien konnten nicht konvertiert werden",
+ "Converting file …" : "Datei wird konvertiert …",
+ "File successfully converted" : "Datei konvertiert",
+ "Failed to convert file: {message}" : "Fehler beim Konvertieren der Datei: {message}",
+ "Failed to convert file" : "Datei konnte nicht konvertiert werden",
+ "Leave this share" : "Diese Freigabe verlassen",
+ "Leave these shares" : "Diese Freigaben verlassen",
+ "Disconnect storage" : "Speicher trennen",
+ "Disconnect storages" : "Speicher trennen",
+ "Delete permanently" : "Endgültig löschen",
+ "Delete and unshare" : "Löschen und nicht mehr teilen",
+ "Delete file" : "Datei löschen",
+ "Delete files" : "Dateien löschen",
+ "Delete folder" : "Ordner löschen",
+ "Delete folders" : "Ordner löschen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sie sind dabei, {count} Element endgültig zu löschen","Sie sind dabei, {count} Elemente endgültig zu löschen"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sie sind dabei, {count} Element zu löschen","Sie sind dabei, {count} Elemente zu löschen"],
+ "Confirm deletion" : "Löschen bestätigen",
+ "Cancel" : "Abbrechen",
+ "Download" : "Herunterladen",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
+ "Destination is not a folder" : "Ziel ist kein Ordner",
+ "This file/folder is already in that directory" : "Diese Datei oder Ordner ist bereits in diesem Verzeichnis vorhanden",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden",
+ "(copy)" : "(Kopie)",
+ "(copy %n)" : "(Kopie %n)",
+ "A file or folder with that name already exists in this folder" : "In diesem Ordner ist bereits eine Datei oder ein Ordner mit diesem Namen vorhanden",
+ "The files are locked" : "Die Dateien sind gesperrt",
+ "The file does not exist anymore" : "Diese Datei existiert nicht mehr",
+ "Choose destination" : "Ziel wählen",
+ "Copy to {target}" : "Nach {target} kopieren",
+ "Move to {target}" : "Nach {target} verschieben",
+ "Move" : "Verschieben",
+ "Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
+ "Move or copy" : "Verschieben oder kopieren",
+ "Open folder {displayName}" : "Ordner {displayName} öffnen",
+ "Open in Files" : "In Dateien öffnen",
+ "Open locally" : "Lokal öffnen",
+ "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
+ "Open file locally" : "Datei lokal öffnen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Die Datei sollte sich jetzt auf Ihrem Gerät öffnen. Wenn dies nicht der Fall ist, überprüfen Sie, ob Sie die Desktop-App installiert haben.",
+ "Retry and close" : "Erneut versuchen und schließen",
+ "Open online" : "Online öffnen",
+ "Details" : "Details",
+ "View in folder" : "In Ordner anzeigen",
+ "Today" : "Heute",
+ "Last 7 days" : "Die letzten 7 Tage",
+ "Last 30 days" : "Die letzten 30 Tage",
+ "This year ({year})" : "Dieses Jahr ({year})",
+ "Last year ({year})" : "Letztes Jahr ({year})",
+ "Documents" : "Dokumente",
+ "Spreadsheets" : "Tabellenkalkulationen",
+ "Presentations" : "Präsentationen",
+ "PDFs" : "PDFs",
+ "Folders" : "Ordner",
+ "Audio" : "Audio",
+ "Images" : "Bilder",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Neuer Ordner \"{name}\" wurde erstellt",
"Unable to initialize the templates directory" : "Der Vorlagenordner kann nicht initialisiert werden",
- "%s used" : "%s verwendet",
- "%s%% of %s used" : "%s%% von %s verwendet",
- "%1$s of %2$s used" : "%1$s von %2$s verwendet",
- "Settings" : "Einstellungen",
- "Show hidden files" : "Versteckte Dateien anzeigen",
- "Crop image previews" : "Bildvorschauen zuschneiden",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen",
- "Toggle %1$s sublist" : "Unterliste %1$s umschalten",
- "Toggle grid view" : "Rasteransicht umschalten",
- "No files in here" : "Keine Dateien vorhanden",
- "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
+ "Create templates folder" : "Vorlagenordner erstellen",
+ "Templates" : "Vorlagen",
+ "New template folder" : "Neuer Vorlagenordner",
+ "In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
+ "Search in folder: {folder}" : "Im Ordner suchen: {folder}",
+ "One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ihr Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen",
+ "No files to upload" : "Keine Dateien zum Hochladen",
+ "Unable to create the directory {directory}" : "Der Ordner {directory} konnte nicht erstellt werden",
+ "Some files could not be uploaded" : "Einige Dateien konnten nicht hochgeladen werden.",
+ "Files uploaded successfully" : "Dateien hochgeladen",
+ "No files to process" : "Keine Dateien zum Verarbeiten",
+ "Some files could not be copied" : "Einige Dateien konnten nicht kopiert werden",
+ "Some files could not be moved" : "Einige Dateien konnten nicht verschoben werden",
+ "Files copied successfully" : "Dateien kopiert",
+ "Files moved successfully" : "Dateien verschoben",
+ "Conflicts resolution skipped" : "Konfliktelösung übersprungen",
+ "Upload cancelled" : "Hochladen abgebrochen",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" konnte nicht umbenannt werden, da es nicht mehr existiert",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{newName}“ wird bereits im Ordner \"{dir}“ verwendet. Bitte einen anderen Namen wählen.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" konnte nicht umbenannt werden",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This folder is unavailable, please try again later or contact the administration" : "Dieser Ordner ist nicht verfügbar. Bitte später erneut versuchen oder an die Administration wenden",
+ "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
+ "Unexpected error: {error}" : "Unerwarteter Fehler: {error}",
+ "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
+ "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
+ "_%n hidden_::_%n hidden_" : ["%n versteckt","%n versteckt"],
+ "Filename must not be empty." : "Dateiname darf nicht leer sein.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ist innerhalb eines Dateinamens nicht zulässig.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ist ein reservierter Name und für Dateinamen nicht zulässig.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ist kein zulässiger Dateityp.",
+ "Filenames must not end with \"{extension}\"." : "Dateinamen dürfen nicht mit \"{extension}\" enden.",
+ "List of favorite files and folders." : "Liste der favorisierten Ordner und Dateien.",
+ "No favorites yet" : "Noch keine Favoriten vorhanden",
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
+ "List of your files and folders." : "Liste Ihrer Dateien und Ordner.",
+ "List of your files and folders that are not shared." : "Liste Ihrer Dateien und Ordner, die nicht geteilt wurden.",
+ "No personal files found" : "Keine persönlichen Dateien gefunden",
+ "Files that are not shared will show up here." : "Dateien, die nicht geteilt wurden, werden hier angezeigt.",
+ "Recent" : "Neueste",
+ "List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner.",
+ "No recently modified files" : "Keine kürzlich geänderten Dateien",
+ "Files and folders you recently modified will show up here." : "Die von Ihnen kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
+ "Search" : "Suche",
+ "Search results within your files." : "Suchergebnisse innerhalb Ihrer Dateien.",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
- "No favorites yet" : "Noch keine Favoriten vorhanden",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
- "Deleted files" : "Gelöschte Dateien",
- "Shares" : "Freigaben",
- "Shared with others" : "Mit anderen geteilt",
- "Shared with you" : "Mit Ihnen geteilt",
- "Shared by link" : "Über einen Link geteilt",
- "Deleted shares" : "Gelöschte Freigaben",
- "Pending shares" : "Ausstehende Freigaben",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
+ "Show list view" : "Listenansicht anzeigen",
+ "Show grid view" : "Kachelansicht anzeigen",
+ "Close" : "Schließen",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
+ "Upload cancelled." : "Hochladen abgebrochen.",
+ "Processing files …" : "Dateien werden verarbeitet…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
+ "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
+ "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
+ "File could not be uploaded" : "Datei konnte nicht hochgeladen werden",
+ "Uploading …" : "Lade hoch …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lade hoch… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
+ "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
+ "Choose target folder" : "Zielordner auswählen",
+ "Set reminder" : "Erinnerung erstellen",
+ "Edit locally" : "Lokal bearbeiten",
+ "Open" : "Öffnen",
+ "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
+ "Please select tag(s) to add to the selection" : "Bitte wählen Sie das/die Schlagwort(e) aus, das/die Sie zur Auswahl hinzufügen möchten",
+ "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
+ "Select directory \"{dirName}\"" : "Ordner \"{dirName}\" auswählen",
+ "Select file \"{fileName}\"" : "Datei \"{fileName}\" auswählen",
+ "Unable to determine date" : "Datum konnte nicht ermittelt werden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Protokolldateien oder kontaktieren Sie die Administration",
+ "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
+ "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
+ "copy" : "Kopie",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
+ "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
+ "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
+ "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
+ "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Geben Sie mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
+ "{dirs} and {files}" : "{dirs} und {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
+ "You do not have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"],
+ "New" : "Neu",
+ "New file/folder menu" : "Menü für neue Datei/Ordner",
+ "Select file range" : "Dateibereich auswählen",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used} verwendet",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ist kein gültiger Dateiname.",
+ "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" ist kein erlaubter Dateityp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ihr Speicher ist beinahe voll ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlink wurde kopiert (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Favored" : "Favorisiert",
+ "Favor" : "Favorisieren",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Personen, die Zugriff auf diese Datei bzw. den Ordner haben)",
+ "Upload file" : "Datei hochladen",
+ "Not favored" : "Nicht favorisiert",
+ "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Schlagworte aufgetreten",
+ "Upload (max. %s)" : "Hochladen (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Aktion \"{displayName}\" ausgeführt",
+ "\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
+ "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
+ "Submitting fields…" : "Felder werden übermittelt…",
+ "Filter filenames…" : "Dateinamen filtern…",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL in die Zwischenablage kopiert",
+ "Enable the grid view" : "Kachelansicht aktivieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Copy to clipboard" : "In die Zwischenablage kopieren",
+ "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
+ "Deletion cancelled" : "Löschen abgebrochen",
+ "Move cancelled" : "Verschieben abgebrochen",
+ "Cancelled move or copy of \"{filename}\"." : "Verschieben oder Kopieren von \"{filename}\" abgebrochen.",
+ "Cancelled move or copy operation" : "Verschieben oder kopieren abgebrochen",
+ "Open details" : "Details öffnen",
+ "Photos and images" : "Fotos und Bilder",
+ "New folder creation cancelled" : "Erstellung des neuen Ordners abgebrochen",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} Datei und 1 Ordner","{fileCount} Dateien und 1 Ordner"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} Dateien und {folderCount} Ordner",
+ "All folders" : "Alle Ordner",
+ "Personal Files" : "Persönliche Dateien",
"Text file" : "Textdatei",
"New text file.txt" : "Neue Textdatei file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"]
+ "%1$s (renamed)" : "%1$s (umbenannt)",
+ "renamed file" : "Umbenannte Datei",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "Filter file names …" : "Dateinamen filtern …",
+ "Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
+ "Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
+ "Speed up your Files experience with these quick shortcuts." : "Arbeiten Sie schneller mit Dateien mit diesen Schnellzugriffen.",
+ "Open the actions menu for a file" : "Aktionsmenü für eine Datei öffnen",
+ "Rename a file" : "Eine Datei umbenennen",
+ "Delete a file" : "Eine Datei löschen",
+ "Favorite or remove a file from favorites" : "Datei favorisieren oder aus den Favoriten entfernen",
+ "Manage tags for a file" : "Schlagworte für eine Datei verwalten",
+ "Deselect all files" : "Auswahl aller Dateien aufheben",
+ "Select or deselect a file" : "Auswählen oder Auswahl einer Datei aufheben",
+ "Select a range of files" : "Einen Bereich von Dateien auswählen",
+ "Navigate to the parent folder" : "Zum übergeordneten Ordner navigieren",
+ "Navigate to the file above" : "Zur obigen Datei navigieren",
+ "Navigate to the file below" : "Zur unteren Datei navigieren",
+ "Navigate to the file on the left (in grid mode)" : "Zur Datei links navigieren (in der Kachelansicht)",
+ "Navigate to the file on the right (in grid mode)" : "Zur Datei rechts navigieren (in der Kachelansicht)",
+ "Toggle the grid view" : "Kachelansicht umschalten",
+ "Open the sidebar for a file" : "Seitenleiste für eine Datei öffnen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 44b26dc0e7b..403987f92f0 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
- "Storage invalid" : "Speicher ungültig",
- "Unknown error" : "Unbekannter Fehler",
- "File could not be found" : "Datei konnte nicht gefunden werden",
- "Move or copy" : "Verschieben oder kopieren",
- "Download" : "Herunterladen",
- "Delete" : "Löschen",
- "Home" : "Home",
- "Close" : "Schließen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
- "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
- "Upload cancelled." : "Hochladen abgebrochen.",
- "Processing files …" : "Dateien werden verarbeitet…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
- "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
- "Not enough free space" : "Nicht genügend freier Speicherplatz",
- "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
- "Uploading …" : "Lade hoch …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
- "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
- "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
- "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
- "Actions" : "Aktionen",
- "Rename" : "Umbenennen",
- "Copy" : "Kopieren",
- "Choose target folder" : "Zielordner auswählen",
- "Open" : "Öffnen",
- "Delete file" : "Datei löschen",
- "Delete folder" : "Ordner löschen",
- "Disconnect storage" : "Speicher trennen",
- "Leave this share" : "Diese Freigabe verlassen",
- "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
- "Files" : "Dateien",
- "Details" : "Details",
- "Please select tag(s) to add to the selection" : "Bitte wählen Sie das/die Schlagwort(e) aus, das/die Sie zur Auswahl hinzufügen möchten",
- "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
- "Select" : "Auswählen",
- "Pending" : "Ausstehend",
- "Unable to determine date" : "Datum konnte nicht ermittelt werden",
- "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
- "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
- "copy" : "Kopie",
- "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
- "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
- "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
- "{newName} already exists" : "{newName} existiert bereits",
- "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei \"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte wählen Sie einen anderen Namen.",
- "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
- "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert",
- "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
- "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
- "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Geben Sie mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
- "Name" : "Name",
- "Size" : "Größe",
- "Modified" : "Geändert",
- "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
- "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
- "{dirs} and {files}" : "{dirs} und {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
- "You don’t have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"],
- "New" : "Neu",
- "Select file range" : "Dateibereich auswählen",
- "{used} of {quota} used" : "{used} von {quota} verwendet",
- "{used} used" : "{used} verwendet",
- "\"{name}\" is an invalid file name." : "„{name}“ ist kein gültiger Dateiname.",
- "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
- "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ihr Speicher ist beinahe voll ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
- "View in folder" : "In Ordner anzeigen",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Benutzer, die Zugriff auf diese(n) Datei/Ordner haben)",
- "Path" : "Pfad",
- "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
- "Favorited" : "Favorisiert",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Sie können gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren",
- "New folder" : "Neuer Ordner",
- "Upload file" : "Datei hochladen",
- "Recent" : "Neueste",
- "Not favorited" : "Nicht favorisiert",
- "Remove from favorites" : "Von Favoriten entfernen",
- "Add to favorites" : "Zu den Favoriten hinzufügen",
- "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
"You removed {file} from your favorites" : "Sie haben {file} aus Ihren Favoriten entfernt",
+ "Favorites" : "Favoriten",
"File changes" : "Dateiänderungen",
"Created by {user}" : "Erstellt durch {user}",
"Changed by {user}" : "Geändert durch {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Wiederhergestellt durch {user}",
"Renamed by {user}" : "Umbenannt durch {user}",
"Moved by {user}" : "Verschoben durch {user}",
- "\"remote user\"" : "„Externer Benutzer“",
+ "\"remote account\"" : "\"Entferntes Konto\"",
"You created {file}" : "Sie haben {file} erstellt",
"You created an encrypted file in {file}" : "Sie haben eine verschlüsselte Datei in {file} erstellt",
"{user} created {file}" : "{user} hat {file} erstellt",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Sie haben {oldfile} nach {newfile} verschoben",
"{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben",
"A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Ihren <strong>Favoriten</strong> hinzugefügt oder daraus entfernt",
+ "Files" : "Dateien",
"A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Eine favorisierte Datei oder ein Ordner wurde <strong>geändert</strong>",
- "All files" : "Alle Dateien",
- "Unlimited" : "Unbegrenzt",
- "Upload (max. %s)" : "Hochladen (max. %s)",
+ "Failed to authorize" : "Autorisierung fehlgeschlagen",
+ "Invalid folder path" : "Ungültiger Order-Pfad",
+ "Folder not found" : "Ordner nicht gefunden",
+ "The file cannot be found" : "Die Datei kann nicht gefunden werden",
+ "The destination path does not exist: %1$s" : "Der Zielpfad existiert nicht: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sie haben nicht die Berechtigung, eine Datei am angegebenen Speicherort zu erstellen",
+ "The file could not be converted." : "Die Datei konnte nicht konvertiert werden.",
+ "Could not get relative path to converted file" : "Relativer Pfad zur konvertierten Datei konnte nicht ermittelt werden",
+ "Favorite files" : "Favorisierte Dateien",
+ "No favorites" : "Keine Favoriten",
+ "More favorites" : "Weitere Favoriten",
"Accept" : "Akzeptieren",
"Reject" : "Ablehnen",
"Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.",
+ "Ownership transfer denied" : "Besitzübertragung abgelehnt",
+ "Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Besitzübertragung von {path} vom Benutzer {user} ist fehlgeschlagen.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Übertragen von %1$s an %2$s",
+ "Files compatibility" : "Dateikompatibilität",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ermöglicht die Einschränkung von Dateinamen, um sicherzustellen, dass Dateien mit allen Clients synchronisiert werden können. Standardmäßig sind alle unter POSIX (z. B. Linux oder macOS) gültigen Dateinamen zulässig.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl \"occ“.",
+ "Enforce Windows compatibility" : "Windows-Kompatibilität erzwingen",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dadurch werden Dateinamen blockiert, die auf Windows-Systemen unzulässig sind, z. B. reservierte Namen oder Sonderzeichen. Die Kompatibilität der Groß-/Kleinschreibung wird dadurch jedoch nicht erzwungen.",
"File Management" : "Dateiverwaltung",
- "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
- "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
- "Change" : "Ändern",
- "New owner" : "Neuer Besitzer",
- "Search users" : "Suche Benutzer",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Zielordner existiert nicht mehr",
+ "Reload current directory" : "Aktuelles Verzeichnis neu laden",
+ "Go to the \"{dir}\" directory" : "In das Verzeichnis \"{dir}\" wechseln",
+ "Current directory path" : "Aktueller Verzeichnispfad",
+ "Your have used your space quota and cannot upload files anymore" : "Ihr Speicherplatzkontigent ist aufgebraucht, Sie können keine weiteren Dateien hochladen",
+ "You do not have permission to upload or create files here." : "Sie haben nicht die Berechtigung, hier Dateien hochzuladen oder zu erstellen.",
+ "Drag and drop files here to upload" : "Dateien zum Hochladen hierher ziehen und ablegen",
+ "Favorite" : "Favorit",
+ "Back" : "Zurück",
+ "Toggle selection for file \"{displayName}\"" : "Auswahl für die Datei \"{displayName}\" umschalten",
+ "Toggle selection for folder \"{displayName}\"" : "Auswahl für den Ordner \"{displayName}\" umschalten",
+ "File is loading" : "Datei wird geladen",
+ "Folder is loading" : "Ordner wird geladen",
+ "Filename" : "Dateiname",
+ "Folder name" : "Ordnername",
+ "This node is unavailable" : "Dieser Knoten ist nicht verfügbar",
+ "Another entry with the same name already exists." : "Ein anderer Eintrag mit diesem Namen existiert bereits.",
+ "Invalid filename." : "Ungültiger Dateiname.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt",
+ "Rename file" : "Datei umbenennen",
+ "Folder" : "Ordner",
+ "Unknown file type" : "Unbekannter Dateityp",
+ "{ext} image" : "{ext}-Bild",
+ "{ext} video" : "{ext}-Video",
+ "{ext} audio" : "{ext}-Audio",
+ "{ext} text" : "{ext}-Text",
+ "Pending" : "Ausstehend",
+ "Unknown date" : "Unbekanntes Datum",
+ "Clear filter" : "Filter zurücksetzen",
+ "Modified" : "Geändert",
+ "Search everywhere" : "Überall suchen",
+ "Type" : "Typ",
+ "Active filters" : "Aktive Filter",
+ "Remove filter" : "Filter entfernen",
+ "Total rows summary" : "Zusammenfassung aller Zeilen",
+ "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten",
+ "Name" : "Name",
+ "File type" : "Dateityp",
+ "Size" : "Größe",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: done" : "{displayName}: Abgeschlossen",
+ "{displayName}: failed" : "{displayName}: Fehlgeschlagen",
+ "Actions" : "Aktionen",
+ "(selected)" : "(ausgewählt)",
+ "List of files and folders." : "Liste der Dateien und Ordner.",
+ "You have used your space quota and cannot upload files anymore." : "Ihr Speicherplatzkontigent ist aufgebraucht, Sie können keine weiteren Dateien hochladen.",
+ "Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
+ "File not found" : "Datei nicht gefunden",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
+ "Search everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
+ "Search scope options" : "Suchbereichsoptionen",
+ "Search here" : "Hier suchen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
+ "{used} of {quota} used" : "{used} von {quota} verwendet",
+ "{relative}% used" : "{relative} % verwendet",
+ "Could not refresh storage stats" : "Die Speicherstatistik konnte nicht aktualisiert werden",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage information" : "Speicherinformation",
+ "Storage quota" : "Speicherkontingent",
+ "New folder" : "Neuer Ordner",
+ "Create new folder" : "Neuen Ordner erstellen",
+ "This name is already in use." : "Dieser Name wird bereits verwendet.",
+ "Create" : "Erstellen",
+ "Files starting with a dot are hidden by default" : "Dateien, die mit einem Punkt beginnen, sind standardmäßig ausgeblendet",
+ "Fill template fields" : "Vorlagenfelder ausfüllen",
+ "Submitting fields …" : "Felder werden übermittelt …",
+ "Submit" : "Übermitteln",
"Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
"Transfer" : "Übertragen",
"Transfer {path} to {userid}" : "Übertrage {path} an {userid}",
"Invalid path selected" : "Ungültiger Pfad ausgewählt",
+ "Unknown error" : "Unbekannter Fehler",
"Ownership transfer request sent" : "Anforderung für die Besitzübertragung versendet",
- "Cannot transfer ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Sie nicht besitzen, kann nicht übertragen werden",
- "Tags" : "Tags",
- "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei kann nicht geändert werden",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sie können den Besitz von Dateien oder Ordnern, die Sie nicht besitzen, nicht übertragen",
+ "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen",
+ "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen",
+ "Change" : "Ändern",
+ "New owner" : "Neuer Besitzer",
+ "Keep {old}" : "{old} behalten",
+ "Keep without extension" : "Ohne Erweiterung behalten",
+ "Use {new}" : "{new} verwenden",
+ "Remove extension" : "Dateierweiterung entfernen",
+ "Change file extension" : "Dateierweiterungen ändern",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ändern der Dateierweiterung von \"{old}\" zu \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Entfernen der Dateierweiterung \"{old}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Hinzufügen der Dateierweiterung \"{new}\" kann dazu führen, dass die Datei unlesbar wird.",
+ "Do not show this dialog again." : "Diesen Dialog nicht mehr anzeigen.",
+ "Select file or folder to link to" : "Datei oder Ordner zum Verknüpfen auswählen",
+ "Choose {file}" : "{file} auswählen",
+ "Share" : "Teilen",
+ "Shared by link" : "Über einen Link geteilt",
+ "Shared" : "Geteilt",
+ "Switch to list view" : "Zur Listenansicht wechseln",
+ "Switch to grid view" : "Zur Kachelansicht wechseln",
+ "The file could not be found" : "Die Datei konnte nicht gefunden werden",
+ "Upload was cancelled by user" : "Das Hochladen wurde vom Benutzer abgebrochen",
+ "Not enough free space" : "Nicht genügend freier Speicherplatz",
+ "Operation is blocked by access control" : "Vorgang wird durch die Zugangskontrolle blockiert",
+ "Error during upload: {message}" : "Fehler beim Hochladen: {message}",
+ "Error during upload, status code {status}" : "Fehler beim Hochladen, Statuscode {status}",
+ "Unknown error during upload" : "Unbekannter Fehler beim Hochladen",
+ "Loading current folder" : "Lade aktuellen Ordner",
+ "Retry" : "Wiederholen",
+ "No files in here" : "Keine Dateien vorhanden",
+ "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie Ihre Geräte!",
+ "Go back" : "Zurückgehen",
+ "Views" : "Ansichten",
+ "Files settings" : "Dateien-Einstellungen",
+ "Your files" : "Ihre Dateien",
+ "Open in files" : "In Dateien öffnen",
+ "File cannot be accessed" : "Auf die Datei kann nicht zugegriffen werden",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Die Datei konnte nicht gefunden werden oder Sie haben keine Berechtigungen, um sie anzuzeigen. Bitten Sie den Absender, die Datei zu teilen.",
+ "No search results for “{query}”" : "Keine Suchergebnisse für \"{query}\"",
+ "Search for files" : "Nach Dateien suchen",
+ "Clipboard is not available" : "Zwischenablage ist nicht verfügbar",
+ "WebDAV URL copied" : "WebDAV-URL kopiert",
+ "General" : "Allgemein",
+ "Default view" : "Standardansicht",
+ "All files" : "Alle Dateien",
+ "Personal files" : "Persönliche Dateien",
+ "Sort favorites first" : "Favoriten zuerst sortieren",
+ "Sort folders before files" : "Ordner vor Dateien sortieren",
+ "Folder tree" : "Ordnerbaum",
+ "Appearance" : "Aussehen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
+ "Show file type column" : "Dateityp-Spalte anzeigen",
+ "Show file extensions" : "Dateierweiterungen anzeigen",
+ "Crop image previews" : "Bildvorschauen zuschneiden",
+ "Additional settings" : "Zusätzliche Einstellungen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-URL",
+ "Copy" : "Kopieren",
+ "How to access files using WebDAV" : "So greifen Sie mit WebDAV auf Dateien zu",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Für Ihr Konto ist die Zwei-Faktor-Authentifizierung aktiviert. Zur Verbindung eines externen WebDAV-Clients ist daher die Verwendung eines App-Passwortes erforderlich.",
+ "Warnings" : "Warnungen",
+ "Warn before changing a file extension" : "Vor der Änderung einer Dateierweiterung warnen",
+ "Warn before deleting files" : "Vor dem Löschen von Dateien warnen",
+ "Keyboard shortcuts" : "Tastaturkürzel",
+ "File actions" : "Dateiaktionen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Add or remove favorite" : "Favorit hinzufügen oder entfernen",
+ "Manage tags" : "Schlagworte verwalten",
+ "Selection" : "Auswahl",
+ "Select all files" : "Alle Dateien auswählen",
+ "Deselect all" : "Auswahl aufheben",
+ "Select or deselect" : "Aus- oder abwählen",
+ "Select a range" : "Einen Bereich auswählen",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Zum übergeordneten Ordner wechseln",
+ "Go to file above" : "Zur Datei darüber wechseln",
+ "Go to file below" : "Zur Datei darunter wechseln",
+ "Go left in grid" : "Im Raster nach links gehen",
+ "Go right in grid" : "Im Raster nach rechts gehen",
+ "View" : "Ansicht",
+ "Toggle grid view" : "Kachelansicht umschalten",
+ "Open file sidebar" : "Datei-Seitenleiste öffnen",
+ "Show those shortcuts" : "Diese Tastaturkürzel anzeigen",
+ "You" : "Sie",
+ "Shared multiple times with different people" : "Mehrmals mit verschiedenen Personen geteilt",
+ "Unable to change the favorite state of the file" : "Der Favoriten-Status der Datei kann nicht geändert werden",
"Error while loading the file data" : "Fehler beim Laden der Datei-Daten",
+ "Owner" : "Besitzer",
+ "Remove from favorites" : "Von Favoriten entfernen",
+ "Add to favorites" : "Zu den Favoriten hinzufügen",
+ "Tags" : "Schlagworte",
+ "Blank" : "Leer",
+ "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
"Pick a template for {name}" : "Eine Vorlage für {name} wählen",
- "Cancel" : "Abbrechen",
- "Create" : "Erstellen",
"Create a new file with the selected template" : "Eine neue Datei anhand der ausgewählten Vorlage erstellen",
"Creating file" : "Datei erstellen",
- "Blank" : "Leer",
- "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden",
- "Set up templates folder" : "Vorlagenordner einrichten",
- "Templates" : "Vorlagen",
+ "Save as {displayName}" : "Speichern als {displayName}",
+ "Save as …" : "Speichern als …",
+ "Converting files …" : "Dateien werden konvertiert …",
+ "Failed to convert files: {message}" : "Fehler beim Konvertieren der Dateien: {message}",
+ "All files failed to be converted" : "Alle Dateien konnten nicht konvertiert werden",
+ "One file could not be converted: {message}" : "Eine Datei konnte nicht konvertiert werden: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Eine Datei konnte nicht konvertiert werden","%n Dateien konnten nicht konvertiert werden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Eine Datei konvertiert","%n Dateien konvertiert"],
+ "Files successfully converted" : "Dateien konvertiert",
+ "Failed to convert files" : "Dateien konnten nicht konvertiert werden",
+ "Converting file …" : "Datei wird konvertiert …",
+ "File successfully converted" : "Datei konvertiert",
+ "Failed to convert file: {message}" : "Fehler beim Konvertieren der Datei: {message}",
+ "Failed to convert file" : "Datei konnte nicht konvertiert werden",
+ "Leave this share" : "Diese Freigabe verlassen",
+ "Leave these shares" : "Diese Freigaben verlassen",
+ "Disconnect storage" : "Speicher trennen",
+ "Disconnect storages" : "Speicher trennen",
+ "Delete permanently" : "Endgültig löschen",
+ "Delete and unshare" : "Löschen und nicht mehr teilen",
+ "Delete file" : "Datei löschen",
+ "Delete files" : "Dateien löschen",
+ "Delete folder" : "Ordner löschen",
+ "Delete folders" : "Ordner löschen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sie sind dabei, {count} Element endgültig zu löschen","Sie sind dabei, {count} Elemente endgültig zu löschen"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sie sind dabei, {count} Element zu löschen","Sie sind dabei, {count} Elemente zu löschen"],
+ "Confirm deletion" : "Löschen bestätigen",
+ "Cancel" : "Abbrechen",
+ "Download" : "Herunterladen",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
+ "Destination is not a folder" : "Ziel ist kein Ordner",
+ "This file/folder is already in that directory" : "Diese Datei oder Ordner ist bereits in diesem Verzeichnis vorhanden",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden",
+ "(copy)" : "(Kopie)",
+ "(copy %n)" : "(Kopie %n)",
+ "A file or folder with that name already exists in this folder" : "In diesem Ordner ist bereits eine Datei oder ein Ordner mit diesem Namen vorhanden",
+ "The files are locked" : "Die Dateien sind gesperrt",
+ "The file does not exist anymore" : "Diese Datei existiert nicht mehr",
+ "Choose destination" : "Ziel wählen",
+ "Copy to {target}" : "Nach {target} kopieren",
+ "Move to {target}" : "Nach {target} verschieben",
+ "Move" : "Verschieben",
+ "Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
+ "Move or copy" : "Verschieben oder kopieren",
+ "Open folder {displayName}" : "Ordner {displayName} öffnen",
+ "Open in Files" : "In Dateien öffnen",
+ "Open locally" : "Lokal öffnen",
+ "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
+ "Open file locally" : "Datei lokal öffnen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Die Datei sollte sich jetzt auf Ihrem Gerät öffnen. Wenn dies nicht der Fall ist, überprüfen Sie, ob Sie die Desktop-App installiert haben.",
+ "Retry and close" : "Erneut versuchen und schließen",
+ "Open online" : "Online öffnen",
+ "Details" : "Details",
+ "View in folder" : "In Ordner anzeigen",
+ "Today" : "Heute",
+ "Last 7 days" : "Die letzten 7 Tage",
+ "Last 30 days" : "Die letzten 30 Tage",
+ "This year ({year})" : "Dieses Jahr ({year})",
+ "Last year ({year})" : "Letztes Jahr ({year})",
+ "Documents" : "Dokumente",
+ "Spreadsheets" : "Tabellenkalkulationen",
+ "Presentations" : "Präsentationen",
+ "PDFs" : "PDFs",
+ "Folders" : "Ordner",
+ "Audio" : "Audio",
+ "Images" : "Bilder",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Neuer Ordner \"{name}\" wurde erstellt",
"Unable to initialize the templates directory" : "Der Vorlagenordner kann nicht initialisiert werden",
- "%s used" : "%s verwendet",
- "%s%% of %s used" : "%s%% von %s verwendet",
- "%1$s of %2$s used" : "%1$s von %2$s verwendet",
- "Settings" : "Einstellungen",
- "Show hidden files" : "Versteckte Dateien anzeigen",
- "Crop image previews" : "Bildvorschauen zuschneiden",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen",
- "Toggle %1$s sublist" : "Unterliste %1$s umschalten",
- "Toggle grid view" : "Rasteransicht umschalten",
- "No files in here" : "Keine Dateien vorhanden",
- "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
+ "Create templates folder" : "Vorlagenordner erstellen",
+ "Templates" : "Vorlagen",
+ "New template folder" : "Neuer Vorlagenordner",
+ "In folder" : "Im Ordner",
+ "Search in all files" : "In allen Dateien suchen",
+ "Search in folder: {folder}" : "Im Ordner suchen: {folder}",
+ "One of the dropped files could not be processed" : "Eine der abgelegten Dateien konnte nicht verarbeitet werden",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ihr Browser unterstützt die Dateisystem-API nicht. Verzeichnisse werden nicht hochgeladen",
+ "No files to upload" : "Keine Dateien zum Hochladen",
+ "Unable to create the directory {directory}" : "Der Ordner {directory} konnte nicht erstellt werden",
+ "Some files could not be uploaded" : "Einige Dateien konnten nicht hochgeladen werden.",
+ "Files uploaded successfully" : "Dateien hochgeladen",
+ "No files to process" : "Keine Dateien zum Verarbeiten",
+ "Some files could not be copied" : "Einige Dateien konnten nicht kopiert werden",
+ "Some files could not be moved" : "Einige Dateien konnten nicht verschoben werden",
+ "Files copied successfully" : "Dateien kopiert",
+ "Files moved successfully" : "Dateien verschoben",
+ "Conflicts resolution skipped" : "Konfliktelösung übersprungen",
+ "Upload cancelled" : "Hochladen abgebrochen",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" konnte nicht umbenannt werden, da es nicht mehr existiert",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{newName}“ wird bereits im Ordner \"{dir}“ verwendet. Bitte einen anderen Namen wählen.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" konnte nicht umbenannt werden",
+ "This operation is forbidden" : "Diese Operation ist nicht erlaubt",
+ "This folder is unavailable, please try again later or contact the administration" : "Dieser Ordner ist nicht verfügbar. Bitte später erneut versuchen oder an die Administration wenden",
+ "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
+ "Unexpected error: {error}" : "Unerwarteter Fehler: {error}",
+ "_%n file_::_%n files_" : ["%n Datei","%n Dateien"],
+ "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"],
+ "_%n hidden_::_%n hidden_" : ["%n versteckt","%n versteckt"],
+ "Filename must not be empty." : "Dateiname darf nicht leer sein.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ist innerhalb eines Dateinamens nicht zulässig.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ist ein reservierter Name und für Dateinamen nicht zulässig.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ist kein zulässiger Dateityp.",
+ "Filenames must not end with \"{extension}\"." : "Dateinamen dürfen nicht mit \"{extension}\" enden.",
+ "List of favorite files and folders." : "Liste der favorisierten Ordner und Dateien.",
+ "No favorites yet" : "Noch keine Favoriten vorhanden",
+ "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
+ "List of your files and folders." : "Liste Ihrer Dateien und Ordner.",
+ "List of your files and folders that are not shared." : "Liste Ihrer Dateien und Ordner, die nicht geteilt wurden.",
+ "No personal files found" : "Keine persönlichen Dateien gefunden",
+ "Files that are not shared will show up here." : "Dateien, die nicht geteilt wurden, werden hier angezeigt.",
+ "Recent" : "Neueste",
+ "List of recently modified files and folders." : "Liste der zuletzt geänderten Dateien und Ordner.",
+ "No recently modified files" : "Keine kürzlich geänderten Dateien",
+ "Files and folders you recently modified will show up here." : "Die von Ihnen kürzlich geänderten Dateien und Ordner werden hier angezeigt.",
+ "Search" : "Suche",
+ "Search results within your files." : "Suchergebnisse innerhalb Ihrer Dateien.",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
- "No favorites yet" : "Noch keine Favoriten vorhanden",
- "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen",
- "Deleted files" : "Gelöschte Dateien",
- "Shares" : "Freigaben",
- "Shared with others" : "Mit anderen geteilt",
- "Shared with you" : "Mit Ihnen geteilt",
- "Shared by link" : "Über einen Link geteilt",
- "Deleted shares" : "Gelöschte Freigaben",
- "Pending shares" : "Ausstehende Freigaben",
+ "File could not be found" : "Datei konnte nicht gefunden werden",
+ "Show list view" : "Listenansicht anzeigen",
+ "Show grid view" : "Kachelansicht anzeigen",
+ "Close" : "Schließen",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.",
+ "Upload cancelled." : "Hochladen abgebrochen.",
+ "Processing files …" : "Dateien werden verarbeitet…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
+ "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr",
+ "An unknown error has occurred" : "Es ist ein unbekannter Fehler aufgetreten",
+ "File could not be uploaded" : "Datei konnte nicht hochgeladen werden",
+ "Uploading …" : "Lade hoch …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lade hoch… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.",
+ "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}",
+ "Choose target folder" : "Zielordner auswählen",
+ "Set reminder" : "Erinnerung erstellen",
+ "Edit locally" : "Lokal bearbeiten",
+ "Open" : "Öffnen",
+ "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden",
+ "Please select tag(s) to add to the selection" : "Bitte wählen Sie das/die Schlagwort(e) aus, das/die Sie zur Auswahl hinzufügen möchten",
+ "Apply tag(s) to selection" : "Schlagwort(e) auf die Auswahl anwenden",
+ "Select directory \"{dirName}\"" : "Ordner \"{dirName}\" auswählen",
+ "Select file \"{fileName}\"" : "Datei \"{fileName}\" auswählen",
+ "Unable to determine date" : "Datum konnte nicht ermittelt werden",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Protokolldateien oder kontaktieren Sie die Administration",
+ "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits",
+ "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden",
+ "copy" : "Kopie",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits",
+ "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden",
+ "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden, da diese bereits existiert",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden, da dieser bereits existiert",
+ "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden",
+ "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Geben Sie mehr als zwei Zeichen ein, um in anderen Ordnern zu suchen",
+ "{dirs} and {files}" : "{dirs} und {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"],
+ "You do not have permission to upload or create files here" : "Sie haben keine Berechtigung, hier Dateien hochzuladen oder zu erstellen",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hoch geladen","%n Dateien werden hochgeladen"],
+ "New" : "Neu",
+ "New file/folder menu" : "Menü für neue Datei/Ordner",
+ "Select file range" : "Dateibereich auswählen",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used} verwendet",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ist kein gültiger Dateiname.",
+ "File name cannot be empty." : "Der Dateiname darf nicht leer sein.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" ist kein erlaubter Dateityp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppenordner \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externer Speicher \"{mountPoint}\" ist beinahe voll ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ihr Speicher ist beinahe voll ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["stimmt mit \"{filter}\" überein","stimmen mit \"{filter}\" überein"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlink wurde kopiert (funktioniert nur für Personen, die Zugriff auf diese Datei/Ordner haben)",
+ "Path" : "Pfad",
+ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Favored" : "Favorisiert",
+ "Favor" : "Favorisieren",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Personen, die Zugriff auf diese Datei bzw. den Ordner haben)",
+ "Upload file" : "Datei hochladen",
+ "Not favored" : "Nicht favorisiert",
+ "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Schlagworte aufgetreten",
+ "Upload (max. %s)" : "Hochladen (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Aktion \"{displayName}\" ausgeführt",
+ "\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
+ "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
+ "Submitting fields…" : "Felder werden übermittelt…",
+ "Filter filenames…" : "Dateinamen filtern…",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL in die Zwischenablage kopiert",
+ "Enable the grid view" : "Kachelansicht aktivieren",
+ "Enable folder tree" : "Ordnerstruktur aktivieren",
+ "Copy to clipboard" : "In die Zwischenablage kopieren",
+ "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Wenn Sie 2FA aktiviert haben, müssen Sie ein neues App-Passwort erstellen und verwenden, indem Sie hier klicken.",
+ "Deletion cancelled" : "Löschen abgebrochen",
+ "Move cancelled" : "Verschieben abgebrochen",
+ "Cancelled move or copy of \"{filename}\"." : "Verschieben oder Kopieren von \"{filename}\" abgebrochen.",
+ "Cancelled move or copy operation" : "Verschieben oder kopieren abgebrochen",
+ "Open details" : "Details öffnen",
+ "Photos and images" : "Fotos und Bilder",
+ "New folder creation cancelled" : "Erstellung des neuen Ordners abgebrochen",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} Ordner","{folderCount} Ordner"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} Datei","{fileCount} Dateien"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 Datei und {folderCount} Ordner","1 Datei und {folderCount} Ordner"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} Datei und 1 Ordner","{fileCount} Dateien und 1 Ordner"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} Dateien und {folderCount} Ordner",
+ "All folders" : "Alle Ordner",
+ "Personal Files" : "Persönliche Dateien",
"Text file" : "Textdatei",
"New text file.txt" : "Neue Textdatei file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppenordner \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externer Speicher \"{mountPoint}\" ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
- "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"]
+ "%1$s (renamed)" : "%1$s (umbenannt)",
+ "renamed file" : "Umbenannte Datei",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
+ "Filter file names …" : "Dateinamen filtern …",
+ "Prevent warning dialogs from open or reenable them." : "Öffnen von Warndialogen verhindern oder diese erneut aktivieren.",
+ "Show a warning dialog when changing a file extension." : "Beim Ändern einer Dateierweiterung einen Warndialog anzeigen.",
+ "Speed up your Files experience with these quick shortcuts." : "Arbeiten Sie schneller mit Dateien mit diesen Schnellzugriffen.",
+ "Open the actions menu for a file" : "Aktionsmenü für eine Datei öffnen",
+ "Rename a file" : "Eine Datei umbenennen",
+ "Delete a file" : "Eine Datei löschen",
+ "Favorite or remove a file from favorites" : "Datei favorisieren oder aus den Favoriten entfernen",
+ "Manage tags for a file" : "Schlagworte für eine Datei verwalten",
+ "Deselect all files" : "Auswahl aller Dateien aufheben",
+ "Select or deselect a file" : "Auswählen oder Auswahl einer Datei aufheben",
+ "Select a range of files" : "Einen Bereich von Dateien auswählen",
+ "Navigate to the parent folder" : "Zum übergeordneten Ordner navigieren",
+ "Navigate to the file above" : "Zur obigen Datei navigieren",
+ "Navigate to the file below" : "Zur unteren Datei navigieren",
+ "Navigate to the file on the left (in grid mode)" : "Zur Datei links navigieren (in der Kachelansicht)",
+ "Navigate to the file on the right (in grid mode)" : "Zur Datei rechts navigieren (in der Kachelansicht)",
+ "Toggle the grid view" : "Kachelansicht umschalten",
+ "Open the sidebar for a file" : "Seitenleiste für eine Datei öffnen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index 72fc8049271..405918f73bd 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Μη διαθέσιμος χώρος αποθήκευσης προσωρινά",
- "Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος",
- "Unknown error" : "Άγνωστο σφάλμα",
- "File could not be found" : "Δεν μπορεί να βρεθεί το αρχείο",
- "Move or copy" : "Μετακίνηση ή αντιγραφή",
- "Download" : "Λήψη",
- "Delete" : "Διαγραφή",
- "Home" : "Αρχική",
- "Close" : "Κλείσιμο",
- "Favorites" : "Αγαπημένα",
- "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
- "This will stop your current uploads." : "Αυτό θα σταματήσει τις τρέχουσες μεταφορτώσεις.",
- "Upload cancelled." : "Η μεταφόρτωση ακυρώθηκε.",
- "Processing files …" : "Γίνεται επεξεργασία των αρχείων …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος ή έχει 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνεται {size1} αλλά υπάρχει χώρος μόνο για {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Ο φάκελος προορισμού \"{dir}\" δεν υπάρχει πλέον",
- "Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
- "An unknown error has occurred" : "Προέκυψε άγνωστο σφάλμα.",
- "Uploading …" : "Μεταφόρτωση σε εξέλιξη ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} από {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Η μεταφόρτωση αυτού του αντικειμένου δεν υποστηρίζεται",
- "Target folder does not exist any more" : "Ο φάκελος προορισμού δεν υπάρχει πια",
- "Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
- "Error when assembling chunks, status code {status}" : "Σφάλμα κατά την συλλογή τμημάτων, κωδικός κατάστασης {status}",
- "Actions" : "Ενέργειες",
- "Rename" : "Μετονομασία",
- "Copy" : "Αντιγραφή",
- "Choose target folder" : "Επιλογή φακέλου προορισμού",
- "Open" : "Άνοιγμα",
- "Delete file" : "Διαγραφή αρχείου",
- "Delete folder" : "Διαγραφή φακέλου",
- "Disconnect storage" : "Αποσύνδεση αποθηκευτικού χώρου",
- "Leave this share" : "Αποχωρήστε από αυτήν την κοινή χρήση",
- "Could not load info for file \"{file}\"" : "Αδυναμία φόρτωσης πληροφοριών για το αρχείο \"{file}\"",
- "Files" : "Αρχεία",
- "Details" : "Λεπτομέρειες",
- "Please select tag(s) to add to the selection" : "Επιλέξτε ετικέτα (ες) για προσθήκη στην επιλογή",
- "Apply tag(s) to selection" : "Εφαρμογή ετικετών στην επιλογή",
- "Select" : "Επιλογή",
- "Pending" : "Εκκρεμεί",
- "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας",
- "This operation is forbidden" : "Αυτή η λειτουργία απαγορεύεται",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλούμε ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
- "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
- "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
- "copy" : "αντιγραφή",
- "Could not copy \"{file}\", target exists" : "Αδυναμία αντιγραφής του \"{file}\", υπάρχει ήδη.",
- "Could not copy \"{file}\"" : "Αδυναμία αντιγραφής του \"{file}\"",
- "Copied {origin} inside {destination}" : "Αντιγράφτηκε το {origin} στο {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Αντιγράφτηκε το {origin} και {nbfiles} άλλα αρχεία στο {destination}",
- "{newName} already exists" : "Το {newname} υπάρχει ήδη",
- "Could not rename \"{fileName}\", it does not exist any more" : "Αδυναμία μετονομασίας του \"{fileName}\", το αρχείο δεν υπάρχει πια.",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Το όνομα \"{targetName}\" χρησιμοποιείται ήδη στον φάκελο\"{dir}\". Παρακαλούμε διαλέξτε ένα διαφορετικό όνομα.",
- "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"",
- "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του αρχείου \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Αδυναμία δημιουργίας του αρχείου \"{file}\" επειδή υπάρχει ήδη",
- "Could not create folder \"{dir}\" because it already exists" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\" επειδή υπάρχει ήδη",
- "Could not fetch file details \"{file}\"" : "Δεν είναι δυνατή η ανάγνωση λεπτομερειών του αρχείου \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Σφάλμα διαγραφής του \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Κανένα αποτέλεσμα αναζήτησης σε άλλους φακέλους για {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Εισαγάγετε περισσότερους από δύο χαρακτήρες για αναζήτηση σε άλλους φακέλους",
- "Name" : "Όνομα",
- "Size" : "Μέγεθος",
- "Modified" : "Τροποποιήθηκε",
- "_%n folder_::_%n folders_" : ["%n φάκελος","%n φάκελοι"],
- "_%n file_::_%n files_" : ["%n αρχείο","%n αρχεία"],
- "{dirs} and {files}" : "{dirs} και {files}",
- "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"],
- "You don’t have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ",
- "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"],
- "New" : "Νέο",
- "Select file range" : "Επιλέξτε εύρος αρχείων",
- "{used} of {quota} used" : "Χρήση {used} από {quota} ",
- "{used} used" : "Σε χρήση {used}",
- "\"{name}\" is an invalid file name." : "Το \"{name}\" δεν είναι έγκυρο όνομα αρχείου.",
- "File name cannot be empty." : "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
- "\"/\" is not allowed inside a file name." : "Το \"/\" δεν είναι επιτρεπτό εντός του ονόματος αρχείου.",
- "\"{name}\" is not an allowed filetype" : "Το \"{name}\" δεν είναι ένας επιτρεπτός τύπος αρχείου",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του/της {owner} είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο φάκελος της ομάδας \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός χώρος του {owner} είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο φάκελος ομάδας \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός σας χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Ταιριάζει \"{filter}\"","Ταιριάζουν \"{filter}\""],
- "View in folder" : "Προβολή στον φάκελο",
- "Copied!" : "Αντιγράφηκε!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Αντιγραφή άμεσου συνδέσμου (λειτουργεί μόνο για χρήστες που έχουν πρόσβαση στο αρχείο/φάκελο)",
- "Path" : "Διαδρομή",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Αγαπημένα",
- "Favorite" : "Αγαπημένο",
- "You can only favorite a single file or folder at a time" : "Προσθήκη στα αγαπημένα ενός αρχείου ή φακέλου κάθε φορά",
- "New folder" : "Νέος φάκελος",
- "Upload file" : "Μεταφόρτωση αρχείου",
- "Recent" : "Πρόσφατα",
- "Not favorited" : "Δεν είναι αγαπημένο",
- "Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
- "Add to favorites" : "Προσθήκη στα αγαπημένα",
- "An error occurred while trying to update the tags" : "Ένα σφάλμα προέκυψε κατά τη διάρκεια ενημέρωσης των ετικετών",
"Added to favorites" : "Προστέθηκε στα αγαπημένα",
"Removed from favorites" : "Αφαιρέθηκε από τα αγαπημένα",
"You added {file} to your favorites" : "Προσθέσατε το {file} στα αγαπημένα σας",
"You removed {file} from your favorites" : "Αφαιρέσατε το {file} από τα αγαπημένα σας",
+ "Favorites" : "Αγαπημένα",
"File changes" : "Αλλαγές αρχείου",
"Created by {user}" : "Δημιουργήθηκε από τον {user}",
"Changed by {user}" : "Άλλαξε από τον {user}",
@@ -116,7 +13,6 @@ OC.L10N.register(
"Restored by {user}" : "Επαναφέρθηκε από τον {user}",
"Renamed by {user}" : "Μετονομάστηκε από τον {user}",
"Moved by {user}" : "Μετακινήθηκε από τον {user}",
- "\"remote user\"" : "\"απομακρυσμένος χρήστης\"",
"You created {file}" : "Δημιουργήσατε το {file}",
"You created an encrypted file in {file}" : "Δημιουργήσατε ένα κρυπτογραφημένο αρχείο στο {file}",
"{user} created {file}" : "Ο/η {user} δημιούργησε {file}",
@@ -143,15 +39,16 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Μεταφέρατε το {oldfile} σε {newfile}",
"{user} moved {oldfile} to {newfile}" : "Ο/η {user} μετέφερε το {oldfile} σε {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Ένα αρχείο έχει προστεθεί ή αφαιρεθεί από τα <strong>αγαπημένα</strong> σας",
+ "Files" : "Αρχεία",
"A file or folder has been <strong>changed</strong>" : "Ένα αρχείο ή κατάλογος έχουν <strong>αλλάξει</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Ένα αγαπημένο αρχείο ή φάκελός σας έχει <strong>τροποποιηθεί</strong>.",
- "All files" : "Όλα τα αρχεία",
- "Unlimited" : "Απεριόριστο",
- "Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
+ "No favorites" : "Δεν υπάρχουν αγαπημένα",
"Accept" : "Αποδοχή",
"Reject" : "Απόρριψη",
"Incoming ownership transfer from {user}" : "Εισερχόμενη μεταβίβαση κυριότητας από τον {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Δέχεστε την διαδρομή {path}?\n\nΣημείωση: Η διαδικασία μεταφοράς μπορεί να διαρκέσει πάνω από μία ώρα.",
+ "Ownership transfer denied" : "Η μεταφορά κυριότητας απορρίφθηκε",
+ "Your ownership transfer of {path} was denied by {user}." : "Η μεταφορά της κυριότητας του {path} απορρίφθηκε από τον χρήστη {user}.",
"Ownership transfer failed" : "Η μεταφορά κυριότητας απέτυχε",
"Your ownership transfer of {path} to {user} failed." : "Η μεταφορά κυριότητας σας του {path} στον {user} απέτυχε.",
"The ownership transfer of {path} from {user} failed." : "Η μεταφορά κυριότητας του {path} από {user} απέτυχε.",
@@ -159,62 +56,302 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Η μεταφορά κυριότητας σας του {path} στον {user} ολοκληρώθηκε.",
"The ownership transfer of {path} from {user} has completed." : "Η μεταφορά κυριότητας του {path} στον {user} ολοκληρώθηκε.",
"in %s" : "σε %s",
+ "Transferred from %1$s on %2$s" : "Μεταβιβάστηκε από %1$s σε %2$s",
+ "Enforce Windows compatibility" : "Επιβολή συμβατότητας με Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Αυτό θα αποκλείσει ονόματα αρχείων που δεν είναι έγκυρα σε συστήματα Windows, όπως η χρήση δεσμευμένων ονομάτων ή ειδικών χαρακτήρων. Αλλά αυτό δεν θα επιβάλει τη συμμόρφωση ως προς την διάκριση πεζών-κεφαλαίων.",
"File Management" : "Διαχείριση αρχείων",
- "Transfer ownership of a file or folder" : "Μεταβίβαση κυριότητας αρχείου ή φακέλου",
- "Choose file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
- "Change" : "Αλλαγή",
- "New owner" : "Νέος κάτοχος",
- "Search users" : "Αναζήτηση χρηστών",
+ "Home" : "Αρχική",
+ "Target folder does not exist any more" : "Ο φάκελος προορισμού δεν υπάρχει πια",
+ "Reload current directory" : "Επαναφόρτωση τρέχοντος καταλόγου",
+ "Go to the \"{dir}\" directory" : "Μετάβαση στον κατάλογο \"{dir}\"",
+ "Current directory path" : "Τρέχουσα διαδρομή καταλόγου",
+ "Your have used your space quota and cannot upload files anymore" : "Έχετε χρησιμοποιήσει το όριο χώρου σας και δεν μπορείτε να μεταφορτώσετε αρχεία πλέον",
+ "Drag and drop files here to upload" : "Σύρετε και αφήστε αρχεία εδώ για να τα μεταφορτώσετε",
+ "Favorite" : "Αγαπημένο",
+ "Back" : "Επιστροφή",
+ "Toggle selection for file \"{displayName}\"" : "Εναλλαγή επιλογής για το αρχείο \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Εναλλαγή επιλογής για τον φάκελο \"{displayName}\"",
+ "Filename" : "Όνομα αρχείου",
+ "Folder name" : "Όνομα φακέλου",
+ "This node is unavailable" : "Αυτός ο κόμβος δεν είναι διαθέσιμος",
+ "Another entry with the same name already exists." : "Μια άλλη καταχώρηση με το ίδιο όνομα υπάρχει ήδη.",
+ "Invalid filename." : "Μη έγκυρο όνομα αρχείου",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Μετονομασία του \"{oldName}\" σε \"{newName}\"",
+ "Rename file" : "Μετονομασία αρχείου",
+ "Folder" : "Φάκελος",
+ "Pending" : "Εκκρεμεί",
+ "Clear filter" : "Εκκαθάριση φίλτρου",
+ "Modified" : "Τροποποιήθηκε",
+ "Search everywhere" : "Αναζητήστε παντού",
+ "Type" : "Τύπος",
+ "Active filters" : "Ενεργά φίλτρα",
+ "Remove filter" : "Αφαίρεση φίλτρου",
+ "Total rows summary" : "Συνολική σύνοψη γραμμών",
+ "Toggle selection for all files and folders" : "Εναλλαγή επιλογής για όλα τα αρχεία και τους φακέλους",
+ "Name" : "Όνομα",
+ "Size" : "Μέγεθος",
+ "Actions" : "Ενέργειες",
+ "List of files and folders." : "Λίστα αρχείων και φακέλων.",
+ "Column headers with buttons are sortable." : "Οι επικεφαλίδες στηλών με κουμπιά είναι ταξινομήσιμες.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
+ "File not found" : "Δε βρέθηκε το αρχείο",
+ "{usedQuotaByte} used" : "{usedQuotaByte} χρησιμοποιείται",
+ "{used} of {quota} used" : "Χρήση {used} από {quota} ",
+ "{relative}% used" : "{relative}% χρησιμοποιείται",
+ "Could not refresh storage stats" : "Δεν ήταν δυνατή η ανανέωση των στατιστικών αποθήκευσης",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
+ "Storage information" : "Πληροφορίες αποθήκευσης",
+ "New folder" : "Νέος φάκελος",
+ "Create new folder" : "Δημιουργία νέου φακέλου",
+ "This name is already in use." : "Αυτό το όνομα χρησιμοποιείται ήδη.",
+ "Create" : "Δημιουργία",
+ "Submit" : "Υποβολή",
"Choose a file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
"Transfer" : "Μεταφορά",
"Transfer {path} to {userid}" : "Μεταφορά {path} στον {userid}",
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
+ "Unknown error" : "Άγνωστο σφάλμα",
"Ownership transfer request sent" : "Αποστολή αίτησης μεταβίβασης κυριότητας",
- "Cannot transfer ownership of a file or folder you don't own" : "Δεν μπορεί να μεταβιβαστεί η κυριότητα αρχείου ή φακέλου που δεν σας ανήκει",
- "Tags" : "Ετικέτες",
- "Unable to change the favourite state of the file" : "Αδυναμία αλλαγής αγαπημένης κατάστασης αρχείου",
+ "Cannot transfer ownership of a file or folder you do not own" : "Δεν είναι δυνατή η μεταβίβαση της κυριότητας ενός αρχείου ή φακέλου που δε σας ανήκει",
+ "Transfer ownership of a file or folder" : "Μεταβίβαση κυριότητας αρχείου ή φακέλου",
+ "Choose file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
+ "Change" : "Αλλαγή",
+ "New owner" : "Νέος κάτοχος",
+ "Select file or folder to link to" : "Επιλέξτε αρχείο ή φάκελο για σύνδεση",
+ "Choose {file}" : "Επιλέξτε {file}",
+ "Share" : "Διαμοιρασμός",
+ "Shared by link" : "Διαμοιρασμένα μέσω συνδέσμου",
+ "Shared" : "Κοινόχρηστα",
+ "Switch to list view" : "Αλλαγή σε προβολή λίστας",
+ "Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
+ "Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
+ "Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
+ "Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
+ "Error during upload: {message}" : "Σφάλμα κατά τη μεταφόρτωση: {message}",
+ "Error during upload, status code {status}" : "Σφάλμα κατά τη μεταφόρτωση, κωδικός κατάστασης {status}",
+ "Unknown error during upload" : "Άγνωστο σφάλμα κατά τη μεταφόρτωση",
+ "Loading current folder" : "Φόρτωση τρέχοντος φακέλου",
+ "Retry" : "Δοκιμή ξανά",
+ "No files in here" : "Δεν υπάρχουν αρχεία εδώ",
+ "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
+ "Go back" : "Επιστροφή",
+ "Views" : "Προβολές",
+ "Files settings" : "Ρυθμίσεις αρχείων",
+ "Your files" : "Τα αρχεία σας",
+ "Open in files" : "Άνοιγμα στα αρχεία",
+ "File cannot be accessed" : "Δεν είναι δυνατή η πρόσβαση στο αρχείο",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Το αρχείο δεν βρέθηκε ή δεν έχετε δικαιώματα προβολής του. Ζητήστε από τον αποστολέα να το μοιράσει.",
+ "Clipboard is not available" : "Το πρόχειρο δεν είναι διαθέσιμο",
+ "General" : "Γενικά",
+ "All files" : "Όλα τα αρχεία",
+ "Personal files" : "Προσωπικά αρχεία",
+ "Sort favorites first" : "Ταξινόμηση των αγαπημένων πρώτα",
+ "Sort folders before files" : "Ταξινόμηση φακέλων πριν από τα αρχεία",
+ "Appearance" : "Εμφάνιση",
+ "Show hidden files" : "Εμφάνιση κρυφών αρχείων",
+ "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας",
+ "Additional settings" : "Επιπρόσθετες ρυθμίσεις",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Αντιγραφή",
+ "Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου",
+ "File actions" : "Ενέργειες αρχείου",
+ "Rename" : "Μετονομασία",
+ "Delete" : "Διαγραφή",
+ "Manage tags" : "Διαχείριση ετικετών",
+ "Selection" : "Επιλογή",
+ "Deselect all" : "Αναίρεση επιλογής όλων",
+ "Navigation" : "Πλοήγηση",
+ "View" : "Προβολή",
+ "Toggle grid view" : "Εναλλαγή σε προβολή πλέγματος",
+ "You" : "Εσύ",
"Error while loading the file data" : "Σφάλμα κατά την φόρτωση αρχείου δεδομένων",
+ "Owner" : "Κάτοχος",
+ "Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
+ "Add to favorites" : "Προσθήκη στα αγαπημένα",
+ "Tags" : "Ετικέτες",
+ "Blank" : "Κενό",
+ "Unable to create new file from template" : "Δεν είναι δυνατή η δημιουργία νέου αρχείου από το πρότυπο",
"Pick a template for {name}" : "Επιλέξτε ένα πρότυπο για {name}",
- "Cancel" : "Ακύρωση",
- "Create" : "Δημιουργία",
"Create a new file with the selected template" : "Δημιουργήστε ένα νέο αρχείο με το επιλεγμένο πρότυπο",
"Creating file" : "Δημιουργία αρχείου",
- "Blank" : "Κενό",
- "Unable to create new file from template" : "Δεν είναι δυνατή η δημιουργία νέου αρχείου από το πρότυπο",
- "Set up templates folder" : "Ρύθμιση φακέλου προτύπων",
- "Templates" : "Πρότυπα",
+ "Leave this share" : "Αποχώρηση από αυτό το κοινόχρηστο",
+ "Leave these shares" : "Αποχώρηση από αυτά τα κοινόχρηστα",
+ "Disconnect storage" : "Αποσύνδεση αποθηκευτικού χώρου",
+ "Delete permanently" : "Διαγραφή οριστικά",
+ "Delete and unshare" : "Διαγραφή και κατάργηση κοινής χρήσης",
+ "Delete file" : "Διαγραφή αρχείου",
+ "Delete files" : "Διαγραφή αρχείων",
+ "Delete folder" : "Διαγραφή φακέλου",
+ "Delete folders" : "Διαγραφή φακέλων",
+ "Confirm deletion" : "Επιβεβαίωση διαγραφής",
+ "Cancel" : "Ακύρωση",
+ "Download" : "Λήψη",
+ "Destination is not a folder" : "Ο προορισμός δεν είναι φάκελος",
+ "This file/folder is already in that directory" : "Αυτό το αρχείο/φάκελος βρίσκεται ήδη σε αυτόν τον κατάλογο",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Δεν μπορείτε να μετακινήσετε ένα αρχείο/φάκελο στον εαυτό του ή σε έναν υποφάκελο του ίδιου του φακέλου.",
+ "(copy)" : "(αντιγραφή)",
+ "(copy %n)" : "(αντιγραφή %n)",
+ "A file or folder with that name already exists in this folder" : "Ένα αρχείο ή ένας φάκελος με αυτό το όνομα υπάρχει ήδη σε αυτόν το φάκελο",
+ "The files are locked" : "Το αρχεία είναι κλειδωμένα",
+ "The file does not exist anymore" : "Το αρχείο δεν υπάρχει πλέον",
+ "Choose destination" : "Επιλέξτε προορισμό",
+ "Copy to {target}" : "Αντιγραφή σε {target}",
+ "Move to {target}" : "Μετακίνηση σε {target}",
+ "Move" : "Μετακίνηση",
+ "Move or copy operation failed" : "Η λειτουργία μετακίνησης ή αντιγραφής απέτυχε",
+ "Move or copy" : "Μετακίνηση ή αντιγραφή",
+ "Open folder {displayName}" : "Άνοιγμα φακέλου {displayName}",
+ "Open in Files" : "Άνοιγμα στα Αρχεία",
+ "Failed to redirect to client" : "Αποτυχία ανακατεύθυνσης στον πελάτη",
+ "Details" : "Λεπτομέρειες",
+ "View in folder" : "Προβολή στον φάκελο",
+ "Today" : "Σήμερα",
+ "Last 7 days" : "Τελευταίες 7 ημέρες",
+ "Last 30 days" : "Τελευταίες 30 ημέρες",
+ "This year ({year})" : "Αυτό το έτος ({year})",
+ "Last year ({year})" : "Το περασμένο έτος ({year})",
+ "Documents" : "Έγγραφα",
+ "Presentations" : "Παρουσιάσεις",
+ "Audio" : "Ήχος",
+ "Images" : "Εικόνες",
+ "Videos" : "Βίντεο",
+ "Created new folder \"{name}\"" : "Δημιουργήθηκε νέος φάκελος \"{name}\"",
"Unable to initialize the templates directory" : "Δεν είναι δυνατή η προετοιμασία του καταλόγου προτύπων",
- "%s used" : "%s σε χρήση",
- "%s%% of %s used" : "%s%% από %s σε χρήση",
- "%1$s of %2$s used" : "χρησιμοποιούνται %1$s από %2$s",
- "Settings" : "Ρυθμίσεις",
- "Show hidden files" : "Εμφάνιση κρυφών αρχείων",
- "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
- "Toggle %1$s sublist" : "Εναλλαγή %1$s σε υπολίστα",
- "Toggle grid view" : "Εναλλαγή σε προβολή πλέγματος",
- "No files in here" : "Δεν υπάρχουν αρχεία εδώ",
- "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
+ "Templates" : "Πρότυπα",
+ "In folder" : "Σε φάκελο",
+ "Search in folder: {folder}" : "Αναζήτηση στον φάκελο: {folder}",
+ "One of the dropped files could not be processed" : "Ένα από τα αρχεία που ελήφθησαν δεν μπόρεσε να επεξεργαστεί",
+ "Some files could not be uploaded" : "Μερικά αρχεία δεν μπόρεσαν να μεταφορτωθούν",
+ "Files uploaded successfully" : "Τα αρχεία μεταφορτώθηκαν επιτυχώς",
+ "No files to process" : "Δεν υπάρχουν αρχεία προς επεξεργασία",
+ "Some files could not be copied" : "Ορισμένα αρχεία δεν μπόρεσαν να αντιγραφούν",
+ "Some files could not be moved" : "Αδυναμία μετακίνησης μερικών αρχείων",
+ "Files copied successfully" : "Τα αρχεία αντιγράφηκαν επιτυχώς",
+ "Files moved successfully" : "Τα αρχεία μετακινήθηκαν επιτυχώς",
+ "Upload cancelled" : "Η μεταφόρτωση ακυρώθηκε",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Δεν ήταν δυνατή η μετονομασία του \"{oldName}\", δεν υπάρχει πλέον",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Το όνομα \"{newName}\" χρησιμοποιείται ήδη στον φάκελο \"{dir}\". Παρακαλώ επιλέξτε ένα διαφορετικό όνομα.",
+ "Could not rename \"{oldName}\"" : "Δεν ήταν δυνατή η μετονομασία του \"{oldName}\"",
+ "This operation is forbidden" : "Αυτή η λειτουργία απαγορεύεται",
+ "Storage is temporarily not available" : "Μη διαθέσιμος χώρος αποθήκευσης προσωρινά",
+ "_%n file_::_%n files_" : ["%n αρχείο","%n αρχεία"],
+ "_%n folder_::_%n folders_" : ["%n φάκελος","%n φάκελοι"],
+ "Filename must not be empty." : "Το όνομα αρχείου δεν πρέπει να είναι κενό.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" δεν επιτρέπεται μέσα σε όνομα αρχείου.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" είναι δεσμευμένο όνομα και δεν επιτρέπεται για ονόματα αρχείων.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" δεν είναι επιτρεπτός τύπος αρχείου.",
+ "Filenames must not end with \"{extension}\"." : "Τα ονόματα αρχείων δεν πρέπει να τελειώνουν με \"{extension}\".",
+ "No favorites yet" : "Κανένα αγαπημένο ακόμα",
+ "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ",
+ "List of your files and folders." : "Λίστα των αρχείων και φακέλων σας.",
+ "List of your files and folders that are not shared." : "Λίστα αρχείων και φακέλων που δεν είναι κοινόχρηστα.",
+ "No personal files found" : "Δε βρέθηκαν προσωπικά αρχεία",
+ "Files that are not shared will show up here." : "Τα αρχεία που δεν είναι κοινόχρηστα θα εμφανίζονται εδώ.",
+ "Recent" : "Πρόσφατα",
+ "List of recently modified files and folders." : "Λίστα των πρόσφατα τροποποιημένων αρχείων και φακέλων.",
+ "No recently modified files" : "Δεν υπάρχουν πρόσφατα τροποποιημένα αρχεία",
+ "Files and folders you recently modified will show up here." : "Εδώ θα εμφανίζονται τα αρχεία και οι φάκελοι που τροποποιήσατε πρόσφατα.",
+ "Search" : "Αναζήτηση",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
"Upload too large" : "Πολύ μεγάλο αρχείο προς μεταφόρτωση",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να μεταφορτώσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν τον διακομιστή.",
- "No favorites yet" : "Κανένα αγαπημένο ακόμα",
- "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ",
- "Deleted files" : "Διαγραμμένα αρχεία",
- "Shares" : "Κοινόχρηστα",
- "Shared with others" : "Διαμοιρασμένα με άλλους",
- "Shared with you" : "Διαμοιρασμένα με εσάς",
- "Shared by link" : "Διαμοιρασμένα μέσω συνδέσμου",
- "Deleted shares" : "Διαγραμμένα κοινόχρηστα",
- "Pending shares" : "Κοινή χρήση σε εκκρεμότητα",
+ "File could not be found" : "Δεν μπορεί να βρεθεί το αρχείο",
+ "Show list view" : "Προβολή λίστας",
+ "Show grid view" : "Προβολή πλέγματος",
+ "Close" : "Κλείσιμο",
+ "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
+ "This will stop your current uploads." : "Αυτό θα σταματήσει τις τρέχουσες μεταφορτώσεις.",
+ "Upload cancelled." : "Η μεταφόρτωση ακυρώθηκε.",
+ "Processing files …" : "Γίνεται επεξεργασία των αρχείων …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος ή έχει 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνεται {size1} αλλά υπάρχει χώρος μόνο για {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Ο φάκελος προορισμού \"{dir}\" δεν υπάρχει πλέον",
+ "An unknown error has occurred" : "Προέκυψε άγνωστο σφάλμα.",
+ "File could not be uploaded" : "Δεν ήταν δυνατή η μεταφόρτωση του αρχείου",
+ "Uploading …" : "Μεταφόρτωση σε εξέλιξη ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Μεταφόρτωση … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} από {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Η μεταφόρτωση αυτού του αντικειμένου δεν υποστηρίζεται",
+ "Error when assembling chunks, status code {status}" : "Σφάλμα κατά την συλλογή τμημάτων, κωδικός κατάστασης {status}",
+ "Choose target folder" : "Επιλογή φακέλου προορισμού",
+ "Set reminder" : "Προσθήκη υπενθύμισης",
+ "Edit locally" : "Επεξεργασία τοπικά",
+ "Open" : "Άνοιγμα",
+ "Could not load info for file \"{file}\"" : "Αδυναμία φόρτωσης πληροφοριών για το αρχείο \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Επιλέξτε ετικέτα (ες) για προσθήκη στην επιλογή",
+ "Apply tag(s) to selection" : "Εφαρμογή ετικετών στην επιλογή",
+ "Select directory \"{dirName}\"" : "Επιλέξτε κατάλογο \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Επιλέξτε αρχείο \"{fileName}\"",
+ "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλούμε ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
+ "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
+ "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
+ "copy" : "αντιγραφή",
+ "Could not copy \"{file}\", target exists" : "Αδυναμία αντιγραφής του \"{file}\", υπάρχει ήδη.",
+ "Could not copy \"{file}\"" : "Αδυναμία αντιγραφής του \"{file}\"",
+ "Copied {origin} inside {destination}" : "Αντιγράφτηκε το {origin} στο {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Αντιγράφτηκε το {origin} και {nbfiles} άλλα αρχεία στο {destination}",
+ "{newName} already exists" : "Το {newName} υπάρχει ήδη",
+ "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του αρχείου \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Αδυναμία δημιουργίας του αρχείου \"{file}\" επειδή υπάρχει ήδη",
+ "Could not create folder \"{dir}\" because it already exists" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\" επειδή υπάρχει ήδη",
+ "Could not fetch file details \"{file}\"" : "Δεν είναι δυνατή η ανάγνωση λεπτομερειών του αρχείου \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Σφάλμα διαγραφής του \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Κανένα αποτέλεσμα αναζήτησης σε άλλους φακέλους για {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Εισαγάγετε περισσότερους από δύο χαρακτήρες για αναζήτηση σε άλλους φακέλους",
+ "{dirs} and {files}" : "{dirs} και {files}",
+ "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"],
+ "You do not have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ",
+ "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"],
+ "New" : "Νέα",
+ "New file/folder menu" : "Μενού νέου αρχείου/φακέλου",
+ "Select file range" : "Επιλέξτε εύρος αρχείων",
+ "{used}%" : "{used}%",
+ "{used} used" : "Σε χρήση {used}",
+ "\"{name}\" is an invalid file name." : "Το \"{name}\" δεν είναι έγκυρο όνομα αρχείου.",
+ "File name cannot be empty." : "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
+ "\"/\" is not allowed inside a file name." : "Το \"/\" δεν είναι επιτρεπτό εντός του ονόματος αρχείου.",
+ "\"{name}\" is not an allowed filetype" : "Το \"{name}\" δεν είναι ένας επιτρεπτός τύπος αρχείου",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του/της {owner} είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο φάκελος της ομάδας \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός χώρος του {owner} είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο φάκελος ομάδας \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός σας χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Ταιριάζει \"{filter}\"","Ταιριάζουν \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Ο άμεσος σύνδεσμος αντιγράφηκε (λειτουργεί μόνο για άτομα που έχουν πρόσβαση σε αυτό το αρχείο/φάκελο)",
+ "Path" : "Διαδρομή",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Αντιγραφή άμεσου συνδέσμου (λειτουργεί μόνο για άτομα που έχουν πρόσβαση στο αρχείο/φάκελο)",
+ "Upload file" : "Μεταφόρτωση αρχείου",
+ "An error occurred while trying to update the tags" : "Ένα σφάλμα προέκυψε κατά τη διάρκεια ενημέρωσης των ετικετών",
+ "Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Η ενέργεια του/της \"{displayName}\" εκτελέστηκε επιτυχώς",
+ "\"{displayName}\" action failed" : "Η ενέργεια του \"{displayName}\" απέτυχε",
+ "\"{displayName}\" batch action executed successfully" : "Η μαζική ενέργεια του/της \"{displayName}\" εκτελέστηκε επιτυχώς",
+ "Filter filenames…" : "Φιλτράρετε τα ονόματα αρχείων...",
+ "WebDAV URL copied to clipboard" : "Ο σύνδεσμος WebDAV αντιγράφηκε στο πρόχειρο",
+ "Enable the grid view" : "Ενεργοποίηση της προβολής πλέγματος",
+ "Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
+ "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
+ "Deletion cancelled" : "Διαγραφή ακυρώθηκε",
+ "Move cancelled" : "Μετακίνηση ακυρώθηκε",
+ "Cancelled move or copy operation" : "Ακυρώθηκε η λειτουργία μετακίνησης ή αντιγραφής",
+ "Open details" : "Άνοιγμα λεπτομερειών",
+ "Photos and images" : "Φωτογραφίες και εικόνες",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} φάκελος","{folderCount} φακέλοι"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} αρχείο","{fileCount} αρχεία"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 αρχείο και {folderCount} φάκελος","1 αρχείο και {folderCount} φακέλοι"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} αρχείο και 1 φάκελος","{fileCount} αρχεία και 1 φάκελος"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} αρχεία και {folderCount} φακέλοι",
+ "Personal Files" : "Προσωπικά Αρχεία",
"Text file" : "Αρχείο κειμένου",
- "New text file.txt" : "Νέο αρχείο file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του {owner} είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ο φάκελος ομάδας \"{mountPoint}\" είναι γεμάτος, τα αρχεία δεν μπορούν πλέον να ενημερωθούν ή να συγχρονιστούν!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν πλέον να ενημερωθούν ή να συγχρονιστούν!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ταιριάζει '{filter}' ","ταιριάζουν '{filter}'"]
+ "New text file.txt" : "Νέο αρχείο file.txt"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index 7228446176b..23229d28715 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Μη διαθέσιμος χώρος αποθήκευσης προσωρινά",
- "Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος",
- "Unknown error" : "Άγνωστο σφάλμα",
- "File could not be found" : "Δεν μπορεί να βρεθεί το αρχείο",
- "Move or copy" : "Μετακίνηση ή αντιγραφή",
- "Download" : "Λήψη",
- "Delete" : "Διαγραφή",
- "Home" : "Αρχική",
- "Close" : "Κλείσιμο",
- "Favorites" : "Αγαπημένα",
- "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
- "This will stop your current uploads." : "Αυτό θα σταματήσει τις τρέχουσες μεταφορτώσεις.",
- "Upload cancelled." : "Η μεταφόρτωση ακυρώθηκε.",
- "Processing files …" : "Γίνεται επεξεργασία των αρχείων …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος ή έχει 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνεται {size1} αλλά υπάρχει χώρος μόνο για {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Ο φάκελος προορισμού \"{dir}\" δεν υπάρχει πλέον",
- "Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
- "An unknown error has occurred" : "Προέκυψε άγνωστο σφάλμα.",
- "Uploading …" : "Μεταφόρτωση σε εξέλιξη ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} από {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Η μεταφόρτωση αυτού του αντικειμένου δεν υποστηρίζεται",
- "Target folder does not exist any more" : "Ο φάκελος προορισμού δεν υπάρχει πια",
- "Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
- "Error when assembling chunks, status code {status}" : "Σφάλμα κατά την συλλογή τμημάτων, κωδικός κατάστασης {status}",
- "Actions" : "Ενέργειες",
- "Rename" : "Μετονομασία",
- "Copy" : "Αντιγραφή",
- "Choose target folder" : "Επιλογή φακέλου προορισμού",
- "Open" : "Άνοιγμα",
- "Delete file" : "Διαγραφή αρχείου",
- "Delete folder" : "Διαγραφή φακέλου",
- "Disconnect storage" : "Αποσύνδεση αποθηκευτικού χώρου",
- "Leave this share" : "Αποχωρήστε από αυτήν την κοινή χρήση",
- "Could not load info for file \"{file}\"" : "Αδυναμία φόρτωσης πληροφοριών για το αρχείο \"{file}\"",
- "Files" : "Αρχεία",
- "Details" : "Λεπτομέρειες",
- "Please select tag(s) to add to the selection" : "Επιλέξτε ετικέτα (ες) για προσθήκη στην επιλογή",
- "Apply tag(s) to selection" : "Εφαρμογή ετικετών στην επιλογή",
- "Select" : "Επιλογή",
- "Pending" : "Εκκρεμεί",
- "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας",
- "This operation is forbidden" : "Αυτή η λειτουργία απαγορεύεται",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλούμε ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
- "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
- "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
- "copy" : "αντιγραφή",
- "Could not copy \"{file}\", target exists" : "Αδυναμία αντιγραφής του \"{file}\", υπάρχει ήδη.",
- "Could not copy \"{file}\"" : "Αδυναμία αντιγραφής του \"{file}\"",
- "Copied {origin} inside {destination}" : "Αντιγράφτηκε το {origin} στο {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Αντιγράφτηκε το {origin} και {nbfiles} άλλα αρχεία στο {destination}",
- "{newName} already exists" : "Το {newname} υπάρχει ήδη",
- "Could not rename \"{fileName}\", it does not exist any more" : "Αδυναμία μετονομασίας του \"{fileName}\", το αρχείο δεν υπάρχει πια.",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Το όνομα \"{targetName}\" χρησιμοποιείται ήδη στον φάκελο\"{dir}\". Παρακαλούμε διαλέξτε ένα διαφορετικό όνομα.",
- "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"",
- "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του αρχείου \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Αδυναμία δημιουργίας του αρχείου \"{file}\" επειδή υπάρχει ήδη",
- "Could not create folder \"{dir}\" because it already exists" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\" επειδή υπάρχει ήδη",
- "Could not fetch file details \"{file}\"" : "Δεν είναι δυνατή η ανάγνωση λεπτομερειών του αρχείου \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Σφάλμα διαγραφής του \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Κανένα αποτέλεσμα αναζήτησης σε άλλους φακέλους για {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Εισαγάγετε περισσότερους από δύο χαρακτήρες για αναζήτηση σε άλλους φακέλους",
- "Name" : "Όνομα",
- "Size" : "Μέγεθος",
- "Modified" : "Τροποποιήθηκε",
- "_%n folder_::_%n folders_" : ["%n φάκελος","%n φάκελοι"],
- "_%n file_::_%n files_" : ["%n αρχείο","%n αρχεία"],
- "{dirs} and {files}" : "{dirs} και {files}",
- "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"],
- "You don’t have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ",
- "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"],
- "New" : "Νέο",
- "Select file range" : "Επιλέξτε εύρος αρχείων",
- "{used} of {quota} used" : "Χρήση {used} από {quota} ",
- "{used} used" : "Σε χρήση {used}",
- "\"{name}\" is an invalid file name." : "Το \"{name}\" δεν είναι έγκυρο όνομα αρχείου.",
- "File name cannot be empty." : "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
- "\"/\" is not allowed inside a file name." : "Το \"/\" δεν είναι επιτρεπτό εντός του ονόματος αρχείου.",
- "\"{name}\" is not an allowed filetype" : "Το \"{name}\" δεν είναι ένας επιτρεπτός τύπος αρχείου",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του/της {owner} είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο φάκελος της ομάδας \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός χώρος του {owner} είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο φάκελος ομάδας \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός σας χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Ταιριάζει \"{filter}\"","Ταιριάζουν \"{filter}\""],
- "View in folder" : "Προβολή στον φάκελο",
- "Copied!" : "Αντιγράφηκε!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Αντιγραφή άμεσου συνδέσμου (λειτουργεί μόνο για χρήστες που έχουν πρόσβαση στο αρχείο/φάκελο)",
- "Path" : "Διαδρομή",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Αγαπημένα",
- "Favorite" : "Αγαπημένο",
- "You can only favorite a single file or folder at a time" : "Προσθήκη στα αγαπημένα ενός αρχείου ή φακέλου κάθε φορά",
- "New folder" : "Νέος φάκελος",
- "Upload file" : "Μεταφόρτωση αρχείου",
- "Recent" : "Πρόσφατα",
- "Not favorited" : "Δεν είναι αγαπημένο",
- "Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
- "Add to favorites" : "Προσθήκη στα αγαπημένα",
- "An error occurred while trying to update the tags" : "Ένα σφάλμα προέκυψε κατά τη διάρκεια ενημέρωσης των ετικετών",
"Added to favorites" : "Προστέθηκε στα αγαπημένα",
"Removed from favorites" : "Αφαιρέθηκε από τα αγαπημένα",
"You added {file} to your favorites" : "Προσθέσατε το {file} στα αγαπημένα σας",
"You removed {file} from your favorites" : "Αφαιρέσατε το {file} από τα αγαπημένα σας",
+ "Favorites" : "Αγαπημένα",
"File changes" : "Αλλαγές αρχείου",
"Created by {user}" : "Δημιουργήθηκε από τον {user}",
"Changed by {user}" : "Άλλαξε από τον {user}",
@@ -114,7 +11,6 @@
"Restored by {user}" : "Επαναφέρθηκε από τον {user}",
"Renamed by {user}" : "Μετονομάστηκε από τον {user}",
"Moved by {user}" : "Μετακινήθηκε από τον {user}",
- "\"remote user\"" : "\"απομακρυσμένος χρήστης\"",
"You created {file}" : "Δημιουργήσατε το {file}",
"You created an encrypted file in {file}" : "Δημιουργήσατε ένα κρυπτογραφημένο αρχείο στο {file}",
"{user} created {file}" : "Ο/η {user} δημιούργησε {file}",
@@ -141,15 +37,16 @@
"You moved {oldfile} to {newfile}" : "Μεταφέρατε το {oldfile} σε {newfile}",
"{user} moved {oldfile} to {newfile}" : "Ο/η {user} μετέφερε το {oldfile} σε {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Ένα αρχείο έχει προστεθεί ή αφαιρεθεί από τα <strong>αγαπημένα</strong> σας",
+ "Files" : "Αρχεία",
"A file or folder has been <strong>changed</strong>" : "Ένα αρχείο ή κατάλογος έχουν <strong>αλλάξει</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Ένα αγαπημένο αρχείο ή φάκελός σας έχει <strong>τροποποιηθεί</strong>.",
- "All files" : "Όλα τα αρχεία",
- "Unlimited" : "Απεριόριστο",
- "Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
+ "No favorites" : "Δεν υπάρχουν αγαπημένα",
"Accept" : "Αποδοχή",
"Reject" : "Απόρριψη",
"Incoming ownership transfer from {user}" : "Εισερχόμενη μεταβίβαση κυριότητας από τον {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Δέχεστε την διαδρομή {path}?\n\nΣημείωση: Η διαδικασία μεταφοράς μπορεί να διαρκέσει πάνω από μία ώρα.",
+ "Ownership transfer denied" : "Η μεταφορά κυριότητας απορρίφθηκε",
+ "Your ownership transfer of {path} was denied by {user}." : "Η μεταφορά της κυριότητας του {path} απορρίφθηκε από τον χρήστη {user}.",
"Ownership transfer failed" : "Η μεταφορά κυριότητας απέτυχε",
"Your ownership transfer of {path} to {user} failed." : "Η μεταφορά κυριότητας σας του {path} στον {user} απέτυχε.",
"The ownership transfer of {path} from {user} failed." : "Η μεταφορά κυριότητας του {path} από {user} απέτυχε.",
@@ -157,62 +54,302 @@
"Your ownership transfer of {path} to {user} has completed." : "Η μεταφορά κυριότητας σας του {path} στον {user} ολοκληρώθηκε.",
"The ownership transfer of {path} from {user} has completed." : "Η μεταφορά κυριότητας του {path} στον {user} ολοκληρώθηκε.",
"in %s" : "σε %s",
+ "Transferred from %1$s on %2$s" : "Μεταβιβάστηκε από %1$s σε %2$s",
+ "Enforce Windows compatibility" : "Επιβολή συμβατότητας με Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Αυτό θα αποκλείσει ονόματα αρχείων που δεν είναι έγκυρα σε συστήματα Windows, όπως η χρήση δεσμευμένων ονομάτων ή ειδικών χαρακτήρων. Αλλά αυτό δεν θα επιβάλει τη συμμόρφωση ως προς την διάκριση πεζών-κεφαλαίων.",
"File Management" : "Διαχείριση αρχείων",
- "Transfer ownership of a file or folder" : "Μεταβίβαση κυριότητας αρχείου ή φακέλου",
- "Choose file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
- "Change" : "Αλλαγή",
- "New owner" : "Νέος κάτοχος",
- "Search users" : "Αναζήτηση χρηστών",
+ "Home" : "Αρχική",
+ "Target folder does not exist any more" : "Ο φάκελος προορισμού δεν υπάρχει πια",
+ "Reload current directory" : "Επαναφόρτωση τρέχοντος καταλόγου",
+ "Go to the \"{dir}\" directory" : "Μετάβαση στον κατάλογο \"{dir}\"",
+ "Current directory path" : "Τρέχουσα διαδρομή καταλόγου",
+ "Your have used your space quota and cannot upload files anymore" : "Έχετε χρησιμοποιήσει το όριο χώρου σας και δεν μπορείτε να μεταφορτώσετε αρχεία πλέον",
+ "Drag and drop files here to upload" : "Σύρετε και αφήστε αρχεία εδώ για να τα μεταφορτώσετε",
+ "Favorite" : "Αγαπημένο",
+ "Back" : "Επιστροφή",
+ "Toggle selection for file \"{displayName}\"" : "Εναλλαγή επιλογής για το αρχείο \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Εναλλαγή επιλογής για τον φάκελο \"{displayName}\"",
+ "Filename" : "Όνομα αρχείου",
+ "Folder name" : "Όνομα φακέλου",
+ "This node is unavailable" : "Αυτός ο κόμβος δεν είναι διαθέσιμος",
+ "Another entry with the same name already exists." : "Μια άλλη καταχώρηση με το ίδιο όνομα υπάρχει ήδη.",
+ "Invalid filename." : "Μη έγκυρο όνομα αρχείου",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Μετονομασία του \"{oldName}\" σε \"{newName}\"",
+ "Rename file" : "Μετονομασία αρχείου",
+ "Folder" : "Φάκελος",
+ "Pending" : "Εκκρεμεί",
+ "Clear filter" : "Εκκαθάριση φίλτρου",
+ "Modified" : "Τροποποιήθηκε",
+ "Search everywhere" : "Αναζητήστε παντού",
+ "Type" : "Τύπος",
+ "Active filters" : "Ενεργά φίλτρα",
+ "Remove filter" : "Αφαίρεση φίλτρου",
+ "Total rows summary" : "Συνολική σύνοψη γραμμών",
+ "Toggle selection for all files and folders" : "Εναλλαγή επιλογής για όλα τα αρχεία και τους φακέλους",
+ "Name" : "Όνομα",
+ "Size" : "Μέγεθος",
+ "Actions" : "Ενέργειες",
+ "List of files and folders." : "Λίστα αρχείων και φακέλων.",
+ "Column headers with buttons are sortable." : "Οι επικεφαλίδες στηλών με κουμπιά είναι ταξινομήσιμες.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
+ "File not found" : "Δε βρέθηκε το αρχείο",
+ "{usedQuotaByte} used" : "{usedQuotaByte} χρησιμοποιείται",
+ "{used} of {quota} used" : "Χρήση {used} από {quota} ",
+ "{relative}% used" : "{relative}% χρησιμοποιείται",
+ "Could not refresh storage stats" : "Δεν ήταν δυνατή η ανανέωση των στατιστικών αποθήκευσης",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
+ "Storage information" : "Πληροφορίες αποθήκευσης",
+ "New folder" : "Νέος φάκελος",
+ "Create new folder" : "Δημιουργία νέου φακέλου",
+ "This name is already in use." : "Αυτό το όνομα χρησιμοποιείται ήδη.",
+ "Create" : "Δημιουργία",
+ "Submit" : "Υποβολή",
"Choose a file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
"Transfer" : "Μεταφορά",
"Transfer {path} to {userid}" : "Μεταφορά {path} στον {userid}",
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
+ "Unknown error" : "Άγνωστο σφάλμα",
"Ownership transfer request sent" : "Αποστολή αίτησης μεταβίβασης κυριότητας",
- "Cannot transfer ownership of a file or folder you don't own" : "Δεν μπορεί να μεταβιβαστεί η κυριότητα αρχείου ή φακέλου που δεν σας ανήκει",
- "Tags" : "Ετικέτες",
- "Unable to change the favourite state of the file" : "Αδυναμία αλλαγής αγαπημένης κατάστασης αρχείου",
+ "Cannot transfer ownership of a file or folder you do not own" : "Δεν είναι δυνατή η μεταβίβαση της κυριότητας ενός αρχείου ή φακέλου που δε σας ανήκει",
+ "Transfer ownership of a file or folder" : "Μεταβίβαση κυριότητας αρχείου ή φακέλου",
+ "Choose file or folder to transfer" : "Επιλέξτε αρχείο ή φάκελο για μεταφορά",
+ "Change" : "Αλλαγή",
+ "New owner" : "Νέος κάτοχος",
+ "Select file or folder to link to" : "Επιλέξτε αρχείο ή φάκελο για σύνδεση",
+ "Choose {file}" : "Επιλέξτε {file}",
+ "Share" : "Διαμοιρασμός",
+ "Shared by link" : "Διαμοιρασμένα μέσω συνδέσμου",
+ "Shared" : "Κοινόχρηστα",
+ "Switch to list view" : "Αλλαγή σε προβολή λίστας",
+ "Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
+ "Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
+ "Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
+ "Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
+ "Error during upload: {message}" : "Σφάλμα κατά τη μεταφόρτωση: {message}",
+ "Error during upload, status code {status}" : "Σφάλμα κατά τη μεταφόρτωση, κωδικός κατάστασης {status}",
+ "Unknown error during upload" : "Άγνωστο σφάλμα κατά τη μεταφόρτωση",
+ "Loading current folder" : "Φόρτωση τρέχοντος φακέλου",
+ "Retry" : "Δοκιμή ξανά",
+ "No files in here" : "Δεν υπάρχουν αρχεία εδώ",
+ "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
+ "Go back" : "Επιστροφή",
+ "Views" : "Προβολές",
+ "Files settings" : "Ρυθμίσεις αρχείων",
+ "Your files" : "Τα αρχεία σας",
+ "Open in files" : "Άνοιγμα στα αρχεία",
+ "File cannot be accessed" : "Δεν είναι δυνατή η πρόσβαση στο αρχείο",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Το αρχείο δεν βρέθηκε ή δεν έχετε δικαιώματα προβολής του. Ζητήστε από τον αποστολέα να το μοιράσει.",
+ "Clipboard is not available" : "Το πρόχειρο δεν είναι διαθέσιμο",
+ "General" : "Γενικά",
+ "All files" : "Όλα τα αρχεία",
+ "Personal files" : "Προσωπικά αρχεία",
+ "Sort favorites first" : "Ταξινόμηση των αγαπημένων πρώτα",
+ "Sort folders before files" : "Ταξινόμηση φακέλων πριν από τα αρχεία",
+ "Appearance" : "Εμφάνιση",
+ "Show hidden files" : "Εμφάνιση κρυφών αρχείων",
+ "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας",
+ "Additional settings" : "Επιπρόσθετες ρυθμίσεις",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Αντιγραφή",
+ "Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου",
+ "File actions" : "Ενέργειες αρχείου",
+ "Rename" : "Μετονομασία",
+ "Delete" : "Διαγραφή",
+ "Manage tags" : "Διαχείριση ετικετών",
+ "Selection" : "Επιλογή",
+ "Deselect all" : "Αναίρεση επιλογής όλων",
+ "Navigation" : "Πλοήγηση",
+ "View" : "Προβολή",
+ "Toggle grid view" : "Εναλλαγή σε προβολή πλέγματος",
+ "You" : "Εσύ",
"Error while loading the file data" : "Σφάλμα κατά την φόρτωση αρχείου δεδομένων",
+ "Owner" : "Κάτοχος",
+ "Remove from favorites" : "Αφαίρεση από τα αγαπημένα",
+ "Add to favorites" : "Προσθήκη στα αγαπημένα",
+ "Tags" : "Ετικέτες",
+ "Blank" : "Κενό",
+ "Unable to create new file from template" : "Δεν είναι δυνατή η δημιουργία νέου αρχείου από το πρότυπο",
"Pick a template for {name}" : "Επιλέξτε ένα πρότυπο για {name}",
- "Cancel" : "Ακύρωση",
- "Create" : "Δημιουργία",
"Create a new file with the selected template" : "Δημιουργήστε ένα νέο αρχείο με το επιλεγμένο πρότυπο",
"Creating file" : "Δημιουργία αρχείου",
- "Blank" : "Κενό",
- "Unable to create new file from template" : "Δεν είναι δυνατή η δημιουργία νέου αρχείου από το πρότυπο",
- "Set up templates folder" : "Ρύθμιση φακέλου προτύπων",
- "Templates" : "Πρότυπα",
+ "Leave this share" : "Αποχώρηση από αυτό το κοινόχρηστο",
+ "Leave these shares" : "Αποχώρηση από αυτά τα κοινόχρηστα",
+ "Disconnect storage" : "Αποσύνδεση αποθηκευτικού χώρου",
+ "Delete permanently" : "Διαγραφή οριστικά",
+ "Delete and unshare" : "Διαγραφή και κατάργηση κοινής χρήσης",
+ "Delete file" : "Διαγραφή αρχείου",
+ "Delete files" : "Διαγραφή αρχείων",
+ "Delete folder" : "Διαγραφή φακέλου",
+ "Delete folders" : "Διαγραφή φακέλων",
+ "Confirm deletion" : "Επιβεβαίωση διαγραφής",
+ "Cancel" : "Ακύρωση",
+ "Download" : "Λήψη",
+ "Destination is not a folder" : "Ο προορισμός δεν είναι φάκελος",
+ "This file/folder is already in that directory" : "Αυτό το αρχείο/φάκελος βρίσκεται ήδη σε αυτόν τον κατάλογο",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Δεν μπορείτε να μετακινήσετε ένα αρχείο/φάκελο στον εαυτό του ή σε έναν υποφάκελο του ίδιου του φακέλου.",
+ "(copy)" : "(αντιγραφή)",
+ "(copy %n)" : "(αντιγραφή %n)",
+ "A file or folder with that name already exists in this folder" : "Ένα αρχείο ή ένας φάκελος με αυτό το όνομα υπάρχει ήδη σε αυτόν το φάκελο",
+ "The files are locked" : "Το αρχεία είναι κλειδωμένα",
+ "The file does not exist anymore" : "Το αρχείο δεν υπάρχει πλέον",
+ "Choose destination" : "Επιλέξτε προορισμό",
+ "Copy to {target}" : "Αντιγραφή σε {target}",
+ "Move to {target}" : "Μετακίνηση σε {target}",
+ "Move" : "Μετακίνηση",
+ "Move or copy operation failed" : "Η λειτουργία μετακίνησης ή αντιγραφής απέτυχε",
+ "Move or copy" : "Μετακίνηση ή αντιγραφή",
+ "Open folder {displayName}" : "Άνοιγμα φακέλου {displayName}",
+ "Open in Files" : "Άνοιγμα στα Αρχεία",
+ "Failed to redirect to client" : "Αποτυχία ανακατεύθυνσης στον πελάτη",
+ "Details" : "Λεπτομέρειες",
+ "View in folder" : "Προβολή στον φάκελο",
+ "Today" : "Σήμερα",
+ "Last 7 days" : "Τελευταίες 7 ημέρες",
+ "Last 30 days" : "Τελευταίες 30 ημέρες",
+ "This year ({year})" : "Αυτό το έτος ({year})",
+ "Last year ({year})" : "Το περασμένο έτος ({year})",
+ "Documents" : "Έγγραφα",
+ "Presentations" : "Παρουσιάσεις",
+ "Audio" : "Ήχος",
+ "Images" : "Εικόνες",
+ "Videos" : "Βίντεο",
+ "Created new folder \"{name}\"" : "Δημιουργήθηκε νέος φάκελος \"{name}\"",
"Unable to initialize the templates directory" : "Δεν είναι δυνατή η προετοιμασία του καταλόγου προτύπων",
- "%s used" : "%s σε χρήση",
- "%s%% of %s used" : "%s%% από %s σε χρήση",
- "%1$s of %2$s used" : "χρησιμοποιούνται %1$s από %2$s",
- "Settings" : "Ρυθμίσεις",
- "Show hidden files" : "Εμφάνιση κρυφών αρχείων",
- "Crop image previews" : "Περικοπή προεπισκόπησης εικόνας",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
- "Toggle %1$s sublist" : "Εναλλαγή %1$s σε υπολίστα",
- "Toggle grid view" : "Εναλλαγή σε προβολή πλέγματος",
- "No files in here" : "Δεν υπάρχουν αρχεία εδώ",
- "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
+ "Templates" : "Πρότυπα",
+ "In folder" : "Σε φάκελο",
+ "Search in folder: {folder}" : "Αναζήτηση στον φάκελο: {folder}",
+ "One of the dropped files could not be processed" : "Ένα από τα αρχεία που ελήφθησαν δεν μπόρεσε να επεξεργαστεί",
+ "Some files could not be uploaded" : "Μερικά αρχεία δεν μπόρεσαν να μεταφορτωθούν",
+ "Files uploaded successfully" : "Τα αρχεία μεταφορτώθηκαν επιτυχώς",
+ "No files to process" : "Δεν υπάρχουν αρχεία προς επεξεργασία",
+ "Some files could not be copied" : "Ορισμένα αρχεία δεν μπόρεσαν να αντιγραφούν",
+ "Some files could not be moved" : "Αδυναμία μετακίνησης μερικών αρχείων",
+ "Files copied successfully" : "Τα αρχεία αντιγράφηκαν επιτυχώς",
+ "Files moved successfully" : "Τα αρχεία μετακινήθηκαν επιτυχώς",
+ "Upload cancelled" : "Η μεταφόρτωση ακυρώθηκε",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Δεν ήταν δυνατή η μετονομασία του \"{oldName}\", δεν υπάρχει πλέον",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Το όνομα \"{newName}\" χρησιμοποιείται ήδη στον φάκελο \"{dir}\". Παρακαλώ επιλέξτε ένα διαφορετικό όνομα.",
+ "Could not rename \"{oldName}\"" : "Δεν ήταν δυνατή η μετονομασία του \"{oldName}\"",
+ "This operation is forbidden" : "Αυτή η λειτουργία απαγορεύεται",
+ "Storage is temporarily not available" : "Μη διαθέσιμος χώρος αποθήκευσης προσωρινά",
+ "_%n file_::_%n files_" : ["%n αρχείο","%n αρχεία"],
+ "_%n folder_::_%n folders_" : ["%n φάκελος","%n φάκελοι"],
+ "Filename must not be empty." : "Το όνομα αρχείου δεν πρέπει να είναι κενό.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" δεν επιτρέπεται μέσα σε όνομα αρχείου.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" είναι δεσμευμένο όνομα και δεν επιτρέπεται για ονόματα αρχείων.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" δεν είναι επιτρεπτός τύπος αρχείου.",
+ "Filenames must not end with \"{extension}\"." : "Τα ονόματα αρχείων δεν πρέπει να τελειώνουν με \"{extension}\".",
+ "No favorites yet" : "Κανένα αγαπημένο ακόμα",
+ "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ",
+ "List of your files and folders." : "Λίστα των αρχείων και φακέλων σας.",
+ "List of your files and folders that are not shared." : "Λίστα αρχείων και φακέλων που δεν είναι κοινόχρηστα.",
+ "No personal files found" : "Δε βρέθηκαν προσωπικά αρχεία",
+ "Files that are not shared will show up here." : "Τα αρχεία που δεν είναι κοινόχρηστα θα εμφανίζονται εδώ.",
+ "Recent" : "Πρόσφατα",
+ "List of recently modified files and folders." : "Λίστα των πρόσφατα τροποποιημένων αρχείων και φακέλων.",
+ "No recently modified files" : "Δεν υπάρχουν πρόσφατα τροποποιημένα αρχεία",
+ "Files and folders you recently modified will show up here." : "Εδώ θα εμφανίζονται τα αρχεία και οι φάκελοι που τροποποιήσατε πρόσφατα.",
+ "Search" : "Αναζήτηση",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
"Upload too large" : "Πολύ μεγάλο αρχείο προς μεταφόρτωση",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να μεταφορτώσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν τον διακομιστή.",
- "No favorites yet" : "Κανένα αγαπημένο ακόμα",
- "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ",
- "Deleted files" : "Διαγραμμένα αρχεία",
- "Shares" : "Κοινόχρηστα",
- "Shared with others" : "Διαμοιρασμένα με άλλους",
- "Shared with you" : "Διαμοιρασμένα με εσάς",
- "Shared by link" : "Διαμοιρασμένα μέσω συνδέσμου",
- "Deleted shares" : "Διαγραμμένα κοινόχρηστα",
- "Pending shares" : "Κοινή χρήση σε εκκρεμότητα",
+ "File could not be found" : "Δεν μπορεί να βρεθεί το αρχείο",
+ "Show list view" : "Προβολή λίστας",
+ "Show grid view" : "Προβολή πλέγματος",
+ "Close" : "Κλείσιμο",
+ "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"",
+ "This will stop your current uploads." : "Αυτό θα σταματήσει τις τρέχουσες μεταφορτώσεις.",
+ "Upload cancelled." : "Η μεταφόρτωση ακυρώθηκε.",
+ "Processing files …" : "Γίνεται επεξεργασία των αρχείων …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος ή έχει 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνεται {size1} αλλά υπάρχει χώρος μόνο για {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Ο φάκελος προορισμού \"{dir}\" δεν υπάρχει πλέον",
+ "An unknown error has occurred" : "Προέκυψε άγνωστο σφάλμα.",
+ "File could not be uploaded" : "Δεν ήταν δυνατή η μεταφόρτωση του αρχείου",
+ "Uploading …" : "Μεταφόρτωση σε εξέλιξη ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Μεταφόρτωση … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} από {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Η μεταφόρτωση αυτού του αντικειμένου δεν υποστηρίζεται",
+ "Error when assembling chunks, status code {status}" : "Σφάλμα κατά την συλλογή τμημάτων, κωδικός κατάστασης {status}",
+ "Choose target folder" : "Επιλογή φακέλου προορισμού",
+ "Set reminder" : "Προσθήκη υπενθύμισης",
+ "Edit locally" : "Επεξεργασία τοπικά",
+ "Open" : "Άνοιγμα",
+ "Could not load info for file \"{file}\"" : "Αδυναμία φόρτωσης πληροφοριών για το αρχείο \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Επιλέξτε ετικέτα (ες) για προσθήκη στην επιλογή",
+ "Apply tag(s) to selection" : "Εφαρμογή ετικετών στην επιλογή",
+ "Select directory \"{dirName}\"" : "Επιλέξτε κατάλογο \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Επιλέξτε αρχείο \"{fileName}\"",
+ "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλούμε ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή",
+ "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα",
+ "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"",
+ "copy" : "αντιγραφή",
+ "Could not copy \"{file}\", target exists" : "Αδυναμία αντιγραφής του \"{file}\", υπάρχει ήδη.",
+ "Could not copy \"{file}\"" : "Αδυναμία αντιγραφής του \"{file}\"",
+ "Copied {origin} inside {destination}" : "Αντιγράφτηκε το {origin} στο {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Αντιγράφτηκε το {origin} και {nbfiles} άλλα αρχεία στο {destination}",
+ "{newName} already exists" : "Το {newName} υπάρχει ήδη",
+ "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του αρχείου \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Αδυναμία δημιουργίας του αρχείου \"{file}\" επειδή υπάρχει ήδη",
+ "Could not create folder \"{dir}\" because it already exists" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\" επειδή υπάρχει ήδη",
+ "Could not fetch file details \"{file}\"" : "Δεν είναι δυνατή η ανάγνωση λεπτομερειών του αρχείου \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Σφάλμα διαγραφής του \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Κανένα αποτέλεσμα αναζήτησης σε άλλους φακέλους για {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Εισαγάγετε περισσότερους από δύο χαρακτήρες για αναζήτηση σε άλλους φακέλους",
+ "{dirs} and {files}" : "{dirs} και {files}",
+ "_including %n hidden_::_including %n hidden_" : ["περιλαμβάνεται %n κρυφό","περιλαμβάνονται %n κρυφά"],
+ "You do not have permission to upload or create files here" : "Δεν έχετε δικαιώματα μεταφόρτωσης ή δημιουργίας αρχείων εδώ",
+ "_Uploading %n file_::_Uploading %n files_" : ["Μεταφόρτωση %n αρχείου","Μεταφόρτωση %n αρχείων"],
+ "New" : "Νέα",
+ "New file/folder menu" : "Μενού νέου αρχείου/φακέλου",
+ "Select file range" : "Επιλέξτε εύρος αρχείων",
+ "{used}%" : "{used}%",
+ "{used} used" : "Σε χρήση {used}",
+ "\"{name}\" is an invalid file name." : "Το \"{name}\" δεν είναι έγκυρο όνομα αρχείου.",
+ "File name cannot be empty." : "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
+ "\"/\" is not allowed inside a file name." : "Το \"/\" δεν είναι επιτρεπτό εντός του ονόματος αρχείου.",
+ "\"{name}\" is not an allowed filetype" : "Το \"{name}\" δεν είναι ένας επιτρεπτός τύπος αρχείου",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του/της {owner} είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο φάκελος της ομάδας \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι πλήρης, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πλέον!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός χώρος του {owner} είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο φάκελος ομάδας \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι σχεδόν πλήρης ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ο αποθηκευτικός σας χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Ταιριάζει \"{filter}\"","Ταιριάζουν \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Ο άμεσος σύνδεσμος αντιγράφηκε (λειτουργεί μόνο για άτομα που έχουν πρόσβαση σε αυτό το αρχείο/φάκελο)",
+ "Path" : "Διαδρομή",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Αντιγραφή άμεσου συνδέσμου (λειτουργεί μόνο για άτομα που έχουν πρόσβαση στο αρχείο/φάκελο)",
+ "Upload file" : "Μεταφόρτωση αρχείου",
+ "An error occurred while trying to update the tags" : "Ένα σφάλμα προέκυψε κατά τη διάρκεια ενημέρωσης των ετικετών",
+ "Upload (max. %s)" : "Μεταφόρτωση (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Η ενέργεια του/της \"{displayName}\" εκτελέστηκε επιτυχώς",
+ "\"{displayName}\" action failed" : "Η ενέργεια του \"{displayName}\" απέτυχε",
+ "\"{displayName}\" batch action executed successfully" : "Η μαζική ενέργεια του/της \"{displayName}\" εκτελέστηκε επιτυχώς",
+ "Filter filenames…" : "Φιλτράρετε τα ονόματα αρχείων...",
+ "WebDAV URL copied to clipboard" : "Ο σύνδεσμος WebDAV αντιγράφηκε στο πρόχειρο",
+ "Enable the grid view" : "Ενεργοποίηση της προβολής πλέγματος",
+ "Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
+ "Use this address to access your Files via WebDAV" : "Χρήση αυτής της διεύθυνση για πρόσβαση στα Αρχεία σας μέσω WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Εάν έχετε ενεργοποιήσει το 2FA, πρέπει να δημιουργήσετε και να χρησιμοποιήσετε έναν νέο κωδικό πρόσβασης εφαρμογής κάνοντας κλικ εδώ.",
+ "Deletion cancelled" : "Διαγραφή ακυρώθηκε",
+ "Move cancelled" : "Μετακίνηση ακυρώθηκε",
+ "Cancelled move or copy operation" : "Ακυρώθηκε η λειτουργία μετακίνησης ή αντιγραφής",
+ "Open details" : "Άνοιγμα λεπτομερειών",
+ "Photos and images" : "Φωτογραφίες και εικόνες",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} φάκελος","{folderCount} φακέλοι"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} αρχείο","{fileCount} αρχεία"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 αρχείο και {folderCount} φάκελος","1 αρχείο και {folderCount} φακέλοι"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} αρχείο και 1 φάκελος","{fileCount} αρχεία και 1 φάκελος"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} αρχεία και {folderCount} φακέλοι",
+ "Personal Files" : "Προσωπικά Αρχεία",
"Text file" : "Αρχείο κειμένου",
- "New text file.txt" : "Νέο αρχείο file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός χώρος του {owner} είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ο φάκελος ομάδας \"{mountPoint}\" είναι γεμάτος, τα αρχεία δεν μπορούν πλέον να ενημερωθούν ή να συγχρονιστούν!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ο εξωτερικός χώρος αποθήκευσης \"{mountPoint}\" είναι πλήρης, τα αρχεία δεν μπορούν πλέον να ενημερωθούν ή να συγχρονιστούν!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ταιριάζει '{filter}' ","ταιριάζουν '{filter}'"]
+ "New text file.txt" : "Νέο αρχείο file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index 126f8786c0d..a325eb6bec7 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -1,92 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Storage is temporarily not available",
- "Storage invalid" : "Storage invalid",
- "Unknown error" : "Unknown error",
- "File could not be found" : "File could not be found",
- "Move or copy" : "Move or copy",
- "Download" : "Download",
- "Delete" : "Delete",
- "Home" : "Home",
- "Close" : "Close",
- "Favorites" : "Favourites",
- "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
- "Upload cancelled." : "Upload cancelled.",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
- "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
- "Not enough free space" : "Not enough free space",
- "Uploading …" : "Uploading …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "Target folder does not exist any more",
- "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
- "Actions" : "Actions",
- "Rename" : "Rename",
- "Copy" : "Copy",
- "Open" : "Open",
- "Delete file" : "Delete file",
- "Delete folder" : "Delete folder",
- "Disconnect storage" : "Disconnect storage",
- "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
- "Files" : "Files",
- "Details" : "Details",
- "Select" : "Select",
- "Pending" : "Pending",
- "Unable to determine date" : "Unable to determine date",
- "This operation is forbidden" : "This operation is forbidden",
- "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
- "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
- "Could not move \"{file}\"" : "Could not move \"{file}\"",
- "copy" : "copy",
- "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
- "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
- "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
- "{newName} already exists" : "{newName} already exists",
- "Could not rename \"{fileName}\", it does not exist any more" : "Could not rename \"{fileName}\", it does not exist any more",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name.",
- "Could not rename \"{fileName}\"" : "Could not rename \"{fileName}\"",
- "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
- "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
- "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
- "Name" : "Name",
- "Size" : "Size",
- "Modified" : "Modified",
- "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "{dirs} and {files}" : "{dirs} and {files}",
- "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
- "You don’t have permission to upload or create files here" : "You don’t have permission to upload or create files here",
- "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
- "New" : "New",
- "{used} of {quota} used" : "{used} of {quota} used",
- "{used} used" : "{used} used",
- "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
- "File name cannot be empty." : "File name cannot be empty.",
- "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
- "View in folder" : "View in folder",
- "Copied!" : "Copied!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copy direct link (only works for users who have access to this file/folder)",
- "Path" : "Path",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favourited",
- "Favorite" : "Favourite",
- "New folder" : "New folder",
- "Upload file" : "Upload file",
- "Recent" : "Recent",
- "Not favorited" : "Not favourited",
- "Remove from favorites" : "Remove from favourites",
- "Add to favorites" : "Add to favourites",
- "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
"Added to favorites" : "Added to favourites",
"Removed from favorites" : "Removed from favourites",
"You added {file} to your favorites" : "You added {file} to your favourites",
"You removed {file} from your favorites" : "You removed {file} from your favourites",
+ "Favorites" : "Favourites",
"File changes" : "File changes",
"Created by {user}" : "Created by {user}",
"Changed by {user}" : "Changed by {user}",
@@ -94,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Restored by {user}",
"Renamed by {user}" : "Renamed by {user}",
"Moved by {user}" : "Moved by {user}",
- "\"remote user\"" : "\"remote user\"",
+ "\"remote account\"" : "\"remote account\"",
"You created {file}" : "You created {file}",
"You created an encrypted file in {file}" : "You created an encrypted file in {file}",
"{user} created {file}" : "{user} created {file}",
@@ -110,46 +29,474 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} deleted an encrypted file in {file}",
"You restored {file}" : "You restored {file}",
"{user} restored {file}" : "{user} restored {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "You renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "You renamed {oldfile} (hidden) to {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "You renamed {oldfile} to {newfile} (hidden)",
"You renamed {oldfile} to {newfile}" : "You renamed {oldfile} to {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renamed {oldfile} (hidden) to {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renamed {oldfile} to {newfile} (hidden)",
"{user} renamed {oldfile} to {newfile}" : "{user} renamed {oldfile} to {newfile}",
"You moved {oldfile} to {newfile}" : "You moved {oldfile} to {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} moved {oldfile} to {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "A file has been added to or removed from your <strong>favourites</strong>",
+ "Files" : "Files",
"A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
- "All files" : "All files",
- "Unlimited" : "Unlimited",
- "Upload (max. %s)" : "Upload (max. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "A favourite file or folder has been <strong>changed</strong>",
+ "Failed to authorize" : "Failed to authorize",
+ "Invalid folder path" : "Invalid folder path",
+ "Folder not found" : "Folder not found",
+ "The file cannot be found" : "The file cannot be found",
+ "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s",
+ "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location",
+ "The file could not be converted." : "The file could not be converted.",
+ "Could not get relative path to converted file" : "Could not get relative path to converted file",
+ "Favorite files" : "Favorite files",
+ "No favorites" : "No favourites",
+ "More favorites" : "More favorites",
"Accept" : "Accept",
"Reject" : "Reject",
+ "Incoming ownership transfer from {user}" : "Incoming ownership transfer from {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour.",
+ "Ownership transfer denied" : "Ownership transfer denied",
+ "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.",
+ "Ownership transfer failed" : "Ownership transfer failed",
+ "Your ownership transfer of {path} to {user} failed." : "Your ownership transfer of {path} to {user} failed.",
+ "The ownership transfer of {path} from {user} failed." : "The ownership transfer of {path} from {user} failed.",
+ "Ownership transfer done" : "Ownership transfer done",
+ "Your ownership transfer of {path} to {user} has completed." : "Your ownership transfer of {path} to {user} has completed.",
+ "The ownership transfer of {path} from {user} has completed." : "The ownership transfer of {path} from {user} has completed.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s",
+ "Files compatibility" : "Files compatibility",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.",
+ "Enforce Windows compatibility" : "Enforce Windows compatibility",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.",
"File Management" : "File Management",
- "Change" : "Change",
- "Transfer" : "Transfer",
- "Tags" : "Tags",
- "Cancel" : "Cancel",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Target folder does not exist any more",
+ "Reload current directory" : "Reload current directory",
+ "Go to the \"{dir}\" directory" : "Go to the \"{dir}\" directory",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.",
+ "Drag and drop files here to upload" : "Drag and drop files here to upload",
+ "Favorite" : "Favourite",
+ "Back" : "Back",
+ "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"",
+ "File is loading" : "File is loading",
+ "Folder is loading" : "Folder is loading",
+ "Filename" : "Filename",
+ "Folder name" : "Folder name",
+ "This node is unavailable" : "This node is unavailable",
+ "Another entry with the same name already exists." : "Another entry with the same name already exists.",
+ "Invalid filename." : "Invalid filename.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"",
+ "Rename file" : "Rename file",
+ "Folder" : "Folder",
+ "Unknown file type" : "Unknown file type",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Pending",
+ "Unknown date" : "Unknown date",
+ "Clear filter" : "Clear filter",
+ "Modified" : "Modified",
+ "Search everywhere" : "Search everywhere",
+ "Type" : "Type",
+ "Active filters" : "Active filters",
+ "Remove filter" : "Remove filter",
+ "Total rows summary" : "Total rows summary",
+ "Toggle selection for all files and folders" : "Toggle selection for all files and folders",
+ "Name" : "Name",
+ "File type" : "File type",
+ "Size" : "Size",
+ "{displayName}: failed on some elements" : "{displayName}: failed on some elements",
+ "{displayName}: done" : "{displayName}: done",
+ "{displayName}: failed" : "{displayName}: failed",
+ "Actions" : "Actions",
+ "(selected)" : "(selected)",
+ "List of files and folders." : "List of files and folders.",
+ "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
+ "File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
+ "Search everywhere …" : "Search everywhere …",
+ "Search here …" : "Search here …",
+ "Search scope options" : "Search scope options",
+ "Search here" : "Search here",
+ "{usedQuotaByte} used" : "{usedQuotaByte} used",
+ "{used} of {quota} used" : "{used} of {quota} used",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "Could not refresh storage stats",
+ "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
+ "Storage information" : "Storage information",
+ "Storage quota" : "Storage quota",
+ "New folder" : "New folder",
+ "Create new folder" : "Create new folder",
+ "This name is already in use." : "This name is already in use.",
"Create" : "Create",
- "%s used" : "%s used",
- "%1$s of %2$s used" : "%1$s of %2$s used",
- "Settings" : "Settings",
- "Show hidden files" : "Show hidden files",
- "WebDAV" : "WebDAV",
+ "Files starting with a dot are hidden by default" : "Files starting with a dot are hidden by default",
+ "Fill template fields" : "Fill template fields",
+ "Submitting fields …" : "Submitting fields …",
+ "Submit" : "Submit",
+ "Choose a file or folder to transfer" : "Choose a file or folder to transfer",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transfer {path} to {userid}",
+ "Invalid path selected" : "Invalid path selected",
+ "Unknown error" : "Unknown error",
+ "Ownership transfer request sent" : "Ownership transfer request sent",
+ "Cannot transfer ownership of a file or folder you do not own" : "Cannot transfer ownership of a file or folder you do not own",
+ "Transfer ownership of a file or folder" : "Transfer ownership of a file or folder",
+ "Choose file or folder to transfer" : "Choose file or folder to transfer",
+ "Change" : "Change",
+ "New owner" : "New owner",
+ "Keep {old}" : "Keep {old}",
+ "Keep without extension" : "Keep without extension",
+ "Use {new}" : "Use {new}",
+ "Remove extension" : "Remove extension",
+ "Change file extension" : "Change file extension",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.",
+ "Do not show this dialog again." : "Do not show this dialogue again.",
+ "Select file or folder to link to" : "Select file or folder to link to",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Share",
+ "Shared by link" : "Shared by link",
+ "Shared" : "Shared",
+ "Switch to list view" : "Switch to list view",
+ "Switch to grid view" : "Switch to grid view",
+ "The file could not be found" : "The file could not be found",
+ "Upload was cancelled by user" : "Upload was cancelled by user",
+ "Not enough free space" : "Not enough free space",
+ "Operation is blocked by access control" : "Operation is blocked by access control",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Error during upload, status code {status}" : "Error during upload, status code {status}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "Loading current folder",
+ "Retry" : "Retry",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
+ "Go back" : "Go back",
+ "Views" : "Views",
+ "Files settings" : "Files settings",
+ "Your files" : "Your files",
+ "Open in files" : "Open in files",
+ "File cannot be accessed" : "File cannot be accessed",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.",
+ "No search results for “{query}”" : "No search results for “{query}”",
+ "Search for files" : "Search for files",
+ "Clipboard is not available" : "Clipboard is not available",
+ "WebDAV URL copied" : "WebDAV URL copied",
+ "General" : "General",
+ "Default view" : "Default view",
+ "All files" : "All files",
+ "Personal files" : "Personal files",
+ "Sort favorites first" : "Sort favourites first",
+ "Sort folders before files" : "Sort folders before files",
+ "Folder tree" : "Folder tree",
+ "Appearance" : "Appearance",
+ "Show hidden files" : "Show hidden files",
+ "Show file type column" : "Show file type column",
+ "Show file extensions" : "Show file extensions",
+ "Crop image previews" : "Crop image previews",
+ "Additional settings" : "Additional settings",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copy",
+ "How to access files using WebDAV" : "How to access files using WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.",
+ "Warnings" : "Warnings",
+ "Warn before changing a file extension" : "Warn before changing a file extension",
+ "Warn before deleting files" : "Warn before deleting files",
+ "Keyboard shortcuts" : "Keyboard shortcuts",
+ "File actions" : "File actions",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Add or remove favorite" : "Add or remove favorite",
+ "Manage tags" : "Manage tags",
+ "Selection" : "Selection",
+ "Select all files" : "Select all files",
+ "Deselect all" : "Deselect all",
+ "Select or deselect" : "Select or deselect",
+ "Select a range" : "Select a range",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Go to parent folder",
+ "Go to file above" : "Go to file above",
+ "Go to file below" : "Go to file below",
+ "Go left in grid" : "Go left in grid",
+ "Go right in grid" : "Go right in grid",
+ "View" : "View",
+ "Toggle grid view" : "Toggle grid view",
+ "Open file sidebar" : "Open file sidebar",
+ "Show those shortcuts" : "Show those shortcuts",
+ "You" : "You",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Unable to change the favorite state of the file" : "Unable to change the favorite state of the file",
+ "Error while loading the file data" : "Error while loading the file data",
+ "Owner" : "Owner",
+ "Remove from favorites" : "Remove from favourites",
+ "Add to favorites" : "Add to favourites",
+ "Tags" : "Tags",
+ "Blank" : "Blank",
+ "Unable to create new file from template" : "Unable to create new file from template",
+ "Pick a template for {name}" : "Pick a template for {name}",
+ "Create a new file with the selected template" : "Create a new file with the selected template",
+ "Creating file" : "Creating file",
+ "Save as {displayName}" : "Save as {displayName}",
+ "Save as …" : "Save as …",
+ "Converting files …" : "Converting files …",
+ "Failed to convert files: {message}" : "Failed to convert files: {message}",
+ "All files failed to be converted" : "All files failed to be converted",
+ "One file could not be converted: {message}" : "One file could not be converted: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
+ "Files successfully converted" : "Files successfully converted",
+ "Failed to convert files" : "Failed to convert files",
+ "Converting file …" : "Converting file …",
+ "File successfully converted" : "File successfully converted",
+ "Failed to convert file: {message}" : "Failed to convert file: {message}",
+ "Failed to convert file" : "Failed to convert file",
+ "Leave this share" : "Leave this share",
+ "Leave these shares" : "Leave these shares",
+ "Disconnect storage" : "Disconnect storage",
+ "Disconnect storages" : "Disconnect storages",
+ "Delete permanently" : "Delete permanently",
+ "Delete and unshare" : "Delete and unshare",
+ "Delete file" : "Delete file",
+ "Delete files" : "Delete files",
+ "Delete folder" : "Delete folder",
+ "Delete folders" : "Delete folders",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"],
+ "Confirm deletion" : "Confirm deletion",
+ "Cancel" : "Cancel",
+ "Download" : "Download",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
+ "Destination is not a folder" : "Destination is not a folder",
+ "This file/folder is already in that directory" : "This file/folder is already in that directory",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The files are locked" : "The files are locked",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Move",
+ "Move or copy operation failed" : "Move or copy operation failed",
+ "Move or copy" : "Move or copy",
+ "Open folder {displayName}" : "Open folder {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Open locally",
+ "Failed to redirect to client" : "Failed to redirect to client",
+ "Open file locally" : "Open file locally",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.",
+ "Retry and close" : "Retry and close",
+ "Open online" : "Open online",
+ "Details" : "Details",
+ "View in folder" : "View in folder",
+ "Today" : "Today",
+ "Last 7 days" : "Last 7 days",
+ "Last 30 days" : "Last 30 days",
+ "This year ({year})" : "This year ({year})",
+ "Last year ({year})" : "Last year ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Folders",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "Unable to initialize the templates directory",
+ "Create templates folder" : "Create templates folder",
+ "Templates" : "Templates",
+ "New template folder" : "New template folder",
+ "In folder" : "In folder",
+ "Search in all files" : "Search in all files",
+ "Search in folder: {folder}" : "Search in folder: {folder}",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
+ "No files to upload" : "No files to upload",
+ "Unable to create the directory {directory}" : "Unable to create the directory {directory}",
+ "Some files could not be uploaded" : "Some files could not be uploaded",
+ "Files uploaded successfully" : "Files uploaded successfully",
+ "No files to process" : "No files to process",
+ "Some files could not be copied" : "Some files could not be copied",
+ "Some files could not be moved" : "Some files could not be moved",
+ "Files copied successfully" : "Files copied successfully",
+ "Files moved successfully" : "Files moved successfully",
+ "Conflicts resolution skipped" : "Conflicts resolution skipped",
+ "Upload cancelled" : "Upload cancelled",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Could not rename \"{oldName}\", it does not exist any more",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name.",
+ "Could not rename \"{oldName}\"" : "Could not rename \"{oldName}\"",
+ "This operation is forbidden" : "This operation is forbidden",
+ "This folder is unavailable, please try again later or contact the administration" : "This folder is unavailable, please try again later or contact the administration",
+ "Storage is temporarily not available" : "Storage is temporarily not available",
+ "Unexpected error: {error}" : "Unexpected error: {error}",
+ "_%n file_::_%n files_" : ["%n file","%n files"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"],
+ "Filename must not be empty." : "Filename must not be empty.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.",
+ "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".",
+ "List of favorite files and folders." : "List of favourite files and folders.",
+ "No favorites yet" : "No favourites yet",
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
+ "List of your files and folders." : "List of your files and folders.",
+ "List of your files and folders that are not shared." : "List of your files and folders that are not shared.",
+ "No personal files found" : "No personal files found",
+ "Files that are not shared will show up here." : "Files that are not shared will show up here.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "List of recently modified files and folders.",
+ "No recently modified files" : "No recently modified files",
+ "Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
+ "Search" : "Search",
+ "Search results within your files." : "Search results within your files.",
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
"Upload too large" : "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
- "No favorites yet" : "No favourites yet",
- "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
- "Deleted files" : "Deleted files",
- "Shares" : "Shares",
- "Shared with others" : "Shared with others",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Shared by link",
+ "File could not be found" : "File could not be found",
+ "Show list view" : "Show list view",
+ "Show grid view" : "Show grid view",
+ "Close" : "Close",
+ "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
+ "This will stop your current uploads." : "This will stop your current uploads.",
+ "Upload cancelled." : "Upload cancelled.",
+ "Processing files …" : "Processing files …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
+ "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
+ "An unknown error has occurred" : "An unknown error has occurred",
+ "File could not be uploaded" : "File could not be uploaded",
+ "Uploading …" : "Uploading …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploading … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uploading that item is not supported",
+ "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
+ "Choose target folder" : "Choose target folder",
+ "Set reminder" : "Set reminder",
+ "Edit locally" : "Edit locally",
+ "Open" : "Open",
+ "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Please select tag(s) to add to the selection",
+ "Apply tag(s) to selection" : "Apply tag(s) to selection",
+ "Select directory \"{dirName}\"" : "Select directory \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Select file \"{fileName}\"",
+ "Unable to determine date" : "Unable to determine date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
+ "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
+ "Could not move \"{file}\"" : "Could not move \"{file}\"",
+ "copy" : "copy",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
+ "{newName} already exists" : "{newName} already exists",
+ "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
+ "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
+ "Could not fetch file details \"{file}\"" : "Could not fetch file details \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Enter more than two characters to search in other folders",
+ "{dirs} and {files}" : "{dirs} and {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
+ "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
+ "New" : "New",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Select file range",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} used",
+ "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
+ "File name cannot be empty." : "File name cannot be empty.",
+ "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Storage of {owner} is full, files cannot be updated or synced anymore!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Your storage is full, files cannot be updated or synced anymore!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Storage of {owner} is almost full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Your storage is almost full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)",
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Favored" : "Favoured",
+ "Favor" : "Favour",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)",
+ "Upload file" : "Upload file",
+ "Not favored" : "Not favoured",
+ "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" action executed successfully",
+ "\"{displayName}\" action failed" : "\"{displayName}\" action failed",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully",
+ "Submitting fields…" : "Submitting fields…",
+ "Filter filenames…" : "Filter filenames…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copied to clipboard",
+ "Enable the grid view" : "Enable the grid view",
+ "Enable folder tree" : "Enable folder tree",
+ "Copy to clipboard" : "Copy to clipboard",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Deletion cancelled" : "Deletion cancelled",
+ "Move cancelled" : "Move cancelled",
+ "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "Open details",
+ "Photos and images" : "Photos and images",
+ "New folder creation cancelled" : "New folder creation cancelled",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "All folders" : "All folders",
+ "Personal Files" : "Personal Files",
"Text file" : "Text file",
"New text file.txt" : "New text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Storage of {owner} is full, files can not be updated or synced anymore!",
- "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
- "_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"]
+ "%1$s (renamed)" : "%1$s (renamed)",
+ "renamed file" : "renamed file",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "Filter file names …" : "Filter file names …",
+ "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogues from opening or reenable them.",
+ "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
+ "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.",
+ "Open the actions menu for a file" : "Open the actions menu for a file",
+ "Rename a file" : "Rename a file",
+ "Delete a file" : "Delete a file",
+ "Favorite or remove a file from favorites" : "Favourite or remove a file from favourites",
+ "Manage tags for a file" : "Manage tags for a file",
+ "Deselect all files" : "Deselect all files",
+ "Select or deselect a file" : "Select or deselect a file",
+ "Select a range of files" : "Select a range of files",
+ "Navigate to the parent folder" : "Navigate to the parent folder",
+ "Navigate to the file above" : "Navigate to the file above",
+ "Navigate to the file below" : "Navigate to the file below",
+ "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)",
+ "Toggle the grid view" : "Toggle the grid view",
+ "Open the sidebar for a file" : "Open the sidebar for a file"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index aa74bddfd37..2284ec11b26 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -1,90 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Storage is temporarily not available",
- "Storage invalid" : "Storage invalid",
- "Unknown error" : "Unknown error",
- "File could not be found" : "File could not be found",
- "Move or copy" : "Move or copy",
- "Download" : "Download",
- "Delete" : "Delete",
- "Home" : "Home",
- "Close" : "Close",
- "Favorites" : "Favourites",
- "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
- "Upload cancelled." : "Upload cancelled.",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
- "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
- "Not enough free space" : "Not enough free space",
- "Uploading …" : "Uploading …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "Target folder does not exist any more",
- "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
- "Actions" : "Actions",
- "Rename" : "Rename",
- "Copy" : "Copy",
- "Open" : "Open",
- "Delete file" : "Delete file",
- "Delete folder" : "Delete folder",
- "Disconnect storage" : "Disconnect storage",
- "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
- "Files" : "Files",
- "Details" : "Details",
- "Select" : "Select",
- "Pending" : "Pending",
- "Unable to determine date" : "Unable to determine date",
- "This operation is forbidden" : "This operation is forbidden",
- "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
- "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
- "Could not move \"{file}\"" : "Could not move \"{file}\"",
- "copy" : "copy",
- "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
- "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
- "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
- "{newName} already exists" : "{newName} already exists",
- "Could not rename \"{fileName}\", it does not exist any more" : "Could not rename \"{fileName}\", it does not exist any more",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name.",
- "Could not rename \"{fileName}\"" : "Could not rename \"{fileName}\"",
- "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
- "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
- "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
- "Name" : "Name",
- "Size" : "Size",
- "Modified" : "Modified",
- "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "{dirs} and {files}" : "{dirs} and {files}",
- "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
- "You don’t have permission to upload or create files here" : "You don’t have permission to upload or create files here",
- "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
- "New" : "New",
- "{used} of {quota} used" : "{used} of {quota} used",
- "{used} used" : "{used} used",
- "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
- "File name cannot be empty." : "File name cannot be empty.",
- "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
- "View in folder" : "View in folder",
- "Copied!" : "Copied!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copy direct link (only works for users who have access to this file/folder)",
- "Path" : "Path",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favourited",
- "Favorite" : "Favourite",
- "New folder" : "New folder",
- "Upload file" : "Upload file",
- "Recent" : "Recent",
- "Not favorited" : "Not favourited",
- "Remove from favorites" : "Remove from favourites",
- "Add to favorites" : "Add to favourites",
- "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
"Added to favorites" : "Added to favourites",
"Removed from favorites" : "Removed from favourites",
"You added {file} to your favorites" : "You added {file} to your favourites",
"You removed {file} from your favorites" : "You removed {file} from your favourites",
+ "Favorites" : "Favourites",
"File changes" : "File changes",
"Created by {user}" : "Created by {user}",
"Changed by {user}" : "Changed by {user}",
@@ -92,7 +11,7 @@
"Restored by {user}" : "Restored by {user}",
"Renamed by {user}" : "Renamed by {user}",
"Moved by {user}" : "Moved by {user}",
- "\"remote user\"" : "\"remote user\"",
+ "\"remote account\"" : "\"remote account\"",
"You created {file}" : "You created {file}",
"You created an encrypted file in {file}" : "You created an encrypted file in {file}",
"{user} created {file}" : "{user} created {file}",
@@ -108,46 +27,474 @@
"{user} deleted an encrypted file in {file}" : "{user} deleted an encrypted file in {file}",
"You restored {file}" : "You restored {file}",
"{user} restored {file}" : "{user} restored {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "You renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "You renamed {oldfile} (hidden) to {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "You renamed {oldfile} to {newfile} (hidden)",
"You renamed {oldfile} to {newfile}" : "You renamed {oldfile} to {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renamed {oldfile} (hidden) to {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renamed {oldfile} to {newfile} (hidden)",
"{user} renamed {oldfile} to {newfile}" : "{user} renamed {oldfile} to {newfile}",
"You moved {oldfile} to {newfile}" : "You moved {oldfile} to {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} moved {oldfile} to {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "A file has been added to or removed from your <strong>favourites</strong>",
+ "Files" : "Files",
"A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
- "All files" : "All files",
- "Unlimited" : "Unlimited",
- "Upload (max. %s)" : "Upload (max. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "A favourite file or folder has been <strong>changed</strong>",
+ "Failed to authorize" : "Failed to authorize",
+ "Invalid folder path" : "Invalid folder path",
+ "Folder not found" : "Folder not found",
+ "The file cannot be found" : "The file cannot be found",
+ "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s",
+ "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location",
+ "The file could not be converted." : "The file could not be converted.",
+ "Could not get relative path to converted file" : "Could not get relative path to converted file",
+ "Favorite files" : "Favorite files",
+ "No favorites" : "No favourites",
+ "More favorites" : "More favorites",
"Accept" : "Accept",
"Reject" : "Reject",
+ "Incoming ownership transfer from {user}" : "Incoming ownership transfer from {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour.",
+ "Ownership transfer denied" : "Ownership transfer denied",
+ "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.",
+ "Ownership transfer failed" : "Ownership transfer failed",
+ "Your ownership transfer of {path} to {user} failed." : "Your ownership transfer of {path} to {user} failed.",
+ "The ownership transfer of {path} from {user} failed." : "The ownership transfer of {path} from {user} failed.",
+ "Ownership transfer done" : "Ownership transfer done",
+ "Your ownership transfer of {path} to {user} has completed." : "Your ownership transfer of {path} to {user} has completed.",
+ "The ownership transfer of {path} from {user} has completed." : "The ownership transfer of {path} from {user} has completed.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s",
+ "Files compatibility" : "Files compatibility",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.",
+ "Enforce Windows compatibility" : "Enforce Windows compatibility",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.",
"File Management" : "File Management",
- "Change" : "Change",
- "Transfer" : "Transfer",
- "Tags" : "Tags",
- "Cancel" : "Cancel",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Target folder does not exist any more",
+ "Reload current directory" : "Reload current directory",
+ "Go to the \"{dir}\" directory" : "Go to the \"{dir}\" directory",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.",
+ "Drag and drop files here to upload" : "Drag and drop files here to upload",
+ "Favorite" : "Favourite",
+ "Back" : "Back",
+ "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"",
+ "File is loading" : "File is loading",
+ "Folder is loading" : "Folder is loading",
+ "Filename" : "Filename",
+ "Folder name" : "Folder name",
+ "This node is unavailable" : "This node is unavailable",
+ "Another entry with the same name already exists." : "Another entry with the same name already exists.",
+ "Invalid filename." : "Invalid filename.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"",
+ "Rename file" : "Rename file",
+ "Folder" : "Folder",
+ "Unknown file type" : "Unknown file type",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Pending",
+ "Unknown date" : "Unknown date",
+ "Clear filter" : "Clear filter",
+ "Modified" : "Modified",
+ "Search everywhere" : "Search everywhere",
+ "Type" : "Type",
+ "Active filters" : "Active filters",
+ "Remove filter" : "Remove filter",
+ "Total rows summary" : "Total rows summary",
+ "Toggle selection for all files and folders" : "Toggle selection for all files and folders",
+ "Name" : "Name",
+ "File type" : "File type",
+ "Size" : "Size",
+ "{displayName}: failed on some elements" : "{displayName}: failed on some elements",
+ "{displayName}: done" : "{displayName}: done",
+ "{displayName}: failed" : "{displayName}: failed",
+ "Actions" : "Actions",
+ "(selected)" : "(selected)",
+ "List of files and folders." : "List of files and folders.",
+ "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
+ "File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
+ "Search everywhere …" : "Search everywhere …",
+ "Search here …" : "Search here …",
+ "Search scope options" : "Search scope options",
+ "Search here" : "Search here",
+ "{usedQuotaByte} used" : "{usedQuotaByte} used",
+ "{used} of {quota} used" : "{used} of {quota} used",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "Could not refresh storage stats",
+ "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
+ "Storage information" : "Storage information",
+ "Storage quota" : "Storage quota",
+ "New folder" : "New folder",
+ "Create new folder" : "Create new folder",
+ "This name is already in use." : "This name is already in use.",
"Create" : "Create",
- "%s used" : "%s used",
- "%1$s of %2$s used" : "%1$s of %2$s used",
- "Settings" : "Settings",
- "Show hidden files" : "Show hidden files",
- "WebDAV" : "WebDAV",
+ "Files starting with a dot are hidden by default" : "Files starting with a dot are hidden by default",
+ "Fill template fields" : "Fill template fields",
+ "Submitting fields …" : "Submitting fields …",
+ "Submit" : "Submit",
+ "Choose a file or folder to transfer" : "Choose a file or folder to transfer",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transfer {path} to {userid}",
+ "Invalid path selected" : "Invalid path selected",
+ "Unknown error" : "Unknown error",
+ "Ownership transfer request sent" : "Ownership transfer request sent",
+ "Cannot transfer ownership of a file or folder you do not own" : "Cannot transfer ownership of a file or folder you do not own",
+ "Transfer ownership of a file or folder" : "Transfer ownership of a file or folder",
+ "Choose file or folder to transfer" : "Choose file or folder to transfer",
+ "Change" : "Change",
+ "New owner" : "New owner",
+ "Keep {old}" : "Keep {old}",
+ "Keep without extension" : "Keep without extension",
+ "Use {new}" : "Use {new}",
+ "Remove extension" : "Remove extension",
+ "Change file extension" : "Change file extension",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.",
+ "Do not show this dialog again." : "Do not show this dialogue again.",
+ "Select file or folder to link to" : "Select file or folder to link to",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Share",
+ "Shared by link" : "Shared by link",
+ "Shared" : "Shared",
+ "Switch to list view" : "Switch to list view",
+ "Switch to grid view" : "Switch to grid view",
+ "The file could not be found" : "The file could not be found",
+ "Upload was cancelled by user" : "Upload was cancelled by user",
+ "Not enough free space" : "Not enough free space",
+ "Operation is blocked by access control" : "Operation is blocked by access control",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Error during upload, status code {status}" : "Error during upload, status code {status}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "Loading current folder",
+ "Retry" : "Retry",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
+ "Go back" : "Go back",
+ "Views" : "Views",
+ "Files settings" : "Files settings",
+ "Your files" : "Your files",
+ "Open in files" : "Open in files",
+ "File cannot be accessed" : "File cannot be accessed",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.",
+ "No search results for “{query}”" : "No search results for “{query}”",
+ "Search for files" : "Search for files",
+ "Clipboard is not available" : "Clipboard is not available",
+ "WebDAV URL copied" : "WebDAV URL copied",
+ "General" : "General",
+ "Default view" : "Default view",
+ "All files" : "All files",
+ "Personal files" : "Personal files",
+ "Sort favorites first" : "Sort favourites first",
+ "Sort folders before files" : "Sort folders before files",
+ "Folder tree" : "Folder tree",
+ "Appearance" : "Appearance",
+ "Show hidden files" : "Show hidden files",
+ "Show file type column" : "Show file type column",
+ "Show file extensions" : "Show file extensions",
+ "Crop image previews" : "Crop image previews",
+ "Additional settings" : "Additional settings",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copy",
+ "How to access files using WebDAV" : "How to access files using WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.",
+ "Warnings" : "Warnings",
+ "Warn before changing a file extension" : "Warn before changing a file extension",
+ "Warn before deleting files" : "Warn before deleting files",
+ "Keyboard shortcuts" : "Keyboard shortcuts",
+ "File actions" : "File actions",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Add or remove favorite" : "Add or remove favorite",
+ "Manage tags" : "Manage tags",
+ "Selection" : "Selection",
+ "Select all files" : "Select all files",
+ "Deselect all" : "Deselect all",
+ "Select or deselect" : "Select or deselect",
+ "Select a range" : "Select a range",
+ "Navigation" : "Navigation",
+ "Go to parent folder" : "Go to parent folder",
+ "Go to file above" : "Go to file above",
+ "Go to file below" : "Go to file below",
+ "Go left in grid" : "Go left in grid",
+ "Go right in grid" : "Go right in grid",
+ "View" : "View",
+ "Toggle grid view" : "Toggle grid view",
+ "Open file sidebar" : "Open file sidebar",
+ "Show those shortcuts" : "Show those shortcuts",
+ "You" : "You",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Unable to change the favorite state of the file" : "Unable to change the favorite state of the file",
+ "Error while loading the file data" : "Error while loading the file data",
+ "Owner" : "Owner",
+ "Remove from favorites" : "Remove from favourites",
+ "Add to favorites" : "Add to favourites",
+ "Tags" : "Tags",
+ "Blank" : "Blank",
+ "Unable to create new file from template" : "Unable to create new file from template",
+ "Pick a template for {name}" : "Pick a template for {name}",
+ "Create a new file with the selected template" : "Create a new file with the selected template",
+ "Creating file" : "Creating file",
+ "Save as {displayName}" : "Save as {displayName}",
+ "Save as …" : "Save as …",
+ "Converting files …" : "Converting files …",
+ "Failed to convert files: {message}" : "Failed to convert files: {message}",
+ "All files failed to be converted" : "All files failed to be converted",
+ "One file could not be converted: {message}" : "One file could not be converted: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
+ "Files successfully converted" : "Files successfully converted",
+ "Failed to convert files" : "Failed to convert files",
+ "Converting file …" : "Converting file …",
+ "File successfully converted" : "File successfully converted",
+ "Failed to convert file: {message}" : "Failed to convert file: {message}",
+ "Failed to convert file" : "Failed to convert file",
+ "Leave this share" : "Leave this share",
+ "Leave these shares" : "Leave these shares",
+ "Disconnect storage" : "Disconnect storage",
+ "Disconnect storages" : "Disconnect storages",
+ "Delete permanently" : "Delete permanently",
+ "Delete and unshare" : "Delete and unshare",
+ "Delete file" : "Delete file",
+ "Delete files" : "Delete files",
+ "Delete folder" : "Delete folder",
+ "Delete folders" : "Delete folders",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"],
+ "Confirm deletion" : "Confirm deletion",
+ "Cancel" : "Cancel",
+ "Download" : "Download",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
+ "Destination is not a folder" : "Destination is not a folder",
+ "This file/folder is already in that directory" : "This file/folder is already in that directory",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The files are locked" : "The files are locked",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Move",
+ "Move or copy operation failed" : "Move or copy operation failed",
+ "Move or copy" : "Move or copy",
+ "Open folder {displayName}" : "Open folder {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Open locally",
+ "Failed to redirect to client" : "Failed to redirect to client",
+ "Open file locally" : "Open file locally",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.",
+ "Retry and close" : "Retry and close",
+ "Open online" : "Open online",
+ "Details" : "Details",
+ "View in folder" : "View in folder",
+ "Today" : "Today",
+ "Last 7 days" : "Last 7 days",
+ "Last 30 days" : "Last 30 days",
+ "This year ({year})" : "This year ({year})",
+ "Last year ({year})" : "Last year ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Folders",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "Unable to initialize the templates directory",
+ "Create templates folder" : "Create templates folder",
+ "Templates" : "Templates",
+ "New template folder" : "New template folder",
+ "In folder" : "In folder",
+ "Search in all files" : "Search in all files",
+ "Search in folder: {folder}" : "Search in folder: {folder}",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
+ "No files to upload" : "No files to upload",
+ "Unable to create the directory {directory}" : "Unable to create the directory {directory}",
+ "Some files could not be uploaded" : "Some files could not be uploaded",
+ "Files uploaded successfully" : "Files uploaded successfully",
+ "No files to process" : "No files to process",
+ "Some files could not be copied" : "Some files could not be copied",
+ "Some files could not be moved" : "Some files could not be moved",
+ "Files copied successfully" : "Files copied successfully",
+ "Files moved successfully" : "Files moved successfully",
+ "Conflicts resolution skipped" : "Conflicts resolution skipped",
+ "Upload cancelled" : "Upload cancelled",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Could not rename \"{oldName}\", it does not exist any more",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name.",
+ "Could not rename \"{oldName}\"" : "Could not rename \"{oldName}\"",
+ "This operation is forbidden" : "This operation is forbidden",
+ "This folder is unavailable, please try again later or contact the administration" : "This folder is unavailable, please try again later or contact the administration",
+ "Storage is temporarily not available" : "Storage is temporarily not available",
+ "Unexpected error: {error}" : "Unexpected error: {error}",
+ "_%n file_::_%n files_" : ["%n file","%n files"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"],
+ "Filename must not be empty." : "Filename must not be empty.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.",
+ "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".",
+ "List of favorite files and folders." : "List of favourite files and folders.",
+ "No favorites yet" : "No favourites yet",
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
+ "List of your files and folders." : "List of your files and folders.",
+ "List of your files and folders that are not shared." : "List of your files and folders that are not shared.",
+ "No personal files found" : "No personal files found",
+ "Files that are not shared will show up here." : "Files that are not shared will show up here.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "List of recently modified files and folders.",
+ "No recently modified files" : "No recently modified files",
+ "Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
+ "Search" : "Search",
+ "Search results within your files." : "Search results within your files.",
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
"Upload too large" : "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
- "No favorites yet" : "No favourites yet",
- "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here",
- "Deleted files" : "Deleted files",
- "Shares" : "Shares",
- "Shared with others" : "Shared with others",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Shared by link",
+ "File could not be found" : "File could not be found",
+ "Show list view" : "Show list view",
+ "Show grid view" : "Show grid view",
+ "Close" : "Close",
+ "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
+ "This will stop your current uploads." : "This will stop your current uploads.",
+ "Upload cancelled." : "Upload cancelled.",
+ "Processing files …" : "Processing files …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
+ "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
+ "An unknown error has occurred" : "An unknown error has occurred",
+ "File could not be uploaded" : "File could not be uploaded",
+ "Uploading …" : "Uploading …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploading … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uploading that item is not supported",
+ "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
+ "Choose target folder" : "Choose target folder",
+ "Set reminder" : "Set reminder",
+ "Edit locally" : "Edit locally",
+ "Open" : "Open",
+ "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Please select tag(s) to add to the selection",
+ "Apply tag(s) to selection" : "Apply tag(s) to selection",
+ "Select directory \"{dirName}\"" : "Select directory \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Select file \"{fileName}\"",
+ "Unable to determine date" : "Unable to determine date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
+ "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
+ "Could not move \"{file}\"" : "Could not move \"{file}\"",
+ "copy" : "copy",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
+ "{newName} already exists" : "{newName} already exists",
+ "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
+ "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
+ "Could not fetch file details \"{file}\"" : "Could not fetch file details \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Enter more than two characters to search in other folders",
+ "{dirs} and {files}" : "{dirs} and {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
+ "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
+ "New" : "New",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Select file range",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} used",
+ "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
+ "File name cannot be empty." : "File name cannot be empty.",
+ "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Storage of {owner} is full, files cannot be updated or synced anymore!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Your storage is full, files cannot be updated or synced anymore!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Storage of {owner} is almost full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Your storage is almost full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)",
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Favored" : "Favoured",
+ "Favor" : "Favour",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)",
+ "Upload file" : "Upload file",
+ "Not favored" : "Not favoured",
+ "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" action executed successfully",
+ "\"{displayName}\" action failed" : "\"{displayName}\" action failed",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully",
+ "Submitting fields…" : "Submitting fields…",
+ "Filter filenames…" : "Filter filenames…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copied to clipboard",
+ "Enable the grid view" : "Enable the grid view",
+ "Enable folder tree" : "Enable folder tree",
+ "Copy to clipboard" : "Copy to clipboard",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Deletion cancelled" : "Deletion cancelled",
+ "Move cancelled" : "Move cancelled",
+ "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "Open details",
+ "Photos and images" : "Photos and images",
+ "New folder creation cancelled" : "New folder creation cancelled",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "All folders" : "All folders",
+ "Personal Files" : "Personal Files",
"Text file" : "Text file",
"New text file.txt" : "New text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Storage of {owner} is full, files can not be updated or synced anymore!",
- "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
- "_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"]
+ "%1$s (renamed)" : "%1$s (renamed)",
+ "renamed file" : "renamed file",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "Filter file names …" : "Filter file names …",
+ "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogues from opening or reenable them.",
+ "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
+ "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.",
+ "Open the actions menu for a file" : "Open the actions menu for a file",
+ "Rename a file" : "Rename a file",
+ "Delete a file" : "Delete a file",
+ "Favorite or remove a file from favorites" : "Favourite or remove a file from favourites",
+ "Manage tags for a file" : "Manage tags for a file",
+ "Deselect all files" : "Deselect all files",
+ "Select or deselect a file" : "Select or deselect a file",
+ "Select a range of files" : "Select a range of files",
+ "Navigate to the parent folder" : "Navigate to the parent folder",
+ "Navigate to the file above" : "Navigate to the file above",
+ "Navigate to the file below" : "Navigate to the file below",
+ "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)",
+ "Toggle the grid view" : "Toggle the grid view",
+ "Open the sidebar for a file" : "Open the sidebar for a file"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js
deleted file mode 100644
index d2419770232..00000000000
--- a/apps/files/l10n/eo.js
+++ /dev/null
@@ -1,166 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Konservejo dumtempe ne disponeblas",
- "Storage invalid" : "Konservejo ne validas",
- "Unknown error" : "Nekonata eraro",
- "File could not be found" : "Dosiero ne troveblas",
- "Move or copy" : "Movi aŭ kopii",
- "Download" : "Elŝuti",
- "Delete" : "Forigi",
- "Home" : "Hejmo",
- "Close" : "Fermi",
- "Favorites" : "Pliŝatataj",
- "Could not create folder \"{dir}\"" : "Ne eblas krei dosierujon „{dir}“",
- "This will stop your current uploads." : "Tio haltigos viajn nunajn alŝutojn.",
- "Upload cancelled." : "La alŝuto nuliĝis.",
- "Processing files …" : "Traktado de dosieroj…",
- "…" : "… ",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝuti {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 bajtoj",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ne sufiĉas libera spaco: vi alŝutas {size1} sed nur {size2} restas",
- "Target folder \"{dir}\" does not exist any more" : "Cela dosierujo \"{dir}\" ne plu ekzistas",
- "Not enough free space" : "Ne sufiĉe libera spaco",
- "An unknown error has occurred" : "Nekonata eraro okazis",
- "Uploading …" : "Alŝutado…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} el {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Alŝuto de tiu elemento ne estas subtenata",
- "Target folder does not exist any more" : "La cela dosierujo ne plu ekzistas",
- "Error when assembling chunks, status code {status}" : "Eraro dum kunigo de pecoj, stata kodo {status}",
- "Actions" : "Agoj",
- "Rename" : "Alinomi",
- "Copy" : "Kopii",
- "Choose target folder" : "Elekti celan dosierujon",
- "Open" : "Malfermi",
- "Delete file" : "Forigi dosieron",
- "Delete folder" : "Forigi dosierujon",
- "Disconnect storage" : "Malkonekti konservejon",
- "Could not load info for file \"{file}\"" : "Informo pri dosiero „{file}“ ne legeblis",
- "Files" : "Dosieroj",
- "Details" : "Detaloj",
- "Select" : "Elekti",
- "Pending" : "Pritraktotaj",
- "Unable to determine date" : "Ne eblas determini daton",
- "This operation is forbidden" : "Ĉi tiu operacio malpermesatas",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ĉi tiu dosierujo maldisponeblas, bonvolu kontroli la protokolojn aŭ kontakti la administranton",
- "Could not move \"{file}\", target exists" : "Ne eblas movi la dosieron „{file}“, celo jam ekzistas",
- "Could not move \"{file}\"" : "Ne eblas movi la dosieron „{file}“",
- "copy" : "kopio",
- "Could not copy \"{file}\", target exists" : "Ne eblas kopii la dosieron „{file}“, celo jam ekzistas",
- "Could not copy \"{file}\"" : "Ne eblas kopii la dosieron „{file}“",
- "Copied {origin} inside {destination}" : "{origin} kopiita ene de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} kaj {nbfiles} aliaj dosieroj kopiitaj ene de {destination}",
- "{newName} already exists" : "{newName} jam ekzistas",
- "Could not rename \"{fileName}\", it does not exist any more" : "Ne eblis alinomi „{fileName}“, ĝi ne plu ekzistas",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "La nomo „{targetName}“ jam uzatas en la dosierujo „{dir}“. Bonvolu elekti alian nomon.",
- "Could not rename \"{fileName}\"" : "Ne eblis alinomi „{fileName}“",
- "Could not create file \"{file}\"" : "Ne eblas krei dosieron „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Ne eblis krei dosieron „{file}“ ĉar ĝi jam ekzistas",
- "Could not create folder \"{dir}\" because it already exists" : "Ne eblas krei dosierujon „{dir}“ ĉar ĝi jam ekzistas",
- "Error deleting file \"{fileName}\"." : "Eraro dum forigo de dosiero „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Neniu serĉorezulto en aliaj dosierujoj pri {tag}{filter}{endtag}",
- "Name" : "Nomo",
- "Size" : "Grando",
- "Modified" : "Modifita",
- "_%n folder_::_%n folders_" : ["%n dosierujo","%n dosierujoj"],
- "_%n file_::_%n files_" : ["%n dosiero","%n dosieroj"],
- "{dirs} and {files}" : "{dirs} kaj {files}",
- "_including %n hidden_::_including %n hidden_" : ["inkluzive %n kaŝita","inkluzive %n kaŝita(j)"],
- "You don’t have permission to upload or create files here" : "Vi ne permesatas alŝuti aŭ krei dosierojn ĉi tie",
- "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"],
- "New" : "Nova",
- "Select file range" : "Elekti dosierintervalon",
- "{used} of {quota} used" : "{used} uzataj el {quota}",
- "{used} used" : "{used} uzataj",
- "\"{name}\" is an invalid file name." : "„{name}“ estas nevalida dosiernomo.",
- "File name cannot be empty." : "Dosiernomo devas ne malpleni.",
- "\"/\" is not allowed inside a file name." : "Ne eblas uziĝi „/“ en dosiernomo.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ne estas permesita dosiertipo.",
- "View in folder" : "Vidi en dosierujo",
- "Copied!" : "Kopiita!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopii senperan ligilon (nur validas por uzantoj, kiuj povas aliri al tiu dosiero aŭ dosierujo)",
- "Path" : "Vojo",
- "_%n byte_::_%n bytes_" : ["%n bajto","%n bajtoj"],
- "Favorited" : "Pliŝatitaj",
- "Favorite" : "Pliŝatata",
- "You can only favorite a single file or folder at a time" : "Vi povas samtempe pliŝatigi nur unu dosieron aŭ dosierujon",
- "New folder" : "Nova dosierujo",
- "Upload file" : "Alŝuti dosieron",
- "Recent" : "Lastaj ŝanĝoj",
- "Not favorited" : "Ne pliŝatitaj",
- "Remove from favorites" : "Malpliŝatigi",
- "Add to favorites" : "Pliŝatigi",
- "An error occurred while trying to update the tags" : "Okazis eraro dum provo ĝisdatigi la etikedojn",
- "Added to favorites" : "Aldonita al pliŝatataĵoj",
- "Removed from favorites" : "Forigita el pliŝataĵoj",
- "You added {file} to your favorites" : "Vi aldonis {file} al viaj pliŝataĵoj",
- "You removed {file} from your favorites" : "Vi forigis {file} el viaj pliŝataĵoj",
- "File changes" : "Dosierŝanĝoj",
- "Created by {user}" : "Kreita de {user}",
- "Changed by {user}" : "Ŝanĝita de {user}",
- "Deleted by {user}" : "Forigita de {user}",
- "Restored by {user}" : "Restaŭrita de {user}",
- "Renamed by {user}" : "Alinomita de {user}",
- "Moved by {user}" : "Movita de {user}",
- "\"remote user\"" : "„fora uzanto“",
- "You created {file}" : "Vi kreis „{file}“",
- "You created an encrypted file in {file}" : "Vi kreis ĉifritan dosieron en {file}",
- "{user} created {file}" : "{user} kreis {file}",
- "{user} created an encrypted file in {file}" : "{user} kreis ĉifritan dosieron en {file}",
- "{file} was created in a public folder" : "{file} kreiĝis en publika dosierujo",
- "You changed {file}" : "Vi ŝanĝis {file}",
- "You changed an encrypted file in {file}" : "Vi ŝanĝis ĉifritan dosieron en {file}",
- "{user} changed {file}" : "{user} ŝanĝis {file}",
- "{user} changed an encrypted file in {file}" : "{user} ŝanĝis ĉifritan dosieron en {file}",
- "You deleted {file}" : "Vi forigis {file}",
- "You deleted an encrypted file in {file}" : "Vi forigis ĉifritan dosieron en {file}",
- "{user} deleted {file}" : "{user} forigis {file}",
- "{user} deleted an encrypted file in {file}" : "{user} forigis ĉifritan dosieron en {file}",
- "You restored {file}" : "Vi restaŭris {file}",
- "{user} restored {file}" : "{user} restaŭris {file}",
- "You renamed {oldfile} to {newfile}" : "Vi alinomis {oldfile} al {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} alinomis {oldfile} al {newfile}",
- "You moved {oldfile} to {newfile}" : "Vi movis {oldfile} al {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movis {oldfile} al {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Dosiero aldoniĝis aŭ foriĝis el viaj <strong>pliŝataĵoj</strong>",
- "A file or folder has been <strong>changed</strong>" : "Dosiero aŭ dosierujo <strong>ŝanĝiĝis</strong>",
- "All files" : "Ĉiuj dosieroj",
- "Unlimited" : "Senlima",
- "Upload (max. %s)" : "Alŝuti (maks. %s)",
- "Accept" : "Akcepti",
- "Reject" : "Rifuzi",
- "in %s" : "en %s",
- "File Management" : "Dosieradministrado",
- "Change" : "Ŝanĝi",
- "Tags" : "Etikedoj",
- "Unable to change the favourite state of the file" : "Ne eblas ŝanĝi la staton pri pliŝatataĵo de la dosiero",
- "Error while loading the file data" : "Eraro dum ŝargo de la dosierdatumoj",
- "Cancel" : "Nuligi",
- "Create" : "Krei",
- "%s used" : "%s uzataj",
- "%s%% of %s used" : "%s%% el %s uzataj",
- "%1$s of %2$s used" : "%1$s uzataj el %2$s",
- "Settings" : "Agordo",
- "Show hidden files" : "Montri kaŝitajn dosierojn",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "Baskuligi kradan vidon",
- "No files in here" : "Neniu dosiero ĉi tie",
- "Upload some content or sync with your devices!" : "Alŝutu iom da enhavo aŭ sinkronigu kun viaj aparatoj!",
- "No entries found in this folder" : "Neniu enigo troviĝis en ĉi tiu dosierujo",
- "Select all" : "Elekti ĉion",
- "Upload too large" : "Alŝuto tro granda",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
- "No favorites yet" : "Ankoraŭ neniu pliŝataĵo",
- "Files and folders you mark as favorite will show up here" : "Dosieroj kaj dosierujoj, kiujn vi markas kiel pliŝataĵoj, aperos ĉi tie",
- "Deleted files" : "Forigitaj dosieroj",
- "Shares" : "Kunhavigoj",
- "Shared with others" : "Kunhavata kun aliaj",
- "Shared with you" : "Kunhavata kun vi",
- "Shared by link" : "Kunhavata per ligilo",
- "Deleted shares" : "Forigitaj kunhavigoj",
- "Text file" : "Tekstodosiero",
- "New text file.txt" : "Nova tekstodosiero.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Konservejo de {owner} plenas; dosieroj ne povas alŝutiĝi aŭ sinkroniĝi plu!",
- "Your storage is full, files can not be updated or synced anymore!" : "Via konservejo plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!",
- "_matches '{filter}'_::_match '{filter}'_" : ["kongruas kun “{filter}”","kongruas kun “{filter}”"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json
deleted file mode 100644
index cb8ee6af5a5..00000000000
--- a/apps/files/l10n/eo.json
+++ /dev/null
@@ -1,164 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Konservejo dumtempe ne disponeblas",
- "Storage invalid" : "Konservejo ne validas",
- "Unknown error" : "Nekonata eraro",
- "File could not be found" : "Dosiero ne troveblas",
- "Move or copy" : "Movi aŭ kopii",
- "Download" : "Elŝuti",
- "Delete" : "Forigi",
- "Home" : "Hejmo",
- "Close" : "Fermi",
- "Favorites" : "Pliŝatataj",
- "Could not create folder \"{dir}\"" : "Ne eblas krei dosierujon „{dir}“",
- "This will stop your current uploads." : "Tio haltigos viajn nunajn alŝutojn.",
- "Upload cancelled." : "La alŝuto nuliĝis.",
- "Processing files …" : "Traktado de dosieroj…",
- "…" : "… ",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝuti {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 bajtoj",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ne sufiĉas libera spaco: vi alŝutas {size1} sed nur {size2} restas",
- "Target folder \"{dir}\" does not exist any more" : "Cela dosierujo \"{dir}\" ne plu ekzistas",
- "Not enough free space" : "Ne sufiĉe libera spaco",
- "An unknown error has occurred" : "Nekonata eraro okazis",
- "Uploading …" : "Alŝutado…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} el {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Alŝuto de tiu elemento ne estas subtenata",
- "Target folder does not exist any more" : "La cela dosierujo ne plu ekzistas",
- "Error when assembling chunks, status code {status}" : "Eraro dum kunigo de pecoj, stata kodo {status}",
- "Actions" : "Agoj",
- "Rename" : "Alinomi",
- "Copy" : "Kopii",
- "Choose target folder" : "Elekti celan dosierujon",
- "Open" : "Malfermi",
- "Delete file" : "Forigi dosieron",
- "Delete folder" : "Forigi dosierujon",
- "Disconnect storage" : "Malkonekti konservejon",
- "Could not load info for file \"{file}\"" : "Informo pri dosiero „{file}“ ne legeblis",
- "Files" : "Dosieroj",
- "Details" : "Detaloj",
- "Select" : "Elekti",
- "Pending" : "Pritraktotaj",
- "Unable to determine date" : "Ne eblas determini daton",
- "This operation is forbidden" : "Ĉi tiu operacio malpermesatas",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ĉi tiu dosierujo maldisponeblas, bonvolu kontroli la protokolojn aŭ kontakti la administranton",
- "Could not move \"{file}\", target exists" : "Ne eblas movi la dosieron „{file}“, celo jam ekzistas",
- "Could not move \"{file}\"" : "Ne eblas movi la dosieron „{file}“",
- "copy" : "kopio",
- "Could not copy \"{file}\", target exists" : "Ne eblas kopii la dosieron „{file}“, celo jam ekzistas",
- "Could not copy \"{file}\"" : "Ne eblas kopii la dosieron „{file}“",
- "Copied {origin} inside {destination}" : "{origin} kopiita ene de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} kaj {nbfiles} aliaj dosieroj kopiitaj ene de {destination}",
- "{newName} already exists" : "{newName} jam ekzistas",
- "Could not rename \"{fileName}\", it does not exist any more" : "Ne eblis alinomi „{fileName}“, ĝi ne plu ekzistas",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "La nomo „{targetName}“ jam uzatas en la dosierujo „{dir}“. Bonvolu elekti alian nomon.",
- "Could not rename \"{fileName}\"" : "Ne eblis alinomi „{fileName}“",
- "Could not create file \"{file}\"" : "Ne eblas krei dosieron „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Ne eblis krei dosieron „{file}“ ĉar ĝi jam ekzistas",
- "Could not create folder \"{dir}\" because it already exists" : "Ne eblas krei dosierujon „{dir}“ ĉar ĝi jam ekzistas",
- "Error deleting file \"{fileName}\"." : "Eraro dum forigo de dosiero „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Neniu serĉorezulto en aliaj dosierujoj pri {tag}{filter}{endtag}",
- "Name" : "Nomo",
- "Size" : "Grando",
- "Modified" : "Modifita",
- "_%n folder_::_%n folders_" : ["%n dosierujo","%n dosierujoj"],
- "_%n file_::_%n files_" : ["%n dosiero","%n dosieroj"],
- "{dirs} and {files}" : "{dirs} kaj {files}",
- "_including %n hidden_::_including %n hidden_" : ["inkluzive %n kaŝita","inkluzive %n kaŝita(j)"],
- "You don’t have permission to upload or create files here" : "Vi ne permesatas alŝuti aŭ krei dosierojn ĉi tie",
- "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"],
- "New" : "Nova",
- "Select file range" : "Elekti dosierintervalon",
- "{used} of {quota} used" : "{used} uzataj el {quota}",
- "{used} used" : "{used} uzataj",
- "\"{name}\" is an invalid file name." : "„{name}“ estas nevalida dosiernomo.",
- "File name cannot be empty." : "Dosiernomo devas ne malpleni.",
- "\"/\" is not allowed inside a file name." : "Ne eblas uziĝi „/“ en dosiernomo.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ ne estas permesita dosiertipo.",
- "View in folder" : "Vidi en dosierujo",
- "Copied!" : "Kopiita!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopii senperan ligilon (nur validas por uzantoj, kiuj povas aliri al tiu dosiero aŭ dosierujo)",
- "Path" : "Vojo",
- "_%n byte_::_%n bytes_" : ["%n bajto","%n bajtoj"],
- "Favorited" : "Pliŝatitaj",
- "Favorite" : "Pliŝatata",
- "You can only favorite a single file or folder at a time" : "Vi povas samtempe pliŝatigi nur unu dosieron aŭ dosierujon",
- "New folder" : "Nova dosierujo",
- "Upload file" : "Alŝuti dosieron",
- "Recent" : "Lastaj ŝanĝoj",
- "Not favorited" : "Ne pliŝatitaj",
- "Remove from favorites" : "Malpliŝatigi",
- "Add to favorites" : "Pliŝatigi",
- "An error occurred while trying to update the tags" : "Okazis eraro dum provo ĝisdatigi la etikedojn",
- "Added to favorites" : "Aldonita al pliŝatataĵoj",
- "Removed from favorites" : "Forigita el pliŝataĵoj",
- "You added {file} to your favorites" : "Vi aldonis {file} al viaj pliŝataĵoj",
- "You removed {file} from your favorites" : "Vi forigis {file} el viaj pliŝataĵoj",
- "File changes" : "Dosierŝanĝoj",
- "Created by {user}" : "Kreita de {user}",
- "Changed by {user}" : "Ŝanĝita de {user}",
- "Deleted by {user}" : "Forigita de {user}",
- "Restored by {user}" : "Restaŭrita de {user}",
- "Renamed by {user}" : "Alinomita de {user}",
- "Moved by {user}" : "Movita de {user}",
- "\"remote user\"" : "„fora uzanto“",
- "You created {file}" : "Vi kreis „{file}“",
- "You created an encrypted file in {file}" : "Vi kreis ĉifritan dosieron en {file}",
- "{user} created {file}" : "{user} kreis {file}",
- "{user} created an encrypted file in {file}" : "{user} kreis ĉifritan dosieron en {file}",
- "{file} was created in a public folder" : "{file} kreiĝis en publika dosierujo",
- "You changed {file}" : "Vi ŝanĝis {file}",
- "You changed an encrypted file in {file}" : "Vi ŝanĝis ĉifritan dosieron en {file}",
- "{user} changed {file}" : "{user} ŝanĝis {file}",
- "{user} changed an encrypted file in {file}" : "{user} ŝanĝis ĉifritan dosieron en {file}",
- "You deleted {file}" : "Vi forigis {file}",
- "You deleted an encrypted file in {file}" : "Vi forigis ĉifritan dosieron en {file}",
- "{user} deleted {file}" : "{user} forigis {file}",
- "{user} deleted an encrypted file in {file}" : "{user} forigis ĉifritan dosieron en {file}",
- "You restored {file}" : "Vi restaŭris {file}",
- "{user} restored {file}" : "{user} restaŭris {file}",
- "You renamed {oldfile} to {newfile}" : "Vi alinomis {oldfile} al {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} alinomis {oldfile} al {newfile}",
- "You moved {oldfile} to {newfile}" : "Vi movis {oldfile} al {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movis {oldfile} al {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Dosiero aldoniĝis aŭ foriĝis el viaj <strong>pliŝataĵoj</strong>",
- "A file or folder has been <strong>changed</strong>" : "Dosiero aŭ dosierujo <strong>ŝanĝiĝis</strong>",
- "All files" : "Ĉiuj dosieroj",
- "Unlimited" : "Senlima",
- "Upload (max. %s)" : "Alŝuti (maks. %s)",
- "Accept" : "Akcepti",
- "Reject" : "Rifuzi",
- "in %s" : "en %s",
- "File Management" : "Dosieradministrado",
- "Change" : "Ŝanĝi",
- "Tags" : "Etikedoj",
- "Unable to change the favourite state of the file" : "Ne eblas ŝanĝi la staton pri pliŝatataĵo de la dosiero",
- "Error while loading the file data" : "Eraro dum ŝargo de la dosierdatumoj",
- "Cancel" : "Nuligi",
- "Create" : "Krei",
- "%s used" : "%s uzataj",
- "%s%% of %s used" : "%s%% el %s uzataj",
- "%1$s of %2$s used" : "%1$s uzataj el %2$s",
- "Settings" : "Agordo",
- "Show hidden files" : "Montri kaŝitajn dosierojn",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "Baskuligi kradan vidon",
- "No files in here" : "Neniu dosiero ĉi tie",
- "Upload some content or sync with your devices!" : "Alŝutu iom da enhavo aŭ sinkronigu kun viaj aparatoj!",
- "No entries found in this folder" : "Neniu enigo troviĝis en ĉi tiu dosierujo",
- "Select all" : "Elekti ĉion",
- "Upload too large" : "Alŝuto tro granda",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
- "No favorites yet" : "Ankoraŭ neniu pliŝataĵo",
- "Files and folders you mark as favorite will show up here" : "Dosieroj kaj dosierujoj, kiujn vi markas kiel pliŝataĵoj, aperos ĉi tie",
- "Deleted files" : "Forigitaj dosieroj",
- "Shares" : "Kunhavigoj",
- "Shared with others" : "Kunhavata kun aliaj",
- "Shared with you" : "Kunhavata kun vi",
- "Shared by link" : "Kunhavata per ligilo",
- "Deleted shares" : "Forigitaj kunhavigoj",
- "Text file" : "Tekstodosiero",
- "New text file.txt" : "Nova tekstodosiero.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Konservejo de {owner} plenas; dosieroj ne povas alŝutiĝi aŭ sinkroniĝi plu!",
- "Your storage is full, files can not be updated or synced anymore!" : "Via konservejo plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!",
- "_matches '{filter}'_::_match '{filter}'_" : ["kongruas kun “{filter}”","kongruas kun “{filter}”"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 97fdaff8880..9601f32db31 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
- "Storage invalid" : "Almacenamiento no válido",
- "Unknown error" : "Error desconocido",
- "File could not be found" : "El archivo no se ha encontrado",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Eliminar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No se pudo crear la carpeta \"{dir}\"",
- "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
- "Upload cancelled." : "Subida cancelada.",
- "Processing files …" : "Procesando archivos …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta de destino \"{dir}\" ya no existe",
- "Not enough free space" : "No hay espacio libre suficiente",
- "An unknown error has occurred" : "Ha ocurrido un error desconocido",
- "Uploading …" : "Subiendo …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Subir este archivo no es compatible",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
- "Error when assembling chunks, status code {status}" : "Error al reunir los trozos, código de estado {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Elegir carpeta de destino",
- "Open" : "Abrir",
- "Delete file" : "Eliminar archivo",
- "Delete folder" : "Eliminar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Leave this share" : "Dejar de compartir",
- "Could not load info for file \"{file}\"" : "No se ha podido cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
- "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No se ha podido determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contacte con el administrador",
- "Could not move \"{file}\", target exists" : "No se pudo mover \"{file}\", ya existe",
- "Could not move \"{file}\"" : "No se pudo mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "No se ha podido copiar \"{file}\", ya existe el destino",
- "Could not copy \"{file}\"" : "No se ha podido copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "Se ha copiado {origin} dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Se han copiado {origin} y {nbfiles} otros archivos dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No se pudo renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elija un nombre diferente.",
- "Could not rename \"{fileName}\"" : "No se pudo renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No se pudo crear archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No se ha podido crear la carpeta \"{dir}\" porque ya existe",
- "Could not fetch file details \"{file}\"" : "No se pudieron obtener los detalles de \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No hay resultados de búsqueda en otras carpetas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Escriba más de dos caracteres para buscar en otras carpetas",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"],
- "New" : "Nuevo",
- "Select file range" : "Seleccionar el rango de archivos",
- "{used} of {quota} used" : "{used} usados de {quota}",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido.",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "\"/\" no se permite en un nombre de archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" no es un tipo de archivo permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coinciden \"{filter}\"","coincide \"{filter}\""],
- "View in folder" : "Ver en carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar enlace directo (solo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Agregado a favoritos",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Solo puedes marcar como favorito un solo archivo o carpeta cada vez",
- "New folder" : "Nueva carpeta",
- "Upload file" : "Subir archivo",
- "Recent" : "Reciente",
- "Not favorited" : "Quitado como favorito",
- "Remove from favorites" : "Quitar de favoritos",
- "Add to favorites" : "Añadir a favoritos",
- "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
- "Added to favorites" : "Agregado a favoritos",
+ "Added to favorites" : "Añadido a favoritos",
"Removed from favorites" : "Quitado de favoritos",
- "You added {file} to your favorites" : "Has agregado {file} a tus favoritos",
+ "You added {file} to your favorites" : "Has añadido {file} a tus favoritos",
"You removed {file} from your favorites" : "Has quitado {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios del archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Modificado por {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
+ "\"remote account\"" : "\"cuenta remota\"",
"You created {file}" : "Ha creado {file}",
"You created an encrypted file in {file}" : "Has creado un archivo cifrado en {file}",
"{user} created {file}" : "{user} ha creado {file}",
@@ -142,16 +39,27 @@ OC.L10N.register(
"{user} renamed {oldfile} to {newfile}" : "{user} ha renombrado {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Has movido {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo fue agregado o borrado de tus <strong>favoritos</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo se ha añadido o borrado de tus <strong>favoritos</strong>",
+ "Files" : "Archivos",
"A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta",
- "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>cambiado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Subida (máx. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo favorito o carpeta se ha <strong>cambiado</strong>",
+ "Failed to authorize" : "Fallo al autorizar",
+ "Invalid folder path" : "Ruta de carpeta inválida",
+ "Folder not found" : "Carpeta no encontrada",
+ "The file cannot be found" : "El archivo no se puede encontrar",
+ "The destination path does not exist: %1$s" : "La ruta de destino no existe: %1$s",
+ "You do not have permission to create a file at the specified location" : "No tiene permiso para crear un archivo en la ubicación especificada",
+ "The file could not be converted." : "No se ha podido convertir el archivo.",
+ "Could not get relative path to converted file" : "No se ha podido obtener la ruta relativa al archivo convertido",
+ "Favorite files" : "Archivos favoritos",
+ "No favorites" : "No hay favoritos",
+ "More favorites" : "Más favoritos",
"Accept" : "Aceptar",
"Reject" : "Rechazar",
"Incoming ownership transfer from {user}" : "Ha llegado una transferencia de propiedad de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Deseas aceptar {path}?\n\nNota: El proceso de transferencia tras aceptar podría tardar hasta 1 hora.",
+ "Ownership transfer denied" : "Se denegó la transferencia de propiedad",
+ "Your ownership transfer of {path} was denied by {user}." : "Su transferencia de propiedad de {path} fue denegada por {user}.",
"Ownership transfer failed" : "Fallo al transferir la propiedad",
"Your ownership transfer of {path} to {user} failed." : "Ha fallado tu transferencia de propiedad de {path} a {user}.",
"The ownership transfer of {path} from {user} failed." : "Ha fallado la transferencia de propiedad de {path} desde {user}.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Se ha completado su transferencia de propiedad de {path} a {user}.",
"The ownership transfer of {path} from {user} has completed." : "Se ha completado la transferencia de propiedad de {path} a {user}.",
"in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Se transfirió desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidad de archivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir la restricción en nombres de archivo para asegurar que los archivos se puedan sincronizar con todos los clientes. Por defecto, se permiten todos los nombres de archivos válidos en POSIX (por ejemplo, Linux o macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Una vez habilitados los nombres de archivo compatibles con Windows, los archivos existentes ya no se podrán modificar, pero su propietario podrá renombrarlos a otros nombres válidos de archivo.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "También es posible migrar los archivos automáticamente luego de habilitar este ajuste. Por favor, refiérase a la documentación sobre el comando occ.",
+ "Enforce Windows compatibility" : "Forzar la compatibilidad con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Esto bloqueará los nombres de archivos inválidos en sistemas Windows, tales como usar nombres reservados o caracteres especiales. Pero no forzará la compatibilidad del uso de mayúsculas y minúsculas.",
"File Management" : "Gestión de archivos",
- "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
- "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
- "Change" : "Cambiar",
- "New owner" : "Nuevo propietario",
- "Search users" : "Buscar usuarios",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar carpeta actual",
+ "Go to the \"{dir}\" directory" : "Ir a la carpeta \"{dir}\"",
+ "Current directory path" : "Dirección de la carpeta actual",
+ "Your have used your space quota and cannot upload files anymore" : "Ha utilizado su cuota de espacio y ya no puede subir más archivos",
+ "You do not have permission to upload or create files here." : "No tiene permiso para subir o crear archivos aquí",
+ "Drag and drop files here to upload" : "Arrastre y suelte archivos aquí para subirlos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar selección para archivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar selección para la carpeta \"{displayName}\"",
+ "File is loading" : "El archivo se está cargando",
+ "Folder is loading" : "La carpeta se está cargando",
+ "Filename" : "Nombre de archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "This node is unavailable" : "Este nodo no está disponible",
+ "Another entry with the same name already exists." : "Ya existe otra entrada con el mismo nombre.",
+ "Invalid filename." : "Nombre de archivo inválido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renombrado \"{oldName}\" a \"{newName}\"",
+ "Rename file" : "Renombrar archivo",
+ "Folder" : "Carpeta",
+ "Unknown file type" : "Tipo de archivo desconocido",
+ "{ext} image" : "imagen {ext}",
+ "{ext} video" : "vídeo {ext}",
+ "{ext} audio" : "audio {ext}",
+ "{ext} text" : "texto {ext}",
+ "Pending" : "Pendiente",
+ "Unknown date" : "Fecha desconocida",
+ "Clear filter" : "Borrar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar en todas partes",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Quitar filtro",
+ "Total rows summary" : "Resumen de filas totales",
+ "Toggle selection for all files and folders" : "Seleccionar/deseleccionar todos los archivos y carpetas",
+ "Name" : "Nombre",
+ "File type" : "Tipo de archivo",
+ "Size" : "Tamaño",
+ "{displayName}: failed on some elements" : "{displayName}: falló en algunos elementos",
+ "{displayName}: done" : "{displayName}: listo",
+ "{displayName}: failed" : "{displayName}: falló",
+ "Actions" : "Acciones",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de archivos y carpetas.",
+ "You have used your space quota and cannot upload files anymore." : "Ha usado su cuota de almacenamiento y ya no puede subir más archivos.",
+ "Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
+ "File not found" : "No se ha encontrado el archivo",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionados"],
+ "Search everywhere …" : "Buscar en todas partes …",
+ "Search here …" : "Buscar aquí …",
+ "Search scope options" : "Opciones de alcance de la búsqueda",
+ "Search here" : "Buscar aquí",
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
+ "{used} of {quota} used" : "{used} usados de {quota}",
+ "{relative}% used" : "{relative}% utilizado",
+ "Could not refresh storage stats" : "No fue posible refrescar las estadísticas de almacenamiento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡Ya no se pueden subir ni sincronizarse más archivos!",
+ "Storage information" : "Información de almacenamiento",
+ "Storage quota" : "Cuota de almacenamiento",
+ "New folder" : "Nueva carpeta",
+ "Create new folder" : "Crear carpeta nueva",
+ "This name is already in use." : "Este nombre ya está en uso.",
+ "Create" : "Crear",
+ "Files starting with a dot are hidden by default" : "Los archivos que comienzan con un punto se ocultan de manera predeterminada",
+ "Fill template fields" : "Rellenar los campos de la plantilla",
+ "Submitting fields …" : "Enviando campos …",
+ "Submit" : "Enviar",
"Choose a file or folder to transfer" : "Elegir un archivo o carpeta para transferir",
"Transfer" : "Transferir",
"Transfer {path} to {userid}" : "Transferir {path} a {userid}",
"Invalid path selected" : "Ruta de archivo seleccionada no válida.",
+ "Unknown error" : "Error desconocido",
"Ownership transfer request sent" : "Enviada la solicitud de transferencia de propiedad",
- "Cannot transfer ownership of a file or folder you don't own" : "No se puede transferir la propiedad de un archivo o carpeta que no te pertenece",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "No se ha podido cambiar el estado de favorito del fichero",
+ "Cannot transfer ownership of a file or folder you do not own" : "No puede transferir la propiedad de un archivo o carpeta de la cual no es propietario",
+ "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
+ "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario",
+ "Keep {old}" : "Conservar {old}",
+ "Keep without extension" : "Conservar sin extensión",
+ "Use {new}" : "Usar {new}",
+ "Remove extension" : "Quitar la extensión",
+ "Change file extension" : "Cambiar la extensión de archivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar la extensión de \"{old}\" a \"{new}\" podría hacer a el archivo ilegible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Quitar la extensión \"{old}\" podría hacer a el archivo ilegible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Añadir la extensión \"{new}\" podría hacer a el archivo ilegible.",
+ "Do not show this dialog again." : "No mostrar este diálogo de nuevo.",
+ "Select file or folder to link to" : "Selecciona archivo o carpeta a enlazar",
+ "Choose {file}" : "Seleccionar {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por enlace",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a vista de lista",
+ "Switch to grid view" : "Cambiar a vista de cuadrícula",
+ "The file could not be found" : "El archivo no se pudo encontrar",
+ "Upload was cancelled by user" : "La subida ha sido cancelada por el usuario",
+ "Not enough free space" : "No hay espacio libre suficiente",
+ "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
+ "Error during upload: {message}" : "Error durante la subida: {message}",
+ "Error during upload, status code {status}" : "Error durante la subida, código de estado {status}",
+ "Unknown error during upload" : "Error desconocido durante la subida",
+ "Loading current folder" : "Cargando carpeta actual",
+ "Retry" : "Reintentar",
+ "No files in here" : "Aquí no hay archivos",
+ "Upload some content or sync with your devices!" : "¡Sube contenido o sincroniza tus dispositivos!",
+ "Go back" : "Ir atrás",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos",
+ "Your files" : "Sus archivos",
+ "Open in files" : "Abrir en Archivos",
+ "File cannot be accessed" : "No se ha podido acceder al archivo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "El archivo no fue encontrado o no tiene permisos para verlo. Solicite al remitente que lo comparta.",
+ "No search results for “{query}”" : "No hay resultados para “{query}”",
+ "Search for files" : "Buscar archivos",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "WebDAV URL copied" : "URL de WebDAV copiado",
+ "General" : "General",
+ "Default view" : "Vista predeterminada",
+ "All files" : "Todos los archivos",
+ "Personal files" : "Archivos personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Folder tree" : "Árbol de carpetas",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Show file type column" : "Mostrar la columna de tipo de archivo",
+ "Show file extensions" : "Mostrar extensiones de archivos",
+ "Crop image previews" : "Recortar la previsualización de las imágenes",
+ "Additional settings" : "Ajustes adicionales",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "How to access files using WebDAV" : "Como acceder a los archivos usando WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "La autenticación en dos factores está habilitada para su cuenta y, por lo tanto, debe usar una contraseña de aplicación para conectar un cliente WebDAV externo.",
+ "Warnings" : "Advertencias",
+ "Warn before changing a file extension" : "Advertir antes de cambiar la extensión de un archivo.",
+ "Warn before deleting files" : "Advertir antes de eliminar archivos",
+ "Keyboard shortcuts" : "Atajos de teclado",
+ "File actions" : "Acciones de archivo",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Add or remove favorite" : "Añadir o quitar favorito",
+ "Manage tags" : "Gestionar etiquetas",
+ "Selection" : "Selección",
+ "Select all files" : "Seleccionar todos los archivos",
+ "Deselect all" : "Deseleccionar todos",
+ "Select or deselect" : "Seleccionar o deseleccionar",
+ "Select a range" : "Seleccionar rango",
+ "Navigation" : "Navegación",
+ "Go to parent folder" : "Ir a carpeta superior",
+ "Go to file above" : "Ir al archivo anterior",
+ "Go to file below" : "Ir al archivo siguiente",
+ "Go left in grid" : "Desplazarse a la izquierda en la cuadrícula",
+ "Go right in grid" : "Desplazarse a la derecha en la cuadrícula",
+ "View" : "Vista",
+ "Toggle grid view" : "Alternar vista de cuadrícula",
+ "Open file sidebar" : "Abrir la barra lateral de archivo",
+ "Show those shortcuts" : "Mostrar estos atajos",
+ "You" : "Tú",
+ "Shared multiple times with different people" : "Compartido múltiples veces con diferentes personas",
+ "Unable to change the favorite state of the file" : "No fue posible cambiar el estado de favorito del archivo",
"Error while loading the file data" : "Error al cargar los datos del archivo",
+ "Owner" : "Dueño",
+ "Remove from favorites" : "Quitar de favoritos",
+ "Add to favorites" : "Añadir a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Vacío",
+ "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
"Pick a template for {name}" : "Elija una plantilla para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
"Create a new file with the selected template" : "Crear un nuevo archivo con la plantilla seleccionada",
"Creating file" : "Creando el archivo",
- "Blank" : "Vacío",
- "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
- "Set up templates folder" : "Configura una carpeta para plantillas",
- "Templates" : "Plantillas",
+ "Save as {displayName}" : "Guardar como {displayName}",
+ "Save as …" : "Guardar como …",
+ "Converting files …" : "Convirtiendo archivos …",
+ "Failed to convert files: {message}" : "Fallo al convertir archivos: {message}",
+ "All files failed to be converted" : "Todos los archivos han fallado al convertirse",
+ "One file could not be converted: {message}" : "Un archivo no ha podido ser convertido: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un archivo no pudo ser convertido","%n archivos no pudieron ser convertidos","%n archivos no pudieron ser convertidos"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un archivo convertido exitosamente","%n archivos convertidos exitosamente","%n archivos convertidos exitosamente"],
+ "Files successfully converted" : "Archivos convertidos exitosamente",
+ "Failed to convert files" : "Fallo al convertir archivos",
+ "Converting file …" : "Convirtiendo archivo …",
+ "File successfully converted" : "Archivo convertido exitosamente",
+ "Failed to convert file: {message}" : "Fallo al convertir el archivo: {message}",
+ "Failed to convert file" : "Fallo al convertir el archivo",
+ "Leave this share" : "Abandonar este recurso compartido",
+ "Leave these shares" : "Abandonar estos recursos compartidos",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Disconnect storages" : "Desconectar almacenamientos",
+ "Delete permanently" : "Eliminar de forma permanente",
+ "Delete and unshare" : "Eliminar y dejar de compartir",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Delete folder" : "Eliminar carpeta",
+ "Delete folders" : "Eliminar carpetas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a punto de eliminar {count} elemento permanentemente","Está a punto de eliminar {count} elementos permanentemente.","Está a punto de eliminar {count} elementos permanentemente"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a punto de eliminar {count} elemento","Está a punto de eliminar {count} elementos","Está a punto de eliminar {count} elementos"],
+ "Confirm deletion" : "Confirmar eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moviendo \"{source}\" a \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" a \"{destination}\" …",
+ "Destination is not a folder" : "El destino no es una carpeta",
+ "This file/folder is already in that directory" : "Este archivo/carpeta ya está en ese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No puede mover un archivo/carpeta a sí mismo o a una sub-carpeta de sí mismo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Un archivo o carpeta con ese nombre ya existe en esta carpeta",
+ "The files are locked" : "Los archivos están bloqueados",
+ "The file does not exist anymore" : "El archivo ya no existe",
+ "Choose destination" : "Elegir destino",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}",
+ "Open in Files" : "Abrir en Archivos",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Fallo al redirigir al cliente",
+ "Open file locally" : "Abrir archivo localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "El archivo se abrirá ahora en su dispositivo. Si esto no ocurre, por favor verifique que ha instalado la aplicación de escritorio.",
+ "Retry and close" : "Reintentar y cerrar",
+ "Open online" : "Abrir en línea",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en carpeta",
+ "Today" : "Hoy",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este año ({year})",
+ "Last year ({year})" : "El año pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Hojas de cálculo",
+ "Presentations" : "Presentaciones",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetas",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Se ha creado la carpeta nueva \"{name}\"",
"Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas",
- "%s used" : "usado %s",
- "%s%% of %s used" : "%s%% de %s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Ajustes",
- "Show hidden files" : "Mostrar archivos ocultos",
- "Crop image previews" : "Recortar la previsualización de las imágenes",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "Toggle %1$s sublist" : "Alternar %1$s sublista",
- "Toggle grid view" : "Alternar vista de cuadrícula",
- "No files in here" : "Aquí no hay archivos",
- "Upload some content or sync with your devices!" : "¡Suba contenidos o sincronice sus dispositivos!",
+ "Create templates folder" : "Crear carpeta de plantillas",
+ "Templates" : "Plantillas",
+ "New template folder" : "Nueva carpeta de plantillas",
+ "In folder" : "En carpeta",
+ "Search in all files" : "Buscar en todos los archivos",
+ "Search in folder: {folder}" : "Buscar en carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Uno de los archivos arrastrados no puede ser procesado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Su navegador no soporta la API de Sistema de archivos. Los directorios no se subirán",
+ "No files to upload" : "Ningún archivo para subir",
+ "Unable to create the directory {directory}" : "No se pudo crear el directorio {directory}",
+ "Some files could not be uploaded" : "No se pudieron subir algunos archivos",
+ "Files uploaded successfully" : "Se subieron los archivos exitosamente",
+ "No files to process" : "No hay archivos para procesar",
+ "Some files could not be copied" : "Algunos archivos no se han podido copiar",
+ "Some files could not be moved" : "No se han podido mover algunos archivos",
+ "Files copied successfully" : "Archivos copiados exitosamente",
+ "Files moved successfully" : "Archivos movidos exitosamente",
+ "Conflicts resolution skipped" : "Resolución de conflictos omitida",
+ "Upload cancelled" : "Subida cancelada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se ha podido renombrar \"{oldName}\", ya no existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor, escoja un nombre diferente.",
+ "Could not rename \"{oldName}\"" : "No se ha podido renombrar \"{oldName}\"",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This folder is unavailable, please try again later or contact the administration" : "Esta carpeta no está disponible, por favor, intente de nuevo más tarde o contacte a la administración",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Unexpected error: {error}" : "Error inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "_%n hidden_::_%n hidden_" : ["%n oculto","%n ocultos","%n ocultos"],
+ "Filename must not be empty." : "El nombre de archivo no debe estar vacío.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no está permitido en el nombre de archivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" es un nombre reservado y no se permite para los nombres de archivo.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no es un tipo de archivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "Los nombres de archivo no puede terminar con \"{extension}\".",
+ "List of favorite files and folders." : "Lista de archivos y carpetas favoritos.",
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
+ "List of your files and folders." : "Lista de sus archivos y carpetas.",
+ "List of your files and folders that are not shared." : "Lista de sus archivos y carpetas que no están compartidos.",
+ "No personal files found" : "No se encontraron archivos personales",
+ "Files that are not shared will show up here." : "Los archivos y carpetas que no ha compartido aparecerán aquí.",
+ "Recent" : "Reciente",
+ "List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
+ "No recently modified files" : "No hay archivos modificados recientemente.",
+ "Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
+ "Search" : "Buscar",
+ "Search results within your files." : "Resultados de búsqueda dentro de sus archivos.",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "Subida demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
- "Deleted files" : "Archivos eliminados",
- "Shares" : "Archivos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido conmigo",
- "Shared by link" : "Compartido por enlace",
- "Deleted shares" : "Recursos compartidos eliminados",
- "Pending shares" : "Recursos compartidos pendientes",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
+ "File could not be found" : "El archivo no se ha encontrado",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No se ha podido crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
+ "Upload cancelled." : "Subida cancelada.",
+ "Processing files …" : "Procesando archivos …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta de destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Se ha producido un error desconocido",
+ "File could not be uploaded" : "No se ha podido subir el archivo",
+ "Uploading …" : "Subiendo …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Cargando… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Subir este archivo no es compatible",
+ "Error when assembling chunks, status code {status}" : "Error al reunir los trozos, código de estado {status}",
+ "Choose target folder" : "Elegir carpeta de destino",
+ "Set reminder" : "Establecer recordatorio",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No se ha podido cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección",
+ "Select directory \"{dirName}\"" : "Seleccione la carpeta \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleccione el archivo \"{fileName}\"",
+ "Unable to determine date" : "No se ha podido determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contacte con el administrador",
+ "Could not move \"{file}\", target exists" : "No se ha podido mover \"{file}\", ya existe",
+ "Could not move \"{file}\"" : "No se ha podido mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "No se ha podido copiar \"{file}\", ya existe el destino",
+ "Could not copy \"{file}\"" : "No se ha podido copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "Se ha copiado {origin} dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Se han copiado {origin} y {nbfiles} otros archivos dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No se ha podido crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No se ha podido crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se han podido obtener los detalles de \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No hay resultados de búsqueda en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Escriba más de dos caracteres para buscar en otras carpetas",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tiene permiso para subir o crear archivos aquí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos","Subiendo %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de carpeta/archivo nuevo",
+ "Select file range" : "Seleccionar el rango de archivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo no válido.",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "\"/\" no se permite en un nombre de archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" no es un tipo de archivo permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coinciden \"{filter}\"","coincide \"{filter}\"","coincide \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Se ha copiado el enlace directo (sólo funciona para usuarios que tengan acceso a este archivo/carpeta)",
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar enlace directo (solo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Upload file" : "Subir archivo",
+ "Not favored" : "No favorecido",
+ "An error occurred while trying to update the tags" : "Se ha producido un error al tratar de actualizar las etiquetas",
+ "Upload (max. %s)" : "Subida (máx. %s)",
+ "\"{displayName}\" action executed successfully" : "la acción \"{displayName}\" se ejecutó exitosamente",
+ "\"{displayName}\" action failed" : "la acción \"{displayName}\" falló",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" falló en algunos elementos",
+ "\"{displayName}\" batch action executed successfully" : "la acción en lotes \"{displayName}\" se ejecutó exitosamente",
+ "Submitting fields…" : "Enviando campos…",
+ "Filter filenames…" : "Filtrar nombres de archivo…",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiado al portapapeles",
+ "Enable the grid view" : "Habilitar vista de cuadrícula",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Deletion cancelled" : "Eliminación cancelada",
+ "Move cancelled" : "Se canceló la movida",
+ "Cancelled move or copy of \"{filename}\"." : "Se canceló la operación de mover o copiar de \"{filename}\".",
+ "Cancelled move or copy operation" : "Se canceló la operación de mover o copiar",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imágenes",
+ "New folder creation cancelled" : "Se canceló la creación de la carpeta nueva",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archivo y 1 carpeta","{fileCount} archivos y 1 carpeta","{fileCount} archivos y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archivos y {folderCount} carpetas",
+ "All folders" : "Todas las carpetas",
+ "Personal Files" : "Archivos Personales",
"Text file" : "Archivo de texto",
"New text file.txt" : "Nuevo archivo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno, ¡no se subirán ni se sincronizarán más archivos!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "¡La carpeta de grupo \"{mountPoint}\" está llena, los archivos ya no pueden ser actualizados o sincronizados!.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "¡El almacenamiento externo \"{mountPoint}\" está lleno, los archivos ya no pueden ser actualizados o sincronizados!.",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno, ¡no se subirán ni se sincronizarán más archivos!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincidencias '{filter}'","coincidencia '{filter}'"]
+ "%1$s (renamed)" : "%1$s (renombrado)",
+ "renamed file" : "archivo renombrado",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Una vez habilitados los nombres de archivo compatibles con Windows, los archivos existentes ya no se podrán modificar, pero su propietario podrá renombrarlos a otros nombres válidos de archivo.",
+ "Filter file names …" : "Filtrar nombres de archivo …",
+ "Prevent warning dialogs from open or reenable them." : "Evitar que se abran los diálogos de advertencia o volver a habilitarlos.",
+ "Show a warning dialog when changing a file extension." : "Mostrar un diálogo de advertencia cuando se cambia la extensión de un archivo.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere su experiencia con Archivos con esos rápidos atajos de teclado.",
+ "Open the actions menu for a file" : "Abrir el menú de acciones para un archivo",
+ "Rename a file" : "Renombrar un archivo",
+ "Delete a file" : "Eliminar un archivo",
+ "Favorite or remove a file from favorites" : "Marcar o desmarcar un archivo desde los favoritos",
+ "Manage tags for a file" : "Gestionar etiquetas para un archivo",
+ "Deselect all files" : "Deseleccionar todos los archivos",
+ "Select or deselect a file" : "Seleccionar o deseleccionar un archivo",
+ "Select a range of files" : "Seleccionar un rango de archivos",
+ "Navigate to the parent folder" : "Navegar a la carpeta superior",
+ "Navigate to the file above" : "Navegar al archivo anterior",
+ "Navigate to the file below" : "Navegar al archivo siguiente",
+ "Navigate to the file on the left (in grid mode)" : "Navegar al archivo de la izquierda (en modo cuadrícula)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar al archivo de la derecha (en modo cuadrícula)",
+ "Toggle the grid view" : "Alternar vista en cuadrícula",
+ "Open the sidebar for a file" : "Abrir la barra lateral para un archivo"
},
-"nplurals=2; plural=(n != 1);");
+"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 869faa26f47..935df9c3971 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
- "Storage invalid" : "Almacenamiento no válido",
- "Unknown error" : "Error desconocido",
- "File could not be found" : "El archivo no se ha encontrado",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Eliminar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No se pudo crear la carpeta \"{dir}\"",
- "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
- "Upload cancelled." : "Subida cancelada.",
- "Processing files …" : "Procesando archivos …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta de destino \"{dir}\" ya no existe",
- "Not enough free space" : "No hay espacio libre suficiente",
- "An unknown error has occurred" : "Ha ocurrido un error desconocido",
- "Uploading …" : "Subiendo …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Subir este archivo no es compatible",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
- "Error when assembling chunks, status code {status}" : "Error al reunir los trozos, código de estado {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Elegir carpeta de destino",
- "Open" : "Abrir",
- "Delete file" : "Eliminar archivo",
- "Delete folder" : "Eliminar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Leave this share" : "Dejar de compartir",
- "Could not load info for file \"{file}\"" : "No se ha podido cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
- "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No se ha podido determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contacte con el administrador",
- "Could not move \"{file}\", target exists" : "No se pudo mover \"{file}\", ya existe",
- "Could not move \"{file}\"" : "No se pudo mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "No se ha podido copiar \"{file}\", ya existe el destino",
- "Could not copy \"{file}\"" : "No se ha podido copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "Se ha copiado {origin} dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Se han copiado {origin} y {nbfiles} otros archivos dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No se pudo renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elija un nombre diferente.",
- "Could not rename \"{fileName}\"" : "No se pudo renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No se pudo crear archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No se ha podido crear la carpeta \"{dir}\" porque ya existe",
- "Could not fetch file details \"{file}\"" : "No se pudieron obtener los detalles de \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No hay resultados de búsqueda en otras carpetas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Escriba más de dos caracteres para buscar en otras carpetas",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"],
- "New" : "Nuevo",
- "Select file range" : "Seleccionar el rango de archivos",
- "{used} of {quota} used" : "{used} usados de {quota}",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido.",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "\"/\" no se permite en un nombre de archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" no es un tipo de archivo permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coinciden \"{filter}\"","coincide \"{filter}\""],
- "View in folder" : "Ver en carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar enlace directo (solo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Agregado a favoritos",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Solo puedes marcar como favorito un solo archivo o carpeta cada vez",
- "New folder" : "Nueva carpeta",
- "Upload file" : "Subir archivo",
- "Recent" : "Reciente",
- "Not favorited" : "Quitado como favorito",
- "Remove from favorites" : "Quitar de favoritos",
- "Add to favorites" : "Añadir a favoritos",
- "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
- "Added to favorites" : "Agregado a favoritos",
+ "Added to favorites" : "Añadido a favoritos",
"Removed from favorites" : "Quitado de favoritos",
- "You added {file} to your favorites" : "Has agregado {file} a tus favoritos",
+ "You added {file} to your favorites" : "Has añadido {file} a tus favoritos",
"You removed {file} from your favorites" : "Has quitado {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios del archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Modificado por {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
+ "\"remote account\"" : "\"cuenta remota\"",
"You created {file}" : "Ha creado {file}",
"You created an encrypted file in {file}" : "Has creado un archivo cifrado en {file}",
"{user} created {file}" : "{user} ha creado {file}",
@@ -140,16 +37,27 @@
"{user} renamed {oldfile} to {newfile}" : "{user} ha renombrado {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Has movido {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo fue agregado o borrado de tus <strong>favoritos</strong>",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo se ha añadido o borrado de tus <strong>favoritos</strong>",
+ "Files" : "Archivos",
"A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta",
- "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>cambiado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Subida (máx. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo favorito o carpeta se ha <strong>cambiado</strong>",
+ "Failed to authorize" : "Fallo al autorizar",
+ "Invalid folder path" : "Ruta de carpeta inválida",
+ "Folder not found" : "Carpeta no encontrada",
+ "The file cannot be found" : "El archivo no se puede encontrar",
+ "The destination path does not exist: %1$s" : "La ruta de destino no existe: %1$s",
+ "You do not have permission to create a file at the specified location" : "No tiene permiso para crear un archivo en la ubicación especificada",
+ "The file could not be converted." : "No se ha podido convertir el archivo.",
+ "Could not get relative path to converted file" : "No se ha podido obtener la ruta relativa al archivo convertido",
+ "Favorite files" : "Archivos favoritos",
+ "No favorites" : "No hay favoritos",
+ "More favorites" : "Más favoritos",
"Accept" : "Aceptar",
"Reject" : "Rechazar",
"Incoming ownership transfer from {user}" : "Ha llegado una transferencia de propiedad de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Deseas aceptar {path}?\n\nNota: El proceso de transferencia tras aceptar podría tardar hasta 1 hora.",
+ "Ownership transfer denied" : "Se denegó la transferencia de propiedad",
+ "Your ownership transfer of {path} was denied by {user}." : "Su transferencia de propiedad de {path} fue denegada por {user}.",
"Ownership transfer failed" : "Fallo al transferir la propiedad",
"Your ownership transfer of {path} to {user} failed." : "Ha fallado tu transferencia de propiedad de {path} a {user}.",
"The ownership transfer of {path} from {user} failed." : "Ha fallado la transferencia de propiedad de {path} desde {user}.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Se ha completado su transferencia de propiedad de {path} a {user}.",
"The ownership transfer of {path} from {user} has completed." : "Se ha completado la transferencia de propiedad de {path} a {user}.",
"in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Se transfirió desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidad de archivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir la restricción en nombres de archivo para asegurar que los archivos se puedan sincronizar con todos los clientes. Por defecto, se permiten todos los nombres de archivos válidos en POSIX (por ejemplo, Linux o macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Una vez habilitados los nombres de archivo compatibles con Windows, los archivos existentes ya no se podrán modificar, pero su propietario podrá renombrarlos a otros nombres válidos de archivo.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "También es posible migrar los archivos automáticamente luego de habilitar este ajuste. Por favor, refiérase a la documentación sobre el comando occ.",
+ "Enforce Windows compatibility" : "Forzar la compatibilidad con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Esto bloqueará los nombres de archivos inválidos en sistemas Windows, tales como usar nombres reservados o caracteres especiales. Pero no forzará la compatibilidad del uso de mayúsculas y minúsculas.",
"File Management" : "Gestión de archivos",
- "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
- "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
- "Change" : "Cambiar",
- "New owner" : "Nuevo propietario",
- "Search users" : "Buscar usuarios",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar carpeta actual",
+ "Go to the \"{dir}\" directory" : "Ir a la carpeta \"{dir}\"",
+ "Current directory path" : "Dirección de la carpeta actual",
+ "Your have used your space quota and cannot upload files anymore" : "Ha utilizado su cuota de espacio y ya no puede subir más archivos",
+ "You do not have permission to upload or create files here." : "No tiene permiso para subir o crear archivos aquí",
+ "Drag and drop files here to upload" : "Arrastre y suelte archivos aquí para subirlos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar selección para archivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar selección para la carpeta \"{displayName}\"",
+ "File is loading" : "El archivo se está cargando",
+ "Folder is loading" : "La carpeta se está cargando",
+ "Filename" : "Nombre de archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "This node is unavailable" : "Este nodo no está disponible",
+ "Another entry with the same name already exists." : "Ya existe otra entrada con el mismo nombre.",
+ "Invalid filename." : "Nombre de archivo inválido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renombrado \"{oldName}\" a \"{newName}\"",
+ "Rename file" : "Renombrar archivo",
+ "Folder" : "Carpeta",
+ "Unknown file type" : "Tipo de archivo desconocido",
+ "{ext} image" : "imagen {ext}",
+ "{ext} video" : "vídeo {ext}",
+ "{ext} audio" : "audio {ext}",
+ "{ext} text" : "texto {ext}",
+ "Pending" : "Pendiente",
+ "Unknown date" : "Fecha desconocida",
+ "Clear filter" : "Borrar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar en todas partes",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Quitar filtro",
+ "Total rows summary" : "Resumen de filas totales",
+ "Toggle selection for all files and folders" : "Seleccionar/deseleccionar todos los archivos y carpetas",
+ "Name" : "Nombre",
+ "File type" : "Tipo de archivo",
+ "Size" : "Tamaño",
+ "{displayName}: failed on some elements" : "{displayName}: falló en algunos elementos",
+ "{displayName}: done" : "{displayName}: listo",
+ "{displayName}: failed" : "{displayName}: falló",
+ "Actions" : "Acciones",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de archivos y carpetas.",
+ "You have used your space quota and cannot upload files anymore." : "Ha usado su cuota de almacenamiento y ya no puede subir más archivos.",
+ "Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
+ "File not found" : "No se ha encontrado el archivo",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionados"],
+ "Search everywhere …" : "Buscar en todas partes …",
+ "Search here …" : "Buscar aquí …",
+ "Search scope options" : "Opciones de alcance de la búsqueda",
+ "Search here" : "Buscar aquí",
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
+ "{used} of {quota} used" : "{used} usados de {quota}",
+ "{relative}% used" : "{relative}% utilizado",
+ "Could not refresh storage stats" : "No fue posible refrescar las estadísticas de almacenamiento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡Ya no se pueden subir ni sincronizarse más archivos!",
+ "Storage information" : "Información de almacenamiento",
+ "Storage quota" : "Cuota de almacenamiento",
+ "New folder" : "Nueva carpeta",
+ "Create new folder" : "Crear carpeta nueva",
+ "This name is already in use." : "Este nombre ya está en uso.",
+ "Create" : "Crear",
+ "Files starting with a dot are hidden by default" : "Los archivos que comienzan con un punto se ocultan de manera predeterminada",
+ "Fill template fields" : "Rellenar los campos de la plantilla",
+ "Submitting fields …" : "Enviando campos …",
+ "Submit" : "Enviar",
"Choose a file or folder to transfer" : "Elegir un archivo o carpeta para transferir",
"Transfer" : "Transferir",
"Transfer {path} to {userid}" : "Transferir {path} a {userid}",
"Invalid path selected" : "Ruta de archivo seleccionada no válida.",
+ "Unknown error" : "Error desconocido",
"Ownership transfer request sent" : "Enviada la solicitud de transferencia de propiedad",
- "Cannot transfer ownership of a file or folder you don't own" : "No se puede transferir la propiedad de un archivo o carpeta que no te pertenece",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "No se ha podido cambiar el estado de favorito del fichero",
+ "Cannot transfer ownership of a file or folder you do not own" : "No puede transferir la propiedad de un archivo o carpeta de la cual no es propietario",
+ "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
+ "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario",
+ "Keep {old}" : "Conservar {old}",
+ "Keep without extension" : "Conservar sin extensión",
+ "Use {new}" : "Usar {new}",
+ "Remove extension" : "Quitar la extensión",
+ "Change file extension" : "Cambiar la extensión de archivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar la extensión de \"{old}\" a \"{new}\" podría hacer a el archivo ilegible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Quitar la extensión \"{old}\" podría hacer a el archivo ilegible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Añadir la extensión \"{new}\" podría hacer a el archivo ilegible.",
+ "Do not show this dialog again." : "No mostrar este diálogo de nuevo.",
+ "Select file or folder to link to" : "Selecciona archivo o carpeta a enlazar",
+ "Choose {file}" : "Seleccionar {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por enlace",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a vista de lista",
+ "Switch to grid view" : "Cambiar a vista de cuadrícula",
+ "The file could not be found" : "El archivo no se pudo encontrar",
+ "Upload was cancelled by user" : "La subida ha sido cancelada por el usuario",
+ "Not enough free space" : "No hay espacio libre suficiente",
+ "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
+ "Error during upload: {message}" : "Error durante la subida: {message}",
+ "Error during upload, status code {status}" : "Error durante la subida, código de estado {status}",
+ "Unknown error during upload" : "Error desconocido durante la subida",
+ "Loading current folder" : "Cargando carpeta actual",
+ "Retry" : "Reintentar",
+ "No files in here" : "Aquí no hay archivos",
+ "Upload some content or sync with your devices!" : "¡Sube contenido o sincroniza tus dispositivos!",
+ "Go back" : "Ir atrás",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos",
+ "Your files" : "Sus archivos",
+ "Open in files" : "Abrir en Archivos",
+ "File cannot be accessed" : "No se ha podido acceder al archivo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "El archivo no fue encontrado o no tiene permisos para verlo. Solicite al remitente que lo comparta.",
+ "No search results for “{query}”" : "No hay resultados para “{query}”",
+ "Search for files" : "Buscar archivos",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "WebDAV URL copied" : "URL de WebDAV copiado",
+ "General" : "General",
+ "Default view" : "Vista predeterminada",
+ "All files" : "Todos los archivos",
+ "Personal files" : "Archivos personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Folder tree" : "Árbol de carpetas",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Show file type column" : "Mostrar la columna de tipo de archivo",
+ "Show file extensions" : "Mostrar extensiones de archivos",
+ "Crop image previews" : "Recortar la previsualización de las imágenes",
+ "Additional settings" : "Ajustes adicionales",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "How to access files using WebDAV" : "Como acceder a los archivos usando WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "La autenticación en dos factores está habilitada para su cuenta y, por lo tanto, debe usar una contraseña de aplicación para conectar un cliente WebDAV externo.",
+ "Warnings" : "Advertencias",
+ "Warn before changing a file extension" : "Advertir antes de cambiar la extensión de un archivo.",
+ "Warn before deleting files" : "Advertir antes de eliminar archivos",
+ "Keyboard shortcuts" : "Atajos de teclado",
+ "File actions" : "Acciones de archivo",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Add or remove favorite" : "Añadir o quitar favorito",
+ "Manage tags" : "Gestionar etiquetas",
+ "Selection" : "Selección",
+ "Select all files" : "Seleccionar todos los archivos",
+ "Deselect all" : "Deseleccionar todos",
+ "Select or deselect" : "Seleccionar o deseleccionar",
+ "Select a range" : "Seleccionar rango",
+ "Navigation" : "Navegación",
+ "Go to parent folder" : "Ir a carpeta superior",
+ "Go to file above" : "Ir al archivo anterior",
+ "Go to file below" : "Ir al archivo siguiente",
+ "Go left in grid" : "Desplazarse a la izquierda en la cuadrícula",
+ "Go right in grid" : "Desplazarse a la derecha en la cuadrícula",
+ "View" : "Vista",
+ "Toggle grid view" : "Alternar vista de cuadrícula",
+ "Open file sidebar" : "Abrir la barra lateral de archivo",
+ "Show those shortcuts" : "Mostrar estos atajos",
+ "You" : "Tú",
+ "Shared multiple times with different people" : "Compartido múltiples veces con diferentes personas",
+ "Unable to change the favorite state of the file" : "No fue posible cambiar el estado de favorito del archivo",
"Error while loading the file data" : "Error al cargar los datos del archivo",
+ "Owner" : "Dueño",
+ "Remove from favorites" : "Quitar de favoritos",
+ "Add to favorites" : "Añadir a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Vacío",
+ "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
"Pick a template for {name}" : "Elija una plantilla para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
"Create a new file with the selected template" : "Crear un nuevo archivo con la plantilla seleccionada",
"Creating file" : "Creando el archivo",
- "Blank" : "Vacío",
- "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
- "Set up templates folder" : "Configura una carpeta para plantillas",
- "Templates" : "Plantillas",
+ "Save as {displayName}" : "Guardar como {displayName}",
+ "Save as …" : "Guardar como …",
+ "Converting files …" : "Convirtiendo archivos …",
+ "Failed to convert files: {message}" : "Fallo al convertir archivos: {message}",
+ "All files failed to be converted" : "Todos los archivos han fallado al convertirse",
+ "One file could not be converted: {message}" : "Un archivo no ha podido ser convertido: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un archivo no pudo ser convertido","%n archivos no pudieron ser convertidos","%n archivos no pudieron ser convertidos"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un archivo convertido exitosamente","%n archivos convertidos exitosamente","%n archivos convertidos exitosamente"],
+ "Files successfully converted" : "Archivos convertidos exitosamente",
+ "Failed to convert files" : "Fallo al convertir archivos",
+ "Converting file …" : "Convirtiendo archivo …",
+ "File successfully converted" : "Archivo convertido exitosamente",
+ "Failed to convert file: {message}" : "Fallo al convertir el archivo: {message}",
+ "Failed to convert file" : "Fallo al convertir el archivo",
+ "Leave this share" : "Abandonar este recurso compartido",
+ "Leave these shares" : "Abandonar estos recursos compartidos",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Disconnect storages" : "Desconectar almacenamientos",
+ "Delete permanently" : "Eliminar de forma permanente",
+ "Delete and unshare" : "Eliminar y dejar de compartir",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Delete folder" : "Eliminar carpeta",
+ "Delete folders" : "Eliminar carpetas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a punto de eliminar {count} elemento permanentemente","Está a punto de eliminar {count} elementos permanentemente.","Está a punto de eliminar {count} elementos permanentemente"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a punto de eliminar {count} elemento","Está a punto de eliminar {count} elementos","Está a punto de eliminar {count} elementos"],
+ "Confirm deletion" : "Confirmar eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moviendo \"{source}\" a \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" a \"{destination}\" …",
+ "Destination is not a folder" : "El destino no es una carpeta",
+ "This file/folder is already in that directory" : "Este archivo/carpeta ya está en ese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No puede mover un archivo/carpeta a sí mismo o a una sub-carpeta de sí mismo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Un archivo o carpeta con ese nombre ya existe en esta carpeta",
+ "The files are locked" : "Los archivos están bloqueados",
+ "The file does not exist anymore" : "El archivo ya no existe",
+ "Choose destination" : "Elegir destino",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}",
+ "Open in Files" : "Abrir en Archivos",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Fallo al redirigir al cliente",
+ "Open file locally" : "Abrir archivo localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "El archivo se abrirá ahora en su dispositivo. Si esto no ocurre, por favor verifique que ha instalado la aplicación de escritorio.",
+ "Retry and close" : "Reintentar y cerrar",
+ "Open online" : "Abrir en línea",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en carpeta",
+ "Today" : "Hoy",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este año ({year})",
+ "Last year ({year})" : "El año pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Hojas de cálculo",
+ "Presentations" : "Presentaciones",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetas",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Se ha creado la carpeta nueva \"{name}\"",
"Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas",
- "%s used" : "usado %s",
- "%s%% of %s used" : "%s%% de %s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Ajustes",
- "Show hidden files" : "Mostrar archivos ocultos",
- "Crop image previews" : "Recortar la previsualización de las imágenes",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
- "Toggle %1$s sublist" : "Alternar %1$s sublista",
- "Toggle grid view" : "Alternar vista de cuadrícula",
- "No files in here" : "Aquí no hay archivos",
- "Upload some content or sync with your devices!" : "¡Suba contenidos o sincronice sus dispositivos!",
+ "Create templates folder" : "Crear carpeta de plantillas",
+ "Templates" : "Plantillas",
+ "New template folder" : "Nueva carpeta de plantillas",
+ "In folder" : "En carpeta",
+ "Search in all files" : "Buscar en todos los archivos",
+ "Search in folder: {folder}" : "Buscar en carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Uno de los archivos arrastrados no puede ser procesado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Su navegador no soporta la API de Sistema de archivos. Los directorios no se subirán",
+ "No files to upload" : "Ningún archivo para subir",
+ "Unable to create the directory {directory}" : "No se pudo crear el directorio {directory}",
+ "Some files could not be uploaded" : "No se pudieron subir algunos archivos",
+ "Files uploaded successfully" : "Se subieron los archivos exitosamente",
+ "No files to process" : "No hay archivos para procesar",
+ "Some files could not be copied" : "Algunos archivos no se han podido copiar",
+ "Some files could not be moved" : "No se han podido mover algunos archivos",
+ "Files copied successfully" : "Archivos copiados exitosamente",
+ "Files moved successfully" : "Archivos movidos exitosamente",
+ "Conflicts resolution skipped" : "Resolución de conflictos omitida",
+ "Upload cancelled" : "Subida cancelada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se ha podido renombrar \"{oldName}\", ya no existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor, escoja un nombre diferente.",
+ "Could not rename \"{oldName}\"" : "No se ha podido renombrar \"{oldName}\"",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "This folder is unavailable, please try again later or contact the administration" : "Esta carpeta no está disponible, por favor, intente de nuevo más tarde o contacte a la administración",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Unexpected error: {error}" : "Error inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "_%n hidden_::_%n hidden_" : ["%n oculto","%n ocultos","%n ocultos"],
+ "Filename must not be empty." : "El nombre de archivo no debe estar vacío.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no está permitido en el nombre de archivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" es un nombre reservado y no se permite para los nombres de archivo.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no es un tipo de archivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "Los nombres de archivo no puede terminar con \"{extension}\".",
+ "List of favorite files and folders." : "Lista de archivos y carpetas favoritos.",
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
+ "List of your files and folders." : "Lista de sus archivos y carpetas.",
+ "List of your files and folders that are not shared." : "Lista de sus archivos y carpetas que no están compartidos.",
+ "No personal files found" : "No se encontraron archivos personales",
+ "Files that are not shared will show up here." : "Los archivos y carpetas que no ha compartido aparecerán aquí.",
+ "Recent" : "Reciente",
+ "List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
+ "No recently modified files" : "No hay archivos modificados recientemente.",
+ "Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
+ "Search" : "Buscar",
+ "Search results within your files." : "Resultados de búsqueda dentro de sus archivos.",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "Subida demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que has marcado como favoritos",
- "Deleted files" : "Archivos eliminados",
- "Shares" : "Archivos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido conmigo",
- "Shared by link" : "Compartido por enlace",
- "Deleted shares" : "Recursos compartidos eliminados",
- "Pending shares" : "Recursos compartidos pendientes",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
+ "File could not be found" : "El archivo no se ha encontrado",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No se ha podido crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
+ "Upload cancelled." : "Subida cancelada.",
+ "Processing files …" : "Procesando archivos …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta de destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Se ha producido un error desconocido",
+ "File could not be uploaded" : "No se ha podido subir el archivo",
+ "Uploading …" : "Subiendo …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Cargando… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Subir este archivo no es compatible",
+ "Error when assembling chunks, status code {status}" : "Error al reunir los trozos, código de estado {status}",
+ "Choose target folder" : "Elegir carpeta de destino",
+ "Set reminder" : "Establecer recordatorio",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No se ha podido cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección",
+ "Select directory \"{dirName}\"" : "Seleccione la carpeta \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleccione el archivo \"{fileName}\"",
+ "Unable to determine date" : "No se ha podido determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contacte con el administrador",
+ "Could not move \"{file}\", target exists" : "No se ha podido mover \"{file}\", ya existe",
+ "Could not move \"{file}\"" : "No se ha podido mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "No se ha podido copiar \"{file}\", ya existe el destino",
+ "Could not copy \"{file}\"" : "No se ha podido copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "Se ha copiado {origin} dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Se han copiado {origin} y {nbfiles} otros archivos dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No se ha podido crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No se ha podido crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se han podido obtener los detalles de \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No hay resultados de búsqueda en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Escriba más de dos caracteres para buscar en otras carpetas",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tiene permiso para subir o crear archivos aquí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos","Subiendo %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de carpeta/archivo nuevo",
+ "Select file range" : "Seleccionar el rango de archivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo no válido.",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "\"/\" no se permite en un nombre de archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" no es un tipo de archivo permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coinciden \"{filter}\"","coincide \"{filter}\"","coincide \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Se ha copiado el enlace directo (sólo funciona para usuarios que tengan acceso a este archivo/carpeta)",
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar enlace directo (solo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Upload file" : "Subir archivo",
+ "Not favored" : "No favorecido",
+ "An error occurred while trying to update the tags" : "Se ha producido un error al tratar de actualizar las etiquetas",
+ "Upload (max. %s)" : "Subida (máx. %s)",
+ "\"{displayName}\" action executed successfully" : "la acción \"{displayName}\" se ejecutó exitosamente",
+ "\"{displayName}\" action failed" : "la acción \"{displayName}\" falló",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" falló en algunos elementos",
+ "\"{displayName}\" batch action executed successfully" : "la acción en lotes \"{displayName}\" se ejecutó exitosamente",
+ "Submitting fields…" : "Enviando campos…",
+ "Filter filenames…" : "Filtrar nombres de archivo…",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiado al portapapeles",
+ "Enable the grid view" : "Habilitar vista de cuadrícula",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Deletion cancelled" : "Eliminación cancelada",
+ "Move cancelled" : "Se canceló la movida",
+ "Cancelled move or copy of \"{filename}\"." : "Se canceló la operación de mover o copiar de \"{filename}\".",
+ "Cancelled move or copy operation" : "Se canceló la operación de mover o copiar",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imágenes",
+ "New folder creation cancelled" : "Se canceló la creación de la carpeta nueva",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archivo y 1 carpeta","{fileCount} archivos y 1 carpeta","{fileCount} archivos y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archivos y {folderCount} carpetas",
+ "All folders" : "Todas las carpetas",
+ "Personal Files" : "Archivos Personales",
"Text file" : "Archivo de texto",
"New text file.txt" : "Nuevo archivo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno, ¡no se subirán ni se sincronizarán más archivos!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "¡La carpeta de grupo \"{mountPoint}\" está llena, los archivos ya no pueden ser actualizados o sincronizados!.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "¡El almacenamiento externo \"{mountPoint}\" está lleno, los archivos ya no pueden ser actualizados o sincronizados!.",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno, ¡no se subirán ni se sincronizarán más archivos!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincidencias '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
+ "%1$s (renamed)" : "%1$s (renombrado)",
+ "renamed file" : "archivo renombrado",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Una vez habilitados los nombres de archivo compatibles con Windows, los archivos existentes ya no se podrán modificar, pero su propietario podrá renombrarlos a otros nombres válidos de archivo.",
+ "Filter file names …" : "Filtrar nombres de archivo …",
+ "Prevent warning dialogs from open or reenable them." : "Evitar que se abran los diálogos de advertencia o volver a habilitarlos.",
+ "Show a warning dialog when changing a file extension." : "Mostrar un diálogo de advertencia cuando se cambia la extensión de un archivo.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere su experiencia con Archivos con esos rápidos atajos de teclado.",
+ "Open the actions menu for a file" : "Abrir el menú de acciones para un archivo",
+ "Rename a file" : "Renombrar un archivo",
+ "Delete a file" : "Eliminar un archivo",
+ "Favorite or remove a file from favorites" : "Marcar o desmarcar un archivo desde los favoritos",
+ "Manage tags for a file" : "Gestionar etiquetas para un archivo",
+ "Deselect all files" : "Deseleccionar todos los archivos",
+ "Select or deselect a file" : "Seleccionar o deseleccionar un archivo",
+ "Select a range of files" : "Seleccionar un rango de archivos",
+ "Navigate to the parent folder" : "Navegar a la carpeta superior",
+ "Navigate to the file above" : "Navegar al archivo anterior",
+ "Navigate to the file below" : "Navegar al archivo siguiente",
+ "Navigate to the file on the left (in grid mode)" : "Navegar al archivo de la izquierda (en modo cuadrícula)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar al archivo de la derecha (en modo cuadrícula)",
+ "Toggle the grid view" : "Alternar vista en cuadrícula",
+ "Open the sidebar for a file" : "Abrir la barra lateral para un archivo"
+},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/es_419.js b/apps/files/l10n/es_419.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_419.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_419.json b/apps/files/l10n/es_419.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_419.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js
deleted file mode 100644
index e0bfb1a4a4c..00000000000
--- a/apps/files/l10n/es_AR.js
+++ /dev/null
@@ -1,146 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o Copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "Processing files …" : "Procesando archivos...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero sólo cuenta con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuenta con suficiente espacio disponible",
- "An unknown error has occurred" : "Se presentó un error desconocido",
- "Uploading …" : "Actualizando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Elegir carpeta destino",
- "Open" : "Abrir",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, favor de verficiar las bitácoras o contacte al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\"" : "No es posible copiar \"{file}\"",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Favor de elegir un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar link directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es favorito",
- "Remove from favorites" : "Eliminado de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Usted agregó {file} a sus favoritos",
- "You removed {file} from your favorites" : "Usted eliminó {file} de sus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Usted creó {file}",
- "You created an encrypted file in {file}" : "Se creó el archivo encriptado {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó el archivo encriptado {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Usted cambió {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Usted borró {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Usted restauró {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Usted renombró  {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Usted movió {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de sus strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "File Management" : "Administración de Archivos",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "Vista de cuadrícula",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Cargue algún contenido o sincronice con sus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marque como favortios se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Shares",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por link",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Su espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coinciden '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json
deleted file mode 100644
index 343ef0e6437..00000000000
--- a/apps/files/l10n/es_AR.json
+++ /dev/null
@@ -1,144 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o Copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "Processing files …" : "Procesando archivos...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero sólo cuenta con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuenta con suficiente espacio disponible",
- "An unknown error has occurred" : "Se presentó un error desconocido",
- "Uploading …" : "Actualizando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Elegir carpeta destino",
- "Open" : "Abrir",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, favor de verficiar las bitácoras o contacte al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\"" : "No es posible copiar \"{file}\"",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Favor de elegir un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar link directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es favorito",
- "Remove from favorites" : "Eliminado de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Usted agregó {file} a sus favoritos",
- "You removed {file} from your favorites" : "Usted eliminó {file} de sus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Usted creó {file}",
- "You created an encrypted file in {file}" : "Se creó el archivo encriptado {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó el archivo encriptado {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Usted cambió {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Usted borró {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Usted restauró {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Usted renombró  {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Usted movió {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de sus strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "File Management" : "Administración de Archivos",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "Vista de cuadrícula",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Cargue algún contenido o sincronice con sus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marque como favortios se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Shares",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por link",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Su espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coinciden '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js
deleted file mode 100644
index 5ea47993d8e..00000000000
--- a/apps/files/l10n/es_CL.js
+++ /dev/null
@@ -1,150 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json
deleted file mode 100644
index dbfc10cdaa0..00000000000
--- a/apps/files/l10n/es_CL.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_CO.js b/apps/files/l10n/es_CO.js
deleted file mode 100644
index 2266471e917..00000000000
--- a/apps/files/l10n/es_CO.js
+++ /dev/null
@@ -1,150 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "Copiar",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_CO.json b/apps/files/l10n/es_CO.json
deleted file mode 100644
index 1981b16a1d4..00000000000
--- a/apps/files/l10n/es_CO.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "Copiar",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_CR.js b/apps/files/l10n/es_CR.js
deleted file mode 100644
index 0ec0c48379e..00000000000
--- a/apps/files/l10n/es_CR.js
+++ /dev/null
@@ -1,149 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_CR.json b/apps/files/l10n/es_CR.json
deleted file mode 100644
index 3cafde47f8d..00000000000
--- a/apps/files/l10n/es_CR.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_DO.js b/apps/files/l10n/es_DO.js
deleted file mode 100644
index 0ec0c48379e..00000000000
--- a/apps/files/l10n/es_DO.js
+++ /dev/null
@@ -1,149 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_DO.json b/apps/files/l10n/es_DO.json
deleted file mode 100644
index 3cafde47f8d..00000000000
--- a/apps/files/l10n/es_DO.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js
index 0ec0c48379e..94461e473a7 100644
--- a/apps/files/l10n/es_EC.js
+++ b/apps/files/l10n/es_EC.js
@@ -1,90 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Added to favorites" : "Agregado a los favoritos",
"Removed from favorites" : "Eliminado de los favoritos",
"You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
"You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios al archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Cambiado por {user}",
@@ -92,7 +13,6 @@ OC.L10N.register(
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
"You created {file}" : "Creaste {file}",
"You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
"{user} created {file}" : "{user} creó {file}",
@@ -108,42 +28,237 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
"You restored {file}" : "Restauraste {file}",
"{user} restored {file}" : "{user} restauró {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Cambiaste el nombre de {oldfile} (oculto) a {newfile} (oculto).",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Cambiaste el nombre de {oldfile} (oculto) a {newfile}.",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Cambiaste el nombre de {oldfile} a {newfile} (oculto).",
"You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} cambió el nombre de {oldfile} (oculto) a {newfile} (oculto).",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} cambió el nombre de {oldfile} (oculto) a {newfile}.",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} cambió el nombre de {oldfile} a {newfile} (oculto).",
"{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
"You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
+ "Files" : "Archivos",
+ "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>.",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>modificado</strong>.",
+ "No favorites" : "No hay favoritos",
"Accept" : "Aceptar",
+ "Reject" : "Rechazar",
+ "Incoming ownership transfer from {user}" : "Transferencia de propiedad entrante de {user}.",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quieres aceptar {path}?\n Nota: El proceso de transferencia puede tardar hasta 1 hora después de aceptarlo.",
+ "Ownership transfer failed" : "Error en la transferencia de propiedad.",
+ "Your ownership transfer of {path} to {user} failed." : "No se pudo transferir la propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "No se pudo transferir la propiedad de {path} de {user}.",
+ "Ownership transfer done" : "Transferencia de propiedad completada.",
+ "Your ownership transfer of {path} to {user} has completed." : "La transferencia de propiedad de {path} a {user} se ha completado.",
+ "The ownership transfer of {path} from {user} has completed." : "La transferencia de propiedad de {path} de {user} se ha completado.",
"in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
+ "File Management" : "Gestión de archivos.",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar directorio actual.",
+ "Go to the \"{dir}\" directory" : "Ir al directorio \"{dir}\".",
+ "Favorite" : "Favorito",
+ "Filename" : "Nombre de archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Cambiaste el nombre de \"{oldName}\" a \"{newName}\".",
+ "Rename file" : "Renombrar archivo.",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Clear filter" : "Borrar filtro",
+ "Modified" : "Modificado",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Eliminar filtro",
+ "Total rows summary" : "Resumen total de filas.",
+ "Name" : "Nombre",
+ "Size" : "Tamaño",
+ "Actions" : "Acciones",
+ "List of files and folders." : "Lista de archivos y carpetas. ",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionado"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usados.",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% usados.",
+ "Could not refresh storage stats" : "No se pudo actualizar las estadísticas de almacenamiento.",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear nueva carpeta",
"Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Elige un archivo o carpeta para transferir.",
+ "Transfer" : "Transferencia",
+ "Transfer {path} to {userid}" : "Transferir {path} a {userid}.",
+ "Invalid path selected" : "Ruta seleccionada no válida.",
+ "Unknown error" : "Se presentó un error desconocido",
+ "Ownership transfer request sent" : "Solicitud de transferencia de propiedad enviada.",
+ "Cannot transfer ownership of a file or folder you do not own" : "No se puede transferir la propiedad de un archivo o carpeta que no posees.",
+ "Transfer ownership of a file or folder" : "Transferir propiedad de un archivo o carpeta.",
+ "Choose file or folder to transfer" : "Selecciona un archivo o carpeta para transferir.",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario.",
+ "Select file or folder to link to" : "Seleccionar archivo o carpeta para enlazar.",
+ "Shared by link" : "Compartido por liga",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a vista de lista",
+ "Not enough free space" : "No cuentas con suficiente espacio libre",
+ "Operation is blocked by access control" : "La operación está bloqueada por el control de acceso.",
+ "Loading current folder" : "Cargando directorio actual.",
+ "Retry" : "Reintentar",
"No files in here" : "No hay archivos aquí",
"Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
+ "Go back" : "Regresar",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos.",
+ "Open in files" : "Abrir en archivos",
+ "File cannot be accessed" : "No se puede acceder al archivo.",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "General" : "General",
+ "All files" : "Todos los archivos",
+ "Sort favorites first" : "Ordenar primero los favoritos.",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Crop image previews" : "Recortar vistas previas de imágenes.",
+ "Additional settings" : "Configuraciones adicionales",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atajos del teclado",
+ "File actions" : "Acciones de archivo",
+ "Rename" : "Renombrar",
+ "Delete" : "Borrar",
+ "Manage tags" : "Gestionar etiquetas",
+ "Selection" : "Selección",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar vista en cuadrícula.",
+ "Error while loading the file data" : "Error al cargar los datos del archivo.",
+ "Owner" : "Dueño",
+ "Remove from favorites" : "Eliminar de favoritos",
+ "Add to favorites" : "Agregar a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "En blanco",
+ "Unable to create new file from template" : "No se pudo crear un nuevo archivo a partir de la plantilla.",
+ "Pick a template for {name}" : "Selecciona una plantilla para {name}.",
+ "Create a new file with the selected template" : "Crea un archivo nuevo con la plantilla seleccionada.",
+ "Creating file" : "Creando archivo.",
+ "Leave this share" : "Salir de esta compartición.",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Delete permanently" : "Borrar permanentemente",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Move" : "Mover",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}.",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "No se pudo redirigir al cliente.",
+ "Open file locally" : "Abrir archivo localmente",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en la carpeta",
+ "Today" : "Hoy",
+ "Documents" : "Documentos",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Videos",
+ "Unable to initialize the templates directory" : "No se pudo inicializar el directorio de plantillas.",
+ "Templates" : "Plantillas",
+ "Some files could not be moved" : "Algunos archivos no se pudieron mover",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se pudo cambiar el nombre de \"{oldName}\", ya no existe.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
+ "Could not rename \"{oldName}\"" : "No se pudo cambiar el nombre de \"{oldName}\".",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
+ "Recent" : "Reciente",
+ "Search" : "Buscar",
"No entries found in this folder" : "No se encontraron elementos en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "La carga es demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
+ "File could not be found" : "No fue posible encontrar el archivo",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá tus cargas actuales.",
+ "Upload cancelled." : "Carga cancelada.",
+ "Processing files …" : "Procesando archivos...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Ha ocurrido un error desconocido.",
+ "File could not be uploaded" : "No se pudo cargar el archivo.",
+ "Uploading …" : "Cargando...",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "No se admite la carga de ese elemento.",
+ "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
+ "Choose target folder" : "Selecciona la carpeta de destino.",
+ "Edit locally" : "Editar localmente.",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Selecciona la(s) etiqueta(s) para agregar a la selección.",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección.",
+ "Select directory \"{dirName}\"" : "Selecciona el directorio \"{dirName}\".",
+ "Select file \"{fileName}\"" : "Selecciona el archivo \"{fileName}\".",
+ "Unable to determine date" : "No fue posible determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
+ "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
+ "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
+ "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se pudieron obtener los detalles del archivo \"{file}\".",
+ "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingresa más de dos caracteres para buscar en otras carpetas.",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tienes permiso para cargar o crear archivos aquí.",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de archivo/carpeta nuevo.",
+ "Select file range" : "Selecciona un rango de archivos.",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena, no se pueden actualizar ni sincronizar archivos.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide con \"{filter}\".","coincide con \"{filter}\".","coincide con \"{filter}\"."],
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Upload file" : "Cargar archivo",
+ "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
+ "Upload (max. %s)" : "Cargar (max. %s)",
+ "\"{displayName}\" action executed successfully" : "La acción \"{displayName}\" se ejecutó correctamente.",
+ "\"{displayName}\" action failed" : "La acción \"{displayName}\" falló.",
+ "\"{displayName}\" batch action executed successfully" : "La acción en lote \"{displayName}\" se ejecutó correctamente.",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiada al portapapeles.",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Open details" : "Abrir detalles.",
"Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
+ "New text file.txt" : "Nuevo ArchivoDeTexto.txt"
},
-"nplurals=2; plural=(n != 1);");
+"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json
index 3cafde47f8d..732fffc3f01 100644
--- a/apps/files/l10n/es_EC.json
+++ b/apps/files/l10n/es_EC.json
@@ -1,88 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Added to favorites" : "Agregado a los favoritos",
"Removed from favorites" : "Eliminado de los favoritos",
"You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
"You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios al archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Cambiado por {user}",
@@ -90,7 +11,6 @@
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
"You created {file}" : "Creaste {file}",
"You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
"{user} created {file}" : "{user} creó {file}",
@@ -106,42 +26,237 @@
"{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
"You restored {file}" : "Restauraste {file}",
"{user} restored {file}" : "{user} restauró {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Cambiaste el nombre de {oldfile} (oculto) a {newfile} (oculto).",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Cambiaste el nombre de {oldfile} (oculto) a {newfile}.",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Cambiaste el nombre de {oldfile} a {newfile} (oculto).",
"You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} cambió el nombre de {oldfile} (oculto) a {newfile} (oculto).",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} cambió el nombre de {oldfile} (oculto) a {newfile}.",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} cambió el nombre de {oldfile} a {newfile} (oculto).",
"{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
"You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
+ "Files" : "Archivos",
+ "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>modificado</strong>.",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>modificado</strong>.",
+ "No favorites" : "No hay favoritos",
"Accept" : "Aceptar",
+ "Reject" : "Rechazar",
+ "Incoming ownership transfer from {user}" : "Transferencia de propiedad entrante de {user}.",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quieres aceptar {path}?\n Nota: El proceso de transferencia puede tardar hasta 1 hora después de aceptarlo.",
+ "Ownership transfer failed" : "Error en la transferencia de propiedad.",
+ "Your ownership transfer of {path} to {user} failed." : "No se pudo transferir la propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "No se pudo transferir la propiedad de {path} de {user}.",
+ "Ownership transfer done" : "Transferencia de propiedad completada.",
+ "Your ownership transfer of {path} to {user} has completed." : "La transferencia de propiedad de {path} a {user} se ha completado.",
+ "The ownership transfer of {path} from {user} has completed." : "La transferencia de propiedad de {path} de {user} se ha completado.",
"in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
+ "File Management" : "Gestión de archivos.",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar directorio actual.",
+ "Go to the \"{dir}\" directory" : "Ir al directorio \"{dir}\".",
+ "Favorite" : "Favorito",
+ "Filename" : "Nombre de archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Cambiaste el nombre de \"{oldName}\" a \"{newName}\".",
+ "Rename file" : "Renombrar archivo.",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Clear filter" : "Borrar filtro",
+ "Modified" : "Modificado",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Eliminar filtro",
+ "Total rows summary" : "Resumen total de filas.",
+ "Name" : "Nombre",
+ "Size" : "Tamaño",
+ "Actions" : "Acciones",
+ "List of files and folders." : "Lista de archivos y carpetas. ",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionado"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usados.",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% usados.",
+ "Could not refresh storage stats" : "No se pudo actualizar las estadísticas de almacenamiento.",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear nueva carpeta",
"Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Elige un archivo o carpeta para transferir.",
+ "Transfer" : "Transferencia",
+ "Transfer {path} to {userid}" : "Transferir {path} a {userid}.",
+ "Invalid path selected" : "Ruta seleccionada no válida.",
+ "Unknown error" : "Se presentó un error desconocido",
+ "Ownership transfer request sent" : "Solicitud de transferencia de propiedad enviada.",
+ "Cannot transfer ownership of a file or folder you do not own" : "No se puede transferir la propiedad de un archivo o carpeta que no posees.",
+ "Transfer ownership of a file or folder" : "Transferir propiedad de un archivo o carpeta.",
+ "Choose file or folder to transfer" : "Selecciona un archivo o carpeta para transferir.",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario.",
+ "Select file or folder to link to" : "Seleccionar archivo o carpeta para enlazar.",
+ "Shared by link" : "Compartido por liga",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a vista de lista",
+ "Not enough free space" : "No cuentas con suficiente espacio libre",
+ "Operation is blocked by access control" : "La operación está bloqueada por el control de acceso.",
+ "Loading current folder" : "Cargando directorio actual.",
+ "Retry" : "Reintentar",
"No files in here" : "No hay archivos aquí",
"Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
+ "Go back" : "Regresar",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos.",
+ "Open in files" : "Abrir en archivos",
+ "File cannot be accessed" : "No se puede acceder al archivo.",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "General" : "General",
+ "All files" : "Todos los archivos",
+ "Sort favorites first" : "Ordenar primero los favoritos.",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Crop image previews" : "Recortar vistas previas de imágenes.",
+ "Additional settings" : "Configuraciones adicionales",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atajos del teclado",
+ "File actions" : "Acciones de archivo",
+ "Rename" : "Renombrar",
+ "Delete" : "Borrar",
+ "Manage tags" : "Gestionar etiquetas",
+ "Selection" : "Selección",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar vista en cuadrícula.",
+ "Error while loading the file data" : "Error al cargar los datos del archivo.",
+ "Owner" : "Dueño",
+ "Remove from favorites" : "Eliminar de favoritos",
+ "Add to favorites" : "Agregar a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "En blanco",
+ "Unable to create new file from template" : "No se pudo crear un nuevo archivo a partir de la plantilla.",
+ "Pick a template for {name}" : "Selecciona una plantilla para {name}.",
+ "Create a new file with the selected template" : "Crea un archivo nuevo con la plantilla seleccionada.",
+ "Creating file" : "Creando archivo.",
+ "Leave this share" : "Salir de esta compartición.",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Delete permanently" : "Borrar permanentemente",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Move" : "Mover",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}.",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "No se pudo redirigir al cliente.",
+ "Open file locally" : "Abrir archivo localmente",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en la carpeta",
+ "Today" : "Hoy",
+ "Documents" : "Documentos",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Videos",
+ "Unable to initialize the templates directory" : "No se pudo inicializar el directorio de plantillas.",
+ "Templates" : "Plantillas",
+ "Some files could not be moved" : "Algunos archivos no se pudieron mover",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se pudo cambiar el nombre de \"{oldName}\", ya no existe.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
+ "Could not rename \"{oldName}\"" : "No se pudo cambiar el nombre de \"{oldName}\".",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
+ "Recent" : "Reciente",
+ "Search" : "Buscar",
"No entries found in this folder" : "No se encontraron elementos en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "La carga es demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
+ "File could not be found" : "No fue posible encontrar el archivo",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá tus cargas actuales.",
+ "Upload cancelled." : "Carga cancelada.",
+ "Processing files …" : "Procesando archivos...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Ha ocurrido un error desconocido.",
+ "File could not be uploaded" : "No se pudo cargar el archivo.",
+ "Uploading …" : "Cargando...",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "No se admite la carga de ese elemento.",
+ "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
+ "Choose target folder" : "Selecciona la carpeta de destino.",
+ "Edit locally" : "Editar localmente.",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Selecciona la(s) etiqueta(s) para agregar a la selección.",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a la selección.",
+ "Select directory \"{dirName}\"" : "Selecciona el directorio \"{dirName}\".",
+ "Select file \"{fileName}\"" : "Selecciona el archivo \"{fileName}\".",
+ "Unable to determine date" : "No fue posible determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
+ "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
+ "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
+ "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se pudieron obtener los detalles del archivo \"{file}\".",
+ "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingresa más de dos caracteres para buscar en otras carpetas.",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tienes permiso para cargar o crear archivos aquí.",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de archivo/carpeta nuevo.",
+ "Select file range" : "Selecciona un rango de archivos.",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El almacenamiento de {owner} está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta de grupo \"{mountPoint}\" está llena, no se pueden actualizar ni sincronizar archivos.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "El almacenamiento externo \"{mountPoint}\" está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tu almacenamiento está lleno, no se pueden actualizar ni sincronizar archivos.",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tu almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide con \"{filter}\".","coincide con \"{filter}\".","coincide con \"{filter}\"."],
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Upload file" : "Cargar archivo",
+ "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
+ "Upload (max. %s)" : "Cargar (max. %s)",
+ "\"{displayName}\" action executed successfully" : "La acción \"{displayName}\" se ejecutó correctamente.",
+ "\"{displayName}\" action failed" : "La acción \"{displayName}\" falló.",
+ "\"{displayName}\" batch action executed successfully" : "La acción en lote \"{displayName}\" se ejecutó correctamente.",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiada al portapapeles.",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Usa esta dirección para acceder a tus archivos a través de WebDAV.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si has habilitado la autenticación de dos factores (2FA), debes crear y usar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Open details" : "Abrir detalles.",
"Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
+ "New text file.txt" : "Nuevo ArchivoDeTexto.txt"
+},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/es_GT.js b/apps/files/l10n/es_GT.js
deleted file mode 100644
index 0ec0c48379e..00000000000
--- a/apps/files/l10n/es_GT.js
+++ /dev/null
@@ -1,149 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_GT.json b/apps/files/l10n/es_GT.json
deleted file mode 100644
index 3cafde47f8d..00000000000
--- a/apps/files/l10n/es_GT.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_HN.js b/apps/files/l10n/es_HN.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_HN.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_HN.json b/apps/files/l10n/es_HN.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_HN.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index 22433e9d9ee..4eb580d2ae1 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -1,90 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Added to favorites" : "Agregado a los favoritos",
"Removed from favorites" : "Eliminado de los favoritos",
"You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
"You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios al archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Cambiado por {user}",
@@ -92,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
+ "\"remote account\"" : "\"cuenta remota\"",
"You created {file}" : "Creaste {file}",
"You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
"{user} created {file}" : "{user} creó {file}",
@@ -108,44 +29,373 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
"You restored {file}" : "Restauraste {file}",
"{user} restored {file}" : "{user} restauró {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Has renombrado {oldfile} (oculto) a {newfile} (oculto)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Has renombrado {oldfile} (oculto) a {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Has renombrado {oldfile} a {newfile} (oculto)",
"You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renombró {oldfile} (oculto) a {newfile} (oculto)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renombró {oldfile} (oculto) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renombró {oldfile} a {newfile} (oculto)",
"{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
"You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
+ "Files" : "Archivos",
+ "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>cambiado</strong>",
+ "Failed to authorize" : "Fallo al autorizar",
+ "Invalid folder path" : "Ruta de carpeta inválida",
+ "Folder not found" : "No se encontró la carpeta",
+ "No favorites" : "No hay favoritos",
"Accept" : "Aceptar",
+ "Reject" : "Rechazar",
+ "Incoming ownership transfer from {user}" : "Solicitud de transferencia de propiedad entrante de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Desea aceptar {path}?\n\nNota: El proceso de transferencia tras aceptar podría tardar hasta 1 hora.",
+ "Ownership transfer denied" : "Transferencia de propiedad denegada",
+ "Your ownership transfer of {path} was denied by {user}." : "Su transferencia de propiedad de {path} fue denegada por {user}.",
+ "Ownership transfer failed" : "Fallo al transferir la propiedad",
+ "Your ownership transfer of {path} to {user} failed." : "Ha fallado su transferencia de propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Ha fallado la transferencia de propiedad de {path} desde {user}.",
+ "Ownership transfer done" : "Transferencia de propiedad realizada",
+ "Your ownership transfer of {path} to {user} has completed." : "Se ha completado su transferencia de propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Se ha completado la transferencia de propiedad de {path} a {user}.",
"in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Transfirió desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidad de archivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restringir los nombres de archivos para asegurar que los archivos se puedan sincronizar con todos los clientes. Por defecto, se permiten todos los nombres de archivos válidos en POSIX (por ejemplo, Linux o macOS).",
+ "Enforce Windows compatibility" : "Imponer la compatibilidad de Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Esto bloqueará los nombres de archivos inválidos en sistemas Windows, tales como usar nombres reservados o caracteres especiales. Pero no impondrá la compatibilidad del uso de mayúsculas y minúsculas.",
"File Management" : "Administración de Archivos",
- "Change" : "Cambiar",
- "Transfer" : "Transferir",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar el directorio actual",
+ "Go to the \"{dir}\" directory" : "Ir al directorio \"{dir}\"",
+ "Current directory path" : "Dirección del directorio actual",
+ "Your have used your space quota and cannot upload files anymore" : "Ha utilizado su cuota de espacio y ya no puede subir más archivos",
+ "Drag and drop files here to upload" : "Arrastre y suelte los archivos aquí para subirlos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar selección para archivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar selección para la carpeta \"{displayName}\"",
+ "File is loading" : "El archivo se está cargando",
+ "Folder is loading" : "La carpeta se está cargando",
+ "Filename" : "Nombre del archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "This node is unavailable" : "Este nodo no está disponible",
+ "Another entry with the same name already exists." : "Ya existe otra entrada con el mismo nombre.",
+ "Invalid filename." : "Nombre de archivo inválido",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renombrado \"{oldName}\" a \"{newName}\"",
+ "Rename file" : "Renombrar archivo",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Unknown date" : "Fecha desconocida",
+ "Clear filter" : "Limpiar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar en todas partes",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Quitar filtro",
+ "Total rows summary" : "Resumen de filas totales",
+ "Toggle selection for all files and folders" : "Alternar selección para todos los archivos y carpetas",
+ "Name" : "Nombre",
+ "Size" : "Tamaño",
+ "Actions" : "Acciones",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de archivos y carpetas.",
+ "Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
+ "File not found" : "Archivo no encontrado",
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% utilizado",
+ "Could not refresh storage stats" : "No fue posible actualizar las estadísticas de almacenamiento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Su espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "Storage information" : "Información de almacenamiento",
+ "Storage quota" : "Cuota de almacenamiento",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear nueva carpeta",
+ "This name is already in use." : "Este nombre ya está en uso.",
"Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
+ "Fill template fields" : "Rellenar los campos de la plantilla",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Transfer" : "Transferir",
+ "Transfer {path} to {userid}" : "Transferir {path} a {userid}",
+ "Invalid path selected" : "Ruta seleccionada no válida.",
+ "Unknown error" : "Se presentó un error desconocido",
+ "Ownership transfer request sent" : "Enviada la solicitud de transferencia de propiedad",
+ "Cannot transfer ownership of a file or folder you do not own" : "No puede transferir la propiedad de un archivo o directorio del cual no es propietario",
+ "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
+ "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario",
+ "Remove extension" : "Remover extensión",
+ "Change file extension" : "Cambiar extensión de archivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar la extensión del archivo de \"{old}\" a \"{new}\" podría volver al archivo inaccesible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Remover la extensión \"{old}\" podría volver al archivo inaccesible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Añadir la extensión de archivo \"{new}\" podría volver al archivo inaccesible.",
+ "Select file or folder to link to" : "Seleccionar archivo o carpeta para enlazar.",
+ "Choose {file}" : "Elegir {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por liga",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a la vista de lista",
+ "Switch to grid view" : "Cambiar a la vista de cuadrícula",
+ "Upload was cancelled by user" : "La subida fue cancelada por el usuario",
+ "Not enough free space" : "No cuentas con suficiente espacio libre",
+ "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
+ "Error during upload: {message}" : "Error durante la subida: {message}",
+ "Error during upload, status code {status}" : "Error durante la carga, código de estado {status}",
+ "Unknown error during upload" : "Error desconocido durante la carga",
+ "Loading current folder" : "Cargando la carpeta actual",
+ "Retry" : "Reintentar",
"No files in here" : "No hay archivos aquí",
"Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
+ "Go back" : "Regresar",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos",
+ "Your files" : "Sus archivos",
+ "Open in files" : "Abrir en archivos",
+ "File cannot be accessed" : "No se puede acceder al archivo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "El archivo no fue encontrado o no tiene permisos para verlo. Solicite al remitente que lo comparta.",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "General" : "General",
+ "All files" : "Todos los archivos",
+ "Personal files" : "Archivos personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Crop image previews" : "Recortar la previsualización de las imágenes",
+ "Additional settings" : "Configuraciones adicionales",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atajos del teclado",
+ "Rename" : "Renombrar",
+ "Delete" : "Borrar",
+ "Manage tags" : "Administrar etiquetas",
+ "Selection" : "Selección",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Vista de cuadrícula",
+ "You" : "Usted",
+ "Shared multiple times with different people" : "Compartido múltiples veces con diferentes personas",
+ "Error while loading the file data" : "Error al cargar los datos del archivo",
+ "Owner" : "Propietario",
+ "Remove from favorites" : "Eliminar de favoritos",
+ "Add to favorites" : "Agregar a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Vacío",
+ "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
+ "Pick a template for {name}" : "Elija una plantilla para {name}",
+ "Create a new file with the selected template" : "Crear un nuevo archivo con la plantilla seleccionada",
+ "Creating file" : "Creando el archivo",
+ "Leave this share" : "Dejar este recurso compartido",
+ "Leave these shares" : "Dejar estos recursos compartidos",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Disconnect storages" : "Desconectar almacenamientos",
+ "Delete permanently" : "Eliminar permanentemente",
+ "Delete and unshare" : "Eliminar y dejar de compartir",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Delete folder" : "Eliminar carpeta",
+ "Delete folders" : "Eliminar carpetas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a punto de eliminar {count} elemento permanentemente.","Está a punto de eliminar {count} elementos permanentemente.","Está a punto de eliminar {count} elementos permanentemente."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a punto de eliminar {count} elemento.","Está a punto de eliminar {count} elementos.","Está a punto de eliminar {count} elementos."],
+ "Confirm deletion" : "Confirmar eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moviendo \"{source}\" a \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" a \"{destination}\" …",
+ "Destination is not a folder" : "El destino no es una carpeta",
+ "This file/folder is already in that directory" : "Este archivo/carpeta ya está en ese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No puede mover un archivo/carpeta a sí mismo o a una subcarpeta de sí mismo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Un archivo o carpeta con ese nombre ya existe en esta carpeta",
+ "The files are locked" : "Los archivos están bloqueados",
+ "The file does not exist anymore" : "El archivo ya no existe",
+ "Choose destination" : "Elegir destino",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}",
+ "Open in Files" : "Abrir en Archivos",
+ "Failed to redirect to client" : "Fallo al redirigir al cliente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "El archivo se abrirá ahora en tu dispositivo. Si esto no ocurre, por favor verifica que hayas instalado la aplicación de escritorio.",
+ "Retry and close" : "Reintentar y cerrar",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en la carpeta",
+ "Today" : "Hoy",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este año ({year})",
+ "Last year ({year})" : "El año pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Hojas de cálculo",
+ "Presentations" : "Presentaciones",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetas",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Nueva carpeta \"{name}\" creada",
+ "Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas",
+ "Create templates folder" : "Crear la carpeta de plantillas",
+ "Templates" : "Plantillas",
+ "New template folder" : "Nueva carpeta de plantillas",
+ "In folder" : "En la carpeta",
+ "Search in folder: {folder}" : "Buscar en la carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Uno de los archivos arrastrados no puede ser procesado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Su navegador no soporta la API de Sistema de archivos. Los directorios no se cargarán",
+ "No files to upload" : "No hay archivos para subir",
+ "Unable to create the directory {directory}" : "No se pudo crear el directorio {directory}",
+ "Some files could not be uploaded" : "No se pudieron subir algunos archivos",
+ "Files uploaded successfully" : "Archivo subido exitosamente",
+ "No files to process" : "No hay archivos a procesar",
+ "Some files could not be copied" : "Algunos archivos no se pudieron copiar",
+ "Some files could not be moved" : "Algunos archivos no se pudieron mover",
+ "Files copied successfully" : "Archivos copiados exitosamente",
+ "Files moved successfully" : "Archivos movidos exitosamente",
+ "Conflicts resolution skipped" : "Resolución de conflictos omitida",
+ "Upload cancelled" : "Subida cancelada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se pudo renombrar \"{oldName}\", ya no existe.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor, elija un nombre diferente.",
+ "Could not rename \"{oldName}\"" : "No se pudo renombrar \"{oldName}\"",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
+ "Unexpected error: {error}" : "Error inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "Filename must not be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no está permitido en el nombre de archivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" es un nombre reservado y no se permite en el nombre de archivo.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no es un tipo de archivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "El nombre de archivo no puede terminar con \"{extension}\".",
+ "List of favorite files and folders." : "Lista de archivos y carpetas favoritos",
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
+ "List of your files and folders." : "Lista de sus archivos y carpetas.",
+ "List of your files and folders that are not shared." : "Lista de sus archivos y carpetas que no están compartidos.",
+ "No personal files found" : "No se encontraron archivos personales",
+ "Files that are not shared will show up here." : "Aquí aparecerán los archivos y carpetas que no ha compartido.",
+ "Recent" : "Reciente",
+ "List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
+ "No recently modified files" : "No hay archivos modificados recientemente",
+ "Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
+ "Search" : "Buscar",
"No entries found in this folder" : "No se encontraron elementos en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "La carga es demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
+ "File could not be found" : "No fue posible encontrar el archivo",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
+ "Upload cancelled." : "Carga cancelada.",
+ "Processing files …" : "Procesando archivos ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Ha ocurrido un error desconocido",
+ "File could not be uploaded" : "No se ha podido subir el archivo",
+ "Uploading …" : "Cargando...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Cargando … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "No es posible subir este archivo",
+ "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
+ "Choose target folder" : "Elegir carpeta destino",
+ "Set reminder" : "Establecer recordatorio",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a selección",
+ "Select directory \"{dirName}\"" : "Seleccione carpeta \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleccione archivo \"{fileName}\"",
+ "Unable to determine date" : "No fue posible determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
+ "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
+ "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
+ "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se pudo recuperar detalles de archivo \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingrese al menos dos caracteres para buscar en otras carpetas",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de carpeta/archivo nuevo",
+ "Select file range" : "Seleccione rango de archivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "¡La carpeta de grupo \"{mountPoint}\" está llena, los archivos ya no pueden ser actualizados o sincronizados!.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "¡El almacenamiento externo \"{mountPoint}\" está lleno, los archivos ya no pueden ser actualizados o sincronizados!.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Su almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Su almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide \"{filter}\"","coinciden \"{filter}\"","coinciden \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Se ha copiado el enlace directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar enlace directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Upload file" : "Cargar archivo",
+ "Not favored" : "No favorecido",
+ "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
+ "Upload (max. %s)" : "Cargar (max. %s)",
+ "\"{displayName}\" action executed successfully" : "La acción \"{displayName}\" se ejecutó correctamente",
+ "\"{displayName}\" action failed" : "La acción \"{displayName}\" falló",
+ "\"{displayName}\" batch action executed successfully" : "La acción en lote \"{displayName}\" se ejecutó exitosamente",
+ "Submitting fields…" : "Enviando campos...",
+ "Filter filenames…" : "Filtrar nombres de archivos...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copiada al portapapeles",
+ "Enable the grid view" : "Habilitar la vista de cuadrícula",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Deletion cancelled" : "Eliminación cancelada",
+ "Move cancelled" : "Movimiento cancelado",
+ "Cancelled move or copy of \"{filename}\"." : "Se canceló la operación de mover o copiar de \"{filename}\".",
+ "Cancelled move or copy operation" : "Se canceló la operación de mover o copiar",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imágenes",
+ "New folder creation cancelled" : "Creación de nueva carpeta cancelada",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archivo y 1 carpeta","{fileCount} archivos y 1 carpeta","{fileCount} archivos y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archivos y {folderCount} carpetas",
+ "All folders" : "Todas las carpetas",
+ "Personal Files" : "Archivos personales",
"Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
+ "New text file.txt" : "Nuevo ArchivoDeTexto.txt"
},
-"nplurals=2; plural=(n != 1);");
+"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 82244784583..013dcdec49f 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -1,88 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
"Added to favorites" : "Agregado a los favoritos",
"Removed from favorites" : "Eliminado de los favoritos",
"You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
"You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Cambios al archivo",
"Created by {user}" : "Creado por {user}",
"Changed by {user}" : "Cambiado por {user}",
@@ -90,7 +11,7 @@
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renombrado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
+ "\"remote account\"" : "\"cuenta remota\"",
"You created {file}" : "Creaste {file}",
"You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
"{user} created {file}" : "{user} creó {file}",
@@ -106,44 +27,373 @@
"{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
"You restored {file}" : "Restauraste {file}",
"{user} restored {file}" : "{user} restauró {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Has renombrado {oldfile} (oculto) a {newfile} (oculto)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Has renombrado {oldfile} (oculto) a {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Has renombrado {oldfile} a {newfile} (oculto)",
"You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renombró {oldfile} (oculto) a {newfile} (oculto)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renombró {oldfile} (oculto) a {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renombró {oldfile} a {newfile} (oculto)",
"{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
"You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
+ "Files" : "Archivos",
+ "A file or folder has been <strong>changed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un archivo o carpeta favorito ha sido <strong>cambiado</strong>",
+ "Failed to authorize" : "Fallo al autorizar",
+ "Invalid folder path" : "Ruta de carpeta inválida",
+ "Folder not found" : "No se encontró la carpeta",
+ "No favorites" : "No hay favoritos",
"Accept" : "Aceptar",
+ "Reject" : "Rechazar",
+ "Incoming ownership transfer from {user}" : "Solicitud de transferencia de propiedad entrante de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Desea aceptar {path}?\n\nNota: El proceso de transferencia tras aceptar podría tardar hasta 1 hora.",
+ "Ownership transfer denied" : "Transferencia de propiedad denegada",
+ "Your ownership transfer of {path} was denied by {user}." : "Su transferencia de propiedad de {path} fue denegada por {user}.",
+ "Ownership transfer failed" : "Fallo al transferir la propiedad",
+ "Your ownership transfer of {path} to {user} failed." : "Ha fallado su transferencia de propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Ha fallado la transferencia de propiedad de {path} desde {user}.",
+ "Ownership transfer done" : "Transferencia de propiedad realizada",
+ "Your ownership transfer of {path} to {user} has completed." : "Se ha completado su transferencia de propiedad de {path} a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Se ha completado la transferencia de propiedad de {path} a {user}.",
"in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Transfirió desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidad de archivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restringir los nombres de archivos para asegurar que los archivos se puedan sincronizar con todos los clientes. Por defecto, se permiten todos los nombres de archivos válidos en POSIX (por ejemplo, Linux o macOS).",
+ "Enforce Windows compatibility" : "Imponer la compatibilidad de Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Esto bloqueará los nombres de archivos inválidos en sistemas Windows, tales como usar nombres reservados o caracteres especiales. Pero no impondrá la compatibilidad del uso de mayúsculas y minúsculas.",
"File Management" : "Administración de Archivos",
- "Change" : "Cambiar",
- "Transfer" : "Transferir",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "La carpeta destino ya no existe",
+ "Reload current directory" : "Recargar el directorio actual",
+ "Go to the \"{dir}\" directory" : "Ir al directorio \"{dir}\"",
+ "Current directory path" : "Dirección del directorio actual",
+ "Your have used your space quota and cannot upload files anymore" : "Ha utilizado su cuota de espacio y ya no puede subir más archivos",
+ "Drag and drop files here to upload" : "Arrastre y suelte los archivos aquí para subirlos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Alternar selección para archivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar selección para la carpeta \"{displayName}\"",
+ "File is loading" : "El archivo se está cargando",
+ "Folder is loading" : "La carpeta se está cargando",
+ "Filename" : "Nombre del archivo",
+ "Folder name" : "Nombre de la carpeta",
+ "This node is unavailable" : "Este nodo no está disponible",
+ "Another entry with the same name already exists." : "Ya existe otra entrada con el mismo nombre.",
+ "Invalid filename." : "Nombre de archivo inválido",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renombrado \"{oldName}\" a \"{newName}\"",
+ "Rename file" : "Renombrar archivo",
+ "Folder" : "Carpeta",
+ "Pending" : "Pendiente",
+ "Unknown date" : "Fecha desconocida",
+ "Clear filter" : "Limpiar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar en todas partes",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Quitar filtro",
+ "Total rows summary" : "Resumen de filas totales",
+ "Toggle selection for all files and folders" : "Alternar selección para todos los archivos y carpetas",
+ "Name" : "Nombre",
+ "Size" : "Tamaño",
+ "Actions" : "Acciones",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de archivos y carpetas.",
+ "Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
+ "File not found" : "Archivo no encontrado",
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% utilizado",
+ "Could not refresh storage stats" : "No fue posible actualizar las estadísticas de almacenamiento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Su espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "Storage information" : "Información de almacenamiento",
+ "Storage quota" : "Cuota de almacenamiento",
+ "New folder" : "Carpeta nueva",
+ "Create new folder" : "Crear nueva carpeta",
+ "This name is already in use." : "Este nombre ya está en uso.",
"Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
+ "Fill template fields" : "Rellenar los campos de la plantilla",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Transfer" : "Transferir",
+ "Transfer {path} to {userid}" : "Transferir {path} a {userid}",
+ "Invalid path selected" : "Ruta seleccionada no válida.",
+ "Unknown error" : "Se presentó un error desconocido",
+ "Ownership transfer request sent" : "Enviada la solicitud de transferencia de propiedad",
+ "Cannot transfer ownership of a file or folder you do not own" : "No puede transferir la propiedad de un archivo o directorio del cual no es propietario",
+ "Transfer ownership of a file or folder" : "Transferir la propiedad de un archivo o carpeta",
+ "Choose file or folder to transfer" : "Elegir archivo o carpeta para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Nuevo propietario",
+ "Remove extension" : "Remover extensión",
+ "Change file extension" : "Cambiar extensión de archivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar la extensión del archivo de \"{old}\" a \"{new}\" podría volver al archivo inaccesible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Remover la extensión \"{old}\" podría volver al archivo inaccesible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Añadir la extensión de archivo \"{new}\" podría volver al archivo inaccesible.",
+ "Select file or folder to link to" : "Seleccionar archivo o carpeta para enlazar.",
+ "Choose {file}" : "Elegir {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por liga",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar a la vista de lista",
+ "Switch to grid view" : "Cambiar a la vista de cuadrícula",
+ "Upload was cancelled by user" : "La subida fue cancelada por el usuario",
+ "Not enough free space" : "No cuentas con suficiente espacio libre",
+ "Operation is blocked by access control" : "Esta operación está bloqueada por el control de accesos",
+ "Error during upload: {message}" : "Error durante la subida: {message}",
+ "Error during upload, status code {status}" : "Error durante la carga, código de estado {status}",
+ "Unknown error during upload" : "Error desconocido durante la carga",
+ "Loading current folder" : "Cargando la carpeta actual",
+ "Retry" : "Reintentar",
"No files in here" : "No hay archivos aquí",
"Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
+ "Go back" : "Regresar",
+ "Views" : "Vistas",
+ "Files settings" : "Configuración de archivos",
+ "Your files" : "Sus archivos",
+ "Open in files" : "Abrir en archivos",
+ "File cannot be accessed" : "No se puede acceder al archivo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "El archivo no fue encontrado o no tiene permisos para verlo. Solicite al remitente que lo comparta.",
+ "Clipboard is not available" : "El portapapeles no está disponible",
+ "General" : "General",
+ "All files" : "Todos los archivos",
+ "Personal files" : "Archivos personales",
+ "Sort favorites first" : "Ordenar los favoritos primero",
+ "Sort folders before files" : "Ordenar carpetas antes que archivos",
+ "Appearance" : "Apariencia",
+ "Show hidden files" : "Mostrar archivos ocultos",
+ "Crop image previews" : "Recortar la previsualización de las imágenes",
+ "Additional settings" : "Configuraciones adicionales",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atajos del teclado",
+ "Rename" : "Renombrar",
+ "Delete" : "Borrar",
+ "Manage tags" : "Administrar etiquetas",
+ "Selection" : "Selección",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Vista de cuadrícula",
+ "You" : "Usted",
+ "Shared multiple times with different people" : "Compartido múltiples veces con diferentes personas",
+ "Error while loading the file data" : "Error al cargar los datos del archivo",
+ "Owner" : "Propietario",
+ "Remove from favorites" : "Eliminar de favoritos",
+ "Add to favorites" : "Agregar a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Vacío",
+ "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla",
+ "Pick a template for {name}" : "Elija una plantilla para {name}",
+ "Create a new file with the selected template" : "Crear un nuevo archivo con la plantilla seleccionada",
+ "Creating file" : "Creando el archivo",
+ "Leave this share" : "Dejar este recurso compartido",
+ "Leave these shares" : "Dejar estos recursos compartidos",
+ "Disconnect storage" : "Desconectar almacenamiento",
+ "Disconnect storages" : "Desconectar almacenamientos",
+ "Delete permanently" : "Eliminar permanentemente",
+ "Delete and unshare" : "Eliminar y dejar de compartir",
+ "Delete file" : "Eliminar archivo",
+ "Delete files" : "Eliminar archivos",
+ "Delete folder" : "Eliminar carpeta",
+ "Delete folders" : "Eliminar carpetas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a punto de eliminar {count} elemento permanentemente.","Está a punto de eliminar {count} elementos permanentemente.","Está a punto de eliminar {count} elementos permanentemente."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a punto de eliminar {count} elemento.","Está a punto de eliminar {count} elementos.","Está a punto de eliminar {count} elementos."],
+ "Confirm deletion" : "Confirmar eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moviendo \"{source}\" a \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" a \"{destination}\" …",
+ "Destination is not a folder" : "El destino no es una carpeta",
+ "This file/folder is already in that directory" : "Este archivo/carpeta ya está en ese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "No puede mover un archivo/carpeta a sí mismo o a una subcarpeta de sí mismo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Un archivo o carpeta con ese nombre ya existe en esta carpeta",
+ "The files are locked" : "Los archivos están bloqueados",
+ "The file does not exist anymore" : "El archivo ya no existe",
+ "Choose destination" : "Elegir destino",
+ "Copy to {target}" : "Copiar a {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "La operación de mover o copiar falló",
+ "Move or copy" : "Mover o copiar",
+ "Open folder {displayName}" : "Abrir carpeta {displayName}",
+ "Open in Files" : "Abrir en Archivos",
+ "Failed to redirect to client" : "Fallo al redirigir al cliente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "El archivo se abrirá ahora en tu dispositivo. Si esto no ocurre, por favor verifica que hayas instalado la aplicación de escritorio.",
+ "Retry and close" : "Reintentar y cerrar",
+ "Details" : "Detalles",
+ "View in folder" : "Ver en la carpeta",
+ "Today" : "Hoy",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este año ({year})",
+ "Last year ({year})" : "El año pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Hojas de cálculo",
+ "Presentations" : "Presentaciones",
+ "PDFs" : "PDFs",
+ "Folders" : "Carpetas",
+ "Audio" : "Audio",
+ "Images" : "Imágenes",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Nueva carpeta \"{name}\" creada",
+ "Unable to initialize the templates directory" : "No se ha podido iniciar la carpeta de plantillas",
+ "Create templates folder" : "Crear la carpeta de plantillas",
+ "Templates" : "Plantillas",
+ "New template folder" : "Nueva carpeta de plantillas",
+ "In folder" : "En la carpeta",
+ "Search in folder: {folder}" : "Buscar en la carpeta: {folder}",
+ "One of the dropped files could not be processed" : "Uno de los archivos arrastrados no puede ser procesado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Su navegador no soporta la API de Sistema de archivos. Los directorios no se cargarán",
+ "No files to upload" : "No hay archivos para subir",
+ "Unable to create the directory {directory}" : "No se pudo crear el directorio {directory}",
+ "Some files could not be uploaded" : "No se pudieron subir algunos archivos",
+ "Files uploaded successfully" : "Archivo subido exitosamente",
+ "No files to process" : "No hay archivos a procesar",
+ "Some files could not be copied" : "Algunos archivos no se pudieron copiar",
+ "Some files could not be moved" : "Algunos archivos no se pudieron mover",
+ "Files copied successfully" : "Archivos copiados exitosamente",
+ "Files moved successfully" : "Archivos movidos exitosamente",
+ "Conflicts resolution skipped" : "Resolución de conflictos omitida",
+ "Upload cancelled" : "Subida cancelada",
+ "Could not rename \"{oldName}\", it does not exist any more" : "No se pudo renombrar \"{oldName}\", ya no existe.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{newName}\" ya está en uso en la carpeta \"{dir}\". Por favor, elija un nombre diferente.",
+ "Could not rename \"{oldName}\"" : "No se pudo renombrar \"{oldName}\"",
+ "This operation is forbidden" : "Esta operación está prohibida",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
+ "Unexpected error: {error}" : "Error inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n archivo","%n archivos","%n archivos"],
+ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas","%n carpetas"],
+ "Filename must not be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" no está permitido en el nombre de archivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" es un nombre reservado y no se permite en el nombre de archivo.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" no es un tipo de archivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "El nombre de archivo no puede terminar con \"{extension}\".",
+ "List of favorite files and folders." : "Lista de archivos y carpetas favoritos",
+ "No favorites yet" : "Aún no hay favoritos",
+ "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
+ "List of your files and folders." : "Lista de sus archivos y carpetas.",
+ "List of your files and folders that are not shared." : "Lista de sus archivos y carpetas que no están compartidos.",
+ "No personal files found" : "No se encontraron archivos personales",
+ "Files that are not shared will show up here." : "Aquí aparecerán los archivos y carpetas que no ha compartido.",
+ "Recent" : "Reciente",
+ "List of recently modified files and folders." : "Lista de archivos y carpetas modificados recientemente.",
+ "No recently modified files" : "No hay archivos modificados recientemente",
+ "Files and folders you recently modified will show up here." : "Los archivos y carpetas que ha modificado recientemente aparecerán aquí.",
+ "Search" : "Buscar",
"No entries found in this folder" : "No se encontraron elementos en esta carpeta",
"Select all" : "Seleccionar todo",
"Upload too large" : "La carga es demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
+ "File could not be found" : "No fue posible encontrar el archivo",
+ "Show list view" : "Mostrar vista de lista",
+ "Show grid view" : "Mostrar vista de cuadrícula",
+ "Close" : "Cerrar",
+ "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
+ "This will stop your current uploads." : "Esto detendrá las subidas en curso.",
+ "Upload cancelled." : "Carga cancelada.",
+ "Processing files …" : "Procesando archivos ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
+ "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
+ "An unknown error has occurred" : "Ha ocurrido un error desconocido",
+ "File could not be uploaded" : "No se ha podido subir el archivo",
+ "Uploading …" : "Cargando...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Cargando … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "No es posible subir este archivo",
+ "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
+ "Choose target folder" : "Elegir carpeta destino",
+ "Set reminder" : "Establecer recordatorio",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleccione la(s) etiqueta(s) para añadir a la selección",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) a selección",
+ "Select directory \"{dirName}\"" : "Seleccione carpeta \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleccione archivo \"{fileName}\"",
+ "Unable to determine date" : "No fue posible determinar la fecha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
+ "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
+ "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
+ "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
+ "Could not fetch file details \"{file}\"" : "No se pudo recuperar detalles de archivo \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingrese al menos dos caracteres para buscar en otras carpetas",
+ "{dirs} and {files}" : "{dirs} y {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos","incluyendo %n ocultos"],
+ "You do not have permission to upload or create files here" : "No tiene permiso para crear o cargar archivos aquí",
+ "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos","Cargando %n archivos"],
+ "New" : "Nuevo",
+ "New file/folder menu" : "Menú de carpeta/archivo nuevo",
+ "Select file range" : "Seleccione rango de archivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
+ "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
+ "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "¡La carpeta de grupo \"{mountPoint}\" está llena, los archivos ya no pueden ser actualizados o sincronizados!.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "¡El almacenamiento externo \"{mountPoint}\" está lleno, los archivos ya no pueden ser actualizados o sincronizados!.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Su almacenamiento está lleno. ¡No se puede actualizar o sincronizar ningún archivo más!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El almacenamiento de {owner} está casi lleno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta de grupo \"{mountPoint}\" está casi llena ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "El almacenamiento externo \"{mountPoint}\" está casi lleno ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Su almacenamiento está casi lleno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide \"{filter}\"","coinciden \"{filter}\"","coinciden \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Se ha copiado el enlace directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Path" : "Ruta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar enlace directo (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
+ "Upload file" : "Cargar archivo",
+ "Not favored" : "No favorecido",
+ "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
+ "Upload (max. %s)" : "Cargar (max. %s)",
+ "\"{displayName}\" action executed successfully" : "La acción \"{displayName}\" se ejecutó correctamente",
+ "\"{displayName}\" action failed" : "La acción \"{displayName}\" falló",
+ "\"{displayName}\" batch action executed successfully" : "La acción en lote \"{displayName}\" se ejecutó exitosamente",
+ "Submitting fields…" : "Enviando campos...",
+ "Filter filenames…" : "Filtrar nombres de archivos...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copiada al portapapeles",
+ "Enable the grid view" : "Habilitar la vista de cuadrícula",
+ "Enable folder tree" : "Habilitar el árbol de carpetas",
+ "Copy to clipboard" : "Copiar al portapapeles",
+ "Use this address to access your Files via WebDAV" : "Use esta dirección para acceder a tus archivos vía WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si ha habilitado 2FA, debe crear y utilizar una nueva contraseña de aplicación haciendo clic aquí.",
+ "Deletion cancelled" : "Eliminación cancelada",
+ "Move cancelled" : "Movimiento cancelado",
+ "Cancelled move or copy of \"{filename}\"." : "Se canceló la operación de mover o copiar de \"{filename}\".",
+ "Cancelled move or copy operation" : "Se canceló la operación de mover o copiar",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imágenes",
+ "New folder creation cancelled" : "Creación de nueva carpeta cancelada",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetas","{folderCount} carpetas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archivo","{fileCount} archivos","{fileCount} archivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archivo y {folderCount} carpeta","1 archivo y {folderCount} carpetas","1 archivo y {folderCount} carpetas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archivo y 1 carpeta","{fileCount} archivos y 1 carpeta","{fileCount} archivos y 1 carpeta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archivos y {folderCount} carpetas",
+ "All folders" : "Todas las carpetas",
+ "Personal Files" : "Archivos personales",
"Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
+ "New text file.txt" : "Nuevo ArchivoDeTexto.txt"
+},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/es_NI.js b/apps/files/l10n/es_NI.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_NI.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_NI.json b/apps/files/l10n/es_NI.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_NI.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_PA.js b/apps/files/l10n/es_PA.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_PA.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_PA.json b/apps/files/l10n/es_PA.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_PA.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_PE.js b/apps/files/l10n/es_PE.js
deleted file mode 100644
index afc28112235..00000000000
--- a/apps/files/l10n/es_PE.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferente. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_PE.json b/apps/files/l10n/es_PE.json
deleted file mode 100644
index 34d0f5e8f10..00000000000
--- a/apps/files/l10n/es_PE.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferente. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_PR.js b/apps/files/l10n/es_PR.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_PR.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_PR.json b/apps/files/l10n/es_PR.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_PR.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_PY.js b/apps/files/l10n/es_PY.js
deleted file mode 100644
index 731085ba168..00000000000
--- a/apps/files/l10n/es_PY.js
+++ /dev/null
@@ -1,155 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "This will stop your current uploads." : "Esto detendrá tus cargas actuales.",
- "Upload cancelled." : "Carga cancelada.",
- "Processing files …" : "Procesando archivos ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "An unknown error has occurred" : "Se presentó un error desconocido",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Operation is blocked by access control" : "La operación es bloqueada por control de acceso",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Seleccionar carpeta destino",
- "Open" : "Abrir",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Leave this share" : "Dejar este recurso compartido",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Could not fetch file details \"{file}\"" : "No fue posible obtener detalles del archivo \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ingrese más de dos carácteres para buscar en otras carpetas",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usado",
- "{used} used" : "{used} usado",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "\"/\" no es permitido dentro del nombre de un archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El espacio de {owner} está casi lleno ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tu espacio está casi lleno ({usedSpacePercent}%).",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_PY.json b/apps/files/l10n/es_PY.json
deleted file mode 100644
index 749e33c5302..00000000000
--- a/apps/files/l10n/es_PY.json
+++ /dev/null
@@ -1,153 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "This will stop your current uploads." : "Esto detendrá tus cargas actuales.",
- "Upload cancelled." : "Carga cancelada.",
- "Processing files …" : "Procesando archivos ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "An unknown error has occurred" : "Se presentó un error desconocido",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Operation is blocked by access control" : "La operación es bloqueada por control de acceso",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Choose target folder" : "Seleccionar carpeta destino",
- "Open" : "Abrir",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Leave this share" : "Dejar este recurso compartido",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Could not fetch file details \"{file}\"" : "No fue posible obtener detalles del archivo \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ingrese más de dos carácteres para buscar en otras carpetas",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usado",
- "{used} used" : "{used} usado",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "\"/\" no es permitido dentro del nombre de un archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "El espacio de {owner} está casi lleno ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tu espacio está casi lleno ({usedSpacePercent}%).",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_SV.js b/apps/files/l10n/es_SV.js
deleted file mode 100644
index 0ec0c48379e..00000000000
--- a/apps/files/l10n/es_SV.js
+++ /dev/null
@@ -1,149 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_SV.json b/apps/files/l10n/es_SV.json
deleted file mode 100644
index 3cafde47f8d..00000000000
--- a/apps/files/l10n/es_SV.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"/\" is not allowed inside a file name." : "No se permite el uso del caracter \"/\" en el nombre del archivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "You created an encrypted file in {file}" : "Creaste un archivo encriptado en {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{user} created an encrypted file in {file}" : "{user} creó un archivo encriptado en {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "You changed an encrypted file in {file}" : "Cambiaste un archivo encriptado en {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "{user} changed an encrypted file in {file}" : "{user} cambió un archivo encriptado en {file}",
- "You deleted {file}" : "Borraste {file}",
- "You deleted an encrypted file in {file}" : "Borraste un archivo encriptado en {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "{user} deleted an encrypted file in {file}" : "{user} borró un archivo encriptado en {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Papelera",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/es_UY.js b/apps/files/l10n/es_UY.js
deleted file mode 100644
index e0ef697c638..00000000000
--- a/apps/files/l10n/es_UY.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/es_UY.json b/apps/files/l10n/es_UY.json
deleted file mode 100644
index a26ffcd72e1..00000000000
--- a/apps/files/l10n/es_UY.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente ",
- "Storage invalid" : "El almacenamiento es inválido",
- "Unknown error" : "Se presentó un error desconocido",
- "File could not be found" : "No fue posible encontrar el archivo",
- "Move or copy" : "Mover o copiar",
- "Download" : "Descargar",
- "Delete" : "Borrar",
- "Home" : "Inicio",
- "Close" : "Cerrar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"",
- "Upload cancelled." : "Carga cancelada.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "No tienes suficiente espacio disponible, Estás cargando {size1} pero sólo cuentas con {size2} disponible",
- "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe",
- "Not enough free space" : "No cuentas con suficiente espacio libre",
- "Uploading …" : "Cargando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Target folder does not exist any more" : "La carpeta destino ya no existe",
- "Error when assembling chunks, status code {status}" : "Se presentó un error al ensamblar los bloques, código de estatus {status}",
- "Actions" : "Acciones",
- "Rename" : "Renombrar",
- "Copy" : "Copiar",
- "Delete file" : "Borrar archivo",
- "Delete folder" : "Borrar carpeta",
- "Disconnect storage" : "Desconectar almacenamiento",
- "Could not load info for file \"{file}\"" : "No fue posible cargar información para el archivo \"{file}\"",
- "Files" : "Archivos",
- "Details" : "Detalles",
- "Select" : "Seleccionar",
- "Pending" : "Pendiente",
- "Unable to determine date" : "No fue posible determinar la fecha",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verfica las bitácoras o contacta al administrador",
- "Could not move \"{file}\", target exists" : "No fue posible mover \"{file}\", el destino ya existe",
- "Could not move \"{file}\"" : "No fue posible mover \"{file}\"",
- "Could not copy \"{file}\", target exists" : "No se pudo copiar \"{file}\", el destino ya existe",
- "Could not copy \"{file}\"" : "No se pudo copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} fue copiado dentro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} y otros {nbfiles} archivos fueron copiados dentro de {destination}",
- "{newName} already exists" : "{newName} ya existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "No fue posible renombrar \"{fileName}\", ya no existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nombre \"{targetName}\" ya está en uso en la carpeta \"{dir}\". Por favor elege un nombre diferete. ",
- "Could not rename \"{fileName}\"" : "No fue posible renombrar \"{fileName}\"",
- "Could not create file \"{file}\"" : "No fue posible crear el archivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No fue posible crear el archivo\"{file}\" porque ya existe",
- "Could not create folder \"{dir}\" because it already exists" : "No fue posible crear la carpeta \"{dir}\" porque ya existe",
- "Error deleting file \"{fileName}\"." : "Se presentó un error al borrar el archivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "No se encontraron resultados en otras carpetas para {tag}{filter}{endtag}",
- "Name" : "Nombre",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"],
- "_%n file_::_%n files_" : ["%n archivo","%n archivos"],
- "{dirs} and {files}" : "{dirs} y {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"],
- "You don’t have permission to upload or create files here" : "No cuentas con los permisos para cargar o crear archivos aquí",
- "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"],
- "New" : "Nuevo",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido. ",
- "File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" es un tipo de archivo no permitido",
- "View in folder" : "Ver en la carpeta",
- "Copied!" : "¡Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar liga directa (sólo funciona para usuarios que tienen acceso a este archivo/carpeta)",
- "Path" : "Ruta",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "New folder" : "Carpeta nueva",
- "Upload file" : "Cargar archivo",
- "Recent" : "Reciente",
- "Not favorited" : "No es un favorito",
- "Remove from favorites" : "Eliminar de favoritos",
- "Add to favorites" : "Agregar a favoritos",
- "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta",
- "Added to favorites" : "Agregado a los favoritos",
- "Removed from favorites" : "Eliminado de los favoritos",
- "You added {file} to your favorites" : "Agregaste {file} a tus favoritos",
- "You removed {file} from your favorites" : "Eliminaste {file} de tus favoritos",
- "File changes" : "Cambios al archivo",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Borrado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renombrado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuario remoto\"",
- "You created {file}" : "Creaste {file}",
- "{user} created {file}" : "{user} creó {file}",
- "{file} was created in a public folder" : "{file} fue creado en una carpeta pública",
- "You changed {file}" : "Cambiaste {file}",
- "{user} changed {file}" : "{user} cambió {file}",
- "You deleted {file}" : "Borraste {file}",
- "{user} deleted {file}" : "{user} borró {file}",
- "You restored {file}" : "Restauraste {file}",
- "{user} restored {file}" : "{user} restauró {file}",
- "You renamed {oldfile} to {newfile}" : "Renombraste {oldfile} como {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renombró {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Moviste {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} movió {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un archivo ha sido agregado o eliminado de tus <strong>favoritos</strong>",
- "All files" : "Todos los archivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Cargar (max. %s)",
- "Accept" : "Aceptar",
- "in %s" : "en %s",
- "Change" : "Cambiar",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "%s used" : "%s usado",
- "%1$s of %2$s used" : "%1$s de %2$s usados",
- "Settings" : "Configuraciones ",
- "Show hidden files" : "Mostrar archivos ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "No hay archivos aquí",
- "Upload some content or sync with your devices!" : "¡Carga algún contenido o sincroniza con tus dispositivos!",
- "No entries found in this folder" : "No se encontraron elementos en esta carpeta",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "La carga es demasido grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando cargar sobrepasan el tamaño máximo permitido para la carga de archivos en este servidor.",
- "No favorites yet" : "Aún no hay favoritos",
- "Files and folders you mark as favorite will show up here" : "Los archivos y carpetas que marques como favoritos se mostrarán aquí. ",
- "Deleted files" : "Archivos borrados",
- "Shares" : "Elementos compartidos",
- "Shared with others" : "Compartido con otros",
- "Shared with you" : "Compartido con usted",
- "Shared by link" : "Compartido por liga",
- "Text file" : "Archivo de texto",
- "New text file.txt" : "Nuevo ArchivoDeTexto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El espacio de {owner} está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu espacio está lleno. ¡Los archivos ya no se pueden actualizar o sincronizar!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide '{filter}'","coincidencia '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index a767546d452..1ee28ff43ba 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -1,148 +1,479 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Salvestusruum pole ajutiselt kättesaadav",
- "Storage invalid" : "Vigane andmehoidla",
+ "Added to favorites" : "Lemmikutesse lisatud",
+ "Removed from favorites" : "Lemmikutest eemaldatud",
+ "You added {file} to your favorites" : "Lisasid {file} lemmikutesse",
+ "You removed {file} from your favorites" : "Eemaldasid {file} lemmikutest",
+ "Favorites" : "Lemmikud",
+ "File changes" : "Failimuudatused",
+ "Created by {user}" : "Loodud kasutaja {user} poolt",
+ "Changed by {user}" : "Muudetud kasutaja {user} poolt",
+ "Deleted by {user}" : "Kustutatud kasutaja {user} poolt",
+ "Restored by {user}" : "Taastatud kasutaja {user} poolt",
+ "Renamed by {user}" : "Kasutaja {user} muutis nime",
+ "Moved by {user}" : "Liigutatud kasutaja {user} poolt",
+ "\"remote account\"" : "„kaugkonto“",
+ "You created {file}" : "Sa lõid faili {file}",
+ "You created an encrypted file in {file}" : "Sa lõid krüpteeritud faili {file}",
+ "{user} created {file}" : "Kasutaja {user} lõi faili {file}",
+ "{user} created an encrypted file in {file}" : "Kasutaja {user} lõi krüpteeritud faili {file}",
+ "{file} was created in a public folder" : "{file} loodi avalikus kaustas",
+ "You changed {file}" : "Sa muutsid faili {file}",
+ "You changed an encrypted file in {file}" : "Sa muutsid krüpteeritud faili {file}",
+ "{user} changed {file}" : "Kasutaja {user} muutis faili {file}",
+ "{user} changed an encrypted file in {file}" : "Kasutaja {user} muutis krüpteeritud faili {file}",
+ "You deleted {file}" : "Sa kustutasid faili {file}",
+ "You deleted an encrypted file in {file}" : "Sa kustutasid krüpteeritud faili {file}",
+ "{user} deleted {file}" : "Kasutaja {user} kustutas faili {file}",
+ "{user} deleted an encrypted file in {file}" : "Kasutaja {user} kustutas krüpteeritud faili {file}",
+ "You restored {file}" : "Sa taastasid faili {file}",
+ "{user} restored {file}" : "Kasutaja {user} taastas faili {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Sa muutsid „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Sa muutsid „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Sa muutsid „{oldfile}“ faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "You renamed {oldfile} to {newfile}" : "Sa muutsid „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "Kasutaja {user} muutis „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "Kasutaja {user} muutis (peidetud) „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "Kasutaja {user} muutis „{oldfile}“ faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "{user} renamed {oldfile} to {newfile}" : "Kasutaja {user} muutis „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "You moved {oldfile} to {newfile}" : "Sa liigutasid faili: {oldfile} nüüd {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} liigutas faili: {oldfile} nüüd {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Fail lisati su <strong>lemmikutesse</strong> või eemaldati sealt",
+ "Files" : "Failid",
+ "A file or folder has been <strong>changed</strong>" : "Fail või kaust on <strong>muudetud</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Lemmikuks märgitud faili või kausta on <strong>muudetud</strong>",
+ "Failed to authorize" : "Autoriseerimine ei õnnestunud",
+ "Invalid folder path" : "Kausta vigane asukoht",
+ "Folder not found" : "Kausta ei leidu",
+ "The file cannot be found" : "Faili ei õnnestu leida",
+ "The destination path does not exist: %1$s" : "Sihtasukoht pole olemas: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sul puudvad õigused faili loomiseks antud asukohas",
+ "The file could not be converted." : "Seda faili ei õnnestunud teisendada.",
+ "Could not get relative path to converted file" : "Teisendatud faili suhtelist asukohta ei õnnestunud tuvastada",
+ "Favorite files" : "Lemmikfailid",
+ "No favorites" : "Lemmikuid pole",
+ "More favorites" : "Veel lemmikuid",
+ "Accept" : "Nõustu",
+ "Reject" : "Keeldu",
+ "Incoming ownership transfer from {user}" : "Saaduv omandi üleandmine kasutajalt {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Kas sa soovid „{path}“ omandi üle võtta?\n\nMärkus: palun arvesta, et selleks võib kuluda kuni 1 tund.",
+ "Ownership transfer denied" : "Keeldumine omandi üleandmisest",
+ "Your ownership transfer of {path} was denied by {user}." : "Kasutaja {user} keeldus sinu soovist „{path}“ omand üle anda.",
+ "Ownership transfer failed" : "Omandi üleandmine ei õnnestunud",
+ "Your ownership transfer of {path} to {user} failed." : "Sinu poolt algatatud „{path}“ omandi üleandmine kasutajale {user} ei õnnestunud.",
+ "The ownership transfer of {path} from {user} failed." : "„{path}“ omandi üleandmine kasutajale {user} ei õnnestunud.",
+ "Ownership transfer done" : "Omandi üleandmine on lõppenud",
+ "Your ownership transfer of {path} to {user} has completed." : "Sinu poolt algatatud „{path}“ omandi üleandmine kasutajale {user} on lõppenud.",
+ "The ownership transfer of {path} from {user} has completed." : "„{path}“ omandi üleandmine kasutajale {user} on tehtud.",
+ "in %s" : "kaustas %s",
+ "Transferred from %1$s on %2$s" : "Üleantud kasutajalt %1$s %2$s",
+ "Files compatibility" : "Failide ühilduvus",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Luba failinimede piiramine tagamaks, et sünkroniseerimine toimib kõikide platvormide klientide vahel. Vaikimisi on lubatud kõik POSIX-i standardile vastavad failinimed (seda järgivad Linux ja macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Kui võtad kasutusele Windowsiga ühilduvad failinimed, siis olemasolevaid mitteühilduvaid faile ei saa enam muuta, aga faili omanik saab failinime muuta ühilduvaks.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Lisaks on peale selle seadistuse kasutuselevõtmist võimalik kõik mitteühilduvad failid automaatselt ära muuta. Asjakohast teavet leiad kasutusjuhendist occ-käsku kirjeldavast peatükist.",
+ "Enforce Windows compatibility" : "Kasuta ühilduvust Windowsiga",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Sellega blokeerid niisuguste failinimede kasutamise, mis Windowsis ei toimiks. See tähendab mõnede nimede ja tähemärkide keelamist. Aga see seadistus ei jõusta suur- ja väiketähtede kasutust.",
+ "File Management" : "Failihaldus",
+ "Home" : "Kodu",
+ "Target folder does not exist any more" : "Sihtkausta pole enam olemas",
+ "Reload current directory" : "Laadi see kaust uuesti",
+ "Go to the \"{dir}\" directory" : "Mine kausta „{dir}“",
+ "Current directory path" : "Praeguse kausta asukoht",
+ "Your have used your space quota and cannot upload files anymore" : "Sa oled kasutanud ära kogu oma andmeruumi kvoodi ega saa rohkem faile üles laadida.",
+ "You do not have permission to upload or create files here." : "Sul puuduvad õigused siia failide üleslaadimiseks või loomiseks.",
+ "Drag and drop files here to upload" : "Üleslaadimiseks lohista failid siia",
+ "Favorite" : "Lemmik",
+ "Back" : "Tagasi",
+ "Toggle selection for file \"{displayName}\"" : "Lülita „{displayName}“ faili valimine sisse/välja",
+ "Toggle selection for folder \"{displayName}\"" : "Lülita „{displayName}“ kausta valimine sisse/välja",
+ "File is loading" : "Fail on laadimisel",
+ "Folder is loading" : "Kaust on laadimisel",
+ "Filename" : "Failinimi",
+ "Folder name" : "Kausta nimi",
+ "This node is unavailable" : "See sõlm pole saadaval",
+ "Another entry with the same name already exists." : "Selle nimega kirje on juba olemas.",
+ "Invalid filename." : "Vigane failinimi.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Failinimi on muutunud „{oldName}“ ⇨ „{newName}“",
+ "Rename file" : "Muuda failinime",
+ "Folder" : "Kaust",
+ "Unknown file type" : "Tundmatu failitüüp",
+ "{ext} image" : "{ext} pilt",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} helifail",
+ "{ext} text" : "{ext} tekst",
+ "Pending" : "Ootel",
+ "Unknown date" : "Tundmatu kuupäev",
+ "Clear filter" : "Tühjenda filter",
+ "Modified" : "Muudetud",
+ "Search everywhere" : "Otsi kõikjalt",
+ "Type" : "Tüüp",
+ "Active filters" : "Aktiivsed filtrid",
+ "Remove filter" : "Eemalda filter",
+ "Total rows summary" : "Ridade koondkokkuvõte",
+ "Toggle selection for all files and folders" : "Lülita kõikide failide ja kaustade valik sisse/välja",
+ "Name" : "Nimi",
+ "File type" : "Failitüüp",
+ "Size" : "Suurus",
+ "Actions" : "Tegevused",
+ "(selected)" : "(valitud)",
+ "List of files and folders." : "Failide ja kaustade loend",
+ "You have used your space quota and cannot upload files anymore." : "Sa oled kasutanud ära kogu oma andmeruumi kvoodi ega saa rohkem faile üles laadida.",
+ "Column headers with buttons are sortable." : "Võid kasutada nuppudega veerupäised järjestamiseks.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
+ "File not found" : "Faili ei leitud",
+ "_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
+ "Search scope options" : "Otsinguulatuse valikud",
+ "{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
+ "{used} of {quota} used" : "{used} / {quota} kasutusel",
+ "{relative}% used" : "{relative}% kasutusel",
+ "Could not refresh storage stats" : "Andmeruumi statistika värskendamine ei õnnestunud",
+ "Your storage is full, files can not be updated or synced anymore!" : "Sinu andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Storage information" : "Andmeruumi teave",
+ "Storage quota" : "Andmeruumi kvoot",
+ "New folder" : "Uus kaust",
+ "Create new folder" : "Loo uus kaust",
+ "This name is already in use." : "See nimi on juba kasutusel.",
+ "Create" : "Loo",
+ "Files starting with a dot are hidden by default" : "Punktiga algavad failinimed vaikimisi muudavad faili peidetuks",
+ "Fill template fields" : "Täida malli väljad",
+ "Submitting fields …" : "Saadan välju…",
+ "Submit" : "Saada",
+ "Choose a file or folder to transfer" : "Vali üleantav fail või kaust",
+ "Transfer" : "Anna üle teisele kasutajale",
+ "Transfer {path} to {userid}" : "Anna „{path}“ üle kasutajale {userid}",
+ "Invalid path selected" : "Vigane asukoht on valitud",
"Unknown error" : "Tundmatu viga",
- "File could not be found" : "Faili ei leitud",
- "Move or copy" : "Liiguta või kopeeri",
- "Download" : "Lae alla",
+ "Ownership transfer request sent" : "Üleandmispäring on saadetud",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sa ei saa teisele kasutaja anda üle kausta või faili, mis pole sinu oma",
+ "Transfer ownership of a file or folder" : "Kaustade või failide omandi üleandmine teisele kasutajale",
+ "Choose file or folder to transfer" : "Vali üleantav fail või kaust",
+ "Change" : "Muuda",
+ "New owner" : "Uus omanik",
+ "Keep {old}" : "Säilita „{old}“",
+ "Keep without extension" : "Säilita ilma faililaiendita",
+ "Use {new}" : "Kasuta „{new}“",
+ "Remove extension" : "Eemalda faililaiend",
+ "Change file extension" : "Muuda faililaiendit",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Muutes senist faililaiendit „{old}“ uueks laiendiks „{new}“ võib fail muutuda loetamatuks.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "„{old}“ faililaiendi eemaldamine võib muuta faili loetamatuks.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "„{new}“ faililaiendi lisamine võib muuta faili loetamatuks.",
+ "Do not show this dialog again." : "Ära näita seda vaadet enam uuesti.",
+ "Select file or folder to link to" : "Vali lingitav fail või kaust",
+ "Choose {file}" : "Vali „{file}“",
+ "Share" : "Jaga",
+ "Shared by link" : "Jagatud lingiga",
+ "Shared" : "Jagatud",
+ "Switch to list view" : "Kasuta loendivaadet",
+ "Switch to grid view" : "Kasuta ruudustikuvaadet",
+ "The file could not be found" : "Seda faili ei õnnestu leida",
+ "Upload was cancelled by user" : "Kasutaja katkestas üleslaadimise",
+ "Not enough free space" : "Pole piisavalt vaba ruumi",
+ "Operation is blocked by access control" : "Tegevus on blokeeritud ligipääsupiirangute poolt",
+ "Error during upload: {message}" : "Viga üleslaadimisel: {message}",
+ "Error during upload, status code {status}" : "Viga üleslaadimisel, olekukood {status} ",
+ "Unknown error during upload" : "Tundmatu viga üleslaadimisel",
+ "Loading current folder" : "Laadin käesolevat kausta",
+ "Retry" : "Proovi uuesti",
+ "No files in here" : "Siin ei ole faile",
+ "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
+ "Go back" : "Mine tagasi",
+ "Views" : "Vaated",
+ "Files settings" : "Failide seadistused",
+ "Your files" : "Sinu failid",
+ "Open in files" : "Ava failirakenduses",
+ "File cannot be accessed" : "Failile ligipääs puudub",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili kas ei leidu või sul puudub õigus selle vaatamiseks. Palu saatjat, et ta jagaks antud faili sulle.",
+ "No search results for “{query}”" : "„{query}“ otsingul pole tulemusi",
+ "Search for files" : "Otsi faile",
+ "Clipboard is not available" : "Lõikelaud ei ole saadaval",
+ "General" : "Üldine",
+ "Default view" : "Vaikimisi vaade",
+ "All files" : "Kõik failid",
+ "Personal files" : "Isiklikud failid",
+ "Sort favorites first" : "Järjesta lemmikud esimesena",
+ "Sort folders before files" : "Järjesta kaustad enne faile",
+ "Folder tree" : "Kaustapuu",
+ "Appearance" : "Välimus",
+ "Show hidden files" : "Näita peidetud faile",
+ "Show file type column" : "Näita failitüübi veergu",
+ "Crop image previews" : "Kadreeri piltide eelvaated",
+ "Additional settings" : "Lisaseadistused",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-i võrguaadress",
+ "Copy" : "Kopeeri",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Kaheastmeline autentimine on sellel kontol kasutusel ja seega pead välise WebDAV-i kliendi jaoks kasutama rakenduse salasõna.",
+ "Warnings" : "Hoiatused",
+ "Keyboard shortcuts" : "Klaviatuuri kiirklahvid",
+ "Rename" : "Muuda nime",
"Delete" : "Kustuta",
- "Home" : "Kodu",
+ "Manage tags" : "Halda silte",
+ "Selection" : "Valik",
+ "Select all files" : "Vali kõik failid",
+ "Deselect all" : "Eemalda kogu valik",
+ "Navigation" : "Liikumine",
+ "View" : "Vaata",
+ "Show those shortcuts" : "Näita neid otseteid",
+ "You" : "Sina",
+ "Shared multiple times with different people" : "Jagatud mitu korda eri kasutajate poolt",
+ "Unable to change the favorite state of the file" : "Faili olekut lemmikuna ei õnnestu muuta",
+ "Error while loading the file data" : "Viga faili andmete laadimisel",
+ "Owner" : "Omanik",
+ "Remove from favorites" : "Eemalda lemmikutest",
+ "Add to favorites" : "Lisa lemmikutesse",
+ "Tags" : "Sildid",
+ "Blank" : "Tühi",
+ "Unable to create new file from template" : "Faili loomine mallist ebaõnnestus",
+ "Pick a template for {name}" : "Vali mall „{name}“ faili jaoks",
+ "Create a new file with the selected template" : "Loo valitud malli alusel uus fail",
+ "Creating file" : "Fail on loomisel",
+ "Save as {displayName}" : "Salvesta kui „{displayName}“",
+ "Save as …" : "Salvesta kui…",
+ "Converting files …" : "Teisendan faile…",
+ "Failed to convert files: {message}" : "Failide teisendamine ei õnnestunud: {message}",
+ "All files failed to be converted" : "Kõiki faile ei õnnestunud teisendada",
+ "One file could not be converted: {message}" : "Ühe faili teisendamine ei õnnestunud: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Ühe faili teisendamine ei õnnestunud","%n faili teisendamine ei õnnestunud"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Ühe faili teisendamine õnnestus","%n faili teisendamine õnnestus"],
+ "Files successfully converted" : "Failide teisendamine õnnestus",
+ "Failed to convert files" : "Failide teisendamine ei õnnestunud",
+ "Converting file …" : "Teisendan faili…",
+ "File successfully converted" : "Faili teisendamine õnnestus",
+ "Failed to convert file: {message}" : "Faili teisendamine ei õnnestunud: {message}",
+ "Failed to convert file" : "Faili teisendamine ei õnnestunud",
+ "Leave this share" : "Lahku jaoskaustast",
+ "Leave these shares" : "Lahku neist jaoskaustadest",
+ "Disconnect storage" : "Ühenda andmeruum lahti",
+ "Disconnect storages" : "Ühenda andmeruumid lahti",
+ "Delete permanently" : "Kustuta jäädavalt",
+ "Delete and unshare" : "Kustuta ja lõpeta jagamine",
+ "Delete file" : "Kustuta fail",
+ "Delete files" : "Kustuta failid",
+ "Delete folder" : "Kustuta kaust",
+ "Delete folders" : "Kustuta kaustad",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sa oled jäädavalt kustutamas {count} objekti","Sa oled jäädavalt kustutamas {count} objekti"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sa oled kustutamas {count} objekti","Sa oled kustutamas {count} objekti"],
+ "Confirm deletion" : "Kinnita kustutamine",
+ "Cancel" : "Loobu",
+ "Download" : "Laadi alla",
+ "Moving \"{source}\" to \"{destination}\" …" : "Teisaldan „{source}“ → „{destination}“…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopeerin „{source}“ → „{destination}“…",
+ "Destination is not a folder" : "Sihtasukoht pole kaust",
+ "This file/folder is already in that directory" : "See fail või kaust juba asub selles kaustas",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Sa ei saa faili või kausta iseendaks teisaldada ega teisaldada kausta iseenda alamkausta",
+ "(copy)" : "(koopia)",
+ "(copy %n)" : "(%n koopia)",
+ "A file or folder with that name already exists in this folder" : "Selles kaustas juba on olemas sama nimega fail või kaust",
+ "The files are locked" : "Need failid on lukustatud",
+ "The file does not exist anymore" : "Neid faile pole enam olemas",
+ "Choose destination" : "Vali sihtkaust",
+ "Copy to {target}" : "Kopeeri kausta {target}",
+ "Move to {target}" : "Teisalda kausta {target}",
+ "Move" : "Teisalda",
+ "Move or copy operation failed" : "Teisaldamine või kopeerimine ei õnnestunud",
+ "Move or copy" : "Liiguta või kopeeri",
+ "Open folder {displayName}" : "Ava kaust {displayName}",
+ "Open in Files" : "Ava failirakenduses",
+ "Open locally" : "Ava kohalikust andmeruumist",
+ "Failed to redirect to client" : "Kliendi ümbersuunamine ei õnnestunud",
+ "Open file locally" : "Ava fail kohalikus seadmes",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Fail peaks nüüd sinu seadmes või arvutis olema avatud. Kui see nii pole, siis palun kontrolli, et töölauarakendus on paigaldatud.",
+ "Retry and close" : "Proovi uuesti ja sulge",
+ "Open online" : "Ava võrgust",
+ "Details" : "Üksikasjad",
+ "View in folder" : "Vaata kaustas",
+ "Today" : "Täna",
+ "Last 7 days" : "Viimase 7 päeva jooksul",
+ "Last 30 days" : "Viimase 30 päeva jooksul",
+ "This year ({year})" : "Sel aastal ({year})",
+ "Last year ({year})" : "Eelmisel aastal ({year})",
+ "Documents" : "Dokumendid",
+ "Spreadsheets" : "Arvutustabelid",
+ "Presentations" : "Esitlused",
+ "PDFs" : "PDF-failid",
+ "Folders" : "Kaustad",
+ "Audio" : "Helifailid",
+ "Images" : "Pildid",
+ "Videos" : "Videod",
+ "Created new folder \"{name}\"" : "Uus „{name}“ kaust on loodud",
+ "Unable to initialize the templates directory" : "Mallide kausta loomine ebaõnnestus",
+ "Create templates folder" : "Loo mallide kaust",
+ "Templates" : "Mallid",
+ "New template folder" : "Uus kaustamall",
+ "In folder" : "Kaustas",
+ "Search in all files" : "Otsi kõikide failide seast",
+ "Search in folder: {folder}" : "Otsi kaustast: {folder}",
+ "One of the dropped files could not be processed" : "Ühte siia lisatud failidest ei õnnestunud töödelda",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Sinu veebibrauser ei toeta „Filesystem API“ liidestust. Kaustad jäävad üleslaadimata",
+ "No files to upload" : "Üleslaaditavaid faile pole",
+ "Unable to create the directory {directory}" : "„{directory}“ kausta loomine ei õnnestu",
+ "Some files could not be uploaded" : "Mõnda faili ei saanud üles laadida",
+ "Files uploaded successfully" : "Failide üleslaadimine õnnestus",
+ "No files to process" : "Töödeldavaid faile pole",
+ "Some files could not be copied" : "Mõnda faili ei saanud kopeerida",
+ "Some files could not be moved" : "Mõnda faili ei saanud teisaldada",
+ "Files copied successfully" : "Failide kopeerimine õnnestus",
+ "Files moved successfully" : "Failide teisaldamine õnnestus",
+ "Conflicts resolution skipped" : "Andmekonfilkti lahendamine jäi vahele",
+ "Upload cancelled" : "Üleslaadimine on katkestatud",
+ "Could not rename \"{oldName}\", it does not exist any more" : "„{oldName}“ faili nime muutmine ei õnnestunud, seda pole enam olemas",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "„{newName}“ nimi on juba „{dir}“ kaustas kasutusel. Palun vali teine nimi.",
+ "Could not rename \"{oldName}\"" : "„{oldName}“ faili nime muutmine ei õnnestunud",
+ "This operation is forbidden" : "See toiming on keelatud",
+ "Storage is temporarily not available" : "Salvestusruum pole ajutiselt kättesaadav",
+ "Unexpected error: {error}" : "Tundmatu viga: {error}",
+ "_%n file_::_%n files_" : ["%n fail","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n kaust","%n kausta"],
+ "_%n hidden_::_%n hidden_" : ["%n peidetud","%n peidetud"],
+ "Filename must not be empty." : "Failinimi ei saa olla tühi.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ pole failinimedes lubatud.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ on reserveeritud nimi ja seda failinimedes ei saa kasutada.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ pole lubatud failitüüp.",
+ "Filenames must not end with \"{extension}\"." : "Failinimede lõpus ei tohi olla „{extension}“.",
+ "List of favorite files and folders." : "Sinu lemmikfailide ja -kaustade loend.",
+ "No favorites yet" : "Lemmikuid veel pole",
+ "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
+ "List of your files and folders." : "Sinu failide ja kaustade loend.",
+ "List of your files and folders that are not shared." : "Sinu mittejagatud failide ja kaustade loend",
+ "No personal files found" : "Isiklikke faile ei leitud",
+ "Files that are not shared will show up here." : "Siin kuvatakse faile ja kaustu, mida sa pole teistega jaganud.",
+ "Recent" : "Hiljutised",
+ "List of recently modified files and folders." : "Hiljuti muudetud failide ja kaustade loend.",
+ "No recently modified files" : "Hiljuti muudetud faile pole.",
+ "Files and folders you recently modified will show up here." : "Failid ja kaustad, mida oled hiljuti muutnud, ilmuvad siia.",
+ "Search" : "Otsi",
+ "Search results within your files." : "Otsingutulemusd sinu failide seast.",
+ "No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
+ "Select all" : "Vali kõik",
+ "Upload too large" : "Üleslaadimine on liiga suur",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületavad serveri poolt üleslaaditavatele failidele määratud maksimaalse suuruse.",
+ "File could not be found" : "Faili ei leitud",
+ "Show list view" : "Näita loendivaadet",
+ "Show grid view" : "Näita ruudustikuvaadet",
"Close" : "Sulge",
- "Favorites" : "Lemmikud",
"Could not create folder \"{dir}\"" : "Kausta \"{dir}\" loomine ebaõnnestus",
"This will stop your current uploads." : "See peatab praegused üleslaadimised.",
"Upload cancelled." : "Üleslaadimine tühistati.",
+ "Processing files …" : "Failide töötlemine …",
"…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida „{filename}“, kuna see on kaust või selle suurus on 0 baiti",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.",
"Target folder \"{dir}\" does not exist any more" : "Kausta \"{dir}\" pole enam olemas",
- "Not enough free space" : "Pole piisavalt vaba ruumi",
- "Uploading …" : "Üleslaadminie ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{loadedSize} ({bitrate})",
- "Target folder does not exist any more" : "Sihtkataloogi pole enam olemas",
- "Error when assembling chunks, status code {status}" : "Tükkide kokkupanemise viga, staatus kood {status}",
- "Actions" : "Tegevused",
- "Rename" : "Nimeta ümber",
- "Copy" : "Kopeeri",
- "Delete file" : "Kustuta fail",
- "Delete folder" : "Kustuta kaust",
- "Disconnect storage" : "Ühenda andmehoidla lahti.",
+ "An unknown error has occurred" : "Tekkis tundmatu tõrge",
+ "File could not be uploaded" : "Faili üleslaadimine ebaõnnestus",
+ "Uploading …" : "Üleslaadmisel...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Üleslaadimisel… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Selle objekti üleslaadimine ei ole toetatud",
+ "Error when assembling chunks, status code {status}" : "Tükkide kokkupanemise viga, staatuskood {status}",
+ "Choose target folder" : "Vali sihtkaust",
+ "Set reminder" : "Lisa meeldetuletus",
+ "Edit locally" : "Muuda lokaalselt",
+ "Open" : "Ava",
"Could not load info for file \"{file}\"" : "Faili \"{file}\" info laadimine ebaõnnestus",
- "Files" : "Failid",
- "Details" : "Üksikasjad",
- "Select" : "Vali",
- "Pending" : "Ootel",
- "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
- "This operation is forbidden" : "See toiming on keelatud",
- "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
- "Could not move \"{file}\", target exists" : "\"{file}\" liigutamine ebaõnnestus, fail on juba olemas",
+ "Please select tag(s) to add to the selection" : "Palun vali sildid, mida valitutele lisada",
+ "Apply tag(s) to selection" : "Rakenda sildid valitutele",
+ "Select directory \"{dirName}\"" : "Vali kaust „{dirName}“",
+ "Select file \"{fileName}\"" : "Vali fail „{fileName}“",
+ "Unable to determine date" : "Kuupäeva tuvastamine ebaõnnestus",
+ "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval, palun kontrolli logifaile või võta ühendust administraatoriga",
+ "Could not move \"{file}\", target exists" : "\"{file}\" liigutamine ebaõnnestus, sihtfail on juba olemas",
"Could not move \"{file}\"" : "\"{file}\" liigutamine ebaõnnestus",
+ "copy" : "koopia",
"Could not copy \"{file}\", target exists" : "\"{file}\" kopeerimine ebaõnnestus, sihtfail on juba olemas",
"Could not copy \"{file}\"" : "\"{file}\" kopeerimine ebaõnnestus",
- "Copied {origin} inside {destination}" : "Kopeeris {origin} {destination} sisse",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopeeris {origin} ja {nbfiles} teist faili {destination} sisse",
+ "Copied {origin} inside {destination}" : "{origin} kopeeritud kausta {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ja {nbfiles} teist faili kopeeritud kausta {destination}",
"{newName} already exists" : "{newName} on juba olemas",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" ümbernimetamine ebaõnnestus, seda pole enam olemas",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on juba \"{dir}\" kaustas kasutusel. Palun valige teine nimi.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" ümbernimetamine ebaõnnestus",
"Could not create file \"{file}\"" : "Faili \"{file}\" loomine ebaõnnestus",
"Could not create file \"{file}\" because it already exists" : "Faili \"{file}\" loomine ebaõnnestus, sest see on juba olemas",
"Could not create folder \"{dir}\" because it already exists" : "Kausta \"{dir}\" loomine ebaõnnestus, sest see on juba olemas",
- "Error deleting file \"{fileName}\"." : "Tõrge faili \"{fileName}\" kustutamisel.",
+ "Could not fetch file details \"{file}\"" : "Ei õnnestunud laadida „{file}“ faili üksikasju",
+ "Error deleting file \"{fileName}\"." : "Viga „{fileName}“ faili kustutamisel.",
"No search results in other folders for {tag}{filter}{endtag}" : "Teistest kaustadest ei leitud {tag}{filter}{endtag}",
- "Name" : "Nimi",
- "Size" : "Suurus",
- "Modified" : "Muudetud",
- "_%n folder_::_%n folders_" : ["%n kataloog","%n kataloogi"],
- "_%n file_::_%n files_" : ["%n fail","%n faili"],
+ "Enter more than two characters to search in other folders" : "Teistest kaustadest otsimiseks sisesta rohkem kui kaks sümbolit",
"{dirs} and {files}" : "{dirs} ja {files}",
"_including %n hidden_::_including %n hidden_" : ["sealhulgas %n peidetud","sealhulgas %n peidetud"],
- "You don’t have permission to upload or create files here" : "Sul puuduvad õigused siia failide üleslaadimiseks või tekitamiseks",
+ "You do not have permission to upload or create files here" : "Sul pole luba siia faile lisada ja üles laadida",
"_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"],
"New" : "Uus",
- "{used} of {quota} used" : "Kasutatud {used}/{quota}",
- "{used} used" : "Kasutatud {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" on vigane failinimi.",
- "File name cannot be empty." : "Faili nimi ei saa olla tühi.",
- "\"/\" is not allowed inside a file name." : "\"/\" pole failinimedes lubatud.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" pole lubatud failitüüp",
- "View in folder" : "Vaata kaustas",
- "Copied!" : "Kopeeritud!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopeeri otselink (töötab ainult nende kasutajate jaoks, kelle on ligipääs sellele failile/kaustale)",
+ "New file/folder menu" : "Uue faili või kausta menüü",
+ "Select file range" : "Vali failivahemik",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} kasutusel",
+ "\"{name}\" is an invalid file name." : "„{name}“ on vigane failinimi.",
+ "File name cannot be empty." : "Failinimi ei saa olla tühi.",
+ "\"/\" is not allowed inside a file name." : "„/“ pole failinimedes lubatud.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ pole lubatud failitüüp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "„{mountPoint}“ grupikausta andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Väline andmeruum „{mountPoint}“ on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Sinu andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Kasutaja {owner} andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "„{mountPoint}“ grupi andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Väline andmeruum „{mountPoint}“ on peaaegu täis ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Su andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastab tingimusele „{filter}“","vastab tingimustele „{filter}“"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Otselink on kopeeritud (toimib ainult nende kasutajate puhul, kellel on ligipääs sellele failile/kaustale)",
"Path" : "Asukoht",
"_%n byte_::_%n bytes_" : ["%n bait","%n baiti"],
- "Favorited" : "Lemmikud",
- "Favorite" : "Lemmik",
- "New folder" : "Uus kaust",
- "Upload file" : "Lae fail üles",
- "Recent" : "Hiljutised",
- "Not favorited" : "Lemmikuks lisamata",
- "Remove from favorites" : "Eemalda lemmikutest",
- "Add to favorites" : "Lisa lemmikutesse",
+ "Favored" : "Märgitud lemmikuks",
+ "Favor" : "Märgi lemmikuks",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopeeri otselink (töötab ainult nende kasutajate puhul, kellel on ligipääs sellele failile/kaustale)",
+ "Upload file" : "Laadi fail üles",
+ "Not favored" : "Pole märgitud lemmikuks",
"An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
- "Added to favorites" : "Lemmikutesse lisatud",
- "Removed from favorites" : "Lemmikutest eemaldatud",
- "You added {file} to your favorites" : "{file} lemmikutesse lisatud",
- "You removed {file} from your favorites" : "{file} lemmikutest eemaldatud",
- "File changes" : "Failimuudatused",
- "Created by {user}" : "Kasutaja {user} poolt loodud",
- "Changed by {user}" : "Kasutaja {user} poolt muudetud",
- "Deleted by {user}" : "Kasutaja {user} poolt kustutatud",
- "Restored by {user}" : "Kasutaja {user} poolt taastatud",
- "Renamed by {user}" : "Kasutaja {user} poolt ümber nimetatud",
- "Moved by {user}" : "Kasutaja {user} liigutatud",
- "\"remote user\"" : "\"kaugkasutaja\"",
- "You created {file}" : "Sa lõid faili {file}",
- "{user} created {file}" : "Kasutaja {user} lõi faili {file}",
- "{file} was created in a public folder" : "{file} loodi avalikku kausta",
- "You changed {file}" : "Sa muutsid faili {file}",
- "{user} changed {file}" : "Kasutaja {user} muutis faili {file}",
- "You deleted {file}" : "Sa kustutasid faili {file}",
- "{user} deleted {file}" : "Kasutaja {user} kustutas faili {file}",
- "You restored {file}" : "Sa taastasid faili {file}",
- "{user} restored {file}" : "Kasutaja {user} taastas faili {file}",
- "You renamed {oldfile} to {newfile}" : "Sa nimetasid faili ümber: {oldfile} nüüd {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} nimetas faili ümber: {oldfile} nüüd {newfile}",
- "You moved {oldfile} to {newfile}" : "Sa liigutasid faili: {oldfile} nüüd {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} liigutas faili: {oldfile} nüüd {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "<strong>Lemmikutesse</strong> on lisatud või sealt eemaldatud fail",
- "A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
- "All files" : "Kõik failid",
- "Unlimited" : "Piiramatult",
"Upload (max. %s)" : "Üleslaadimine (max. %s)",
- "Accept" : "Nõustu",
- "Reject" : "Keeldu",
- "in %s" : "kaustas %s",
- "Change" : "Muuda",
- "Tags" : "Sildid",
- "Cancel" : "Loobu",
- "Create" : "Loo",
- "%s used" : "Kasutatud %s",
- "%1$s of %2$s used" : "Kasutatud %1$s/%2$s",
- "Settings" : "Seaded",
- "Show hidden files" : "Näita peidetud faile",
- "WebDAV" : "WebDAV",
- "No files in here" : "Siin ei ole faile",
- "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
- "No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
- "Select all" : "Vali kõik",
- "Upload too large" : "Üleslaadimine on liiga suur",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
- "No favorites yet" : "Lemmikuid veel pole",
- "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
- "Deleted files" : "Kustutatud failid",
- "Shares" : "Jagamisi",
- "Shared with others" : "Teistega jagatud",
- "Shared with you" : "Sinuga jagatud",
- "Shared by link" : "Jagatud lingiga",
- "Deleted shares" : "Kustutatud jagamised",
- "Pending shares" : "Ootel jagamised",
+ "\"{displayName}\" action executed successfully" : "Toiming õnnestus: „{displayName}“",
+ "\"{displayName}\" action failed" : "Tegevus ei õnnestunud: „{displayName}“",
+ "\"{displayName}\" failed on some elements" : "„{displayName}“ ei toiminud mõne objekti puhul",
+ "\"{displayName}\" batch action executed successfully" : "Pakktöötlus õnnestus: „{displayName}“",
+ "Submitting fields…" : "Saadan välju…",
+ "Filter filenames…" : "Otsi failinimesid…",
+ "WebDAV URL copied to clipboard" : "WebDAV-i võrguaadress on kopeeritud lõikelauale",
+ "Enable the grid view" : "Võta kasutusele ruudustikuvaade",
+ "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Copy to clipboard" : "Kopeeri lõikelauale",
+ "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
+ "Deletion cancelled" : "Kustutamine on tühistatud",
+ "Move cancelled" : "Teisaldamine on katkestatud",
+ "Cancelled move or copy of \"{filename}\"." : "„{filename}“ faili teisaldamine või kopeerimine on katkestatud.",
+ "Cancelled move or copy operation" : "Teisaldamine või kopeerimine on katkestatud",
+ "Open details" : "Ava üksikasjad",
+ "Photos and images" : "Fotod ja pildid",
+ "New folder creation cancelled" : "Uue kausta loomine on katkestatud",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kaust","{folderCount} kausta"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fail","{fileCount} faili"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fail ja {folderCount} kaust","1 fail ja {folderCount} kausta"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fail ja 1 kaust","{fileCount} faili ja 1 kaust"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili ja {folderCount} kausta",
+ "All folders" : "Kõik kaustad",
+ "Personal Files" : "Isiklikud Failid",
"Text file" : "Tekstifail",
"New text file.txt" : "Uus tekstifail.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
- "Your storage is full, files can not be updated or synced anymore!" : "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
- "_matches '{filter}'_::_match '{filter}'_" : ["vastab '{filter}'","vastab '{filter}'"]
+ "%1$s (renamed)" : "%1$s (nimi on muudetud)",
+ "renamed file" : "muudetud nimega fail",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Kui võtad kasutusele Windowsiga ühilduvad failinimed, siis olemasolevad mitteühilduvaid faile ei saa enam muuta, aga faili omanik saab failinime muuta ühilduvaks.",
+ "Filter file names …" : "Otsi failinimesid…",
+ "Prevent warning dialogs from open or reenable them." : "Ära kasuta hoiatusteateid nende avamisel või uuesti kasutusele võtmisel.",
+ "Show a warning dialog when changing a file extension." : "Faililaiendi muutmisel näita hoiatust.",
+ "Speed up your Files experience with these quick shortcuts." : "Tee failirakenduse kasutamine kiiremaks nende kiirklahvidega.",
+ "Open the actions menu for a file" : "Ava failitoimingute menüü",
+ "Rename a file" : "Muuda failinime",
+ "Delete a file" : "Kustuta fail",
+ "Favorite or remove a file from favorites" : "Märgi fail lemmikuks või eemalda olek lemmikuna",
+ "Manage tags for a file" : "Halda failide silte",
+ "Deselect all files" : "Eemalda kõikide failide valik",
+ "Select or deselect a file" : "Vali fail või eemalda valik",
+ "Select a range of files" : "Vali mitu faili",
+ "Navigate to the parent folder" : "Mine ülakausta",
+ "Navigate to the file above" : "Liigu ülemise faili juurde",
+ "Navigate to the file below" : "Liigu alumise faili juurde",
+ "Navigate to the file on the left (in grid mode)" : "Liigu vasakpoolse faili juurde (ruudustikuvaates)",
+ "Navigate to the file on the right (in grid mode)" : "Liigu parempoolse faili juurde (ruudustikuvaates)",
+ "Toggle the grid view" : "Lülita ruudustikuvaade sisse/välja",
+ "Open the sidebar for a file" : "Ava faili külgriba"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index 43805723a03..181a468baa2 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -1,146 +1,477 @@
{ "translations": {
- "Storage is temporarily not available" : "Salvestusruum pole ajutiselt kättesaadav",
- "Storage invalid" : "Vigane andmehoidla",
+ "Added to favorites" : "Lemmikutesse lisatud",
+ "Removed from favorites" : "Lemmikutest eemaldatud",
+ "You added {file} to your favorites" : "Lisasid {file} lemmikutesse",
+ "You removed {file} from your favorites" : "Eemaldasid {file} lemmikutest",
+ "Favorites" : "Lemmikud",
+ "File changes" : "Failimuudatused",
+ "Created by {user}" : "Loodud kasutaja {user} poolt",
+ "Changed by {user}" : "Muudetud kasutaja {user} poolt",
+ "Deleted by {user}" : "Kustutatud kasutaja {user} poolt",
+ "Restored by {user}" : "Taastatud kasutaja {user} poolt",
+ "Renamed by {user}" : "Kasutaja {user} muutis nime",
+ "Moved by {user}" : "Liigutatud kasutaja {user} poolt",
+ "\"remote account\"" : "„kaugkonto“",
+ "You created {file}" : "Sa lõid faili {file}",
+ "You created an encrypted file in {file}" : "Sa lõid krüpteeritud faili {file}",
+ "{user} created {file}" : "Kasutaja {user} lõi faili {file}",
+ "{user} created an encrypted file in {file}" : "Kasutaja {user} lõi krüpteeritud faili {file}",
+ "{file} was created in a public folder" : "{file} loodi avalikus kaustas",
+ "You changed {file}" : "Sa muutsid faili {file}",
+ "You changed an encrypted file in {file}" : "Sa muutsid krüpteeritud faili {file}",
+ "{user} changed {file}" : "Kasutaja {user} muutis faili {file}",
+ "{user} changed an encrypted file in {file}" : "Kasutaja {user} muutis krüpteeritud faili {file}",
+ "You deleted {file}" : "Sa kustutasid faili {file}",
+ "You deleted an encrypted file in {file}" : "Sa kustutasid krüpteeritud faili {file}",
+ "{user} deleted {file}" : "Kasutaja {user} kustutas faili {file}",
+ "{user} deleted an encrypted file in {file}" : "Kasutaja {user} kustutas krüpteeritud faili {file}",
+ "You restored {file}" : "Sa taastasid faili {file}",
+ "{user} restored {file}" : "Kasutaja {user} taastas faili {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Sa muutsid „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Sa muutsid „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Sa muutsid „{oldfile}“ faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "You renamed {oldfile} to {newfile}" : "Sa muutsid „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "Kasutaja {user} muutis „{oldfile}“ (peidetud) faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "Kasutaja {user} muutis (peidetud) „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "Kasutaja {user} muutis „{oldfile}“ faili nime, uus nimi on „{newfile}“ (peidetud)",
+ "{user} renamed {oldfile} to {newfile}" : "Kasutaja {user} muutis „{oldfile}“ faili nime, uus nimi on „{newfile}“",
+ "You moved {oldfile} to {newfile}" : "Sa liigutasid faili: {oldfile} nüüd {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} liigutas faili: {oldfile} nüüd {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Fail lisati su <strong>lemmikutesse</strong> või eemaldati sealt",
+ "Files" : "Failid",
+ "A file or folder has been <strong>changed</strong>" : "Fail või kaust on <strong>muudetud</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Lemmikuks märgitud faili või kausta on <strong>muudetud</strong>",
+ "Failed to authorize" : "Autoriseerimine ei õnnestunud",
+ "Invalid folder path" : "Kausta vigane asukoht",
+ "Folder not found" : "Kausta ei leidu",
+ "The file cannot be found" : "Faili ei õnnestu leida",
+ "The destination path does not exist: %1$s" : "Sihtasukoht pole olemas: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sul puudvad õigused faili loomiseks antud asukohas",
+ "The file could not be converted." : "Seda faili ei õnnestunud teisendada.",
+ "Could not get relative path to converted file" : "Teisendatud faili suhtelist asukohta ei õnnestunud tuvastada",
+ "Favorite files" : "Lemmikfailid",
+ "No favorites" : "Lemmikuid pole",
+ "More favorites" : "Veel lemmikuid",
+ "Accept" : "Nõustu",
+ "Reject" : "Keeldu",
+ "Incoming ownership transfer from {user}" : "Saaduv omandi üleandmine kasutajalt {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Kas sa soovid „{path}“ omandi üle võtta?\n\nMärkus: palun arvesta, et selleks võib kuluda kuni 1 tund.",
+ "Ownership transfer denied" : "Keeldumine omandi üleandmisest",
+ "Your ownership transfer of {path} was denied by {user}." : "Kasutaja {user} keeldus sinu soovist „{path}“ omand üle anda.",
+ "Ownership transfer failed" : "Omandi üleandmine ei õnnestunud",
+ "Your ownership transfer of {path} to {user} failed." : "Sinu poolt algatatud „{path}“ omandi üleandmine kasutajale {user} ei õnnestunud.",
+ "The ownership transfer of {path} from {user} failed." : "„{path}“ omandi üleandmine kasutajale {user} ei õnnestunud.",
+ "Ownership transfer done" : "Omandi üleandmine on lõppenud",
+ "Your ownership transfer of {path} to {user} has completed." : "Sinu poolt algatatud „{path}“ omandi üleandmine kasutajale {user} on lõppenud.",
+ "The ownership transfer of {path} from {user} has completed." : "„{path}“ omandi üleandmine kasutajale {user} on tehtud.",
+ "in %s" : "kaustas %s",
+ "Transferred from %1$s on %2$s" : "Üleantud kasutajalt %1$s %2$s",
+ "Files compatibility" : "Failide ühilduvus",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Luba failinimede piiramine tagamaks, et sünkroniseerimine toimib kõikide platvormide klientide vahel. Vaikimisi on lubatud kõik POSIX-i standardile vastavad failinimed (seda järgivad Linux ja macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Kui võtad kasutusele Windowsiga ühilduvad failinimed, siis olemasolevaid mitteühilduvaid faile ei saa enam muuta, aga faili omanik saab failinime muuta ühilduvaks.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Lisaks on peale selle seadistuse kasutuselevõtmist võimalik kõik mitteühilduvad failid automaatselt ära muuta. Asjakohast teavet leiad kasutusjuhendist occ-käsku kirjeldavast peatükist.",
+ "Enforce Windows compatibility" : "Kasuta ühilduvust Windowsiga",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Sellega blokeerid niisuguste failinimede kasutamise, mis Windowsis ei toimiks. See tähendab mõnede nimede ja tähemärkide keelamist. Aga see seadistus ei jõusta suur- ja väiketähtede kasutust.",
+ "File Management" : "Failihaldus",
+ "Home" : "Kodu",
+ "Target folder does not exist any more" : "Sihtkausta pole enam olemas",
+ "Reload current directory" : "Laadi see kaust uuesti",
+ "Go to the \"{dir}\" directory" : "Mine kausta „{dir}“",
+ "Current directory path" : "Praeguse kausta asukoht",
+ "Your have used your space quota and cannot upload files anymore" : "Sa oled kasutanud ära kogu oma andmeruumi kvoodi ega saa rohkem faile üles laadida.",
+ "You do not have permission to upload or create files here." : "Sul puuduvad õigused siia failide üleslaadimiseks või loomiseks.",
+ "Drag and drop files here to upload" : "Üleslaadimiseks lohista failid siia",
+ "Favorite" : "Lemmik",
+ "Back" : "Tagasi",
+ "Toggle selection for file \"{displayName}\"" : "Lülita „{displayName}“ faili valimine sisse/välja",
+ "Toggle selection for folder \"{displayName}\"" : "Lülita „{displayName}“ kausta valimine sisse/välja",
+ "File is loading" : "Fail on laadimisel",
+ "Folder is loading" : "Kaust on laadimisel",
+ "Filename" : "Failinimi",
+ "Folder name" : "Kausta nimi",
+ "This node is unavailable" : "See sõlm pole saadaval",
+ "Another entry with the same name already exists." : "Selle nimega kirje on juba olemas.",
+ "Invalid filename." : "Vigane failinimi.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Failinimi on muutunud „{oldName}“ ⇨ „{newName}“",
+ "Rename file" : "Muuda failinime",
+ "Folder" : "Kaust",
+ "Unknown file type" : "Tundmatu failitüüp",
+ "{ext} image" : "{ext} pilt",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} helifail",
+ "{ext} text" : "{ext} tekst",
+ "Pending" : "Ootel",
+ "Unknown date" : "Tundmatu kuupäev",
+ "Clear filter" : "Tühjenda filter",
+ "Modified" : "Muudetud",
+ "Search everywhere" : "Otsi kõikjalt",
+ "Type" : "Tüüp",
+ "Active filters" : "Aktiivsed filtrid",
+ "Remove filter" : "Eemalda filter",
+ "Total rows summary" : "Ridade koondkokkuvõte",
+ "Toggle selection for all files and folders" : "Lülita kõikide failide ja kaustade valik sisse/välja",
+ "Name" : "Nimi",
+ "File type" : "Failitüüp",
+ "Size" : "Suurus",
+ "Actions" : "Tegevused",
+ "(selected)" : "(valitud)",
+ "List of files and folders." : "Failide ja kaustade loend",
+ "You have used your space quota and cannot upload files anymore." : "Sa oled kasutanud ära kogu oma andmeruumi kvoodi ega saa rohkem faile üles laadida.",
+ "Column headers with buttons are sortable." : "Võid kasutada nuppudega veerupäised järjestamiseks.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
+ "File not found" : "Faili ei leitud",
+ "_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
+ "Search scope options" : "Otsinguulatuse valikud",
+ "{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
+ "{used} of {quota} used" : "{used} / {quota} kasutusel",
+ "{relative}% used" : "{relative}% kasutusel",
+ "Could not refresh storage stats" : "Andmeruumi statistika värskendamine ei õnnestunud",
+ "Your storage is full, files can not be updated or synced anymore!" : "Sinu andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Storage information" : "Andmeruumi teave",
+ "Storage quota" : "Andmeruumi kvoot",
+ "New folder" : "Uus kaust",
+ "Create new folder" : "Loo uus kaust",
+ "This name is already in use." : "See nimi on juba kasutusel.",
+ "Create" : "Loo",
+ "Files starting with a dot are hidden by default" : "Punktiga algavad failinimed vaikimisi muudavad faili peidetuks",
+ "Fill template fields" : "Täida malli väljad",
+ "Submitting fields …" : "Saadan välju…",
+ "Submit" : "Saada",
+ "Choose a file or folder to transfer" : "Vali üleantav fail või kaust",
+ "Transfer" : "Anna üle teisele kasutajale",
+ "Transfer {path} to {userid}" : "Anna „{path}“ üle kasutajale {userid}",
+ "Invalid path selected" : "Vigane asukoht on valitud",
"Unknown error" : "Tundmatu viga",
- "File could not be found" : "Faili ei leitud",
- "Move or copy" : "Liiguta või kopeeri",
- "Download" : "Lae alla",
+ "Ownership transfer request sent" : "Üleandmispäring on saadetud",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sa ei saa teisele kasutaja anda üle kausta või faili, mis pole sinu oma",
+ "Transfer ownership of a file or folder" : "Kaustade või failide omandi üleandmine teisele kasutajale",
+ "Choose file or folder to transfer" : "Vali üleantav fail või kaust",
+ "Change" : "Muuda",
+ "New owner" : "Uus omanik",
+ "Keep {old}" : "Säilita „{old}“",
+ "Keep without extension" : "Säilita ilma faililaiendita",
+ "Use {new}" : "Kasuta „{new}“",
+ "Remove extension" : "Eemalda faililaiend",
+ "Change file extension" : "Muuda faililaiendit",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Muutes senist faililaiendit „{old}“ uueks laiendiks „{new}“ võib fail muutuda loetamatuks.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "„{old}“ faililaiendi eemaldamine võib muuta faili loetamatuks.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "„{new}“ faililaiendi lisamine võib muuta faili loetamatuks.",
+ "Do not show this dialog again." : "Ära näita seda vaadet enam uuesti.",
+ "Select file or folder to link to" : "Vali lingitav fail või kaust",
+ "Choose {file}" : "Vali „{file}“",
+ "Share" : "Jaga",
+ "Shared by link" : "Jagatud lingiga",
+ "Shared" : "Jagatud",
+ "Switch to list view" : "Kasuta loendivaadet",
+ "Switch to grid view" : "Kasuta ruudustikuvaadet",
+ "The file could not be found" : "Seda faili ei õnnestu leida",
+ "Upload was cancelled by user" : "Kasutaja katkestas üleslaadimise",
+ "Not enough free space" : "Pole piisavalt vaba ruumi",
+ "Operation is blocked by access control" : "Tegevus on blokeeritud ligipääsupiirangute poolt",
+ "Error during upload: {message}" : "Viga üleslaadimisel: {message}",
+ "Error during upload, status code {status}" : "Viga üleslaadimisel, olekukood {status} ",
+ "Unknown error during upload" : "Tundmatu viga üleslaadimisel",
+ "Loading current folder" : "Laadin käesolevat kausta",
+ "Retry" : "Proovi uuesti",
+ "No files in here" : "Siin ei ole faile",
+ "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
+ "Go back" : "Mine tagasi",
+ "Views" : "Vaated",
+ "Files settings" : "Failide seadistused",
+ "Your files" : "Sinu failid",
+ "Open in files" : "Ava failirakenduses",
+ "File cannot be accessed" : "Failile ligipääs puudub",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili kas ei leidu või sul puudub õigus selle vaatamiseks. Palu saatjat, et ta jagaks antud faili sulle.",
+ "No search results for “{query}”" : "„{query}“ otsingul pole tulemusi",
+ "Search for files" : "Otsi faile",
+ "Clipboard is not available" : "Lõikelaud ei ole saadaval",
+ "General" : "Üldine",
+ "Default view" : "Vaikimisi vaade",
+ "All files" : "Kõik failid",
+ "Personal files" : "Isiklikud failid",
+ "Sort favorites first" : "Järjesta lemmikud esimesena",
+ "Sort folders before files" : "Järjesta kaustad enne faile",
+ "Folder tree" : "Kaustapuu",
+ "Appearance" : "Välimus",
+ "Show hidden files" : "Näita peidetud faile",
+ "Show file type column" : "Näita failitüübi veergu",
+ "Crop image previews" : "Kadreeri piltide eelvaated",
+ "Additional settings" : "Lisaseadistused",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-i võrguaadress",
+ "Copy" : "Kopeeri",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Kaheastmeline autentimine on sellel kontol kasutusel ja seega pead välise WebDAV-i kliendi jaoks kasutama rakenduse salasõna.",
+ "Warnings" : "Hoiatused",
+ "Keyboard shortcuts" : "Klaviatuuri kiirklahvid",
+ "Rename" : "Muuda nime",
"Delete" : "Kustuta",
- "Home" : "Kodu",
+ "Manage tags" : "Halda silte",
+ "Selection" : "Valik",
+ "Select all files" : "Vali kõik failid",
+ "Deselect all" : "Eemalda kogu valik",
+ "Navigation" : "Liikumine",
+ "View" : "Vaata",
+ "Show those shortcuts" : "Näita neid otseteid",
+ "You" : "Sina",
+ "Shared multiple times with different people" : "Jagatud mitu korda eri kasutajate poolt",
+ "Unable to change the favorite state of the file" : "Faili olekut lemmikuna ei õnnestu muuta",
+ "Error while loading the file data" : "Viga faili andmete laadimisel",
+ "Owner" : "Omanik",
+ "Remove from favorites" : "Eemalda lemmikutest",
+ "Add to favorites" : "Lisa lemmikutesse",
+ "Tags" : "Sildid",
+ "Blank" : "Tühi",
+ "Unable to create new file from template" : "Faili loomine mallist ebaõnnestus",
+ "Pick a template for {name}" : "Vali mall „{name}“ faili jaoks",
+ "Create a new file with the selected template" : "Loo valitud malli alusel uus fail",
+ "Creating file" : "Fail on loomisel",
+ "Save as {displayName}" : "Salvesta kui „{displayName}“",
+ "Save as …" : "Salvesta kui…",
+ "Converting files …" : "Teisendan faile…",
+ "Failed to convert files: {message}" : "Failide teisendamine ei õnnestunud: {message}",
+ "All files failed to be converted" : "Kõiki faile ei õnnestunud teisendada",
+ "One file could not be converted: {message}" : "Ühe faili teisendamine ei õnnestunud: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Ühe faili teisendamine ei õnnestunud","%n faili teisendamine ei õnnestunud"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Ühe faili teisendamine õnnestus","%n faili teisendamine õnnestus"],
+ "Files successfully converted" : "Failide teisendamine õnnestus",
+ "Failed to convert files" : "Failide teisendamine ei õnnestunud",
+ "Converting file …" : "Teisendan faili…",
+ "File successfully converted" : "Faili teisendamine õnnestus",
+ "Failed to convert file: {message}" : "Faili teisendamine ei õnnestunud: {message}",
+ "Failed to convert file" : "Faili teisendamine ei õnnestunud",
+ "Leave this share" : "Lahku jaoskaustast",
+ "Leave these shares" : "Lahku neist jaoskaustadest",
+ "Disconnect storage" : "Ühenda andmeruum lahti",
+ "Disconnect storages" : "Ühenda andmeruumid lahti",
+ "Delete permanently" : "Kustuta jäädavalt",
+ "Delete and unshare" : "Kustuta ja lõpeta jagamine",
+ "Delete file" : "Kustuta fail",
+ "Delete files" : "Kustuta failid",
+ "Delete folder" : "Kustuta kaust",
+ "Delete folders" : "Kustuta kaustad",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Sa oled jäädavalt kustutamas {count} objekti","Sa oled jäädavalt kustutamas {count} objekti"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Sa oled kustutamas {count} objekti","Sa oled kustutamas {count} objekti"],
+ "Confirm deletion" : "Kinnita kustutamine",
+ "Cancel" : "Loobu",
+ "Download" : "Laadi alla",
+ "Moving \"{source}\" to \"{destination}\" …" : "Teisaldan „{source}“ → „{destination}“…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopeerin „{source}“ → „{destination}“…",
+ "Destination is not a folder" : "Sihtasukoht pole kaust",
+ "This file/folder is already in that directory" : "See fail või kaust juba asub selles kaustas",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Sa ei saa faili või kausta iseendaks teisaldada ega teisaldada kausta iseenda alamkausta",
+ "(copy)" : "(koopia)",
+ "(copy %n)" : "(%n koopia)",
+ "A file or folder with that name already exists in this folder" : "Selles kaustas juba on olemas sama nimega fail või kaust",
+ "The files are locked" : "Need failid on lukustatud",
+ "The file does not exist anymore" : "Neid faile pole enam olemas",
+ "Choose destination" : "Vali sihtkaust",
+ "Copy to {target}" : "Kopeeri kausta {target}",
+ "Move to {target}" : "Teisalda kausta {target}",
+ "Move" : "Teisalda",
+ "Move or copy operation failed" : "Teisaldamine või kopeerimine ei õnnestunud",
+ "Move or copy" : "Liiguta või kopeeri",
+ "Open folder {displayName}" : "Ava kaust {displayName}",
+ "Open in Files" : "Ava failirakenduses",
+ "Open locally" : "Ava kohalikust andmeruumist",
+ "Failed to redirect to client" : "Kliendi ümbersuunamine ei õnnestunud",
+ "Open file locally" : "Ava fail kohalikus seadmes",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Fail peaks nüüd sinu seadmes või arvutis olema avatud. Kui see nii pole, siis palun kontrolli, et töölauarakendus on paigaldatud.",
+ "Retry and close" : "Proovi uuesti ja sulge",
+ "Open online" : "Ava võrgust",
+ "Details" : "Üksikasjad",
+ "View in folder" : "Vaata kaustas",
+ "Today" : "Täna",
+ "Last 7 days" : "Viimase 7 päeva jooksul",
+ "Last 30 days" : "Viimase 30 päeva jooksul",
+ "This year ({year})" : "Sel aastal ({year})",
+ "Last year ({year})" : "Eelmisel aastal ({year})",
+ "Documents" : "Dokumendid",
+ "Spreadsheets" : "Arvutustabelid",
+ "Presentations" : "Esitlused",
+ "PDFs" : "PDF-failid",
+ "Folders" : "Kaustad",
+ "Audio" : "Helifailid",
+ "Images" : "Pildid",
+ "Videos" : "Videod",
+ "Created new folder \"{name}\"" : "Uus „{name}“ kaust on loodud",
+ "Unable to initialize the templates directory" : "Mallide kausta loomine ebaõnnestus",
+ "Create templates folder" : "Loo mallide kaust",
+ "Templates" : "Mallid",
+ "New template folder" : "Uus kaustamall",
+ "In folder" : "Kaustas",
+ "Search in all files" : "Otsi kõikide failide seast",
+ "Search in folder: {folder}" : "Otsi kaustast: {folder}",
+ "One of the dropped files could not be processed" : "Ühte siia lisatud failidest ei õnnestunud töödelda",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Sinu veebibrauser ei toeta „Filesystem API“ liidestust. Kaustad jäävad üleslaadimata",
+ "No files to upload" : "Üleslaaditavaid faile pole",
+ "Unable to create the directory {directory}" : "„{directory}“ kausta loomine ei õnnestu",
+ "Some files could not be uploaded" : "Mõnda faili ei saanud üles laadida",
+ "Files uploaded successfully" : "Failide üleslaadimine õnnestus",
+ "No files to process" : "Töödeldavaid faile pole",
+ "Some files could not be copied" : "Mõnda faili ei saanud kopeerida",
+ "Some files could not be moved" : "Mõnda faili ei saanud teisaldada",
+ "Files copied successfully" : "Failide kopeerimine õnnestus",
+ "Files moved successfully" : "Failide teisaldamine õnnestus",
+ "Conflicts resolution skipped" : "Andmekonfilkti lahendamine jäi vahele",
+ "Upload cancelled" : "Üleslaadimine on katkestatud",
+ "Could not rename \"{oldName}\", it does not exist any more" : "„{oldName}“ faili nime muutmine ei õnnestunud, seda pole enam olemas",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "„{newName}“ nimi on juba „{dir}“ kaustas kasutusel. Palun vali teine nimi.",
+ "Could not rename \"{oldName}\"" : "„{oldName}“ faili nime muutmine ei õnnestunud",
+ "This operation is forbidden" : "See toiming on keelatud",
+ "Storage is temporarily not available" : "Salvestusruum pole ajutiselt kättesaadav",
+ "Unexpected error: {error}" : "Tundmatu viga: {error}",
+ "_%n file_::_%n files_" : ["%n fail","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n kaust","%n kausta"],
+ "_%n hidden_::_%n hidden_" : ["%n peidetud","%n peidetud"],
+ "Filename must not be empty." : "Failinimi ei saa olla tühi.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ pole failinimedes lubatud.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ on reserveeritud nimi ja seda failinimedes ei saa kasutada.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ pole lubatud failitüüp.",
+ "Filenames must not end with \"{extension}\"." : "Failinimede lõpus ei tohi olla „{extension}“.",
+ "List of favorite files and folders." : "Sinu lemmikfailide ja -kaustade loend.",
+ "No favorites yet" : "Lemmikuid veel pole",
+ "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
+ "List of your files and folders." : "Sinu failide ja kaustade loend.",
+ "List of your files and folders that are not shared." : "Sinu mittejagatud failide ja kaustade loend",
+ "No personal files found" : "Isiklikke faile ei leitud",
+ "Files that are not shared will show up here." : "Siin kuvatakse faile ja kaustu, mida sa pole teistega jaganud.",
+ "Recent" : "Hiljutised",
+ "List of recently modified files and folders." : "Hiljuti muudetud failide ja kaustade loend.",
+ "No recently modified files" : "Hiljuti muudetud faile pole.",
+ "Files and folders you recently modified will show up here." : "Failid ja kaustad, mida oled hiljuti muutnud, ilmuvad siia.",
+ "Search" : "Otsi",
+ "Search results within your files." : "Otsingutulemusd sinu failide seast.",
+ "No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
+ "Select all" : "Vali kõik",
+ "Upload too large" : "Üleslaadimine on liiga suur",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületavad serveri poolt üleslaaditavatele failidele määratud maksimaalse suuruse.",
+ "File could not be found" : "Faili ei leitud",
+ "Show list view" : "Näita loendivaadet",
+ "Show grid view" : "Näita ruudustikuvaadet",
"Close" : "Sulge",
- "Favorites" : "Lemmikud",
"Could not create folder \"{dir}\"" : "Kausta \"{dir}\" loomine ebaõnnestus",
"This will stop your current uploads." : "See peatab praegused üleslaadimised.",
"Upload cancelled." : "Üleslaadimine tühistati.",
+ "Processing files …" : "Failide töötlemine …",
"…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida „{filename}“, kuna see on kaust või selle suurus on 0 baiti",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.",
"Target folder \"{dir}\" does not exist any more" : "Kausta \"{dir}\" pole enam olemas",
- "Not enough free space" : "Pole piisavalt vaba ruumi",
- "Uploading …" : "Üleslaadminie ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{loadedSize} ({bitrate})",
- "Target folder does not exist any more" : "Sihtkataloogi pole enam olemas",
- "Error when assembling chunks, status code {status}" : "Tükkide kokkupanemise viga, staatus kood {status}",
- "Actions" : "Tegevused",
- "Rename" : "Nimeta ümber",
- "Copy" : "Kopeeri",
- "Delete file" : "Kustuta fail",
- "Delete folder" : "Kustuta kaust",
- "Disconnect storage" : "Ühenda andmehoidla lahti.",
+ "An unknown error has occurred" : "Tekkis tundmatu tõrge",
+ "File could not be uploaded" : "Faili üleslaadimine ebaõnnestus",
+ "Uploading …" : "Üleslaadmisel...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Üleslaadimisel… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Selle objekti üleslaadimine ei ole toetatud",
+ "Error when assembling chunks, status code {status}" : "Tükkide kokkupanemise viga, staatuskood {status}",
+ "Choose target folder" : "Vali sihtkaust",
+ "Set reminder" : "Lisa meeldetuletus",
+ "Edit locally" : "Muuda lokaalselt",
+ "Open" : "Ava",
"Could not load info for file \"{file}\"" : "Faili \"{file}\" info laadimine ebaõnnestus",
- "Files" : "Failid",
- "Details" : "Üksikasjad",
- "Select" : "Vali",
- "Pending" : "Ootel",
- "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
- "This operation is forbidden" : "See toiming on keelatud",
- "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga",
- "Could not move \"{file}\", target exists" : "\"{file}\" liigutamine ebaõnnestus, fail on juba olemas",
+ "Please select tag(s) to add to the selection" : "Palun vali sildid, mida valitutele lisada",
+ "Apply tag(s) to selection" : "Rakenda sildid valitutele",
+ "Select directory \"{dirName}\"" : "Vali kaust „{dirName}“",
+ "Select file \"{fileName}\"" : "Vali fail „{fileName}“",
+ "Unable to determine date" : "Kuupäeva tuvastamine ebaõnnestus",
+ "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval, palun kontrolli logifaile või võta ühendust administraatoriga",
+ "Could not move \"{file}\", target exists" : "\"{file}\" liigutamine ebaõnnestus, sihtfail on juba olemas",
"Could not move \"{file}\"" : "\"{file}\" liigutamine ebaõnnestus",
+ "copy" : "koopia",
"Could not copy \"{file}\", target exists" : "\"{file}\" kopeerimine ebaõnnestus, sihtfail on juba olemas",
"Could not copy \"{file}\"" : "\"{file}\" kopeerimine ebaõnnestus",
- "Copied {origin} inside {destination}" : "Kopeeris {origin} {destination} sisse",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopeeris {origin} ja {nbfiles} teist faili {destination} sisse",
+ "Copied {origin} inside {destination}" : "{origin} kopeeritud kausta {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ja {nbfiles} teist faili kopeeritud kausta {destination}",
"{newName} already exists" : "{newName} on juba olemas",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" ümbernimetamine ebaõnnestus, seda pole enam olemas",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on juba \"{dir}\" kaustas kasutusel. Palun valige teine nimi.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" ümbernimetamine ebaõnnestus",
"Could not create file \"{file}\"" : "Faili \"{file}\" loomine ebaõnnestus",
"Could not create file \"{file}\" because it already exists" : "Faili \"{file}\" loomine ebaõnnestus, sest see on juba olemas",
"Could not create folder \"{dir}\" because it already exists" : "Kausta \"{dir}\" loomine ebaõnnestus, sest see on juba olemas",
- "Error deleting file \"{fileName}\"." : "Tõrge faili \"{fileName}\" kustutamisel.",
+ "Could not fetch file details \"{file}\"" : "Ei õnnestunud laadida „{file}“ faili üksikasju",
+ "Error deleting file \"{fileName}\"." : "Viga „{fileName}“ faili kustutamisel.",
"No search results in other folders for {tag}{filter}{endtag}" : "Teistest kaustadest ei leitud {tag}{filter}{endtag}",
- "Name" : "Nimi",
- "Size" : "Suurus",
- "Modified" : "Muudetud",
- "_%n folder_::_%n folders_" : ["%n kataloog","%n kataloogi"],
- "_%n file_::_%n files_" : ["%n fail","%n faili"],
+ "Enter more than two characters to search in other folders" : "Teistest kaustadest otsimiseks sisesta rohkem kui kaks sümbolit",
"{dirs} and {files}" : "{dirs} ja {files}",
"_including %n hidden_::_including %n hidden_" : ["sealhulgas %n peidetud","sealhulgas %n peidetud"],
- "You don’t have permission to upload or create files here" : "Sul puuduvad õigused siia failide üleslaadimiseks või tekitamiseks",
+ "You do not have permission to upload or create files here" : "Sul pole luba siia faile lisada ja üles laadida",
"_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"],
"New" : "Uus",
- "{used} of {quota} used" : "Kasutatud {used}/{quota}",
- "{used} used" : "Kasutatud {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" on vigane failinimi.",
- "File name cannot be empty." : "Faili nimi ei saa olla tühi.",
- "\"/\" is not allowed inside a file name." : "\"/\" pole failinimedes lubatud.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" pole lubatud failitüüp",
- "View in folder" : "Vaata kaustas",
- "Copied!" : "Kopeeritud!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopeeri otselink (töötab ainult nende kasutajate jaoks, kelle on ligipääs sellele failile/kaustale)",
+ "New file/folder menu" : "Uue faili või kausta menüü",
+ "Select file range" : "Vali failivahemik",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} kasutusel",
+ "\"{name}\" is an invalid file name." : "„{name}“ on vigane failinimi.",
+ "File name cannot be empty." : "Failinimi ei saa olla tühi.",
+ "\"/\" is not allowed inside a file name." : "„/“ pole failinimedes lubatud.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ pole lubatud failitüüp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "„{mountPoint}“ grupikausta andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Väline andmeruum „{mountPoint}“ on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Sinu andmeruum on täis - faile ei saa enam uuendada ega sünkroniseerida!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Kasutaja {owner} andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "„{mountPoint}“ grupi andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Väline andmeruum „{mountPoint}“ on peaaegu täis ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Su andmeruum on peaaegu täis ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastab tingimusele „{filter}“","vastab tingimustele „{filter}“"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Otselink on kopeeritud (toimib ainult nende kasutajate puhul, kellel on ligipääs sellele failile/kaustale)",
"Path" : "Asukoht",
"_%n byte_::_%n bytes_" : ["%n bait","%n baiti"],
- "Favorited" : "Lemmikud",
- "Favorite" : "Lemmik",
- "New folder" : "Uus kaust",
- "Upload file" : "Lae fail üles",
- "Recent" : "Hiljutised",
- "Not favorited" : "Lemmikuks lisamata",
- "Remove from favorites" : "Eemalda lemmikutest",
- "Add to favorites" : "Lisa lemmikutesse",
+ "Favored" : "Märgitud lemmikuks",
+ "Favor" : "Märgi lemmikuks",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopeeri otselink (töötab ainult nende kasutajate puhul, kellel on ligipääs sellele failile/kaustale)",
+ "Upload file" : "Laadi fail üles",
+ "Not favored" : "Pole märgitud lemmikuks",
"An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
- "Added to favorites" : "Lemmikutesse lisatud",
- "Removed from favorites" : "Lemmikutest eemaldatud",
- "You added {file} to your favorites" : "{file} lemmikutesse lisatud",
- "You removed {file} from your favorites" : "{file} lemmikutest eemaldatud",
- "File changes" : "Failimuudatused",
- "Created by {user}" : "Kasutaja {user} poolt loodud",
- "Changed by {user}" : "Kasutaja {user} poolt muudetud",
- "Deleted by {user}" : "Kasutaja {user} poolt kustutatud",
- "Restored by {user}" : "Kasutaja {user} poolt taastatud",
- "Renamed by {user}" : "Kasutaja {user} poolt ümber nimetatud",
- "Moved by {user}" : "Kasutaja {user} liigutatud",
- "\"remote user\"" : "\"kaugkasutaja\"",
- "You created {file}" : "Sa lõid faili {file}",
- "{user} created {file}" : "Kasutaja {user} lõi faili {file}",
- "{file} was created in a public folder" : "{file} loodi avalikku kausta",
- "You changed {file}" : "Sa muutsid faili {file}",
- "{user} changed {file}" : "Kasutaja {user} muutis faili {file}",
- "You deleted {file}" : "Sa kustutasid faili {file}",
- "{user} deleted {file}" : "Kasutaja {user} kustutas faili {file}",
- "You restored {file}" : "Sa taastasid faili {file}",
- "{user} restored {file}" : "Kasutaja {user} taastas faili {file}",
- "You renamed {oldfile} to {newfile}" : "Sa nimetasid faili ümber: {oldfile} nüüd {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} nimetas faili ümber: {oldfile} nüüd {newfile}",
- "You moved {oldfile} to {newfile}" : "Sa liigutasid faili: {oldfile} nüüd {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} liigutas faili: {oldfile} nüüd {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "<strong>Lemmikutesse</strong> on lisatud või sealt eemaldatud fail",
- "A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
- "All files" : "Kõik failid",
- "Unlimited" : "Piiramatult",
"Upload (max. %s)" : "Üleslaadimine (max. %s)",
- "Accept" : "Nõustu",
- "Reject" : "Keeldu",
- "in %s" : "kaustas %s",
- "Change" : "Muuda",
- "Tags" : "Sildid",
- "Cancel" : "Loobu",
- "Create" : "Loo",
- "%s used" : "Kasutatud %s",
- "%1$s of %2$s used" : "Kasutatud %1$s/%2$s",
- "Settings" : "Seaded",
- "Show hidden files" : "Näita peidetud faile",
- "WebDAV" : "WebDAV",
- "No files in here" : "Siin ei ole faile",
- "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
- "No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
- "Select all" : "Vali kõik",
- "Upload too large" : "Üleslaadimine on liiga suur",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
- "No favorites yet" : "Lemmikuid veel pole",
- "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks",
- "Deleted files" : "Kustutatud failid",
- "Shares" : "Jagamisi",
- "Shared with others" : "Teistega jagatud",
- "Shared with you" : "Sinuga jagatud",
- "Shared by link" : "Jagatud lingiga",
- "Deleted shares" : "Kustutatud jagamised",
- "Pending shares" : "Ootel jagamised",
+ "\"{displayName}\" action executed successfully" : "Toiming õnnestus: „{displayName}“",
+ "\"{displayName}\" action failed" : "Tegevus ei õnnestunud: „{displayName}“",
+ "\"{displayName}\" failed on some elements" : "„{displayName}“ ei toiminud mõne objekti puhul",
+ "\"{displayName}\" batch action executed successfully" : "Pakktöötlus õnnestus: „{displayName}“",
+ "Submitting fields…" : "Saadan välju…",
+ "Filter filenames…" : "Otsi failinimesid…",
+ "WebDAV URL copied to clipboard" : "WebDAV-i võrguaadress on kopeeritud lõikelauale",
+ "Enable the grid view" : "Võta kasutusele ruudustikuvaade",
+ "Enable folder tree" : "Võta kasutusele kaustapuu",
+ "Copy to clipboard" : "Kopeeri lõikelauale",
+ "Use this address to access your Files via WebDAV" : "Oma failidele WebDAV-i kaudu ligipääsemiseks kasuta seda aadressi",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Kui sa oled kaheastmelise autentimise kasutusele võtnud, siis pead looma ja kasutama rakenduse uut salasõna klikates siia.",
+ "Deletion cancelled" : "Kustutamine on tühistatud",
+ "Move cancelled" : "Teisaldamine on katkestatud",
+ "Cancelled move or copy of \"{filename}\"." : "„{filename}“ faili teisaldamine või kopeerimine on katkestatud.",
+ "Cancelled move or copy operation" : "Teisaldamine või kopeerimine on katkestatud",
+ "Open details" : "Ava üksikasjad",
+ "Photos and images" : "Fotod ja pildid",
+ "New folder creation cancelled" : "Uue kausta loomine on katkestatud",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kaust","{folderCount} kausta"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fail","{fileCount} faili"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fail ja {folderCount} kaust","1 fail ja {folderCount} kausta"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fail ja 1 kaust","{fileCount} faili ja 1 kaust"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili ja {folderCount} kausta",
+ "All folders" : "Kõik kaustad",
+ "Personal Files" : "Isiklikud Failid",
"Text file" : "Tekstifail",
"New text file.txt" : "Uus tekstifail.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
- "Your storage is full, files can not be updated or synced anymore!" : "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
- "_matches '{filter}'_::_match '{filter}'_" : ["vastab '{filter}'","vastab '{filter}'"]
+ "%1$s (renamed)" : "%1$s (nimi on muudetud)",
+ "renamed file" : "muudetud nimega fail",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Kui võtad kasutusele Windowsiga ühilduvad failinimed, siis olemasolevad mitteühilduvaid faile ei saa enam muuta, aga faili omanik saab failinime muuta ühilduvaks.",
+ "Filter file names …" : "Otsi failinimesid…",
+ "Prevent warning dialogs from open or reenable them." : "Ära kasuta hoiatusteateid nende avamisel või uuesti kasutusele võtmisel.",
+ "Show a warning dialog when changing a file extension." : "Faililaiendi muutmisel näita hoiatust.",
+ "Speed up your Files experience with these quick shortcuts." : "Tee failirakenduse kasutamine kiiremaks nende kiirklahvidega.",
+ "Open the actions menu for a file" : "Ava failitoimingute menüü",
+ "Rename a file" : "Muuda failinime",
+ "Delete a file" : "Kustuta fail",
+ "Favorite or remove a file from favorites" : "Märgi fail lemmikuks või eemalda olek lemmikuna",
+ "Manage tags for a file" : "Halda failide silte",
+ "Deselect all files" : "Eemalda kõikide failide valik",
+ "Select or deselect a file" : "Vali fail või eemalda valik",
+ "Select a range of files" : "Vali mitu faili",
+ "Navigate to the parent folder" : "Mine ülakausta",
+ "Navigate to the file above" : "Liigu ülemise faili juurde",
+ "Navigate to the file below" : "Liigu alumise faili juurde",
+ "Navigate to the file on the left (in grid mode)" : "Liigu vasakpoolse faili juurde (ruudustikuvaates)",
+ "Navigate to the file on the right (in grid mode)" : "Liigu parempoolse faili juurde (ruudustikuvaates)",
+ "Toggle the grid view" : "Lülita ruudustikuvaade sisse/välja",
+ "Open the sidebar for a file" : "Ava faili külgriba"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index 37e0c6a79c0..fdc5c607a10 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Biltegia ez dago erabilgarri momentu honetan",
- "Storage invalid" : "Biltegi baliogabea",
- "Unknown error" : "Errore ezezaguna",
- "File could not be found" : "Ezin izan da fitxategia aurkitu",
- "Move or copy" : "Mugitu edo kopiatu",
- "Download" : "Deskargatu",
- "Delete" : "Ezabatu",
- "Home" : "Etxea",
- "Close" : "Itxi",
- "Favorites" : "Gogokoak",
- "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu",
- "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.",
- "Upload cancelled." : "Igoera bertan behera utzi da.",
- "Processing files …" : "Fitxategiak prozesatzen...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} kargatu karpeta bat delako edo 0 byte dituelako",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, {size1} kargatzen ari zara baina {size2} daude libre soilik",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" helburuko karpeta ez da existitzen jadanik",
- "Not enough free space" : "Ez dago leku libre nahikorik",
- "An unknown error has occurred" : "Errore ezezagun bat gertatu da",
- "Uploading …" : "Kargatzen...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Ez da onartzen elementu hori kargatzea",
- "Target folder does not exist any more" : "Helburuko karpeta ez da existitzen jadanik",
- "Operation is blocked by access control" : "Sarbide kontrolak eragiketa blokeatu du",
- "Error when assembling chunks, status code {status}" : "Errorea zatiak elkartzean, egoera kodea {status}",
- "Actions" : "Ekintzak",
- "Rename" : "Berrizendatu",
- "Copy" : "Kopiatu",
- "Choose target folder" : "Aukeratu helburuko karpeta",
- "Open" : "Ireki",
- "Delete file" : "Ezabatu fitxategia",
- "Delete folder" : "Ezabatu karpeta",
- "Disconnect storage" : "Deskonektatu biltegia",
- "Leave this share" : "Utzi partekatze hau",
- "Could not load info for file \"{file}\"" : "Ezin izan da \"{file}\" fitxategiaren informazioa kargatu",
- "Files" : "Fitxategiak",
- "Details" : "Xehetasunak",
- "Please select tag(s) to add to the selection" : "Hautatu etiketa(k) hautapenera gehitzeko",
- "Apply tag(s) to selection" : "Aplikatu etiketa(k) hautapenari",
- "Select" : "Hautatu",
- "Pending" : "Zain",
- "Unable to determine date" : "Ezin izan da data zehaztu",
- "This operation is forbidden" : "Eragiketa hau debekatuta dago",
- "This directory is unavailable, please check the logs or contact the administrator" : "Direktorio hau ez dago erabilgarri, egiaztatu egunkariak edo jarri administratzailearekin harremanetan",
- "Could not move \"{file}\", target exists" : "Ezin izan da \"{file}\" lekuz aldatu, helburua existitzen da jadanik",
- "Could not move \"{file}\"" : "Ezin izan da \"{file}\" lekuz aldatu",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Ezin izan da \"{file}\" kopiatu; helburua existitzen da",
- "Could not copy \"{file}\"" : "Ezin izan da \"{file}\" kopiatu",
- "Copied {origin} inside {destination}" : "{origin} {destination} barruan kopiatu da",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} eta beste {nbfiles} fitxategi {destination} barruan kopiatu dira",
- "{newName} already exists" : "{newName} existitzen da dagoeneko",
- "Could not rename \"{fileName}\", it does not exist any more" : "Ezin izan da \"{fileName}\" berrizendatu, ez da existitzen jada",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" izena dagoeneko erabiltzen da \"{dir}\" karpetan. Aukeratu beste izen bat.",
- "Could not rename \"{fileName}\"" : "Ezin izan da \"{fileName}\" berrizendatu ",
- "Could not create file \"{file}\"" : "Ezin izan da \"{file}\" fitxategia sortu",
- "Could not create file \"{file}\" because it already exists" : "Ezin izan da \"{file}\" fitxategia sortu, dagoeneko existitzen delako",
- "Could not create folder \"{dir}\" because it already exists" : "Ezin izan da \"{dir}\" karpeta sortu, dagoeneko existitzen delako",
- "Could not fetch file details \"{file}\"" : "Ezin izan dira \"{file}\" fitxategiaren xehetasunak eskuratu",
- "Error deleting file \"{fileName}\"." : "Errorea \"{fileName}\" fitxategia ezabatzerakoan.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ez da '{tag}{filter}{endtag}' bilaketarako emaitzarik aurkitu beste karpetetan",
- "Enter more than two characters to search in other folders" : "Sartu bi karaktere baino gehiago beste karpetetan bilatu ahal izateko",
- "Name" : "Izena",
- "Size" : "Tamaina",
- "Modified" : "Aldatuta",
- "_%n folder_::_%n folders_" : ["Karpeta %n","%n karpeta"],
- "_%n file_::_%n files_" : ["Fitxategi %n","%n fitxategi"],
- "{dirs} and {files}" : "{dirs} eta {files}",
- "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"],
- "You don’t have permission to upload or create files here" : "Ez duzu baimenik fitxategiak hona kargatu edo hemen sortzeko",
- "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi kargatzen"],
- "New" : "Berria",
- "Select file range" : "Hautatu fitxategi-barrutia",
- "{used} of {quota} used" : "{used} / {quota} erabilita",
- "{used} used" : "{used} erabilita",
- "\"{name}\" is an invalid file name." : "\"{name}\" fitxategi-izen baliogabea da.",
- "File name cannot be empty." : "Fitxategi-izena ezin da hutsa izan.",
- "\"/\" is not allowed inside a file name." : "\"/\" ez da onartzen fitxategi-izenen barnean.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" fitxategi-mota ez da onartzen",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira jada eguneratu edo sinkronizatu!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{MountPoint}\" taldeko karpeta beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{MountPoint}\" kanpoko biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Biltegiratzea beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-(r)en biltegia betetzear dago ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" talde karpeta betetzear dago ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" kanpoko biltegia betetzear dago ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Zure biltegia betetzear dago ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" emaitza","\"{filter}\" emaitza"],
- "View in folder" : "Ikusi karpetan",
- "Copied!" : "Kopiatua!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiatu esteka zuzena (fitxategi/karpeta honetara sarbidea duten erabiltzaileentzat bakarrik balio du)",
- "Path" : "Bidea",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Gogoko gisa markatua",
- "Favorite" : "Gogokoa",
- "You can only favorite a single file or folder at a time" : "Fitxategi edo karpeta bakarra markatu dezakezu gogoko gisa aldiko",
- "New folder" : "Karpeta berria",
- "Upload file" : "Kargatu fitxategia",
- "Recent" : "Azkenak",
- "Not favorited" : "Ez da gogokoa",
- "Remove from favorites" : "Kendu gogokoetatik",
- "Add to favorites" : "Gehitu gogokoetara",
- "An error occurred while trying to update the tags" : "Errore bat gertatu da etiketak eguneratzen saiatzean",
"Added to favorites" : "Gogokoetara gehitu da",
"Removed from favorites" : "Gogokoetatik kendu da",
"You added {file} to your favorites" : "{file} gehitu duzu gogokoetara",
"You removed {file} from your favorites" : "{file} kendu duzu gogokoetatik",
+ "Favorites" : "Gogokoak",
"File changes" : "Fitxategi aldaketak",
"Created by {user}" : "{user} erabiltzaileak sortua",
"Changed by {user}" : "{user} erabiltzaileak aldatua",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "{user} erabiltzaileak leheneratua",
"Renamed by {user}" : "{user} erabiltzaileak berrizendatua",
"Moved by {user}" : "{user} erabiltzaileak lekuz aldatua",
- "\"remote user\"" : "\"urruneko erabiltzailea\"",
+ "\"remote account\"" : "Urrutiko kontua",
"You created {file}" : "{file} sortu duzu",
"You created an encrypted file in {file}" : "{file} karpetan enkriptatutako fitxategi bat sortu duzu",
"{user} created {file}" : "{user} erabiltzaileak {file} sortu du",
@@ -143,78 +40,390 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "{oldfile} lekuz aldatu duzu {newfile}(e)ra",
"{user} moved {oldfile} to {newfile}" : "{user} erabiltzaileak {oldfile} lekuz aldatu du {newfile}(e)ra",
"A file has been added to or removed from your <strong>favorites</strong>" : "Fitxategi bat gehitu edo kendu da zure <strong>gogokoetatik</strong>",
+ "Files" : "Fitxategiak",
"A file or folder has been <strong>changed</strong>" : "Fitxategi edo karpeta bat <strong>aldatu da</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Gogoko fitxategi edo karpeta bat <strong>aldatu</strong> egin da.",
- "All files" : "Fitxategi guztiak",
- "Unlimited" : "Mugarik gabe",
- "Upload (max. %s)" : "Kargatu (%s gehienez)",
+ "Failed to authorize" : "Ezin izan da baimendu",
+ "Invalid folder path" : "Karpeta bide baliogabea",
+ "Folder not found" : "Ez da karpeta aurkitu",
+ "You do not have permission to create a file at the specified location" : "Ez duzu baimenik fitxategia sortzeko zehaztutako tokian",
+ "The file could not be converted." : "Fitxategia ezin izan da bihurtu.",
+ "Favorite files" : "Gogoko fitxategiak",
+ "No favorites" : "Gogokorik ez",
+ "More favorites" : "Gogoko gehiago",
"Accept" : "Onartu",
"Reject" : "Ukatu",
- "Incoming ownership transfer from {user}" : "{user}-ren jabetza-transferentzia",
+ "Incoming ownership transfer from {user}" : "{user}(r)en jabetza-transferentzia",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} onartu nahi duzu?\n\nOharra: onarpenaren ondoren transferentzia prozesuak ordu 1 iraun dezake.",
+ "Ownership transfer denied" : "Jabetza transferentzia ukatu egin da",
+ "Your ownership transfer of {path} was denied by {user}." : "{path}-ren zure jabetza-transferentzia {user} erabiltzaileak ukatu du",
"Ownership transfer failed" : "Jabetzaren transferentziak huts egin du",
- "Your ownership transfer of {path} to {user} failed." : "{path}-aren jabetza {user} erabiltzaileari transferitzeak huts egin du.",
- "The ownership transfer of {path} from {user} failed." : "{path}-ren jabetza {user} erabiltzailetik transferitzeak huts egin du.",
+ "Your ownership transfer of {path} to {user} failed." : "{path}(r)en jabetza {user} erabiltzaileari transferitzeak huts egin du.",
+ "The ownership transfer of {path} from {user} failed." : "{path}(r)ren jabetza {user} erabiltzailetik transferitzeak huts egin du.",
"Ownership transfer done" : "Jabetzaren transferentzia egina",
- "Your ownership transfer of {path} to {user} has completed." : "{path}-ren jabetza {user} erabiltzaileari transferitzea osatu da.",
- "The ownership transfer of {path} from {user} has completed." : "{path}-ren jabetza {user} erabiltzailetik transferitzea osatu da.",
- "in %s" : "%s-an",
+ "Your ownership transfer of {path} to {user} has completed." : "{path}(r)en jabetza {user} erabiltzaileari transferitzea osatu da.",
+ "The ownership transfer of {path} from {user} has completed." : "{path}(r)en jabetza {user} erabiltzailetik transferitzea osatu da.",
+ "in %s" : "%s(e)n",
+ "Transferred from %1$s on %2$s" : "%1$s(e)tik %2$s(e)n transferitua",
+ "Files compatibility" : "Fitxategien bateragarritasuna",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Baimendu fitxategi-izenak mugatzea, fitxategiak bezero guztiekin sinkroniza daitezkeela ziurtatzeko. Lehenespenez POSIX-en balio duten fitxategi-izen guztiak (adibidez, Linux edo macOS) onartzen dira.",
+ "Enforce Windows compatibility" : "Ezarri Windows bateragarritasuna",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Honek Windows sistemetan balio ez duten fitxategi-izenak blokeatuko ditu, adibidez, izen erreserbatuak edo karaktere bereziak erabiltzea. Baina honek ez du maiuskulak eta minuskulak bereizteko bateragarritasuna beteko.",
"File Management" : "Fitxategi-kudeaketa",
- "Transfer ownership of a file or folder" : "Transferitu fitxategiaren edo karpetaren jabetza",
- "Choose file or folder to transfer" : "Aukeratu fitxategia edo karpeta transferitzeko",
- "Change" : "Aldatu",
- "New owner" : "Jabe berria",
- "Search users" : "Bilatu erabiltzaileak",
+ "Home" : "Etxea",
+ "Target folder does not exist any more" : "Helburuko karpeta ez da existitzen jadanik",
+ "Reload current directory" : "Birkargatu uneko direktorioa",
+ "Go to the \"{dir}\" directory" : "Joan \"{dir}\" direktoriora",
+ "Current directory path" : "Uneko direktorio-bidea",
+ "Your have used your space quota and cannot upload files anymore" : "Zure espazio-kuota erabili duzu eta ezin duzu fitxategi gehiago kargatu",
+ "Drag and drop files here to upload" : "Jaregin fitxategiak hemen igotzeko",
+ "Favorite" : "Gogokoa",
+ "Back" : "Itzuli",
+ "Toggle selection for file \"{displayName}\"" : "Ordeztu hautatutakoa \"{displayName}\" fitxategiarekin",
+ "Toggle selection for folder \"{displayName}\"" : "Ordeztu hautatutakoa \"{displayName}\" karpetarekin",
+ "File is loading" : "Fitxategia kargatzen ari da",
+ "Folder is loading" : "Karpeta kargatzen ari da",
+ "Filename" : "Fitxategi-izena",
+ "Folder name" : "Karpetaren izena",
+ "This node is unavailable" : "Nodo hori ez dago erabilgarri",
+ "Another entry with the same name already exists." : "Izen bereko beste sarrera bat badago jada.",
+ "Invalid filename." : "Fitxategi-izen baliogabea.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" \"{newName}\"(e)ra berrizendatu da.",
+ "Rename file" : "Berrizendatu fitxategia",
+ "Folder" : "Karpeta",
+ "Pending" : "Zain",
+ "Unknown date" : "Data ezezaguna",
+ "Clear filter" : "Garbitu iragazkia",
+ "Modified" : "Aldatuta",
+ "Search everywhere" : "Bilatu nonahi",
+ "Type" : "Mota",
+ "Active filters" : "Iragazki aktiboak",
+ "Remove filter" : "Kendu iragazkia",
+ "Total rows summary" : "Errenkaden guztirako laburpena",
+ "Toggle selection for all files and folders" : "Ordeztu hautatutako fitxategi eta karpeta guztiak",
+ "Name" : "Izena",
+ "Size" : "Tamaina",
+ "Actions" : "Ekintzak",
+ "(selected)" : "(hautatuta)",
+ "List of files and folders." : "Fitxategi eta karpeten zerrenda.",
+ "You have used your space quota and cannot upload files anymore." : "Zure espazio-kuota erabili duzu eta ezin duzu fitxategi gehiago kargatu.",
+ "Column headers with buttons are sortable." : "Botoiak dituzten zutabeen goiburuak ordena daitezke.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
+ "File not found" : "Ez da fitxategia aurkitu",
+ "_{count} selected_::_{count} selected_" : ["{count} hautatuta","{count} hautatuta"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
+ "{used} of {quota} used" : "{used} / {quota} erabilita",
+ "{relative}% used" : "%{relative} erabilita",
+ "Could not refresh storage stats" : "Ezin izan da biltegiratze maila freskatu",
+ "Your storage is full, files can not be updated or synced anymore!" : "Zure biltegia beteta dago, ezin duzu fitxategirik igo edo sinkronizatu jada!",
+ "Storage information" : "Biltegiaren informazioa",
+ "Storage quota" : "Biltegiratze-kuota",
+ "New folder" : "Karpeta berria",
+ "Create new folder" : "Sortu karpeta berria",
+ "This name is already in use." : "Izen hau dagoeneko erabiltzen ari da.",
+ "Create" : "Sortu",
+ "Fill template fields" : "Bete txantiloien eremuak",
+ "Submit" : "Bidali",
"Choose a file or folder to transfer" : "Aukeratu fitxategi edo karpeta bat transferitzeko",
"Transfer" : "Transferitu",
"Transfer {path} to {userid}" : "Transfereritu {path} {userid} erabiltzaileari",
"Invalid path selected" : "Bide baliogabea hautatuta",
+ "Unknown error" : "Errore ezezaguna",
"Ownership transfer request sent" : "Jabetza transferentzia eskaera bidalita",
- "Cannot transfer ownership of a file or folder you don't own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu",
- "Tags" : "Etiketak",
- "Unable to change the favourite state of the file" : "Ezinezkoa fitxategiaren gogoko egoera aldatzea",
- "Error while loading the file data" : "Errorea fitxategiaren datuak kargatzerakoan",
- "Pick a template for {name}" : "Hautatu {name}-ren txantiloia",
- "Cancel" : "Utzi",
- "Create" : "Sortu",
- "Create a new file with the selected template" : "Sortu fitxategi berria hautatutako txantiloiarekin",
- "Creating file" : "Fitxategia sortzen",
- "Blank" : "Hutsik",
- "Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
- "Set up templates folder" : "Konfiguratu txantiloien karpeta",
- "Templates" : "Txantiloia",
- "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu",
- "%s used" : "%s erabilita",
- "%s%% of %s used" : "%s%% / %s erabilita",
- "%1$s of %2$s used" : "%1$s / %2$s erabilita",
- "Settings" : "Ezarpenak",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu",
+ "Transfer ownership of a file or folder" : "Transferitu fitxategiaren edo karpetaren jabetza",
+ "Choose file or folder to transfer" : "Aukeratu fitxategia edo karpeta transferitzeko",
+ "Change" : "Aldatu",
+ "New owner" : "Jabe berria",
+ "Use {new}" : "Erabili {new}",
+ "Remove extension" : "Kendu luzapena",
+ "Change file extension" : "Aldatu fitxategiaren luzapena",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Fitxategiaren luzapena «{old}»(e)tik «{new}»(e)ra aldatzeak irakurezin bihur dezake.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "«{old}» fitxategiaren luzapena kentzeak fitxategia irakurezin bihur dezake.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "«{new}» fitxategiaren luzapena gehitzeak fitxategia irakurezin bihur dezake.",
+ "Select file or folder to link to" : "Hautatu estekatzeko fitxategia edo karpeta",
+ "Choose {file}" : "Aukeratu {file}",
+ "Share" : "Partekatu",
+ "Shared by link" : "Esteka bidez partekatuta",
+ "Shared" : "Partekatuta",
+ "Switch to list view" : "Aldatu zerrenda ikuspegira",
+ "Switch to grid view" : "Aldatu sareta ikuspegira",
+ "Upload was cancelled by user" : "Igoera bertan behera utzi du erabiltzaileak",
+ "Not enough free space" : "Ez dago leku libre nahikorik",
+ "Operation is blocked by access control" : "Sarbide kontrolak eragiketa blokeatu du",
+ "Error during upload: {message}" : "Errorea igotzean: {message}",
+ "Error during upload, status code {status}" : "Errore bat gertatu da igotzean, {status} egoera kodea",
+ "Unknown error during upload" : "Errore ezezaguna igotzean",
+ "Loading current folder" : "Uneko karpeta kargatzen",
+ "Retry" : "saiatu berriro",
+ "No files in here" : "Ez dago fitxategirik hemen",
+ "Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
+ "Go back" : "Atzera",
+ "Views" : "Ikuspegiak",
+ "Files settings" : "FItxategien ezarpenak",
+ "Your files" : "Zure fitxategiak",
+ "Open in files" : "Ireki Fitxategiak aplikazioan",
+ "File cannot be accessed" : "Ezin da fitxategia atzitu",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Ezin izan da fitxategia aurkitu edo ez duzu ikusteko baimenik. Eskatu bidaltzaileari partekatzeko.",
+ "Clipboard is not available" : "Arbela ez dago erabilgarri",
+ "General" : "Orokorra",
+ "All files" : "Fitxategi guztiak",
+ "Personal files" : "Fitxategi pertsonalak",
+ "Sort favorites first" : "Ordenatu gogokoak lehenengo",
+ "Sort folders before files" : "Ordenatu karpetak fitxategien aurretik",
+ "Appearance" : "Itxura",
"Show hidden files" : "Erakutsi ezkutuko fitxategiak",
"Crop image previews" : "Moztu irudien aurrebistak",
+ "Additional settings" : "Ezarpen gehiago",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
- "Toggle %1$s sublist" : "Txandakatu %1$sazpizerrenda",
+ "WebDAV URL" : "WebDAV URLa",
+ "Copy" : "Kopiatu",
+ "Keyboard shortcuts" : "Teklatuaren lasterbideak",
+ "File actions" : "Fitxategi ekintzak",
+ "Rename" : "Berrizendatu",
+ "Delete" : "Ezabatu",
+ "Manage tags" : "Kudeatu etiketak",
+ "Selection" : "Hautapena",
+ "Select all files" : "Fitxategi guztiak aukeratu",
+ "Deselect all" : "Deshautatu dena",
+ "Navigation" : "Nabigazioa",
+ "View" : "Ikusi",
"Toggle grid view" : "Txandakatu sareta ikuspegia",
- "No files in here" : "Ez dago fitxategirik hemen",
- "Upload some content or sync with your devices!" : "Kargatu edukiren bat edo sinkronizatu zure gailuekin!",
- "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
- "Select all" : "Hautatu dena",
- "Upload too large" : "Kargatzea handiegia da",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kargatzen saiatzen ari zaren fitxategiek zerbitzari honek onartzen duen gehienezko tamaina gainditzen dute.",
+ "Show those shortcuts" : "Erakutsi lasterbide horiek",
+ "You" : "Zu ",
+ "Shared multiple times with different people" : "Hainbat aldiz partekatua pertsona ezberdinekin",
+ "Error while loading the file data" : "Errorea fitxategiaren datuak kargatzerakoan",
+ "Owner" : "Jabea",
+ "Remove from favorites" : "Kendu gogokoetatik",
+ "Add to favorites" : "Gehitu gogokoetara",
+ "Tags" : "Etiketak",
+ "Blank" : "Hutsik",
+ "Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
+ "Pick a template for {name}" : "Hautatu {name}(r)entzako txantiloia",
+ "Create a new file with the selected template" : "Sortu fitxategi berria hautatutako txantiloiarekin",
+ "Creating file" : "Fitxategia sortzen",
+ "Leave this share" : "Utzi partekatze hau",
+ "Leave these shares" : "Utzi partekatze hauek",
+ "Disconnect storage" : "Deskonektatu biltegia",
+ "Disconnect storages" : "Deskonektatu biltegiak",
+ "Delete permanently" : "Ezabatu betirako",
+ "Delete and unshare" : "Ezabatu eta kendu partekatzea",
+ "Delete file" : "Fitxategia ezabatu",
+ "Delete files" : "Ezabatu fitxategiak",
+ "Delete folder" : "Ezabatu karpeta",
+ "Delete folders" : "Ezabatu karpetak",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Elementu {count} betiko ezabatzera zoaz","{count} elementu betiko ezabatzera zoaz"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Elementu {count} ezabatzera zoaz"," {count} elementu ezabatzera zoaz"],
+ "Confirm deletion" : "Berretsi ezabaketa",
+ "Cancel" : "Utzi",
+ "Download" : "Deskargatu",
+ "Moving \"{source}\" to \"{destination}\" …" : "«{source}» «{destination}»(e)ra mugitzen",
+ "Copying \"{source}\" to \"{destination}\" …" : "«{source}» «{destination}»(e)ra mugitzen",
+ "Destination is not a folder" : "Helburua ez da karpeta bat",
+ "This file/folder is already in that directory" : "Fitxategi/karpeta hau dagoeneko karpeta horretan dago",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Ezin duzu fitxategi/karpeta bat berera edo bere azpikarpeta batera mugitu",
+ "(copy)" : "(kopiatu)",
+ "(copy %n)" : "(kopiatu %n)",
+ "A file or folder with that name already exists in this folder" : "Izen hori duen fitxategi edo karpeta bat dago karpena honetan",
+ "The files are locked" : "Fitxategiak blokeatuta daude",
+ "The file does not exist anymore" : "Fitxategia ez da existizen dagoeneko",
+ "Choose destination" : "Aukeratu helburua",
+ "Copy to {target}" : "Kopiatu hona: {target}",
+ "Move to {target}" : "Mugitu hona: {target}",
+ "Move" : "Mugitu",
+ "Move or copy operation failed" : "Mugitzeko edo kopiatzeko eragiketak huts egin du",
+ "Move or copy" : "Mugitu edo kopiatu",
+ "Open folder {displayName}" : "Ireki {displayName} karpeta",
+ "Open in Files" : "Ireki Fitxategiak aplikazioan",
+ "Open locally" : "Ireki lokalean",
+ "Failed to redirect to client" : "Bezerora birbideratzeak huts egin du",
+ "Open file locally" : "Ireki fitxategia lokalean",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Fitxategia orain zure gailuan ireki beharko litzateke. Hala ez bada, egiaztatu mahaigaineko aplikazioa instalatuta duzula.",
+ "Retry and close" : "Saiatu berriro eta itxi",
+ "Details" : "Xehetasunak",
+ "View in folder" : "Ikusi karpetan",
+ "Today" : "Gaur",
+ "Last 7 days" : "Azken 7 egunetan",
+ "Last 30 days" : "Azken 30 egunetan",
+ "This year ({year})" : "Aurten ({year})",
+ "Last year ({year})" : "Iaz ({year})",
+ "Documents" : "Dokumentuak",
+ "Spreadsheets" : "kalkulu-orriak",
+ "Presentations" : "Aurkezpenak",
+ "PDFs" : "PDFak",
+ "Folders" : "Karpetak",
+ "Audio" : "Audio",
+ "Images" : "Irudiak",
+ "Videos" : "Bideoak",
+ "Created new folder \"{name}\"" : "\"{name}\" karpeta berria sortu da",
+ "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu",
+ "Create templates folder" : "Sortu txantiloien karpeta",
+ "Templates" : "Txantiloiak",
+ "New template folder" : "Txantiloien karpeta berria",
+ "In folder" : "Karpetan",
+ "Search in folder: {folder}" : "Bilatu {folder} karpetan",
+ "One of the dropped files could not be processed" : "Jaregindako fitxategietako bat ezin izan da prozesatu",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Zure nabigatzaileak ez du Filesystem APIa onartzen. Direktorioak ez dira igoko",
+ "No files to upload" : "Ez dago igotzeko fitxategirik",
+ "Unable to create the directory {directory}" : "Ezin da {directory} direktorioa sortu",
+ "Some files could not be uploaded" : "Fitxategi batzuk ezin izan dira igo",
+ "Files uploaded successfully" : "Fitxategiak behar bezala igo dira",
+ "No files to process" : "Ez dago prozesatzeko fitxategirik",
+ "Some files could not be copied" : "Fitxategi batzuk ezin izan dira kopiatu",
+ "Some files could not be moved" : "Fitxategi batzuk ezin izan dira mugitu",
+ "Files copied successfully" : "Fitxategiak behar bezala kopiatu dira",
+ "Files moved successfully" : "Fitxategiak behar bezala mugitu dira",
+ "Conflicts resolution skipped" : "Gatazkak konpontzea saihestu da",
+ "Upload cancelled" : "Igotzea bertan behera utzi da",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Ezin izan da \"{oldName}\" berrizendatu, ez da existitzen dagoeneko",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" izena \"{dir}\" karpetan dagoeneko erabiltzen da. Mesedez aukeratu beste izen bat.",
+ "Could not rename \"{oldName}\"" : "Ezin izan da \"{oldName}\" berrizendatu ",
+ "This operation is forbidden" : "Eragiketa hau debekatuta dago",
+ "Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
+ "Unexpected error: {error}" : "Ustekabeko errorea: {error}",
+ "_%n file_::_%n files_" : ["Fitxategi %n","%n fitxategi"],
+ "_%n folder_::_%n folders_" : ["Karpeta %n","%n karpeta"],
+ "Filename must not be empty." : "Fitxategi-izenak ez du hutsik egon behar.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ez da onartzen fitxategi-izen baten barruan.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" izen erreserbatua da eta ez da onartzen fitxategi-izenetan.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" fitxategi mota ez dago baimenduta.",
+ "Filenames must not end with \"{extension}\"." : "Fitxategi-izenak ez dira \"{extension}\"rekin amaitu behar..",
+ "List of favorite files and folders." : "Gogoko fitxategi eta karpeten zerrenda.",
"No favorites yet" : "Gogokorik ez oraindik",
"Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpetak hemen agertuko dira",
- "Deleted files" : "Ezabatutako fitxategiak",
- "Shares" : "Partekatzeak",
- "Shared with others" : "Besteekin partekatuta",
- "Shared with you" : "Zurekin partekatuta",
- "Shared by link" : "Partekatua esteka bidez",
- "Deleted shares" : "Ezabatutako partekatzeak",
- "Pending shares" : "Zain dauden partekatzeak",
+ "List of your files and folders." : "Zure fitxategi eta karpeten zerrenda.",
+ "List of your files and folders that are not shared." : "Partekatu ez diren zure fitxategi eta karpeten zerrenda.",
+ "No personal files found" : "Ez dago fitxategi pertsonalik",
+ "Files that are not shared will show up here." : "Partekatu ez dituzun fitxategiak hemen agertuko dira",
+ "Recent" : "Azkenak",
+ "List of recently modified files and folders." : "Azkenaldian aldatutako fitxategi eta karpeten zerrenda.",
+ "No recently modified files" : "Ez dago azkenaldian aldatutako fitxategirik",
+ "Files and folders you recently modified will show up here." : "Azkenaldian aldatu dituzun fitxategi eta karpetak hemen agertuko dira.",
+ "Search" : "Bilatu",
+ "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
+ "Select all" : "Hautatu dena",
+ "Upload too large" : "Igotzekoa handiegia da",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiek zerbitzari honek onartzen duen gehienezko tamaina gainditzen dute.",
+ "File could not be found" : "Ezin izan da fitxategia aurkitu",
+ "Show list view" : "Erakutsi zerrenda ikuspegia",
+ "Show grid view" : "Erakutsi sareta ikuspegia",
+ "Close" : "Itxi",
+ "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu",
+ "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.",
+ "Upload cancelled." : "Igotzea bertan behera utzi da.",
+ "Processing files …" : "Fitxategiak prozesatzen...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, {size1} igotzen ari zara baina {size2} soilik daude libre",
+ "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" helburuko karpeta ez da existitzen jadanik",
+ "An unknown error has occurred" : "Errore ezezagun bat gertatu da",
+ "File could not be uploaded" : "Fitxategia ezin izan da igo",
+ "Uploading …" : "Igotzen...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Igotzen … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ez da onartzen elementu hori igotzea",
+ "Error when assembling chunks, status code {status}" : "Errorea zatiak elkartzean, egoera kodea {status}",
+ "Choose target folder" : "Aukeratu helburuko karpeta",
+ "Set reminder" : "Ezarri gogorarazpena",
+ "Edit locally" : "Editatu lokalean",
+ "Open" : "Ireki",
+ "Could not load info for file \"{file}\"" : "Ezin izan da \"{file}\" fitxategiaren informazioa kargatu",
+ "Please select tag(s) to add to the selection" : "Hautatu etiketa(k) hautapenera gehitzeko",
+ "Apply tag(s) to selection" : "Aplikatu etiketa(k) hautapenari",
+ "Select directory \"{dirName}\"" : "Hautatu \"{dirName}\" direktorioa",
+ "Select file \"{fileName}\"" : "Hautatu \"{fileName}\" fitxategia",
+ "Unable to determine date" : "Ezin izan da data zehaztu",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Direktorio hau ez dago erabilgarri, egiaztatu egunkariak edo jarri administratzailearekin harremanetan",
+ "Could not move \"{file}\", target exists" : "Ezin izan da \"{file}\" lekuz aldatu, helburua existitzen da jadanik",
+ "Could not move \"{file}\"" : "Ezin izan da \"{file}\" lekuz aldatu",
+ "copy" : "kopiatu",
+ "Could not copy \"{file}\", target exists" : "Ezin izan da \"{file}\" kopiatu; helburua existitzen da",
+ "Could not copy \"{file}\"" : "Ezin izan da \"{file}\" kopiatu",
+ "Copied {origin} inside {destination}" : "{origin} kopiatu da {destination} barruan",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} eta beste {nbfiles} fitxategi {destination} barruan kopiatu dira",
+ "{newName} already exists" : "{newName} existitzen da dagoeneko",
+ "Could not create file \"{file}\"" : "Ezin izan da \"{file}\" fitxategia sortu",
+ "Could not create file \"{file}\" because it already exists" : "Ezin izan da \"{file}\" fitxategia sortu, dagoeneko existitzen delako",
+ "Could not create folder \"{dir}\" because it already exists" : "Ezin izan da \"{dir}\" karpeta sortu, dagoeneko existitzen delako",
+ "Could not fetch file details \"{file}\"" : "Ezin izan dira \"{file}\" fitxategiaren xehetasunak eskuratu",
+ "Error deleting file \"{fileName}\"." : "Errorea \"{fileName}\" fitxategia ezabatzerakoan.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ez da '{tag}{filter}{endtag}' bilaketarako emaitzarik aurkitu beste karpetetan",
+ "Enter more than two characters to search in other folders" : "Sartu bi karaktere baino gehiago beste karpetetan bilatu ahal izateko",
+ "{dirs} and {files}" : "{dirs} eta {files}",
+ "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"],
+ "You do not have permission to upload or create files here" : "Ez duzu hemen fitxategiak igotzeko edo sortzeko baimenik",
+ "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi igotzen"],
+ "New" : "Berria",
+ "New file/folder menu" : "Fitxategi/karpeta berri menua",
+ "Select file range" : "Hautatu fitxategi-barrutia",
+ "{used}%" : "%{used}",
+ "{used} used" : "{used} erabilita",
+ "\"{name}\" is an invalid file name." : "\"{name}\" fitxategi-izen baliogabea da.",
+ "File name cannot be empty." : "Fitxategi-izena ezin da hutsa izan.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ez da onartzen fitxategi-izenen barnean.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" fitxategi-mota ez da onartzen",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira jada eguneratu edo sinkronizatu!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" taldeko karpeta beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" kanpoko biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Zure biltegiratzea beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-(r)en biltegia betetzear dago ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" talde karpeta betetzear dago ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" kanpoko biltegia betetzear dago ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Zure biltegia betetzear dago ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" emaitza","\"{filter}\" emaitza"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Esteka zuzena kopiatu da (fitxategi/karpeta honetara sarbidea dutenentzat bakarrik balio du)",
+ "Path" : "Bidea",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
+ "Favored" : "Mesedetua",
+ "Favor" : "Mesedea",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiatu esteka zuzena (fitxategi/karpeta honetara sarbidea dutenentzat bakarrik balio du)",
+ "Upload file" : "Igo fitxategia",
+ "Not favored" : "Mesedetu gabe",
+ "An error occurred while trying to update the tags" : "Errore bat gertatu da etiketak eguneratzen saiatzean",
+ "Upload (max. %s)" : "Igo (%s gehienez)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ekintza behar bezala exekutatu da",
+ "\"{displayName}\" action failed" : "\"{displayName}\" ekintzak huts egin du",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" multzoko ekintza behar bezala exekutatu da",
+ "Submitting fields…" : "Eremuak bidaltzen…",
+ "Filter filenames…" : "Iragazi fitxategi-izenak...",
+ "WebDAV URL copied to clipboard" : "WebDAV URLa arbelean kopiatu da",
+ "Enable the grid view" : "Gaitu sareta ikuspegira",
+ "Enable folder tree" : "Gaitu karpeta-zuhaitza",
+ "Copy to clipboard" : "Kopiatu arbelera",
+ "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
+ "Deletion cancelled" : "Ezabatzea bertan behera utzi da",
+ "Move cancelled" : "Mugimendua bertan behera utzi da",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\" -ren mugimendua edo kopia bertan behera utzi da.",
+ "Cancelled move or copy operation" : "Mugitze edo kopiatze operazioa utzi da",
+ "Open details" : "Ireki xehetasunak",
+ "Photos and images" : "Argazkiak eta irudiak",
+ "New folder creation cancelled" : "Karpeta berrien sorrera bertan behera utzi da",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["Karpeta {folderCount}","{folderCount} karpeta"],
+ "_{fileCount} file_::_{fileCount} files_" : ["Fitxategi {fileCount}","{fileCount} fitxategi"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["Fitxategi 1 eta karpeta {folderCount}","Fitxategi 1 eta {folderCount} karpeta"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["Fitxategi {fileCount} eta karpeta 1","{fileCount} fitxategi eta karpeta 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fitxategi eta {folderCount} fitxategi",
+ "All folders" : "Karpeta guztiak",
+ "Personal Files" : "Fitxategi pertsonalak",
"Text file" : "Testu-fitxategia",
"New text file.txt" : "Testu-fitxategi berria.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu jada!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" talde karpeta beteta dago, ezin da fitxategirik eguneratu edo sinkronizatu gehiago!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" kanpoko biltegia beteta dago, ezin da fitxategirik eguneratu edo sinkronizatu gehiago!",
- "Your storage is full, files can not be updated or synced anymore!" : "Zure biltegia beteta dago, ezin duzu fitxategirik igo edo sinkronizatu jada!",
- "_matches '{filter}'_::_match '{filter}'_" : ["bat dator '{filter}' iragazkiarekin","bat datoz '{filter}' iragazkiarekin"]
+ "Speed up your Files experience with these quick shortcuts." : "Azkartu zure Fitxategi esperientzia lasterbide bizkor hauekin",
+ "Open the actions menu for a file" : "Ireki ekintza menua fitxategi baterako",
+ "Rename a file" : "Fitxategi bat berrizendatu",
+ "Delete a file" : "Fitxategi bat ezabatu",
+ "Favorite or remove a file from favorites" : "Fitxategi bat gustoko bihurtu edo gustoko izateari utzi",
+ "Manage tags for a file" : "Fitxategi baten etiketak kudeatu",
+ "Deselect all files" : "Fitxategi guztiak desaukeratu",
+ "Select or deselect a file" : "Fitxategi bat aukeratu edo desaukeratu",
+ "Select a range of files" : "Fitxategi-hein bat aukeratu",
+ "Navigate to the parent folder" : "Nabigatu guraso karpetara",
+ "Navigate to the file above" : "Nabigatu goiko fitxategira",
+ "Navigate to the file below" : "Nabigatu azpiko fitxategira",
+ "Navigate to the file on the left (in grid mode)" : "Nabigatu ezkerreko fitxategira (sareta moduan)",
+ "Navigate to the file on the right (in grid mode)" : "Nabigatu eskuineko fitxategira (sareta moduan)",
+ "Toggle the grid view" : "Txandakatu sareta ikuspegia",
+ "Open the sidebar for a file" : "Ireki alboko barra fitxategi baterako"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index 3ba2637a549..c8b68ddaaf1 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Biltegia ez dago erabilgarri momentu honetan",
- "Storage invalid" : "Biltegi baliogabea",
- "Unknown error" : "Errore ezezaguna",
- "File could not be found" : "Ezin izan da fitxategia aurkitu",
- "Move or copy" : "Mugitu edo kopiatu",
- "Download" : "Deskargatu",
- "Delete" : "Ezabatu",
- "Home" : "Etxea",
- "Close" : "Itxi",
- "Favorites" : "Gogokoak",
- "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu",
- "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.",
- "Upload cancelled." : "Igoera bertan behera utzi da.",
- "Processing files …" : "Fitxategiak prozesatzen...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} kargatu karpeta bat delako edo 0 byte dituelako",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, {size1} kargatzen ari zara baina {size2} daude libre soilik",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" helburuko karpeta ez da existitzen jadanik",
- "Not enough free space" : "Ez dago leku libre nahikorik",
- "An unknown error has occurred" : "Errore ezezagun bat gertatu da",
- "Uploading …" : "Kargatzen...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Ez da onartzen elementu hori kargatzea",
- "Target folder does not exist any more" : "Helburuko karpeta ez da existitzen jadanik",
- "Operation is blocked by access control" : "Sarbide kontrolak eragiketa blokeatu du",
- "Error when assembling chunks, status code {status}" : "Errorea zatiak elkartzean, egoera kodea {status}",
- "Actions" : "Ekintzak",
- "Rename" : "Berrizendatu",
- "Copy" : "Kopiatu",
- "Choose target folder" : "Aukeratu helburuko karpeta",
- "Open" : "Ireki",
- "Delete file" : "Ezabatu fitxategia",
- "Delete folder" : "Ezabatu karpeta",
- "Disconnect storage" : "Deskonektatu biltegia",
- "Leave this share" : "Utzi partekatze hau",
- "Could not load info for file \"{file}\"" : "Ezin izan da \"{file}\" fitxategiaren informazioa kargatu",
- "Files" : "Fitxategiak",
- "Details" : "Xehetasunak",
- "Please select tag(s) to add to the selection" : "Hautatu etiketa(k) hautapenera gehitzeko",
- "Apply tag(s) to selection" : "Aplikatu etiketa(k) hautapenari",
- "Select" : "Hautatu",
- "Pending" : "Zain",
- "Unable to determine date" : "Ezin izan da data zehaztu",
- "This operation is forbidden" : "Eragiketa hau debekatuta dago",
- "This directory is unavailable, please check the logs or contact the administrator" : "Direktorio hau ez dago erabilgarri, egiaztatu egunkariak edo jarri administratzailearekin harremanetan",
- "Could not move \"{file}\", target exists" : "Ezin izan da \"{file}\" lekuz aldatu, helburua existitzen da jadanik",
- "Could not move \"{file}\"" : "Ezin izan da \"{file}\" lekuz aldatu",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Ezin izan da \"{file}\" kopiatu; helburua existitzen da",
- "Could not copy \"{file}\"" : "Ezin izan da \"{file}\" kopiatu",
- "Copied {origin} inside {destination}" : "{origin} {destination} barruan kopiatu da",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} eta beste {nbfiles} fitxategi {destination} barruan kopiatu dira",
- "{newName} already exists" : "{newName} existitzen da dagoeneko",
- "Could not rename \"{fileName}\", it does not exist any more" : "Ezin izan da \"{fileName}\" berrizendatu, ez da existitzen jada",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" izena dagoeneko erabiltzen da \"{dir}\" karpetan. Aukeratu beste izen bat.",
- "Could not rename \"{fileName}\"" : "Ezin izan da \"{fileName}\" berrizendatu ",
- "Could not create file \"{file}\"" : "Ezin izan da \"{file}\" fitxategia sortu",
- "Could not create file \"{file}\" because it already exists" : "Ezin izan da \"{file}\" fitxategia sortu, dagoeneko existitzen delako",
- "Could not create folder \"{dir}\" because it already exists" : "Ezin izan da \"{dir}\" karpeta sortu, dagoeneko existitzen delako",
- "Could not fetch file details \"{file}\"" : "Ezin izan dira \"{file}\" fitxategiaren xehetasunak eskuratu",
- "Error deleting file \"{fileName}\"." : "Errorea \"{fileName}\" fitxategia ezabatzerakoan.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ez da '{tag}{filter}{endtag}' bilaketarako emaitzarik aurkitu beste karpetetan",
- "Enter more than two characters to search in other folders" : "Sartu bi karaktere baino gehiago beste karpetetan bilatu ahal izateko",
- "Name" : "Izena",
- "Size" : "Tamaina",
- "Modified" : "Aldatuta",
- "_%n folder_::_%n folders_" : ["Karpeta %n","%n karpeta"],
- "_%n file_::_%n files_" : ["Fitxategi %n","%n fitxategi"],
- "{dirs} and {files}" : "{dirs} eta {files}",
- "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"],
- "You don’t have permission to upload or create files here" : "Ez duzu baimenik fitxategiak hona kargatu edo hemen sortzeko",
- "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi kargatzen"],
- "New" : "Berria",
- "Select file range" : "Hautatu fitxategi-barrutia",
- "{used} of {quota} used" : "{used} / {quota} erabilita",
- "{used} used" : "{used} erabilita",
- "\"{name}\" is an invalid file name." : "\"{name}\" fitxategi-izen baliogabea da.",
- "File name cannot be empty." : "Fitxategi-izena ezin da hutsa izan.",
- "\"/\" is not allowed inside a file name." : "\"/\" ez da onartzen fitxategi-izenen barnean.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" fitxategi-mota ez da onartzen",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira jada eguneratu edo sinkronizatu!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{MountPoint}\" taldeko karpeta beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{MountPoint}\" kanpoko biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Biltegiratzea beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu gehiago!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-(r)en biltegia betetzear dago ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" talde karpeta betetzear dago ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" kanpoko biltegia betetzear dago ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Zure biltegia betetzear dago ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" emaitza","\"{filter}\" emaitza"],
- "View in folder" : "Ikusi karpetan",
- "Copied!" : "Kopiatua!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiatu esteka zuzena (fitxategi/karpeta honetara sarbidea duten erabiltzaileentzat bakarrik balio du)",
- "Path" : "Bidea",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Gogoko gisa markatua",
- "Favorite" : "Gogokoa",
- "You can only favorite a single file or folder at a time" : "Fitxategi edo karpeta bakarra markatu dezakezu gogoko gisa aldiko",
- "New folder" : "Karpeta berria",
- "Upload file" : "Kargatu fitxategia",
- "Recent" : "Azkenak",
- "Not favorited" : "Ez da gogokoa",
- "Remove from favorites" : "Kendu gogokoetatik",
- "Add to favorites" : "Gehitu gogokoetara",
- "An error occurred while trying to update the tags" : "Errore bat gertatu da etiketak eguneratzen saiatzean",
"Added to favorites" : "Gogokoetara gehitu da",
"Removed from favorites" : "Gogokoetatik kendu da",
"You added {file} to your favorites" : "{file} gehitu duzu gogokoetara",
"You removed {file} from your favorites" : "{file} kendu duzu gogokoetatik",
+ "Favorites" : "Gogokoak",
"File changes" : "Fitxategi aldaketak",
"Created by {user}" : "{user} erabiltzaileak sortua",
"Changed by {user}" : "{user} erabiltzaileak aldatua",
@@ -114,7 +11,7 @@
"Restored by {user}" : "{user} erabiltzaileak leheneratua",
"Renamed by {user}" : "{user} erabiltzaileak berrizendatua",
"Moved by {user}" : "{user} erabiltzaileak lekuz aldatua",
- "\"remote user\"" : "\"urruneko erabiltzailea\"",
+ "\"remote account\"" : "Urrutiko kontua",
"You created {file}" : "{file} sortu duzu",
"You created an encrypted file in {file}" : "{file} karpetan enkriptatutako fitxategi bat sortu duzu",
"{user} created {file}" : "{user} erabiltzaileak {file} sortu du",
@@ -141,78 +38,390 @@
"You moved {oldfile} to {newfile}" : "{oldfile} lekuz aldatu duzu {newfile}(e)ra",
"{user} moved {oldfile} to {newfile}" : "{user} erabiltzaileak {oldfile} lekuz aldatu du {newfile}(e)ra",
"A file has been added to or removed from your <strong>favorites</strong>" : "Fitxategi bat gehitu edo kendu da zure <strong>gogokoetatik</strong>",
+ "Files" : "Fitxategiak",
"A file or folder has been <strong>changed</strong>" : "Fitxategi edo karpeta bat <strong>aldatu da</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Gogoko fitxategi edo karpeta bat <strong>aldatu</strong> egin da.",
- "All files" : "Fitxategi guztiak",
- "Unlimited" : "Mugarik gabe",
- "Upload (max. %s)" : "Kargatu (%s gehienez)",
+ "Failed to authorize" : "Ezin izan da baimendu",
+ "Invalid folder path" : "Karpeta bide baliogabea",
+ "Folder not found" : "Ez da karpeta aurkitu",
+ "You do not have permission to create a file at the specified location" : "Ez duzu baimenik fitxategia sortzeko zehaztutako tokian",
+ "The file could not be converted." : "Fitxategia ezin izan da bihurtu.",
+ "Favorite files" : "Gogoko fitxategiak",
+ "No favorites" : "Gogokorik ez",
+ "More favorites" : "Gogoko gehiago",
"Accept" : "Onartu",
"Reject" : "Ukatu",
- "Incoming ownership transfer from {user}" : "{user}-ren jabetza-transferentzia",
+ "Incoming ownership transfer from {user}" : "{user}(r)en jabetza-transferentzia",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} onartu nahi duzu?\n\nOharra: onarpenaren ondoren transferentzia prozesuak ordu 1 iraun dezake.",
+ "Ownership transfer denied" : "Jabetza transferentzia ukatu egin da",
+ "Your ownership transfer of {path} was denied by {user}." : "{path}-ren zure jabetza-transferentzia {user} erabiltzaileak ukatu du",
"Ownership transfer failed" : "Jabetzaren transferentziak huts egin du",
- "Your ownership transfer of {path} to {user} failed." : "{path}-aren jabetza {user} erabiltzaileari transferitzeak huts egin du.",
- "The ownership transfer of {path} from {user} failed." : "{path}-ren jabetza {user} erabiltzailetik transferitzeak huts egin du.",
+ "Your ownership transfer of {path} to {user} failed." : "{path}(r)en jabetza {user} erabiltzaileari transferitzeak huts egin du.",
+ "The ownership transfer of {path} from {user} failed." : "{path}(r)ren jabetza {user} erabiltzailetik transferitzeak huts egin du.",
"Ownership transfer done" : "Jabetzaren transferentzia egina",
- "Your ownership transfer of {path} to {user} has completed." : "{path}-ren jabetza {user} erabiltzaileari transferitzea osatu da.",
- "The ownership transfer of {path} from {user} has completed." : "{path}-ren jabetza {user} erabiltzailetik transferitzea osatu da.",
- "in %s" : "%s-an",
+ "Your ownership transfer of {path} to {user} has completed." : "{path}(r)en jabetza {user} erabiltzaileari transferitzea osatu da.",
+ "The ownership transfer of {path} from {user} has completed." : "{path}(r)en jabetza {user} erabiltzailetik transferitzea osatu da.",
+ "in %s" : "%s(e)n",
+ "Transferred from %1$s on %2$s" : "%1$s(e)tik %2$s(e)n transferitua",
+ "Files compatibility" : "Fitxategien bateragarritasuna",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Baimendu fitxategi-izenak mugatzea, fitxategiak bezero guztiekin sinkroniza daitezkeela ziurtatzeko. Lehenespenez POSIX-en balio duten fitxategi-izen guztiak (adibidez, Linux edo macOS) onartzen dira.",
+ "Enforce Windows compatibility" : "Ezarri Windows bateragarritasuna",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Honek Windows sistemetan balio ez duten fitxategi-izenak blokeatuko ditu, adibidez, izen erreserbatuak edo karaktere bereziak erabiltzea. Baina honek ez du maiuskulak eta minuskulak bereizteko bateragarritasuna beteko.",
"File Management" : "Fitxategi-kudeaketa",
- "Transfer ownership of a file or folder" : "Transferitu fitxategiaren edo karpetaren jabetza",
- "Choose file or folder to transfer" : "Aukeratu fitxategia edo karpeta transferitzeko",
- "Change" : "Aldatu",
- "New owner" : "Jabe berria",
- "Search users" : "Bilatu erabiltzaileak",
+ "Home" : "Etxea",
+ "Target folder does not exist any more" : "Helburuko karpeta ez da existitzen jadanik",
+ "Reload current directory" : "Birkargatu uneko direktorioa",
+ "Go to the \"{dir}\" directory" : "Joan \"{dir}\" direktoriora",
+ "Current directory path" : "Uneko direktorio-bidea",
+ "Your have used your space quota and cannot upload files anymore" : "Zure espazio-kuota erabili duzu eta ezin duzu fitxategi gehiago kargatu",
+ "Drag and drop files here to upload" : "Jaregin fitxategiak hemen igotzeko",
+ "Favorite" : "Gogokoa",
+ "Back" : "Itzuli",
+ "Toggle selection for file \"{displayName}\"" : "Ordeztu hautatutakoa \"{displayName}\" fitxategiarekin",
+ "Toggle selection for folder \"{displayName}\"" : "Ordeztu hautatutakoa \"{displayName}\" karpetarekin",
+ "File is loading" : "Fitxategia kargatzen ari da",
+ "Folder is loading" : "Karpeta kargatzen ari da",
+ "Filename" : "Fitxategi-izena",
+ "Folder name" : "Karpetaren izena",
+ "This node is unavailable" : "Nodo hori ez dago erabilgarri",
+ "Another entry with the same name already exists." : "Izen bereko beste sarrera bat badago jada.",
+ "Invalid filename." : "Fitxategi-izen baliogabea.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" \"{newName}\"(e)ra berrizendatu da.",
+ "Rename file" : "Berrizendatu fitxategia",
+ "Folder" : "Karpeta",
+ "Pending" : "Zain",
+ "Unknown date" : "Data ezezaguna",
+ "Clear filter" : "Garbitu iragazkia",
+ "Modified" : "Aldatuta",
+ "Search everywhere" : "Bilatu nonahi",
+ "Type" : "Mota",
+ "Active filters" : "Iragazki aktiboak",
+ "Remove filter" : "Kendu iragazkia",
+ "Total rows summary" : "Errenkaden guztirako laburpena",
+ "Toggle selection for all files and folders" : "Ordeztu hautatutako fitxategi eta karpeta guztiak",
+ "Name" : "Izena",
+ "Size" : "Tamaina",
+ "Actions" : "Ekintzak",
+ "(selected)" : "(hautatuta)",
+ "List of files and folders." : "Fitxategi eta karpeten zerrenda.",
+ "You have used your space quota and cannot upload files anymore." : "Zure espazio-kuota erabili duzu eta ezin duzu fitxategi gehiago kargatu.",
+ "Column headers with buttons are sortable." : "Botoiak dituzten zutabeen goiburuak ordena daitezke.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
+ "File not found" : "Ez da fitxategia aurkitu",
+ "_{count} selected_::_{count} selected_" : ["{count} hautatuta","{count} hautatuta"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
+ "{used} of {quota} used" : "{used} / {quota} erabilita",
+ "{relative}% used" : "%{relative} erabilita",
+ "Could not refresh storage stats" : "Ezin izan da biltegiratze maila freskatu",
+ "Your storage is full, files can not be updated or synced anymore!" : "Zure biltegia beteta dago, ezin duzu fitxategirik igo edo sinkronizatu jada!",
+ "Storage information" : "Biltegiaren informazioa",
+ "Storage quota" : "Biltegiratze-kuota",
+ "New folder" : "Karpeta berria",
+ "Create new folder" : "Sortu karpeta berria",
+ "This name is already in use." : "Izen hau dagoeneko erabiltzen ari da.",
+ "Create" : "Sortu",
+ "Fill template fields" : "Bete txantiloien eremuak",
+ "Submit" : "Bidali",
"Choose a file or folder to transfer" : "Aukeratu fitxategi edo karpeta bat transferitzeko",
"Transfer" : "Transferitu",
"Transfer {path} to {userid}" : "Transfereritu {path} {userid} erabiltzaileari",
"Invalid path selected" : "Bide baliogabea hautatuta",
+ "Unknown error" : "Errore ezezaguna",
"Ownership transfer request sent" : "Jabetza transferentzia eskaera bidalita",
- "Cannot transfer ownership of a file or folder you don't own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu",
- "Tags" : "Etiketak",
- "Unable to change the favourite state of the file" : "Ezinezkoa fitxategiaren gogoko egoera aldatzea",
- "Error while loading the file data" : "Errorea fitxategiaren datuak kargatzerakoan",
- "Pick a template for {name}" : "Hautatu {name}-ren txantiloia",
- "Cancel" : "Utzi",
- "Create" : "Sortu",
- "Create a new file with the selected template" : "Sortu fitxategi berria hautatutako txantiloiarekin",
- "Creating file" : "Fitxategia sortzen",
- "Blank" : "Hutsik",
- "Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
- "Set up templates folder" : "Konfiguratu txantiloien karpeta",
- "Templates" : "Txantiloia",
- "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu",
- "%s used" : "%s erabilita",
- "%s%% of %s used" : "%s%% / %s erabilita",
- "%1$s of %2$s used" : "%1$s / %2$s erabilita",
- "Settings" : "Ezarpenak",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ezin da zurea ez den fitxategi edo karpeta baten jabetza transferitu",
+ "Transfer ownership of a file or folder" : "Transferitu fitxategiaren edo karpetaren jabetza",
+ "Choose file or folder to transfer" : "Aukeratu fitxategia edo karpeta transferitzeko",
+ "Change" : "Aldatu",
+ "New owner" : "Jabe berria",
+ "Use {new}" : "Erabili {new}",
+ "Remove extension" : "Kendu luzapena",
+ "Change file extension" : "Aldatu fitxategiaren luzapena",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Fitxategiaren luzapena «{old}»(e)tik «{new}»(e)ra aldatzeak irakurezin bihur dezake.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "«{old}» fitxategiaren luzapena kentzeak fitxategia irakurezin bihur dezake.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "«{new}» fitxategiaren luzapena gehitzeak fitxategia irakurezin bihur dezake.",
+ "Select file or folder to link to" : "Hautatu estekatzeko fitxategia edo karpeta",
+ "Choose {file}" : "Aukeratu {file}",
+ "Share" : "Partekatu",
+ "Shared by link" : "Esteka bidez partekatuta",
+ "Shared" : "Partekatuta",
+ "Switch to list view" : "Aldatu zerrenda ikuspegira",
+ "Switch to grid view" : "Aldatu sareta ikuspegira",
+ "Upload was cancelled by user" : "Igoera bertan behera utzi du erabiltzaileak",
+ "Not enough free space" : "Ez dago leku libre nahikorik",
+ "Operation is blocked by access control" : "Sarbide kontrolak eragiketa blokeatu du",
+ "Error during upload: {message}" : "Errorea igotzean: {message}",
+ "Error during upload, status code {status}" : "Errore bat gertatu da igotzean, {status} egoera kodea",
+ "Unknown error during upload" : "Errore ezezaguna igotzean",
+ "Loading current folder" : "Uneko karpeta kargatzen",
+ "Retry" : "saiatu berriro",
+ "No files in here" : "Ez dago fitxategirik hemen",
+ "Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
+ "Go back" : "Atzera",
+ "Views" : "Ikuspegiak",
+ "Files settings" : "FItxategien ezarpenak",
+ "Your files" : "Zure fitxategiak",
+ "Open in files" : "Ireki Fitxategiak aplikazioan",
+ "File cannot be accessed" : "Ezin da fitxategia atzitu",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Ezin izan da fitxategia aurkitu edo ez duzu ikusteko baimenik. Eskatu bidaltzaileari partekatzeko.",
+ "Clipboard is not available" : "Arbela ez dago erabilgarri",
+ "General" : "Orokorra",
+ "All files" : "Fitxategi guztiak",
+ "Personal files" : "Fitxategi pertsonalak",
+ "Sort favorites first" : "Ordenatu gogokoak lehenengo",
+ "Sort folders before files" : "Ordenatu karpetak fitxategien aurretik",
+ "Appearance" : "Itxura",
"Show hidden files" : "Erakutsi ezkutuko fitxategiak",
"Crop image previews" : "Moztu irudien aurrebistak",
+ "Additional settings" : "Ezarpen gehiago",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
- "Toggle %1$s sublist" : "Txandakatu %1$sazpizerrenda",
+ "WebDAV URL" : "WebDAV URLa",
+ "Copy" : "Kopiatu",
+ "Keyboard shortcuts" : "Teklatuaren lasterbideak",
+ "File actions" : "Fitxategi ekintzak",
+ "Rename" : "Berrizendatu",
+ "Delete" : "Ezabatu",
+ "Manage tags" : "Kudeatu etiketak",
+ "Selection" : "Hautapena",
+ "Select all files" : "Fitxategi guztiak aukeratu",
+ "Deselect all" : "Deshautatu dena",
+ "Navigation" : "Nabigazioa",
+ "View" : "Ikusi",
"Toggle grid view" : "Txandakatu sareta ikuspegia",
- "No files in here" : "Ez dago fitxategirik hemen",
- "Upload some content or sync with your devices!" : "Kargatu edukiren bat edo sinkronizatu zure gailuekin!",
- "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
- "Select all" : "Hautatu dena",
- "Upload too large" : "Kargatzea handiegia da",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kargatzen saiatzen ari zaren fitxategiek zerbitzari honek onartzen duen gehienezko tamaina gainditzen dute.",
+ "Show those shortcuts" : "Erakutsi lasterbide horiek",
+ "You" : "Zu ",
+ "Shared multiple times with different people" : "Hainbat aldiz partekatua pertsona ezberdinekin",
+ "Error while loading the file data" : "Errorea fitxategiaren datuak kargatzerakoan",
+ "Owner" : "Jabea",
+ "Remove from favorites" : "Kendu gogokoetatik",
+ "Add to favorites" : "Gehitu gogokoetara",
+ "Tags" : "Etiketak",
+ "Blank" : "Hutsik",
+ "Unable to create new file from template" : "Ezin da fitxategi berria sortu txantiloitik",
+ "Pick a template for {name}" : "Hautatu {name}(r)entzako txantiloia",
+ "Create a new file with the selected template" : "Sortu fitxategi berria hautatutako txantiloiarekin",
+ "Creating file" : "Fitxategia sortzen",
+ "Leave this share" : "Utzi partekatze hau",
+ "Leave these shares" : "Utzi partekatze hauek",
+ "Disconnect storage" : "Deskonektatu biltegia",
+ "Disconnect storages" : "Deskonektatu biltegiak",
+ "Delete permanently" : "Ezabatu betirako",
+ "Delete and unshare" : "Ezabatu eta kendu partekatzea",
+ "Delete file" : "Fitxategia ezabatu",
+ "Delete files" : "Ezabatu fitxategiak",
+ "Delete folder" : "Ezabatu karpeta",
+ "Delete folders" : "Ezabatu karpetak",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Elementu {count} betiko ezabatzera zoaz","{count} elementu betiko ezabatzera zoaz"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Elementu {count} ezabatzera zoaz"," {count} elementu ezabatzera zoaz"],
+ "Confirm deletion" : "Berretsi ezabaketa",
+ "Cancel" : "Utzi",
+ "Download" : "Deskargatu",
+ "Moving \"{source}\" to \"{destination}\" …" : "«{source}» «{destination}»(e)ra mugitzen",
+ "Copying \"{source}\" to \"{destination}\" …" : "«{source}» «{destination}»(e)ra mugitzen",
+ "Destination is not a folder" : "Helburua ez da karpeta bat",
+ "This file/folder is already in that directory" : "Fitxategi/karpeta hau dagoeneko karpeta horretan dago",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Ezin duzu fitxategi/karpeta bat berera edo bere azpikarpeta batera mugitu",
+ "(copy)" : "(kopiatu)",
+ "(copy %n)" : "(kopiatu %n)",
+ "A file or folder with that name already exists in this folder" : "Izen hori duen fitxategi edo karpeta bat dago karpena honetan",
+ "The files are locked" : "Fitxategiak blokeatuta daude",
+ "The file does not exist anymore" : "Fitxategia ez da existizen dagoeneko",
+ "Choose destination" : "Aukeratu helburua",
+ "Copy to {target}" : "Kopiatu hona: {target}",
+ "Move to {target}" : "Mugitu hona: {target}",
+ "Move" : "Mugitu",
+ "Move or copy operation failed" : "Mugitzeko edo kopiatzeko eragiketak huts egin du",
+ "Move or copy" : "Mugitu edo kopiatu",
+ "Open folder {displayName}" : "Ireki {displayName} karpeta",
+ "Open in Files" : "Ireki Fitxategiak aplikazioan",
+ "Open locally" : "Ireki lokalean",
+ "Failed to redirect to client" : "Bezerora birbideratzeak huts egin du",
+ "Open file locally" : "Ireki fitxategia lokalean",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Fitxategia orain zure gailuan ireki beharko litzateke. Hala ez bada, egiaztatu mahaigaineko aplikazioa instalatuta duzula.",
+ "Retry and close" : "Saiatu berriro eta itxi",
+ "Details" : "Xehetasunak",
+ "View in folder" : "Ikusi karpetan",
+ "Today" : "Gaur",
+ "Last 7 days" : "Azken 7 egunetan",
+ "Last 30 days" : "Azken 30 egunetan",
+ "This year ({year})" : "Aurten ({year})",
+ "Last year ({year})" : "Iaz ({year})",
+ "Documents" : "Dokumentuak",
+ "Spreadsheets" : "kalkulu-orriak",
+ "Presentations" : "Aurkezpenak",
+ "PDFs" : "PDFak",
+ "Folders" : "Karpetak",
+ "Audio" : "Audio",
+ "Images" : "Irudiak",
+ "Videos" : "Bideoak",
+ "Created new folder \"{name}\"" : "\"{name}\" karpeta berria sortu da",
+ "Unable to initialize the templates directory" : "Ezin da txantiloien direktorioa hasieratu",
+ "Create templates folder" : "Sortu txantiloien karpeta",
+ "Templates" : "Txantiloiak",
+ "New template folder" : "Txantiloien karpeta berria",
+ "In folder" : "Karpetan",
+ "Search in folder: {folder}" : "Bilatu {folder} karpetan",
+ "One of the dropped files could not be processed" : "Jaregindako fitxategietako bat ezin izan da prozesatu",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Zure nabigatzaileak ez du Filesystem APIa onartzen. Direktorioak ez dira igoko",
+ "No files to upload" : "Ez dago igotzeko fitxategirik",
+ "Unable to create the directory {directory}" : "Ezin da {directory} direktorioa sortu",
+ "Some files could not be uploaded" : "Fitxategi batzuk ezin izan dira igo",
+ "Files uploaded successfully" : "Fitxategiak behar bezala igo dira",
+ "No files to process" : "Ez dago prozesatzeko fitxategirik",
+ "Some files could not be copied" : "Fitxategi batzuk ezin izan dira kopiatu",
+ "Some files could not be moved" : "Fitxategi batzuk ezin izan dira mugitu",
+ "Files copied successfully" : "Fitxategiak behar bezala kopiatu dira",
+ "Files moved successfully" : "Fitxategiak behar bezala mugitu dira",
+ "Conflicts resolution skipped" : "Gatazkak konpontzea saihestu da",
+ "Upload cancelled" : "Igotzea bertan behera utzi da",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Ezin izan da \"{oldName}\" berrizendatu, ez da existitzen dagoeneko",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" izena \"{dir}\" karpetan dagoeneko erabiltzen da. Mesedez aukeratu beste izen bat.",
+ "Could not rename \"{oldName}\"" : "Ezin izan da \"{oldName}\" berrizendatu ",
+ "This operation is forbidden" : "Eragiketa hau debekatuta dago",
+ "Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
+ "Unexpected error: {error}" : "Ustekabeko errorea: {error}",
+ "_%n file_::_%n files_" : ["Fitxategi %n","%n fitxategi"],
+ "_%n folder_::_%n folders_" : ["Karpeta %n","%n karpeta"],
+ "Filename must not be empty." : "Fitxategi-izenak ez du hutsik egon behar.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ez da onartzen fitxategi-izen baten barruan.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" izen erreserbatua da eta ez da onartzen fitxategi-izenetan.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" fitxategi mota ez dago baimenduta.",
+ "Filenames must not end with \"{extension}\"." : "Fitxategi-izenak ez dira \"{extension}\"rekin amaitu behar..",
+ "List of favorite files and folders." : "Gogoko fitxategi eta karpeten zerrenda.",
"No favorites yet" : "Gogokorik ez oraindik",
"Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpetak hemen agertuko dira",
- "Deleted files" : "Ezabatutako fitxategiak",
- "Shares" : "Partekatzeak",
- "Shared with others" : "Besteekin partekatuta",
- "Shared with you" : "Zurekin partekatuta",
- "Shared by link" : "Partekatua esteka bidez",
- "Deleted shares" : "Ezabatutako partekatzeak",
- "Pending shares" : "Zain dauden partekatzeak",
+ "List of your files and folders." : "Zure fitxategi eta karpeten zerrenda.",
+ "List of your files and folders that are not shared." : "Partekatu ez diren zure fitxategi eta karpeten zerrenda.",
+ "No personal files found" : "Ez dago fitxategi pertsonalik",
+ "Files that are not shared will show up here." : "Partekatu ez dituzun fitxategiak hemen agertuko dira",
+ "Recent" : "Azkenak",
+ "List of recently modified files and folders." : "Azkenaldian aldatutako fitxategi eta karpeten zerrenda.",
+ "No recently modified files" : "Ez dago azkenaldian aldatutako fitxategirik",
+ "Files and folders you recently modified will show up here." : "Azkenaldian aldatu dituzun fitxategi eta karpetak hemen agertuko dira.",
+ "Search" : "Bilatu",
+ "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
+ "Select all" : "Hautatu dena",
+ "Upload too large" : "Igotzekoa handiegia da",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiek zerbitzari honek onartzen duen gehienezko tamaina gainditzen dute.",
+ "File could not be found" : "Ezin izan da fitxategia aurkitu",
+ "Show list view" : "Erakutsi zerrenda ikuspegia",
+ "Show grid view" : "Erakutsi sareta ikuspegia",
+ "Close" : "Itxi",
+ "Could not create folder \"{dir}\"" : "Ezin izan da \"{dir}\" karpeta sortu",
+ "This will stop your current uploads." : "Honek martxan dauzkazun igoerak geldituko ditu.",
+ "Upload cancelled." : "Igotzea bertan behera utzi da.",
+ "Processing files …" : "Fitxategiak prozesatzen...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, {size1} igotzen ari zara baina {size2} soilik daude libre",
+ "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" helburuko karpeta ez da existitzen jadanik",
+ "An unknown error has occurred" : "Errore ezezagun bat gertatu da",
+ "File could not be uploaded" : "Fitxategia ezin izan da igo",
+ "Uploading …" : "Igotzen...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Igotzen … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ez da onartzen elementu hori igotzea",
+ "Error when assembling chunks, status code {status}" : "Errorea zatiak elkartzean, egoera kodea {status}",
+ "Choose target folder" : "Aukeratu helburuko karpeta",
+ "Set reminder" : "Ezarri gogorarazpena",
+ "Edit locally" : "Editatu lokalean",
+ "Open" : "Ireki",
+ "Could not load info for file \"{file}\"" : "Ezin izan da \"{file}\" fitxategiaren informazioa kargatu",
+ "Please select tag(s) to add to the selection" : "Hautatu etiketa(k) hautapenera gehitzeko",
+ "Apply tag(s) to selection" : "Aplikatu etiketa(k) hautapenari",
+ "Select directory \"{dirName}\"" : "Hautatu \"{dirName}\" direktorioa",
+ "Select file \"{fileName}\"" : "Hautatu \"{fileName}\" fitxategia",
+ "Unable to determine date" : "Ezin izan da data zehaztu",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Direktorio hau ez dago erabilgarri, egiaztatu egunkariak edo jarri administratzailearekin harremanetan",
+ "Could not move \"{file}\", target exists" : "Ezin izan da \"{file}\" lekuz aldatu, helburua existitzen da jadanik",
+ "Could not move \"{file}\"" : "Ezin izan da \"{file}\" lekuz aldatu",
+ "copy" : "kopiatu",
+ "Could not copy \"{file}\", target exists" : "Ezin izan da \"{file}\" kopiatu; helburua existitzen da",
+ "Could not copy \"{file}\"" : "Ezin izan da \"{file}\" kopiatu",
+ "Copied {origin} inside {destination}" : "{origin} kopiatu da {destination} barruan",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} eta beste {nbfiles} fitxategi {destination} barruan kopiatu dira",
+ "{newName} already exists" : "{newName} existitzen da dagoeneko",
+ "Could not create file \"{file}\"" : "Ezin izan da \"{file}\" fitxategia sortu",
+ "Could not create file \"{file}\" because it already exists" : "Ezin izan da \"{file}\" fitxategia sortu, dagoeneko existitzen delako",
+ "Could not create folder \"{dir}\" because it already exists" : "Ezin izan da \"{dir}\" karpeta sortu, dagoeneko existitzen delako",
+ "Could not fetch file details \"{file}\"" : "Ezin izan dira \"{file}\" fitxategiaren xehetasunak eskuratu",
+ "Error deleting file \"{fileName}\"." : "Errorea \"{fileName}\" fitxategia ezabatzerakoan.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ez da '{tag}{filter}{endtag}' bilaketarako emaitzarik aurkitu beste karpetetan",
+ "Enter more than two characters to search in other folders" : "Sartu bi karaktere baino gehiago beste karpetetan bilatu ahal izateko",
+ "{dirs} and {files}" : "{dirs} eta {files}",
+ "_including %n hidden_::_including %n hidden_" : ["ezkutuko %n barne","ezkutuko %n barne"],
+ "You do not have permission to upload or create files here" : "Ez duzu hemen fitxategiak igotzeko edo sortzeko baimenik",
+ "_Uploading %n file_::_Uploading %n files_" : ["Fitxategi %n kargatzen","%n fitxategi igotzen"],
+ "New" : "Berria",
+ "New file/folder menu" : "Fitxategi/karpeta berri menua",
+ "Select file range" : "Hautatu fitxategi-barrutia",
+ "{used}%" : "%{used}",
+ "{used} used" : "{used} erabilita",
+ "\"{name}\" is an invalid file name." : "\"{name}\" fitxategi-izen baliogabea da.",
+ "File name cannot be empty." : "Fitxategi-izena ezin da hutsa izan.",
+ "\"/\" is not allowed inside a file name." : "\"/\" ez da onartzen fitxategi-izenen barnean.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" fitxategi-mota ez da onartzen",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira jada eguneratu edo sinkronizatu!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" taldeko karpeta beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" kanpoko biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Zure biltegiratzea beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-(r)en biltegia betetzear dago ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" talde karpeta betetzear dago ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" kanpoko biltegia betetzear dago ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Zure biltegia betetzear dago ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" emaitza","\"{filter}\" emaitza"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Esteka zuzena kopiatu da (fitxategi/karpeta honetara sarbidea dutenentzat bakarrik balio du)",
+ "Path" : "Bidea",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
+ "Favored" : "Mesedetua",
+ "Favor" : "Mesedea",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiatu esteka zuzena (fitxategi/karpeta honetara sarbidea dutenentzat bakarrik balio du)",
+ "Upload file" : "Igo fitxategia",
+ "Not favored" : "Mesedetu gabe",
+ "An error occurred while trying to update the tags" : "Errore bat gertatu da etiketak eguneratzen saiatzean",
+ "Upload (max. %s)" : "Igo (%s gehienez)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ekintza behar bezala exekutatu da",
+ "\"{displayName}\" action failed" : "\"{displayName}\" ekintzak huts egin du",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" multzoko ekintza behar bezala exekutatu da",
+ "Submitting fields…" : "Eremuak bidaltzen…",
+ "Filter filenames…" : "Iragazi fitxategi-izenak...",
+ "WebDAV URL copied to clipboard" : "WebDAV URLa arbelean kopiatu da",
+ "Enable the grid view" : "Gaitu sareta ikuspegira",
+ "Enable folder tree" : "Gaitu karpeta-zuhaitza",
+ "Copy to clipboard" : "Kopiatu arbelera",
+ "Use this address to access your Files via WebDAV" : "Erabili helbide hau WebDAV bidez zure fitxategietara sartzeko",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FA gaitu baduzu, aplikazioaren pasahitz berria sortu eta erabili behar duzu hemen klik eginez.",
+ "Deletion cancelled" : "Ezabatzea bertan behera utzi da",
+ "Move cancelled" : "Mugimendua bertan behera utzi da",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\" -ren mugimendua edo kopia bertan behera utzi da.",
+ "Cancelled move or copy operation" : "Mugitze edo kopiatze operazioa utzi da",
+ "Open details" : "Ireki xehetasunak",
+ "Photos and images" : "Argazkiak eta irudiak",
+ "New folder creation cancelled" : "Karpeta berrien sorrera bertan behera utzi da",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["Karpeta {folderCount}","{folderCount} karpeta"],
+ "_{fileCount} file_::_{fileCount} files_" : ["Fitxategi {fileCount}","{fileCount} fitxategi"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["Fitxategi 1 eta karpeta {folderCount}","Fitxategi 1 eta {folderCount} karpeta"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["Fitxategi {fileCount} eta karpeta 1","{fileCount} fitxategi eta karpeta 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fitxategi eta {folderCount} fitxategi",
+ "All folders" : "Karpeta guztiak",
+ "Personal Files" : "Fitxategi pertsonalak",
"Text file" : "Testu-fitxategia",
"New text file.txt" : "Testu-fitxategi berria.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} erabiltzailearen biltegia beteta dago, fitxategiak ezin dira eguneratu edo sinkronizatu jada!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" talde karpeta beteta dago, ezin da fitxategirik eguneratu edo sinkronizatu gehiago!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" kanpoko biltegia beteta dago, ezin da fitxategirik eguneratu edo sinkronizatu gehiago!",
- "Your storage is full, files can not be updated or synced anymore!" : "Zure biltegia beteta dago, ezin duzu fitxategirik igo edo sinkronizatu jada!",
- "_matches '{filter}'_::_match '{filter}'_" : ["bat dator '{filter}' iragazkiarekin","bat datoz '{filter}' iragazkiarekin"]
+ "Speed up your Files experience with these quick shortcuts." : "Azkartu zure Fitxategi esperientzia lasterbide bizkor hauekin",
+ "Open the actions menu for a file" : "Ireki ekintza menua fitxategi baterako",
+ "Rename a file" : "Fitxategi bat berrizendatu",
+ "Delete a file" : "Fitxategi bat ezabatu",
+ "Favorite or remove a file from favorites" : "Fitxategi bat gustoko bihurtu edo gustoko izateari utzi",
+ "Manage tags for a file" : "Fitxategi baten etiketak kudeatu",
+ "Deselect all files" : "Fitxategi guztiak desaukeratu",
+ "Select or deselect a file" : "Fitxategi bat aukeratu edo desaukeratu",
+ "Select a range of files" : "Fitxategi-hein bat aukeratu",
+ "Navigate to the parent folder" : "Nabigatu guraso karpetara",
+ "Navigate to the file above" : "Nabigatu goiko fitxategira",
+ "Navigate to the file below" : "Nabigatu azpiko fitxategira",
+ "Navigate to the file on the left (in grid mode)" : "Nabigatu ezkerreko fitxategira (sareta moduan)",
+ "Navigate to the file on the right (in grid mode)" : "Nabigatu eskuineko fitxategira (sareta moduan)",
+ "Toggle the grid view" : "Txandakatu sareta ikuspegia",
+ "Open the sidebar for a file" : "Ireki alboko barra fitxategi baterako"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index e316860d3e2..31a8378af27 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -1,134 +1,468 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
- "Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
+ "Added to favorites" : "محبوب شد",
+ "Removed from favorites" : "از محبوب‌ها حذف شد",
+ "You added {file} to your favorites" : "شما پروندهٔ {file} را به مورد پسند‌هایتان افزودید",
+ "You removed {file} from your favorites" : "شما پروندهٔ {file} را از مورد پسند‌های خود حذف کردید",
+ "Favorites" : "موارد محبوب",
+ "File changes" : "تغییرات پرونده",
+ "Created by {user}" : "{user} ٖایجاد کرد",
+ "Changed by {user}" : "{user} تغییر داد",
+ "Deleted by {user}" : " {user} حذف کرد",
+ "Restored by {user}" : "بازیابی شده توسط {user}",
+ "Renamed by {user}" : "تغییر نام توسط {user}",
+ "Moved by {user}" : "منتقل شده توسط {user}",
+ "\"remote account\"" : "&quot;حساب از راه دور&quot;",
+ "You created {file}" : "شما {file} را ایجاد کردید",
+ "You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید",
+ "{user} created {file}" : "{user} {file} را ایجاد کرد",
+ "{user} created an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده در {file} ایجاد کرد",
+ "{file} was created in a public folder" : "{file} در یک پوشه عمومی ایجاد شد",
+ "You changed {file}" : "شما {file} را تغییر دادید",
+ "You changed an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} تغییر دادید",
+ "{user} changed {file}" : "{user} {file} را تغییر داد",
+ "{user} changed an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} تغییر داد",
+ "You deleted {file}" : "شما {file} را حذف کردید",
+ "You deleted an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} حذف کردید",
+ "{user} deleted {file}" : "{user} {file} را حذف کرد",
+ "{user} deleted an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} حذف کرد",
+ "You restored {file}" : "شما {file} را بازیابی کردید",
+ "{user} restored {file}" : "{user} {file} را بازیابی کرد",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "شما نام {oldfile} (پنهان) را به {newfile} (پنهان) تغییر دادید",
+ "You renamed {oldfile} (hidden) to {newfile}" : "شما نام {oldfile} (پنهان) را به {newfile} تغییر دادید",
+ "You renamed {oldfile} to {newfile} (hidden)" : "شما نام {oldfile} را به {newfile} تغییر دادید (پنهان)",
+ "You renamed {oldfile} to {newfile}" : "شما نام {oldfile} را به {newfile} تغییر دادید",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile} (مخفی)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} نام {oldfile} را به {newfile} تغییر داد (پنهان)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} نام {oldfile} را به {newfile} تغییر داد",
+ "You moved {oldfile} to {newfile}" : "شما {oldfile} را به {newfile} منتقل کردید",
+ "{user} moved {oldfile} to {newfile}" : "{user} {oldfile} را به {newfile} منتقل کرد",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "یک فایل به موارد دلخواه شما اضافه یا حذف شده است",
+ "Files" : "پرونده‌ها",
+ "A file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه تغییر کرده است",
+ "A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است",
+ "Failed to authorize" : "مجوز صادر نشد",
+ "Invalid folder path" : "Invalid folder path",
+ "Folder not found" : "Folder not found",
+ "The file cannot be found" : "The file cannot be found",
+ "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s",
+ "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location",
+ "The file could not be converted." : "The file could not be converted.",
+ "Could not get relative path to converted file" : "Could not get relative path to converted file",
+ "Favorite files" : "Favorite files",
+ "No favorites" : "هیچ برگزیده",
+ "More favorites" : "More favorites",
+ "Accept" : "قبول",
+ "Reject" : "رد کردن",
+ "Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.",
+ "Ownership transfer denied" : "Ownership transfer denied",
+ "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.",
+ "Ownership transfer failed" : "انتقال مالکیت ناموفق بود",
+ "Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.",
+ "The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.",
+ "Ownership transfer done" : "انتقال مالکیت انجام شد",
+ "Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.",
+ "The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.",
+ "in %s" : "در %s",
+ "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s",
+ "Files compatibility" : "Files compatibility",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.",
+ "Enforce Windows compatibility" : "Enforce Windows compatibility",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.",
+ "File Management" : "مدیریت فایل",
+ "Home" : "خانه",
+ "Target folder does not exist any more" : "پوشه هدف وجود ندارد",
+ "Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید",
+ "Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.",
+ "Drag and drop files here to upload" : "برای بارگذاری، فایل‌ها را بکشید و اینجا بیاندازید",
+ "Favorite" : "برگزیده",
+ "Back" : "بازگشت",
+ "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"",
+ "File is loading" : "File is loading",
+ "Folder is loading" : "Folder is loading",
+ "Filename" : "نام پرونده",
+ "Folder name" : "نام پوشه",
+ "This node is unavailable" : "گره شما در دسترس نیست",
+ "Another entry with the same name already exists." : "Another entry with the same name already exists.",
+ "Invalid filename." : "Invalid filename.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"",
+ "Rename file" : "تغییر نام فایل",
+ "Folder" : "پوشه",
+ "Unknown file type" : "Unknown file type",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "در انتظار",
+ "Unknown date" : "Unknown date",
+ "Clear filter" : "پاک کردن پالایه",
+ "Modified" : "تاریخ",
+ "Search everywhere" : "جستجو در هر کجا.",
+ "Type" : "نوع",
+ "Active filters" : "فیلترهای فعال",
+ "Remove filter" : "فیلتر را بردارید",
+ "Total rows summary" : "خلاصه کل ردیف ها",
+ "Toggle selection for all files and folders" : "Toggle selection for all files and folders",
+ "Name" : "نام",
+ "File type" : "File type",
+ "Size" : "اندازه",
+ "Actions" : "فعالیت ها",
+ "(selected)" : "(selected)",
+ "List of files and folders." : "لیست فایل ها و پوشه ها",
+ "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
+ "File not found" : "فایل یافت نشد",
+ "{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
+ "{used} of {quota} used" : "{used} از {quota} استفاده شده",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "نمی‌توان آمار ذخیره‌سازی را بازخوانی کرد",
+ "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!",
+ "Storage information" : "اطلاعات ذخیره‌سازی",
+ "Storage quota" : "محدودیت ذخیره‌سازی",
+ "New folder" : "پوشه جدید",
+ "Create new folder" : "ساختن پوشه جدید",
+ "This name is already in use." : "This name is already in use.",
+ "Create" : "ایجاد",
+ "Fill template fields" : "Fill template fields",
+ "Submitting fields …" : "Submitting fields …",
+ "Submit" : "ارسال",
+ "Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید",
+ "Transfer" : "انتقال",
+ "Transfer {path} to {userid}" : "انتقال {path} به {userid}",
+ "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"Unknown error" : "خطای نامشخص",
- "File could not be found" : "فایل پیدا نمی‌شود",
- "Move or copy" : "انتقال یا کپی",
- "Download" : "دانلود",
+ "Ownership transfer request sent" : "درخواست انتقال مالکیت ارسال شد",
+ "Cannot transfer ownership of a file or folder you do not own" : "نمی‌توان مالکیت فایل یا پوشه‌ای را که متعلق به شما نیست، منتقل کرد",
+ "Transfer ownership of a file or folder" : "انتقال مالکیت یک فایل یا پوشه",
+ "Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید",
+ "Change" : "تغییر",
+ "New owner" : "مالک جدید",
+ "Keep {old}" : "Keep {old}",
+ "Keep without extension" : "Keep without extension",
+ "Use {new}" : "Use {new}",
+ "Remove extension" : "Remove extension",
+ "Change file extension" : "Change file extension",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.",
+ "Do not show this dialog again." : "Do not show this dialog again.",
+ "Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید",
+ "Choose {file}" : "انتخاب {file}",
+ "Share" : "اشتراک‌گذاری",
+ "Shared by link" : "اشتراک گذاشته شده از طریق لینک",
+ "Shared" : "به اشتراک گذاشته شده ",
+ "Switch to list view" : "تغییر به نمای لیست",
+ "Switch to grid view" : "Switch to grid view",
+ "The file could not be found" : "The file could not be found",
+ "Upload was cancelled by user" : "آپلود توسط کاربر لغو شد",
+ "Not enough free space" : "فضای کافی در دسترس نیست",
+ "Operation is blocked by access control" : "مدیریت دسترسی، عملیات را متوقف کرد",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Error during upload, status code {status}" : "Error during upload, status code {status}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "در حال بارگیری پوشه فعلی",
+ "Retry" : "تلاش دوباره",
+ "No files in here" : "هیچ فایلی اینجا وجود ندارد",
+ "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
+ "Go back" : "برگرد",
+ "Views" : "بازدیدها",
+ "Files settings" : "تنظیمات پرونده‌ها",
+ "Your files" : "Your files",
+ "Open in files" : "باز کردن در فایل‌ها",
+ "File cannot be accessed" : "فایل قابل دسترسی نیست",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.",
+ "Clipboard is not available" : "کلیپ بورد در دسترس نیست",
+ "General" : "عمومی",
+ "All files" : "تمامی فایل‌ها",
+ "Personal files" : "فایل‌های شخصی",
+ "Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
+ "Sort folders before files" : "Sort folders before files",
+ "Appearance" : "ظاهر",
+ "Show hidden files" : "نمایش پرونده‌های مخفی",
+ "Show file type column" : "Show file type column",
+ "Crop image previews" : "پیش نمایش تصویر برش",
+ "Additional settings" : "تنظیمات اضافی",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "رونوشت",
+ "Warnings" : "Warnings",
+ "Keyboard shortcuts" : "میان‌برهای صفحه‌کلید",
+ "File actions" : "File actions",
+ "Rename" : "تغییرنام",
"Delete" : "حذف",
- "Home" : "خانه",
+ "Manage tags" : "مدیریت برچسب ها",
+ "Selection" : "انتخاب",
+ "Select all files" : "Select all files",
+ "Deselect all" : "لغو انتخاب همه",
+ "Navigation" : "جهت یابی",
+ "View" : "نمایش",
+ "Toggle grid view" : "نمای دریچه را تغییر دهید",
+ "Show those shortcuts" : "Show those shortcuts",
+ "You" : "You",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Error while loading the file data" : "خطا هنگام بارگیری داده های فایل",
+ "Owner" : "مالک",
+ "Remove from favorites" : "حذف کردن از برگزیده ها",
+ "Add to favorites" : "اضافه کردن به برگزیده ها",
+ "Tags" : "برچسب‌ها",
+ "Blank" : "جای خالی",
+ "Unable to create new file from template" : "امکان ایجاد فایل جدید از الگو وجود ندارد",
+ "Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید",
+ "Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید",
+ "Creating file" : "ایجاد فایل",
+ "Save as {displayName}" : "Save as {displayName}",
+ "Save as …" : "Save as …",
+ "Converting files …" : "Converting files …",
+ "Failed to convert files: {message}" : "Failed to convert files: {message}",
+ "All files failed to be converted" : "All files failed to be converted",
+ "One file could not be converted: {message}" : "One file could not be converted: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
+ "Files successfully converted" : "Files successfully converted",
+ "Failed to convert files" : "Failed to convert files",
+ "Converting file …" : "Converting file …",
+ "File successfully converted" : "File successfully converted",
+ "Failed to convert file: {message}" : "Failed to convert file: {message}",
+ "Failed to convert file" : "Failed to convert file",
+ "Leave this share" : "ترک این اشتراک",
+ "Leave these shares" : "Leave these shares",
+ "Disconnect storage" : "فضای ذخیره را جدا کنید",
+ "Disconnect storages" : "Disconnect storages",
+ "Delete permanently" : "حذف قطعی",
+ "Delete and unshare" : "Delete and unshare",
+ "Delete file" : "حذف پرونده",
+ "Delete files" : "حذف فایل‌ها",
+ "Delete folder" : "حذف پوشه",
+ "Delete folders" : "Delete folders",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"],
+ "Confirm deletion" : "Confirm deletion",
+ "Cancel" : "لغو",
+ "Download" : "دانلود",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The files are locked" : "The files are locked",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "رونوشت به {target}",
+ "Move to {target}" : "جابجایی به {target}",
+ "Move" : "انتقال",
+ "Move or copy operation failed" : "Move or copy operation failed",
+ "Move or copy" : "انتقال یا رونوشت",
+ "Open folder {displayName}" : "باز کردن پوشه {displayName}",
+ "Open in Files" : "در فایل باز کنید",
+ "Open locally" : "گشودن محلی",
+ "Failed to redirect to client" : "هدایت به مشتری انجام نشد",
+ "Open file locally" : "گشودن محلی پرونده",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.",
+ "Retry and close" : "Retry and close",
+ "Open online" : "Open online",
+ "Details" : "جزئیات",
+ "View in folder" : "مشاهده در پوشه",
+ "Today" : "امروز",
+ "Last 7 days" : "۷ روز گذشته",
+ "Last 30 days" : "۳۰ روز گذشته",
+ "This year ({year})" : "This year ({year})",
+ "Last year ({year})" : "Last year ({year})",
+ "Documents" : "سندها",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Folders",
+ "Audio" : "صدا",
+ "Images" : "تصاویر",
+ "Videos" : "فیلم ها ",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست",
+ "Create templates folder" : "Create templates folder",
+ "Templates" : "قالب‌ها",
+ "New template folder" : "New template folder",
+ "In folder" : "In folder",
+ "Search in folder: {folder}" : "Search in folder: {folder}",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
+ "No files to upload" : "No files to upload",
+ "Unable to create the directory {directory}" : "Unable to create the directory {directory}",
+ "Some files could not be uploaded" : "Some files could not be uploaded",
+ "Files uploaded successfully" : "Files uploaded successfully",
+ "No files to process" : "No files to process",
+ "Some files could not be copied" : "Some files could not be copied",
+ "Some files could not be moved" : "برخی از پرونده‌ها قابل انتقال نیستند",
+ "Files copied successfully" : "Files copied successfully",
+ "Files moved successfully" : "Files moved successfully",
+ "Conflicts resolution skipped" : "Conflicts resolution skipped",
+ "Upload cancelled" : "Upload cancelled",
+ "Could not rename \"{oldName}\", it does not exist any more" : "نمی‌توان نام «{oldName}» را تغییر داد، دیگر وجود ندارد",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "نام \"{newName}\" در پوشه \"{dir}\" به کار رفته است.\nلطفا نام دیگری برگزینید.",
+ "Could not rename \"{oldName}\"" : "تغییر نام \"{oldName}\" ممکن نیست",
+ "This operation is forbidden" : "این عملیات غیرمجاز است",
+ "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
+ "Unexpected error: {error}" : "Unexpected error: {error}",
+ "_%n file_::_%n files_" : ["%n فایل","%n فایل"],
+ "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"],
+ "Filename must not be empty." : "Filename must not be empty.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.",
+ "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".",
+ "List of favorite files and folders." : "List of favorite files and folders.",
+ "No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
+ "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
+ "List of your files and folders." : "List of your files and folders.",
+ "List of your files and folders that are not shared." : "List of your files and folders that are not shared.",
+ "No personal files found" : "No personal files found",
+ "Files that are not shared will show up here." : "Files that are not shared will show up here.",
+ "Recent" : "اخیر",
+ "List of recently modified files and folders." : "فهرست فایل‌ها و پوشه‌هایی که اخیراً اصلاح شده‌اند.",
+ "No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است",
+ "Files and folders you recently modified will show up here." : "فایل‌ها و پوشه‌هایی که اخیراً تغییر داده‌اید در اینجا نمایش داده می‌شوند.",
+ "Search" : "جستجو",
+ "No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
+ "Select all" : "انتخاب همه",
+ "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
+ "File could not be found" : "پرونده پیدا نشد",
+ "Show list view" : "نمایش فهرستی",
+ "Show grid view" : "نمایش شبکه‌ای",
"Close" : "بستن",
- "Favorites" : "موارد محبوب",
- "Could not create folder \"{dir}\"" : "شاخه \"{dir}\" ساخته نمی‌شود",
- "This will stop your current uploads." : "با این کار آپلودهای فعلی شما متوقف خواهد شد.",
+ "Could not create folder \"{dir}\"" : "پوشهٔ \"{dir}\" ساخته نشد",
+ "This will stop your current uploads." : "با این کار بارگذاری فعلی شما متوقف خواهد شد.",
"Upload cancelled." : "بار گذاری لغو شد",
- "Processing files …" : "پردازش فایل ها",
+ "Processing files …" : "پردازش پرونده‌ها...",
"…" : "...",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است",
"Target folder \"{dir}\" does not exist any more" : "پوشه هدف \"{dir}\" دیگر وجود ندارد",
- "Not enough free space" : "فضای کافی در دسترس نیست",
"An unknown error has occurred" : "خطایی ناشناخته اتفاق افتاده است",
+ "File could not be uploaded" : "پرونده بارگذاری نشد",
"Uploading …" : "بارگذاری...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber} /{total} )",
+ "Uploading … ({currentNumber}/{total})" : "در حال بارگذاری ... ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} از {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "بارگذاری این مورد پشتیبانی نمی شد",
- "Target folder does not exist any more" : "پوشه هدف وجود ندارد",
+ "Uploading that item is not supported" : "بارگذاری آن مورد پشتیبانی نمی‌شود",
"Error when assembling chunks, status code {status}" : "خطا هنگام جمع آوری قطعه ها، کد وضعیت {status}",
- "Actions" : "فعالیت ها",
- "Rename" : "تغییرنام",
- "Copy" : "کپی کردن",
- "Choose target folder" : "پوشه هدف را انتخاب کنید",
- "Open" : "باز کن...",
- "Delete file" : "حذف فایل",
- "Delete folder" : "حذف پوشه",
- "Disconnect storage" : "فضای ذخیره را جدا کنید",
+ "Choose target folder" : "پوشهٔ هدف را انتخاب کنید",
+ "Set reminder" : "تنظیم یادآوری",
+ "Edit locally" : "ویرایش محلی",
+ "Open" : "باز کردن",
"Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"",
- "Files" : "پرونده‌ها",
- "Details" : "جزئیات",
- "Select" : "انتخاب",
- "Pending" : "در انتظار",
+ "Please select tag(s) to add to the selection" : "لطفاً برچسب(های) را برای افزودن به انتخاب انتخاب کنید",
+ "Apply tag(s) to selection" : "تگ(ها) را در انتخاب اعمال کنید",
+ "Select directory \"{dirName}\"" : "دایرکتوری \"{dirName}\" را انتخاب کنید",
+ "Select file \"{fileName}\"" : "فایل \"{fileName}\" را انتخاب کنید",
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
- "This operation is forbidden" : "این عملیات غیرمجاز است",
"This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
- "Could not move \"{file}\", target exists" : "انتقال\"{پرونده}\" امکان پذیر نیست ، هدف وجود دارد",
- "Could not move \"{file}\"" : "فایل \"{file}\" منتقل نمی‌شود",
+ "Could not move \"{file}\", target exists" : "انتقال\"{file}\" امکان پذیر نیست ، هدف وجود دارد",
+ "Could not move \"{file}\"" : "پروندهٔ \"{file}\" منتقل نمی‌شود",
"copy" : "کپی",
- "Could not copy \"{file}\", target exists" : "\"{پرونده}\" کپی نشد ، هدف وجود دارد",
- "Could not copy \"{file}\"" : "پرونده کپی نشد",
- "Copied {origin} inside {destination}" : "کپی شده (اصل) در مقصد",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "کپی شده از {مبدا} و {فایل های ام بی} و فایل های دیگر در {مقصد} . ",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پرونده‌های دیگر در {destination}",
"{newName} already exists" : "{newName} قبلاً موجود است",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "عنوان \"{targetName}\" هم اکنون در پوشه \"{dir}\" وجود دارد. لطفا نام دیگری انتخاب کنید",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" تغییر نام داده نمی‌شود",
- "Could not create file \"{file}\"" : "فایل \"{file}\" ایجاد نمی‌شود",
+ "Could not create file \"{file}\"" : "پروندهٔ \"{file}\" ساخته نشد",
"Could not create file \"{file}\" because it already exists" : "نمی توان پرونده \"{file}\" ایجاد کرد زیرا در حال حاضر وجود دارد",
"Could not create folder \"{dir}\" because it already exists" : "شاخه \"{dir}\" به علت موجود بودن ساخته نشد",
- "Error deleting file \"{fileName}\"." : "خطای حذف فایل \"{fileName}\".",
+ "Could not fetch file details \"{file}\"" : "جزئیات فایل \"{file}\" واکشی نشد",
+ "Error deleting file \"{fileName}\"." : "خطای حذف پروندهٔ \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "جستجو در پوشه های دیگر برای {tag}{filter}{endtag} یافت نشد",
- "Name" : "نام",
- "Size" : "اندازه",
- "Modified" : "تاریخ",
- "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
- "_%n file_::_%n files_" : ["%n فایل","%n فایل"],
+ "Enter more than two characters to search in other folders" : "برای جستجو در پوشه های دیگر بیش از دو کاراکتر وارد کنید",
"{dirs} and {files}" : "{dirs} و {files}",
- "You don’t have permission to upload or create files here" : "شما دسترسی مجاز برای آپلود یا ایجاد فایل در اینجا را ندارید",
+ "_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"],
+ "You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید",
"_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"],
"New" : "جدید",
- "{used} of {quota} used" : "{used} از {quota} استفاده شده",
+ "New file/folder menu" : "منوی فایل/پوشه جدید",
+ "Select file range" : "محدوده فایل را انتخاب کنید",
+ "{used}%" : "{used}%",
"{used} used" : "{used} استفاده شده",
"\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.",
"File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.",
+ "\"/\" is not allowed inside a file name." : "\"/\" در داخل نام فایل مجاز نیست.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" یک نوع پرونده مجاز نیست",
- "View in folder" : "مشاهده در پوشه",
- "Copied!" : "کپی انجام شد!",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی {owner} پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "پوشه گروه \"{mountPoint}\" پر است، فایل‌ها دیگر قابل به‌روزرسانی یا همگام‌سازی نیستند!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "حافظه خارجی \"{mountPoint}\" پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی شما پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "فضای ذخیره سازی {owner} تقریباً پر است ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "پوشه گروه \"{mountPoint}\" تقریبا پر است ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیره‌سازی شما تقریباً پر است ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)",
"Path" : "مسیر",
"_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"],
- "Favorited" : "برگزیده شده",
- "Favorite" : "برگزیده",
- "New folder" : "پوشه جدید",
- "Upload file" : "آپلود فایل",
- "Recent" : "اخیر",
- "Remove from favorites" : "حذف کردن از برگزیده ها",
- "Add to favorites" : "اضافه کردن به برگزیده ها",
+ "Favored" : "Favored",
+ "Favor" : "Favor",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)",
+ "Upload file" : "بارگذاری پرونده",
+ "Not favored" : "Not favored",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
- "Added to favorites" : "محبوب شد",
- "Removed from favorites" : "از محبوب‌ها حذف شد",
- "You added {file} to your favorites" : "شما فایل {file} را برای خودتان محبوب کردید",
- "You removed {file} from your favorites" : "شما فایل {file} را از محبوب‌های خودتان حذف کردید",
- "File changes" : "تغییرات فایل",
- "Created by {user}" : "{user} ٖایجاد کرد",
- "Changed by {user}" : "{user} تغییر داد",
- "Deleted by {user}" : " {user} حذف کرد",
- "\"remote user\"" : "\"کاربران از راه‌ دور\"",
- "A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت",
- "All files" : "تمامی فایل‌ها",
- "Unlimited" : "نامحدود",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
- "Accept" : "قبول",
- "Reject" : "رد کردن",
- "in %s" : "در %s",
- "Change" : "تغییر",
- "Transfer" : "انتقال",
- "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
- "Tags" : "برچسب‌ها",
- "Cancel" : "لغو",
- "Create" : "ساخت",
- "%1$s of %2$s used" : "%1$s از %2$s استفاده شده ",
- "Settings" : "تنظیمات",
- "Show hidden files" : "نمایش فایل‌های مخفی",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "نمای شبکه را تغییر دهید",
- "No files in here" : "هیچ فایلی اینجا وجود ندارد",
- "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
- "No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
- "Select all" : "انتخاب همه",
- "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
- "No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
- "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
- "Deleted files" : "فایل های حذف شده",
- "Shares" : "اشتراک گذاری ها",
- "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران",
- "Shared with you" : "Shared with you",
- "Shared by link" : "اشتراک گذاشته شده از طریق لینک",
- "Deleted shares" : "اشتراک گذاری های حذف شده",
- "Pending shares" : "اشتراک در حال انتظار ",
+ "\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد",
+ "\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements",
+ "\"{displayName}\" batch action executed successfully" : "عملکرد دسته‌ای \"{displayName}\" با موفقیت اجرا شد",
+ "Submitting fields…" : "Submitting fields…",
+ "Filter filenames…" : "Filter filenames…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد",
+ "Enable the grid view" : "Enable the grid view",
+ "Enable folder tree" : "Enable folder tree",
+ "Copy to clipboard" : "کپی به کلیپ بورد",
+ "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
+ "Deletion cancelled" : "Deletion cancelled",
+ "Move cancelled" : "Move cancelled",
+ "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "باز کردن جزئیات",
+ "Photos and images" : "Photos and images",
+ "New folder creation cancelled" : "New folder creation cancelled",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "All folders" : "All folders",
+ "Personal Files" : "Personal Files",
"Text file" : "فایل متنی",
- "New text file.txt" : "فایل متنی جدید .txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "فضای ذخیر‌سازی {owner} پر شده است، امکان بروزرسانی یا هم‌گام‌سازی بیشتر وجود ندارد!",
- "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!",
- "_matches '{filter}'_::_match '{filter}'_" : ["تطبیق '{filter}'","تطبیق '{filter}'"]
+ "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt",
+ "%1$s (renamed)" : "%1$s (renamed)",
+ "renamed file" : "renamed file",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "Filter file names …" : "Filter file names …",
+ "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.",
+ "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
+ "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.",
+ "Open the actions menu for a file" : "Open the actions menu for a file",
+ "Rename a file" : "Rename a file",
+ "Delete a file" : "Delete a file",
+ "Favorite or remove a file from favorites" : "Favorite or remove a file from favorites",
+ "Manage tags for a file" : "Manage tags for a file",
+ "Deselect all files" : "Deselect all files",
+ "Select or deselect a file" : "Select or deselect a file",
+ "Select a range of files" : "Select a range of files",
+ "Navigate to the parent folder" : "Navigate to the parent folder",
+ "Navigate to the file above" : "Navigate to the file above",
+ "Navigate to the file below" : "Navigate to the file below",
+ "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)",
+ "Toggle the grid view" : "Toggle the grid view",
+ "Open the sidebar for a file" : "Open the sidebar for a file"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index 468ee44f4ef..8dd003ee343 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -1,132 +1,466 @@
{ "translations": {
- "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
- "Storage invalid" : "فضای ذخیره‌سازی نامعتبر",
+ "Added to favorites" : "محبوب شد",
+ "Removed from favorites" : "از محبوب‌ها حذف شد",
+ "You added {file} to your favorites" : "شما پروندهٔ {file} را به مورد پسند‌هایتان افزودید",
+ "You removed {file} from your favorites" : "شما پروندهٔ {file} را از مورد پسند‌های خود حذف کردید",
+ "Favorites" : "موارد محبوب",
+ "File changes" : "تغییرات پرونده",
+ "Created by {user}" : "{user} ٖایجاد کرد",
+ "Changed by {user}" : "{user} تغییر داد",
+ "Deleted by {user}" : " {user} حذف کرد",
+ "Restored by {user}" : "بازیابی شده توسط {user}",
+ "Renamed by {user}" : "تغییر نام توسط {user}",
+ "Moved by {user}" : "منتقل شده توسط {user}",
+ "\"remote account\"" : "&quot;حساب از راه دور&quot;",
+ "You created {file}" : "شما {file} را ایجاد کردید",
+ "You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید",
+ "{user} created {file}" : "{user} {file} را ایجاد کرد",
+ "{user} created an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده در {file} ایجاد کرد",
+ "{file} was created in a public folder" : "{file} در یک پوشه عمومی ایجاد شد",
+ "You changed {file}" : "شما {file} را تغییر دادید",
+ "You changed an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} تغییر دادید",
+ "{user} changed {file}" : "{user} {file} را تغییر داد",
+ "{user} changed an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} تغییر داد",
+ "You deleted {file}" : "شما {file} را حذف کردید",
+ "You deleted an encrypted file in {file}" : "شما یک فایل رمزگذاری شده را در {file} حذف کردید",
+ "{user} deleted {file}" : "{user} {file} را حذف کرد",
+ "{user} deleted an encrypted file in {file}" : "{user} یک فایل رمزگذاری شده را در {file} حذف کرد",
+ "You restored {file}" : "شما {file} را بازیابی کردید",
+ "{user} restored {file}" : "{user} {file} را بازیابی کرد",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "شما نام {oldfile} (پنهان) را به {newfile} (پنهان) تغییر دادید",
+ "You renamed {oldfile} (hidden) to {newfile}" : "شما نام {oldfile} (پنهان) را به {newfile} تغییر دادید",
+ "You renamed {oldfile} to {newfile} (hidden)" : "شما نام {oldfile} را به {newfile} تغییر دادید (پنهان)",
+ "You renamed {oldfile} to {newfile}" : "شما نام {oldfile} را به {newfile} تغییر دادید",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile} (مخفی)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} به {oldfile} تغییر نام داد (پنهان) به {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} نام {oldfile} را به {newfile} تغییر داد (پنهان)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} نام {oldfile} را به {newfile} تغییر داد",
+ "You moved {oldfile} to {newfile}" : "شما {oldfile} را به {newfile} منتقل کردید",
+ "{user} moved {oldfile} to {newfile}" : "{user} {oldfile} را به {newfile} منتقل کرد",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "یک فایل به موارد دلخواه شما اضافه یا حذف شده است",
+ "Files" : "پرونده‌ها",
+ "A file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه تغییر کرده است",
+ "A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است",
+ "Failed to authorize" : "مجوز صادر نشد",
+ "Invalid folder path" : "Invalid folder path",
+ "Folder not found" : "Folder not found",
+ "The file cannot be found" : "The file cannot be found",
+ "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s",
+ "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location",
+ "The file could not be converted." : "The file could not be converted.",
+ "Could not get relative path to converted file" : "Could not get relative path to converted file",
+ "Favorite files" : "Favorite files",
+ "No favorites" : "هیچ برگزیده",
+ "More favorites" : "More favorites",
+ "Accept" : "قبول",
+ "Reject" : "رد کردن",
+ "Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.",
+ "Ownership transfer denied" : "Ownership transfer denied",
+ "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.",
+ "Ownership transfer failed" : "انتقال مالکیت ناموفق بود",
+ "Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.",
+ "The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.",
+ "Ownership transfer done" : "انتقال مالکیت انجام شد",
+ "Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.",
+ "The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.",
+ "in %s" : "در %s",
+ "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s",
+ "Files compatibility" : "Files compatibility",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.",
+ "Enforce Windows compatibility" : "Enforce Windows compatibility",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.",
+ "File Management" : "مدیریت فایل",
+ "Home" : "خانه",
+ "Target folder does not exist any more" : "پوشه هدف وجود ندارد",
+ "Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید",
+ "Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.",
+ "Drag and drop files here to upload" : "برای بارگذاری، فایل‌ها را بکشید و اینجا بیاندازید",
+ "Favorite" : "برگزیده",
+ "Back" : "بازگشت",
+ "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"",
+ "File is loading" : "File is loading",
+ "Folder is loading" : "Folder is loading",
+ "Filename" : "نام پرونده",
+ "Folder name" : "نام پوشه",
+ "This node is unavailable" : "گره شما در دسترس نیست",
+ "Another entry with the same name already exists." : "Another entry with the same name already exists.",
+ "Invalid filename." : "Invalid filename.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"",
+ "Rename file" : "تغییر نام فایل",
+ "Folder" : "پوشه",
+ "Unknown file type" : "Unknown file type",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "در انتظار",
+ "Unknown date" : "Unknown date",
+ "Clear filter" : "پاک کردن پالایه",
+ "Modified" : "تاریخ",
+ "Search everywhere" : "جستجو در هر کجا.",
+ "Type" : "نوع",
+ "Active filters" : "فیلترهای فعال",
+ "Remove filter" : "فیلتر را بردارید",
+ "Total rows summary" : "خلاصه کل ردیف ها",
+ "Toggle selection for all files and folders" : "Toggle selection for all files and folders",
+ "Name" : "نام",
+ "File type" : "File type",
+ "Size" : "اندازه",
+ "Actions" : "فعالیت ها",
+ "(selected)" : "(selected)",
+ "List of files and folders." : "لیست فایل ها و پوشه ها",
+ "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
+ "File not found" : "فایل یافت نشد",
+ "{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
+ "{used} of {quota} used" : "{used} از {quota} استفاده شده",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "نمی‌توان آمار ذخیره‌سازی را بازخوانی کرد",
+ "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!",
+ "Storage information" : "اطلاعات ذخیره‌سازی",
+ "Storage quota" : "محدودیت ذخیره‌سازی",
+ "New folder" : "پوشه جدید",
+ "Create new folder" : "ساختن پوشه جدید",
+ "This name is already in use." : "This name is already in use.",
+ "Create" : "ایجاد",
+ "Fill template fields" : "Fill template fields",
+ "Submitting fields …" : "Submitting fields …",
+ "Submit" : "ارسال",
+ "Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید",
+ "Transfer" : "انتقال",
+ "Transfer {path} to {userid}" : "انتقال {path} به {userid}",
+ "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
"Unknown error" : "خطای نامشخص",
- "File could not be found" : "فایل پیدا نمی‌شود",
- "Move or copy" : "انتقال یا کپی",
- "Download" : "دانلود",
+ "Ownership transfer request sent" : "درخواست انتقال مالکیت ارسال شد",
+ "Cannot transfer ownership of a file or folder you do not own" : "نمی‌توان مالکیت فایل یا پوشه‌ای را که متعلق به شما نیست، منتقل کرد",
+ "Transfer ownership of a file or folder" : "انتقال مالکیت یک فایل یا پوشه",
+ "Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید",
+ "Change" : "تغییر",
+ "New owner" : "مالک جدید",
+ "Keep {old}" : "Keep {old}",
+ "Keep without extension" : "Keep without extension",
+ "Use {new}" : "Use {new}",
+ "Remove extension" : "Remove extension",
+ "Change file extension" : "Change file extension",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.",
+ "Do not show this dialog again." : "Do not show this dialog again.",
+ "Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید",
+ "Choose {file}" : "انتخاب {file}",
+ "Share" : "اشتراک‌گذاری",
+ "Shared by link" : "اشتراک گذاشته شده از طریق لینک",
+ "Shared" : "به اشتراک گذاشته شده ",
+ "Switch to list view" : "تغییر به نمای لیست",
+ "Switch to grid view" : "Switch to grid view",
+ "The file could not be found" : "The file could not be found",
+ "Upload was cancelled by user" : "آپلود توسط کاربر لغو شد",
+ "Not enough free space" : "فضای کافی در دسترس نیست",
+ "Operation is blocked by access control" : "مدیریت دسترسی، عملیات را متوقف کرد",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Error during upload, status code {status}" : "Error during upload, status code {status}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "در حال بارگیری پوشه فعلی",
+ "Retry" : "تلاش دوباره",
+ "No files in here" : "هیچ فایلی اینجا وجود ندارد",
+ "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
+ "Go back" : "برگرد",
+ "Views" : "بازدیدها",
+ "Files settings" : "تنظیمات پرونده‌ها",
+ "Your files" : "Your files",
+ "Open in files" : "باز کردن در فایل‌ها",
+ "File cannot be accessed" : "فایل قابل دسترسی نیست",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.",
+ "Clipboard is not available" : "کلیپ بورد در دسترس نیست",
+ "General" : "عمومی",
+ "All files" : "تمامی فایل‌ها",
+ "Personal files" : "فایل‌های شخصی",
+ "Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید",
+ "Sort folders before files" : "Sort folders before files",
+ "Appearance" : "ظاهر",
+ "Show hidden files" : "نمایش پرونده‌های مخفی",
+ "Show file type column" : "Show file type column",
+ "Crop image previews" : "پیش نمایش تصویر برش",
+ "Additional settings" : "تنظیمات اضافی",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "رونوشت",
+ "Warnings" : "Warnings",
+ "Keyboard shortcuts" : "میان‌برهای صفحه‌کلید",
+ "File actions" : "File actions",
+ "Rename" : "تغییرنام",
"Delete" : "حذف",
- "Home" : "خانه",
+ "Manage tags" : "مدیریت برچسب ها",
+ "Selection" : "انتخاب",
+ "Select all files" : "Select all files",
+ "Deselect all" : "لغو انتخاب همه",
+ "Navigation" : "جهت یابی",
+ "View" : "نمایش",
+ "Toggle grid view" : "نمای دریچه را تغییر دهید",
+ "Show those shortcuts" : "Show those shortcuts",
+ "You" : "You",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Error while loading the file data" : "خطا هنگام بارگیری داده های فایل",
+ "Owner" : "مالک",
+ "Remove from favorites" : "حذف کردن از برگزیده ها",
+ "Add to favorites" : "اضافه کردن به برگزیده ها",
+ "Tags" : "برچسب‌ها",
+ "Blank" : "جای خالی",
+ "Unable to create new file from template" : "امکان ایجاد فایل جدید از الگو وجود ندارد",
+ "Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید",
+ "Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید",
+ "Creating file" : "ایجاد فایل",
+ "Save as {displayName}" : "Save as {displayName}",
+ "Save as …" : "Save as …",
+ "Converting files …" : "Converting files …",
+ "Failed to convert files: {message}" : "Failed to convert files: {message}",
+ "All files failed to be converted" : "All files failed to be converted",
+ "One file could not be converted: {message}" : "One file could not be converted: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
+ "Files successfully converted" : "Files successfully converted",
+ "Failed to convert files" : "Failed to convert files",
+ "Converting file …" : "Converting file …",
+ "File successfully converted" : "File successfully converted",
+ "Failed to convert file: {message}" : "Failed to convert file: {message}",
+ "Failed to convert file" : "Failed to convert file",
+ "Leave this share" : "ترک این اشتراک",
+ "Leave these shares" : "Leave these shares",
+ "Disconnect storage" : "فضای ذخیره را جدا کنید",
+ "Disconnect storages" : "Disconnect storages",
+ "Delete permanently" : "حذف قطعی",
+ "Delete and unshare" : "Delete and unshare",
+ "Delete file" : "حذف پرونده",
+ "Delete files" : "حذف فایل‌ها",
+ "Delete folder" : "حذف پوشه",
+ "Delete folders" : "Delete folders",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"],
+ "Confirm deletion" : "Confirm deletion",
+ "Cancel" : "لغو",
+ "Download" : "دانلود",
+ "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The files are locked" : "The files are locked",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "رونوشت به {target}",
+ "Move to {target}" : "جابجایی به {target}",
+ "Move" : "انتقال",
+ "Move or copy operation failed" : "Move or copy operation failed",
+ "Move or copy" : "انتقال یا رونوشت",
+ "Open folder {displayName}" : "باز کردن پوشه {displayName}",
+ "Open in Files" : "در فایل باز کنید",
+ "Open locally" : "گشودن محلی",
+ "Failed to redirect to client" : "هدایت به مشتری انجام نشد",
+ "Open file locally" : "گشودن محلی پرونده",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.",
+ "Retry and close" : "Retry and close",
+ "Open online" : "Open online",
+ "Details" : "جزئیات",
+ "View in folder" : "مشاهده در پوشه",
+ "Today" : "امروز",
+ "Last 7 days" : "۷ روز گذشته",
+ "Last 30 days" : "۳۰ روز گذشته",
+ "This year ({year})" : "This year ({year})",
+ "Last year ({year})" : "Last year ({year})",
+ "Documents" : "سندها",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Folders",
+ "Audio" : "صدا",
+ "Images" : "تصاویر",
+ "Videos" : "فیلم ها ",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست",
+ "Create templates folder" : "Create templates folder",
+ "Templates" : "قالب‌ها",
+ "New template folder" : "New template folder",
+ "In folder" : "In folder",
+ "Search in folder: {folder}" : "Search in folder: {folder}",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded",
+ "No files to upload" : "No files to upload",
+ "Unable to create the directory {directory}" : "Unable to create the directory {directory}",
+ "Some files could not be uploaded" : "Some files could not be uploaded",
+ "Files uploaded successfully" : "Files uploaded successfully",
+ "No files to process" : "No files to process",
+ "Some files could not be copied" : "Some files could not be copied",
+ "Some files could not be moved" : "برخی از پرونده‌ها قابل انتقال نیستند",
+ "Files copied successfully" : "Files copied successfully",
+ "Files moved successfully" : "Files moved successfully",
+ "Conflicts resolution skipped" : "Conflicts resolution skipped",
+ "Upload cancelled" : "Upload cancelled",
+ "Could not rename \"{oldName}\", it does not exist any more" : "نمی‌توان نام «{oldName}» را تغییر داد، دیگر وجود ندارد",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "نام \"{newName}\" در پوشه \"{dir}\" به کار رفته است.\nلطفا نام دیگری برگزینید.",
+ "Could not rename \"{oldName}\"" : "تغییر نام \"{oldName}\" ممکن نیست",
+ "This operation is forbidden" : "این عملیات غیرمجاز است",
+ "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
+ "Unexpected error: {error}" : "Unexpected error: {error}",
+ "_%n file_::_%n files_" : ["%n فایل","%n فایل"],
+ "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"],
+ "Filename must not be empty." : "Filename must not be empty.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.",
+ "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".",
+ "List of favorite files and folders." : "List of favorite files and folders.",
+ "No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
+ "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
+ "List of your files and folders." : "List of your files and folders.",
+ "List of your files and folders that are not shared." : "List of your files and folders that are not shared.",
+ "No personal files found" : "No personal files found",
+ "Files that are not shared will show up here." : "Files that are not shared will show up here.",
+ "Recent" : "اخیر",
+ "List of recently modified files and folders." : "فهرست فایل‌ها و پوشه‌هایی که اخیراً اصلاح شده‌اند.",
+ "No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است",
+ "Files and folders you recently modified will show up here." : "فایل‌ها و پوشه‌هایی که اخیراً تغییر داده‌اید در اینجا نمایش داده می‌شوند.",
+ "Search" : "جستجو",
+ "No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
+ "Select all" : "انتخاب همه",
+ "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
+ "File could not be found" : "پرونده پیدا نشد",
+ "Show list view" : "نمایش فهرستی",
+ "Show grid view" : "نمایش شبکه‌ای",
"Close" : "بستن",
- "Favorites" : "موارد محبوب",
- "Could not create folder \"{dir}\"" : "شاخه \"{dir}\" ساخته نمی‌شود",
- "This will stop your current uploads." : "با این کار آپلودهای فعلی شما متوقف خواهد شد.",
+ "Could not create folder \"{dir}\"" : "پوشهٔ \"{dir}\" ساخته نشد",
+ "This will stop your current uploads." : "با این کار بارگذاری فعلی شما متوقف خواهد شد.",
"Upload cancelled." : "بار گذاری لغو شد",
- "Processing files …" : "پردازش فایل ها",
+ "Processing files …" : "پردازش پرونده‌ها...",
"…" : "...",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است",
"Target folder \"{dir}\" does not exist any more" : "پوشه هدف \"{dir}\" دیگر وجود ندارد",
- "Not enough free space" : "فضای کافی در دسترس نیست",
"An unknown error has occurred" : "خطایی ناشناخته اتفاق افتاده است",
+ "File could not be uploaded" : "پرونده بارگذاری نشد",
"Uploading …" : "بارگذاری...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber} /{total} )",
+ "Uploading … ({currentNumber}/{total})" : "در حال بارگذاری ... ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} از {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "بارگذاری این مورد پشتیبانی نمی شد",
- "Target folder does not exist any more" : "پوشه هدف وجود ندارد",
+ "Uploading that item is not supported" : "بارگذاری آن مورد پشتیبانی نمی‌شود",
"Error when assembling chunks, status code {status}" : "خطا هنگام جمع آوری قطعه ها، کد وضعیت {status}",
- "Actions" : "فعالیت ها",
- "Rename" : "تغییرنام",
- "Copy" : "کپی کردن",
- "Choose target folder" : "پوشه هدف را انتخاب کنید",
- "Open" : "باز کن...",
- "Delete file" : "حذف فایل",
- "Delete folder" : "حذف پوشه",
- "Disconnect storage" : "فضای ذخیره را جدا کنید",
+ "Choose target folder" : "پوشهٔ هدف را انتخاب کنید",
+ "Set reminder" : "تنظیم یادآوری",
+ "Edit locally" : "ویرایش محلی",
+ "Open" : "باز کردن",
"Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"",
- "Files" : "پرونده‌ها",
- "Details" : "جزئیات",
- "Select" : "انتخاب",
- "Pending" : "در انتظار",
+ "Please select tag(s) to add to the selection" : "لطفاً برچسب(های) را برای افزودن به انتخاب انتخاب کنید",
+ "Apply tag(s) to selection" : "تگ(ها) را در انتخاب اعمال کنید",
+ "Select directory \"{dirName}\"" : "دایرکتوری \"{dirName}\" را انتخاب کنید",
+ "Select file \"{fileName}\"" : "فایل \"{fileName}\" را انتخاب کنید",
"Unable to determine date" : "امکان تعیین تاریخ وجود ندارد",
- "This operation is forbidden" : "این عملیات غیرمجاز است",
"This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید",
- "Could not move \"{file}\", target exists" : "انتقال\"{پرونده}\" امکان پذیر نیست ، هدف وجود دارد",
- "Could not move \"{file}\"" : "فایل \"{file}\" منتقل نمی‌شود",
+ "Could not move \"{file}\", target exists" : "انتقال\"{file}\" امکان پذیر نیست ، هدف وجود دارد",
+ "Could not move \"{file}\"" : "پروندهٔ \"{file}\" منتقل نمی‌شود",
"copy" : "کپی",
- "Could not copy \"{file}\", target exists" : "\"{پرونده}\" کپی نشد ، هدف وجود دارد",
- "Could not copy \"{file}\"" : "پرونده کپی نشد",
- "Copied {origin} inside {destination}" : "کپی شده (اصل) در مقصد",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "کپی شده از {مبدا} و {فایل های ام بی} و فایل های دیگر در {مقصد} . ",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پرونده‌های دیگر در {destination}",
"{newName} already exists" : "{newName} قبلاً موجود است",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "عنوان \"{targetName}\" هم اکنون در پوشه \"{dir}\" وجود دارد. لطفا نام دیگری انتخاب کنید",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" تغییر نام داده نمی‌شود",
- "Could not create file \"{file}\"" : "فایل \"{file}\" ایجاد نمی‌شود",
+ "Could not create file \"{file}\"" : "پروندهٔ \"{file}\" ساخته نشد",
"Could not create file \"{file}\" because it already exists" : "نمی توان پرونده \"{file}\" ایجاد کرد زیرا در حال حاضر وجود دارد",
"Could not create folder \"{dir}\" because it already exists" : "شاخه \"{dir}\" به علت موجود بودن ساخته نشد",
- "Error deleting file \"{fileName}\"." : "خطای حذف فایل \"{fileName}\".",
+ "Could not fetch file details \"{file}\"" : "جزئیات فایل \"{file}\" واکشی نشد",
+ "Error deleting file \"{fileName}\"." : "خطای حذف پروندهٔ \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "جستجو در پوشه های دیگر برای {tag}{filter}{endtag} یافت نشد",
- "Name" : "نام",
- "Size" : "اندازه",
- "Modified" : "تاریخ",
- "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"],
- "_%n file_::_%n files_" : ["%n فایل","%n فایل"],
+ "Enter more than two characters to search in other folders" : "برای جستجو در پوشه های دیگر بیش از دو کاراکتر وارد کنید",
"{dirs} and {files}" : "{dirs} و {files}",
- "You don’t have permission to upload or create files here" : "شما دسترسی مجاز برای آپلود یا ایجاد فایل در اینجا را ندارید",
+ "_including %n hidden_::_including %n hidden_" : ["از جمله %nپنهان","از جمله %nپنهان"],
+ "You do not have permission to upload or create files here" : "شما اجازه آپلود یا ایجاد فایل در اینجا را ندارید",
"_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل","در حال بارگذاری %n فایل"],
"New" : "جدید",
- "{used} of {quota} used" : "{used} از {quota} استفاده شده",
+ "New file/folder menu" : "منوی فایل/پوشه جدید",
+ "Select file range" : "محدوده فایل را انتخاب کنید",
+ "{used}%" : "{used}%",
"{used} used" : "{used} استفاده شده",
"\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.",
"File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.",
+ "\"/\" is not allowed inside a file name." : "\"/\" در داخل نام فایل مجاز نیست.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" یک نوع پرونده مجاز نیست",
- "View in folder" : "مشاهده در پوشه",
- "Copied!" : "کپی انجام شد!",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی {owner} پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "پوشه گروه \"{mountPoint}\" پر است، فایل‌ها دیگر قابل به‌روزرسانی یا همگام‌سازی نیستند!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "حافظه خارجی \"{mountPoint}\" پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "فضای ذخیره‌سازی شما پر است، فایل‌ها دیگر نمی‌توانند به‌روزرسانی یا همگام‌سازی شوند!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "فضای ذخیره سازی {owner} تقریباً پر است ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "پوشه گروه \"{mountPoint}\" تقریبا پر است ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیره‌سازی شما تقریباً پر است ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)",
"Path" : "مسیر",
"_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"],
- "Favorited" : "برگزیده شده",
- "Favorite" : "برگزیده",
- "New folder" : "پوشه جدید",
- "Upload file" : "آپلود فایل",
- "Recent" : "اخیر",
- "Remove from favorites" : "حذف کردن از برگزیده ها",
- "Add to favorites" : "اضافه کردن به برگزیده ها",
+ "Favored" : "Favored",
+ "Favor" : "Favor",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)",
+ "Upload file" : "بارگذاری پرونده",
+ "Not favored" : "Not favored",
"An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است",
- "Added to favorites" : "محبوب شد",
- "Removed from favorites" : "از محبوب‌ها حذف شد",
- "You added {file} to your favorites" : "شما فایل {file} را برای خودتان محبوب کردید",
- "You removed {file} from your favorites" : "شما فایل {file} را از محبوب‌های خودتان حذف کردید",
- "File changes" : "تغییرات فایل",
- "Created by {user}" : "{user} ٖایجاد کرد",
- "Changed by {user}" : "{user} تغییر داد",
- "Deleted by {user}" : " {user} حذف کرد",
- "\"remote user\"" : "\"کاربران از راه‌ دور\"",
- "A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت",
- "All files" : "تمامی فایل‌ها",
- "Unlimited" : "نامحدود",
"Upload (max. %s)" : "آپلود (بیشترین سایز %s)",
- "Accept" : "قبول",
- "Reject" : "رد کردن",
- "in %s" : "در %s",
- "Change" : "تغییر",
- "Transfer" : "انتقال",
- "Invalid path selected" : "مسیر نامعتبر انتخاب شده است",
- "Tags" : "برچسب‌ها",
- "Cancel" : "لغو",
- "Create" : "ساخت",
- "%1$s of %2$s used" : "%1$s از %2$s استفاده شده ",
- "Settings" : "تنظیمات",
- "Show hidden files" : "نمایش فایل‌های مخفی",
- "WebDAV" : "WebDAV",
- "Toggle grid view" : "نمای شبکه را تغییر دهید",
- "No files in here" : "هیچ فایلی اینجا وجود ندارد",
- "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگام‌سازی کنید!",
- "No entries found in this folder" : "هیچ ورودی‌ای در این پوشه وجود ندارد",
- "Select all" : "انتخاب همه",
- "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
- "No favorites yet" : "هنوز مورد دلخواه وجود ندارد",
- "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود",
- "Deleted files" : "فایل های حذف شده",
- "Shares" : "اشتراک گذاری ها",
- "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران",
- "Shared with you" : "Shared with you",
- "Shared by link" : "اشتراک گذاشته شده از طریق لینک",
- "Deleted shares" : "اشتراک گذاری های حذف شده",
- "Pending shares" : "اشتراک در حال انتظار ",
+ "\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد",
+ "\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements",
+ "\"{displayName}\" batch action executed successfully" : "عملکرد دسته‌ای \"{displayName}\" با موفقیت اجرا شد",
+ "Submitting fields…" : "Submitting fields…",
+ "Filter filenames…" : "Filter filenames…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد",
+ "Enable the grid view" : "Enable the grid view",
+ "Enable folder tree" : "Enable folder tree",
+ "Copy to clipboard" : "کپی به کلیپ بورد",
+ "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.",
+ "Deletion cancelled" : "Deletion cancelled",
+ "Move cancelled" : "Move cancelled",
+ "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "باز کردن جزئیات",
+ "Photos and images" : "Photos and images",
+ "New folder creation cancelled" : "New folder creation cancelled",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "All folders" : "All folders",
+ "Personal Files" : "Personal Files",
"Text file" : "فایل متنی",
- "New text file.txt" : "فایل متنی جدید .txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "فضای ذخیر‌سازی {owner} پر شده است، امکان بروزرسانی یا هم‌گام‌سازی بیشتر وجود ندارد!",
- "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!",
- "_matches '{filter}'_::_match '{filter}'_" : ["تطبیق '{filter}'","تطبیق '{filter}'"]
+ "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt",
+ "%1$s (renamed)" : "%1$s (renamed)",
+ "renamed file" : "renamed file",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.",
+ "Filter file names …" : "Filter file names …",
+ "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.",
+ "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.",
+ "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.",
+ "Open the actions menu for a file" : "Open the actions menu for a file",
+ "Rename a file" : "Rename a file",
+ "Delete a file" : "Delete a file",
+ "Favorite or remove a file from favorites" : "Favorite or remove a file from favorites",
+ "Manage tags for a file" : "Manage tags for a file",
+ "Deselect all files" : "Deselect all files",
+ "Select or deselect a file" : "Select or deselect a file",
+ "Select a range of files" : "Select a range of files",
+ "Navigate to the parent folder" : "Navigate to the parent folder",
+ "Navigate to the file above" : "Navigate to the file above",
+ "Navigate to the file below" : "Navigate to the file below",
+ "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)",
+ "Toggle the grid view" : "Toggle the grid view",
+ "Open the sidebar for a file" : "Open the sidebar for a file"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js
index 906a121a3bc..cb790b7cedb 100644
--- a/apps/files/l10n/fi.js
+++ b/apps/files/l10n/fi.js
@@ -1,16 +1,319 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
- "Storage invalid" : "Virheellinen tallennustila",
+ "Added to favorites" : "Lisätty suosikkeihin",
+ "Removed from favorites" : "Poistettu suosikeista",
+ "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin",
+ "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista",
+ "Favorites" : "Suosikit",
+ "File changes" : "Tiedostomuutokset",
+ "Created by {user}" : "Tekijänä {user}",
+ "Changed by {user}" : "Muokkaajana {user}",
+ "Deleted by {user}" : "Poistanut {user}",
+ "Restored by {user}" : "Palauttanut {user}",
+ "Renamed by {user}" : "Uudelleennimennyt {user}",
+ "Moved by {user}" : "Siirtänyt {user}",
+ "\"remote account\"" : "\"etätili\"",
+ "You created {file}" : "Loit tiedoston {file}",
+ "You created an encrypted file in {file}" : "Loit salatun tiedoston {file}",
+ "{user} created {file}" : "{user} loi tiedoston {file}",
+ "{user} created an encrypted file in {file}" : "{user} loi salatun tiedoston {file}",
+ "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa",
+ "You changed {file}" : "Muutit tiedostoa {file}",
+ "You changed an encrypted file in {file}" : "Muutit salattua tiedostoa {file}",
+ "{user} changed {file}" : "{user} muutti tiedostoa {file}",
+ "{user} changed an encrypted file in {file}" : "{user} muutti salattua tiedostoa {file}",
+ "You deleted {file}" : "Poistit tiedoston {file}",
+ "You deleted an encrypted file in {file}" : "Poistit salatun tiedoston {file}",
+ "{user} deleted {file}" : "{user} poisti tiedoston {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} poisti salatun tiedoston {file}",
+ "You restored {file}" : "Palautit tiedoston {file}",
+ "{user} restored {file}" : "{user} palautti tiedoston {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Uudelleennimesit tiedoston {oldfile} (piilotettu) tiedostoksi {newfile} (piilotettu)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Uudelleennimesit tiedoston {oldfile} (piilotettu) tiedostoksi {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Uudelleennimesit tiedoston {oldfile} tiedostoksi {newfile} (piilotettu)",
+ "You renamed {oldfile} to {newfile}" : "Annoit tiedostolle {oldfile} uuden nimen {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} uudelleennimesi tiedoston {oldfile} (piilotettu) tiedostoksi {newfile} (piilotettu)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} (piilotettu) tiedostoksi {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile} (piilotettu)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile}",
+ "You moved {oldfile} to {newfile}" : "Siirsit tiedoston {oldfile} tiedostoksi {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} siirsi tiedoston {oldfile} tiedostoksi {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Tiedosto on lisätty tai poistettu <strong>suosikeista</strong>",
+ "Files" : "Tiedostot",
+ "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Suosikkitiedostoa tai -kansiota on <strong>muutettu</strong>",
+ "Failed to authorize" : "Valtuuttaminen epäonnistui",
+ "Invalid folder path" : "Virheellinen kansion polku",
+ "Folder not found" : "Kansiota ei löytynyt",
+ "The file cannot be found" : "Tiedostoa ei löytynyt",
+ "The destination path does not exist: %1$s" : "Kohdepolkua ei ole olemassa: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sinulla ei ole oikeutta luoda tiedostoa määriteltyyn sijaintiin.",
+ "The file could not be converted." : "Tiedostoa ei voitu muuntaa.",
+ "Could not get relative path to converted file" : "Muunnetun tiedoston suhteellista polkua ei voitu hakea",
+ "Favorite files" : "Suosikkitiedostot",
+ "No favorites" : "Ei suosikkeja",
+ "More favorites" : "Lisää suosikeja",
+ "Accept" : "Hyväksy",
+ "Reject" : "Hylkää",
+ "Incoming ownership transfer from {user}" : "Saapuva omistajuuden siirto käyttäjältä {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Hyväksytkö kohteen {path}?\n\nHuomio: Siirtotoimenpiteet hyväksynnän jälkeen saattavat kestää tunnin.",
+ "Ownership transfer denied" : "Omistajuuden siirto kielletty",
+ "Ownership transfer failed" : "Omistajuuden siirto epäonnistui",
+ "Your ownership transfer of {path} to {user} failed." : "Kohteen {path} omistajuussiirtosi käyttäjälle {user} epäonnistui.",
+ "The ownership transfer of {path} from {user} failed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} epäonnistui.",
+ "Ownership transfer done" : "Omistajuuden siirto valmis",
+ "Your ownership transfer of {path} to {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} valmistui.",
+ "The ownership transfer of {path} from {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjältä {user} valmistui.",
+ "in %s" : "polussa %s",
+ "Files compatibility" : "Tiedostojen yhteensopivuus",
+ "Enforce Windows compatibility" : "Pakota Windows-yhteensopivuus",
+ "File Management" : "Tiedostohallinta",
+ "Home" : "Koti",
+ "Target folder does not exist any more" : "Kohdekansiota ei ole enää olemassa",
+ "Reload current directory" : "Lataa nykyinen kansio uudelleen",
+ "Go to the \"{dir}\" directory" : "Siirry kansioon \"{dir}\"",
+ "Current directory path" : "Nykyisen kansion polku",
+ "Your have used your space quota and cannot upload files anymore" : "Olet käyttänyt tilakiintiösi, joten et voi lähettää enempää tiedostoja",
+ "You do not have permission to upload or create files here." : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tänne.",
+ "Drag and drop files here to upload" : "Vedä ja pudota tiedostot tähän lähettääksesi",
+ "Favorite" : "Suosikki",
+ "Back" : "Takaisin",
+ "File is loading" : "Tiedostoa ladataan",
+ "Folder is loading" : "Kansiota ladataan",
+ "Filename" : "Tiedostonimi",
+ "Folder name" : "Kansion nimi",
+ "Invalid filename." : "Epäkelpo tiedostonimi.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"",
+ "Rename file" : "Nimeä tiedosto uudelleen",
+ "Folder" : "Kansio",
+ "Unknown file type" : "Tuntematon tiedostotyyppi",
+ "{ext} image" : "{ext} kuva",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} ääni",
+ "{ext} text" : "{ext} teksti",
+ "Pending" : "Odottaa",
+ "Unknown date" : "Tuntematon päivämäärä",
+ "Clear filter" : "Tyhjennä suodatin",
+ "Modified" : "Muokattu",
+ "Search everywhere" : "Etsi kaikkialta",
+ "Type" : "Tyyppi",
+ "Active filters" : "Aktiiviset suodattimet",
+ "Remove filter" : "Poista suodatin",
+ "Name" : "Nimi",
+ "File type" : "Tiedoston tyyppi",
+ "Size" : "Koko",
+ "Actions" : "Toiminnot",
+ "(selected)" : "(valittu)",
+ "List of files and folders." : "Luettelo tiedostoista ja kansioista.",
+ "You have used your space quota and cannot upload files anymore." : "Olet käyttänyt tilakiintiösi, etkä voi enää ladata tiedostoja.",
+ "Column headers with buttons are sortable." : "Painikkeilla varustetut sarakeotsikot ovat järjestettävissä.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
+ "File not found" : "Tiedostoa ei löytynyt",
+ "{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
+ "{used} of {quota} used" : "{used}/{quota} käytetty",
+ "{relative}% used" : "{relative} % käytetty",
+ "Could not refresh storage stats" : "Tallennustilan tilastoja ei voitu päivittää",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
+ "Storage information" : "Tallennustilan tiedot",
+ "Storage quota" : "Tallennustilan kiintiö",
+ "New folder" : "Uusi kansio",
+ "Create new folder" : "Luo uusi kansio",
+ "This name is already in use." : "Tämä nimi on jo käytössä.",
+ "Create" : "Luo",
+ "Submit" : "Lähetä",
+ "Choose a file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
+ "Transfer" : "Siirrä",
+ "Transfer {path} to {userid}" : "Siirrä {path} käyttäjälle {userid}",
+ "Invalid path selected" : "Valittu virheellinen polku",
"Unknown error" : "Tuntematon virhe",
- "File could not be found" : "Tiedostoa ei löytynyt",
- "Move or copy" : "Siirrä tai kopioi",
- "Download" : "Lataa",
+ "Ownership transfer request sent" : "Pyyntö omistajuuden vaihdosta lähetetty",
+ "Cannot transfer ownership of a file or folder you do not own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista",
+ "Transfer ownership of a file or folder" : "Siirrä tiedoston tai kansion omistajuus",
+ "Choose file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
+ "Change" : "Muuta",
+ "New owner" : "Uusi omistaja",
+ "Keep {old}" : "Pidä {old}",
+ "Use {new}" : "Käytä {new}",
+ "Remove extension" : "Poista tiedostopääte",
+ "Change file extension" : "Vaihda tiedostopäätettä",
+ "Do not show this dialog again." : "Älä näytä uudelleen",
+ "Select file or folder to link to" : "Valitse tiedosto tai kansio, johon linkitetään",
+ "Choose {file}" : "Valitse {file}",
+ "Share" : "Jaa",
+ "Shared by link" : "Jaettu linkillä",
+ "Shared" : "Jaettu",
+ "Switch to list view" : "Vaihda taulukkonäkymään",
+ "Switch to grid view" : "Vaihda ruudukkonäkymään",
+ "The file could not be found" : "Tiedostoa ei löytynyt",
+ "Upload was cancelled by user" : "Käyttäjä peruutti latauksen",
+ "Not enough free space" : "Ei tarpeeksi vapaata tilaa",
+ "Operation is blocked by access control" : "Pääsynhallinta estää toiminnon",
+ "Error during upload: {message}" : "Virhe lähettäessä: {message}",
+ "Error during upload, status code {status}" : "Virhe lähettäessä, tilakoodi {status}",
+ "Unknown error during upload" : "Tuntematon virhe lähettämisen aikana",
+ "Loading current folder" : "Ladataan nykyistä kansiota",
+ "Retry" : "Yritä uudelleen",
+ "No files in here" : "Täällä ei ole tiedostoja",
+ "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
+ "Go back" : "Mene takaisin",
+ "Views" : "Näkymät",
+ "Files settings" : "Tiedostojen asetukset",
+ "Your files" : "Tiedostot",
+ "Open in files" : "Avaa tiedostosovelluksessa",
+ "File cannot be accessed" : "Tiedostoa ei voi käyttää",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Tiedostoa ei löytynyt tai oikeutesi eivät riitä sen katseluun. Pyydä lähettäjää jakamaan se.",
+ "Clipboard is not available" : "Leikepöytä ei ole käytettävissä",
+ "General" : "Yleiset",
+ "All files" : "Kaikki tiedostot",
+ "Personal files" : "Henkilökohtaiset tiedostot",
+ "Sort favorites first" : "Järjestä suosikit ensiksi",
+ "Sort folders before files" : "Järjestä kansiot ennen tiedostoja",
+ "Appearance" : "Ulkoasu",
+ "Show hidden files" : "Näytä piilotetut tiedostot",
+ "Show file type column" : "Näytä tiedostotyypin sarake",
+ "Crop image previews" : "Rajaa kuvien esikatseluja",
+ "Additional settings" : "Lisäasetukset",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV:in URL-osoite",
+ "Copy" : "Kopioi",
+ "Warnings" : "Varoitukset",
+ "Keyboard shortcuts" : "Pikanäppäimet",
+ "File actions" : "Tiedostotoiminnot",
+ "Rename" : "Nimeä uudelleen",
"Delete" : "Poista",
- "Home" : "Koti",
+ "Manage tags" : "Hallitse tunnisteita",
+ "Selection" : "Valinta",
+ "Select all files" : "Valitse kaikki tiedostot",
+ "Deselect all" : "Poista valinnat",
+ "Navigation" : "Navigointi",
+ "View" : "Näytä",
+ "Toggle grid view" : "Ruudukkonäkymä päälle/pois",
+ "You" : "Sinä",
+ "Shared multiple times with different people" : "Jaettu useita kertoja eri ihmisten kanssa",
+ "Error while loading the file data" : "Virhe tiedostoa ladatessa",
+ "Owner" : "Omistaja",
+ "Remove from favorites" : "Poista suosikeista",
+ "Add to favorites" : "Lisää suosikkeihin",
+ "Tags" : "Tunnisteet",
+ "Blank" : "Tyhjä",
+ "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda",
+ "Pick a template for {name}" : "Valtise mallipohja tiedostolle {name}",
+ "Create a new file with the selected template" : "Luo uusi tiedosto valitulla mallipohjalla",
+ "Creating file" : "Luodaan tiedostoa",
+ "Save as {displayName}" : "Tallenna nimellä {displayName}",
+ "Save as …" : "Tallenna nimellä",
+ "Converting files …" : "Muunnetaan tiedostoja…",
+ "Failed to convert files: {message}" : "Tiedostojen muuntaminen epäonnistui: {message}",
+ "All files failed to be converted" : "Mitään tiedostoista ei voitu muuntaa",
+ "One file could not be converted: {message}" : "Yhtä tiedostoa ei voitu muuntaa: {message}",
+ "Files successfully converted" : "Tiedostot muunnettu onnistuneesti",
+ "Failed to convert files" : "Tiedostojen muuntaminen epäonnistui",
+ "Converting file …" : "Muunnetaan tiedostoa…",
+ "File successfully converted" : "Tiedosto muunnettu onnistuneesti",
+ "Failed to convert file: {message}" : "Tiedoston muuntaminen epäonnistui: {message}",
+ "Failed to convert file" : "Tiedoston muuntaminen epäonnistui",
+ "Leave this share" : "Poistu tästä jaosta",
+ "Disconnect storage" : "Katkaise yhteys tallennustilaan",
+ "Disconnect storages" : "Katkaise yhteys tallennustiloihin",
+ "Delete permanently" : "Poista pysyvästi",
+ "Delete and unshare" : "Poista ja lopeta jakaminen",
+ "Delete file" : "Poista tiedosto",
+ "Delete files" : "Poista tiedostot",
+ "Delete folder" : "Poista kansio",
+ "Delete folders" : "Poista kansio",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Olet poistamassa {count} kohteen lopullisesti","Olet poistamassa {count} kohdetta lopullisesti"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Olet poistamassa {count} kohteen","Olet poistamassa {count} kohdetta"],
+ "Confirm deletion" : "Vahvista poistaminen",
+ "Cancel" : "Peruuta",
+ "Download" : "Lataa",
+ "Moving \"{source}\" to \"{destination}\" …" : "Siirretään \"{source}\" kohteeseen \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopioidaan \"{source}\" kohteeseen \"{destination}\" …",
+ "Destination is not a folder" : "Kohde ei ole kansio",
+ "This file/folder is already in that directory" : "Tämä tiedosto/kansio on jo kyseisessä kansiossa",
+ "(copy)" : "(kopioi)",
+ "A file or folder with that name already exists in this folder" : "Tiedosto tai kansio tällä nimellä on jo olemassa tässä kansiossa",
+ "The files are locked" : "Tiedostot on lukittu",
+ "The file does not exist anymore" : "Tiedostoa ei ole enää olemassa",
+ "Choose destination" : "Valitse kohde",
+ "Copy to {target}" : "Kopioi kohteeseen {target}",
+ "Move to {target}" : "Siirrä kohteeseen {target}",
+ "Move" : "Siirrä",
+ "Move or copy operation failed" : "Siirto- tai kopiointitoiminto epäonnistui",
+ "Move or copy" : "Siirrä tai kopioi",
+ "Open folder {displayName}" : "Avaa kansio {displayName}",
+ "Open in Files" : "Avaa tiedostosovelluksessa",
+ "Open locally" : "Avaa paikallisesti",
+ "Failed to redirect to client" : "Uudelleenohjaus asiakkaaseen epäonnistui",
+ "Open file locally" : "Avaa tiedosto paikallisesti",
+ "Retry and close" : "Yritä uudelleen ja sulje",
+ "Details" : "Tiedot",
+ "View in folder" : "Näe kansiossa",
+ "Today" : "Tänään",
+ "Last 7 days" : "Edelliset 7 päivää",
+ "Last 30 days" : "Edelliset 30 päivää",
+ "This year ({year})" : "Tämä vuosi ({year})",
+ "Last year ({year})" : "Viime vuosi ({year})",
+ "Documents" : "Asiakirjat",
+ "Spreadsheets" : "Laskentataulukot",
+ "Presentations" : "Esitykset",
+ "PDFs" : "PDF-tiedostot",
+ "Folders" : "Kansiot",
+ "Audio" : "Ääni",
+ "Images" : "Kuvat",
+ "Videos" : "Videot",
+ "Created new folder \"{name}\"" : "Luotu uusi kansio \"{name}\"",
+ "Unable to initialize the templates directory" : "Mallipohjien kansiota ei voitu alustaa",
+ "Create templates folder" : "Luo mallipohjien kansio",
+ "Templates" : "Mallipohjat",
+ "New template folder" : "Uusi mallipohjien kansio",
+ "In folder" : "Kansiossa",
+ "Search in folder: {folder}" : "Etsi kansiosta: {folder}",
+ "One of the dropped files could not be processed" : "Yhtä pudotetuista tiedostoista ei voitu prosessoida",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Selaimesi ei tue Filesystem API -rajapintaa. Kansioita ei lähetetä",
+ "No files to upload" : "Ei lähetettäviä tiedostoja",
+ "Unable to create the directory {directory}" : "Kansiota {directory} ei voi luoda",
+ "Some files could not be uploaded" : "Joitain tiedostoja ei voitu lähettää",
+ "Files uploaded successfully" : "Tiedostot lähetetty onnistuneesti",
+ "No files to process" : "Ei tiedostoja käsiteltäväksi",
+ "Some files could not be copied" : "Joitain tiedostoja ei voitu kopioida",
+ "Some files could not be moved" : "Joitain tiedostoja ei voitu siirtää",
+ "Files copied successfully" : "Tiedostot kopioitu onnistuneesti",
+ "Files moved successfully" : "Tiedostot siirretty onnistuneesti",
+ "Upload cancelled" : "Lataus peruutettu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kohdetta \"{oldName}\" ei voitu nimetä uudelleen, koska sitä ei ole enää olemassa",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{newName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
+ "Could not rename \"{oldName}\"" : "Ei voitu nimetä uudelleen \"{oldName}\"",
+ "This operation is forbidden" : "Tämä toiminto on kielletty",
+ "Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
+ "Unexpected error: {error}" : "Odottamaton virhe: {error}",
+ "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
+ "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"],
+ "_%n hidden_::_%n hidden_" : ["%n piilotettu","%n piilotettua"],
+ "Filename must not be empty." : "Tiedostonimi ei voi olla tyhjä.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ei ole sallittu tiedoston nimessä.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ei ole sallitttu tiedostotyyppi.",
+ "Filenames must not end with \"{extension}\"." : "Tiedostojen nimet eivät voi päättyä \"{extension}\".",
+ "List of favorite files and folders." : "Luettelo suosikkitiedostoista ja -kansioista.",
+ "No favorites yet" : "Ei vielä suosikkeja",
+ "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
+ "List of your files and folders." : "Luettelo tiedostoistasi ja kansioistasi.",
+ "List of your files and folders that are not shared." : "Luettelo tiedostoistasi ja kansioistasi, joita ei ole jaettu.",
+ "No personal files found" : "Henkilökohtaisia tiedostoja ei löytynyt",
+ "Files that are not shared will show up here." : "Tiedostot, joita ei ole jasettu, näkyvät täällä.",
+ "Recent" : "Viimeaikaiset",
+ "List of recently modified files and folders." : "Luettelo äskettäin muokatuista tiedostoista ja kansioista.",
+ "No recently modified files" : "Ei äskettäin muokattuja tiedostoja",
+ "Files and folders you recently modified will show up here." : "Äskettäin muokkaamasi tiedostot ja kansiot näkyvät täällä.",
+ "Search" : "Etsi",
+ "No entries found in this folder" : "Ei kohteita tässä kansiossa",
+ "Select all" : "Valitse kaikki",
+ "Upload too large" : "Lähetettävä tiedosto on liian suuri",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
+ "File could not be found" : "Tiedostoa ei löytynyt",
+ "Show list view" : "Näytä listanäkymä",
+ "Show grid view" : "Näytä ruudukkonäkymä",
"Close" : "Sulje",
- "Favorites" : "Suosikit",
"Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda",
"This will stop your current uploads." : "Tämä pysäyttää meneillään olevat lähetykset.",
"Upload cancelled." : "Lähetys peruttu.",
@@ -19,32 +322,24 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä",
"Target folder \"{dir}\" does not exist any more" : "Kohdekansio \"{dir}\" ei ole enää olemassa",
- "Not enough free space" : "Ei tarpeeksi vapaata tilaa",
"An unknown error has occurred" : "Tapahtui tuntematon virhe",
+ "File could not be uploaded" : "Tiedostoa ei voi lähettää",
"Uploading …" : "Lähetetään…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lähetetään… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize} ({bitrate})",
"Uploading that item is not supported" : "Kyseisen kohteen lähettäminen ei ole tuettu",
- "Target folder does not exist any more" : "Kohdekansiota ei ole enää olemassa",
- "Operation is blocked by access control" : "Pääsynhallinta estää toiminnon",
"Error when assembling chunks, status code {status}" : "Virhe koottaessa lohkoja, tilakoodi {status}",
- "Actions" : "Toiminnot",
- "Rename" : "Nimeä uudelleen",
- "Copy" : "Kopioi",
"Choose target folder" : "Valitse kohdekansio",
+ "Set reminder" : "Aseta muistutus",
+ "Edit locally" : "Muokkaa paikallisesti",
"Open" : "Avaa",
- "Delete file" : "Poista tiedosto",
- "Delete folder" : "Poista kansio",
- "Disconnect storage" : "Katkaise yhteys tallennustilaan",
- "Leave this share" : "Poistu tästä jaosta",
"Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja",
- "Files" : "Tiedostot",
- "Details" : "Tiedot",
"Please select tag(s) to add to the selection" : "Valitse lisättävät tunnisteet valinnalle",
"Apply tag(s) to selection" : "Hyväksy tunnisteet valinnalle",
- "Select" : "Valitse",
- "Pending" : "Odottaa",
+ "Select directory \"{dirName}\"" : "Valitse kansio \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Valitse tiedosto \"{fileName}\"",
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
- "This operation is forbidden" : "Tämä toiminto on kielletty",
"This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
"Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa",
"Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut",
@@ -54,9 +349,6 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "Kopioitu {origin} kohteeseen {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Kopioitu {origin} ja {nbfiles} muuta tiedostoa kohteeseen {destination}",
"{newName} already exists" : "{newName} on jo olemassa",
- "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
- "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut",
"Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda",
"Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa",
"Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa",
@@ -64,23 +356,20 @@ OC.L10N.register(
"Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Ei hakutuloksia muissa kansioissa haulla {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Kirjoita enemmän kuin kaksi merkkiä etsiäksesi muista kansioista",
- "Name" : "Nimi",
- "Size" : "Koko",
- "Modified" : "Muokattu",
- "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"],
- "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
"{dirs} and {files}" : "{dirs} ja {files}",
"_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"],
- "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin",
+ "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin",
"_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"],
"New" : "Uusi",
+ "New file/folder menu" : "Uusi tiedosto/kansio -valikko",
"Select file range" : "Valitse tiedostojoukko",
- "{used} of {quota} used" : "{used}/{quota} käytetty",
+ "{used}%" : "{used} %",
"{used} used" : "{used} käytetty",
"\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.",
"File name cannot be empty." : "Tiedoston nimi ei voi olla tyhjä.",
"\"/\" is not allowed inside a file name." : "\"/\" ei ole sallittu merkki tiedostonimessä.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ei ole sallittu tiedostomuoto",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ryhmäkansio \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Erillinen tallennustila \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"Your storage is full, files cannot be updated or synced anymore!" : "Tallennustilasi on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
@@ -89,122 +378,47 @@ OC.L10N.register(
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Erillinen tallennustila \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Tallennustila on melkein täynnä ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastaa \"{filter}\"","vastaa \"{filter}\""],
- "View in folder" : "Näe kansiossa",
- "Copied!" : "Kopioitu!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopioi suora linkki (toimii vain käyttäjillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Suora linkki kopioitu (toimii vain henkilöillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
"Path" : "Polku",
"_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"],
- "Favorited" : "Lisätty suosikkeihin",
- "Favorite" : "Suosikki",
- "You can only favorite a single file or folder at a time" : "Voit valita suosikiksi vain yhden tiedoston tai kansion kerrallaan",
- "New folder" : "Uusi kansio",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopioi suora linkki (toimii vain henkilöillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
"Upload file" : "Lähetä tiedosto",
- "Recent" : "Viimeaikaiset",
- "Not favorited" : "Ei suosikeissa",
- "Remove from favorites" : "Poista suosikeista",
- "Add to favorites" : "Lisää suosikkeihin",
"An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe",
- "Added to favorites" : "Lisätty suosikkeihin",
- "Removed from favorites" : "Poistettu suosikeista",
- "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin",
- "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista",
- "File changes" : "Tiedostomuutokset",
- "Created by {user}" : "Tekijänä {user}",
- "Changed by {user}" : "Muokkaajana {user}",
- "Deleted by {user}" : "Poistanut {user}",
- "Restored by {user}" : "Palauttanut {user}",
- "Renamed by {user}" : "Uudelleennimennyt {user}",
- "Moved by {user}" : "Siirtänyt {user}",
- "\"remote user\"" : "\"etäkäyttäjä\"",
- "You created {file}" : "Loit tiedoston {file}",
- "You created an encrypted file in {file}" : "Loit salatun tiedoston {file}",
- "{user} created {file}" : "{user} loi tiedoston {file}",
- "{user} created an encrypted file in {file}" : "{user} loi salatun tiedoston {file}",
- "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa",
- "You changed {file}" : "Muutit tiedostoa {file}",
- "You changed an encrypted file in {file}" : "Muutit salattua tiedostoa {file}",
- "{user} changed {file}" : "{user} muutti tiedostoa {file}",
- "{user} changed an encrypted file in {file}" : "{user} muutti salattua tiedostoa {file}",
- "You deleted {file}" : "Poistit tiedoston {file}",
- "You deleted an encrypted file in {file}" : "Poistit salatun tiedoston {file}",
- "{user} deleted {file}" : "{user} poisti tiedoston {file}",
- "{user} deleted an encrypted file in {file}" : "{user} poisti salatun tiedoston {file}",
- "You restored {file}" : "Palautit tiedoston {file}",
- "{user} restored {file}" : "{user} palautti tiedoston {file}",
- "You renamed {oldfile} to {newfile}" : "Uudelleennimesit tiedoston {oldfile} tiedostoksi {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile}",
- "You moved {oldfile} to {newfile}" : "Siirsit tiedoston {oldfile} tiedostoksi {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} siirsi tiedoston {oldfile} tiedostoksi {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Tiedosto on lisätty tai poistettu <strong>suosikeista</strong>",
- "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Suosikkitiedostoa tai -kansiota on <strong>muutettu</strong>",
- "All files" : "Kaikki tiedostot",
- "Unlimited" : "Rajoittamaton",
"Upload (max. %s)" : "Lähetys (enintään %s)",
- "Accept" : "Hyväksy",
- "Reject" : "Hylkää",
- "Incoming ownership transfer from {user}" : "Saapuva omistajuussiirto käyttäjältä {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Hyväksytkö kohteen {path}?\n\nHuomio: Siirtotoimenpiteet hyväksynnän jälkeen saattavat kestää tunnin.",
- "Ownership transfer failed" : "Omistajuuden siirto epäonnistui",
- "Your ownership transfer of {path} to {user} failed." : "Kohteen {path} omistajuussiirtosi käyttäjälle {user} epäonnistui.",
- "The ownership transfer of {path} from {user} failed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} epäonnistui.",
- "Ownership transfer done" : "Omistajuuden siirto valmis",
- "Your ownership transfer of {path} to {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} valmistui.",
- "The ownership transfer of {path} from {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjältä {user} valmistui.",
- "in %s" : "polussa %s",
- "File Management" : "Tiedostohallinta",
- "Transfer ownership of a file or folder" : "Siirrä tiedoston tai kansion omistajuus",
- "Choose file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
- "Change" : "Muuta",
- "New owner" : "Uusi omistaja",
- "Search users" : "Etsi käyttäjistä",
- "Choose a file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
- "Transfer" : "Siirrä",
- "Transfer {path} to {userid}" : "Siirrä {path} käyttäjälle {userid}",
- "Invalid path selected" : "Valittu virheellinen polku",
- "Ownership transfer request sent" : "Pyyntö omistajuuden vaihdosta lähetetty",
- "Cannot transfer ownership of a file or folder you don't own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista",
- "Tags" : "Tunnisteet",
- "Unable to change the favourite state of the file" : "Suosikki-tilan muuttaminen epäonnistui.",
- "Error while loading the file data" : "Virhe tiedostoa ladatessa",
- "Cancel" : "Peruuta",
- "Create" : "Luo",
- "Create a new file with the selected template" : "Luo uusi tiedosto valitulla mallipohjalla",
- "Creating file" : "Luodaan tiedostoa",
- "Blank" : "Tyhjä",
- "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda",
- "Set up templates folder" : "Aseta mallipohjien kansio",
- "Templates" : "Mallipohjat",
- "%s used" : "%s käytetty",
- "%s%% of %s used" : "%s%% / %s käytetty",
- "%1$s of %2$s used" : "%1$s/%2$s käytetty",
- "Settings" : "Asetukset",
- "Show hidden files" : "Näytä piilotetut tiedostot",
- "Crop image previews" : "Rajaa kuvien esikatseluja",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Käytä kyseistä osoitetta yhdistääksesi tiedostosi WebDAV kautta",
- "Toggle grid view" : "Ruudukkonäkymä päälle/pois",
- "No files in here" : "Täällä ei ole tiedostoja",
- "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
- "No entries found in this folder" : "Ei kohteita tässä kansiossa",
- "Select all" : "Valitse kaikki",
- "Upload too large" : "Lähetettävä tiedosto on liian suuri",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
- "No favorites yet" : "Ei vielä suosikkeja",
- "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
- "Deleted files" : "Poistetut tiedostot",
- "Shares" : "Jaot",
- "Shared with others" : "Jaettu muille",
- "Shared with you" : "Jaettu kanssasi",
- "Shared by link" : "Jaettu linkillä",
- "Deleted shares" : "Poistetut jaot",
- "Pending shares" : "Odottavat jaot",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massatoiminto suoritettu",
+ "Submitting fields…" : "Lähetetään tietoja...",
+ "Filter filenames…" : "Suodata tiedostonimiä...",
+ "WebDAV URL copied to clipboard" : "WebDAV-osoite kopioitu leikepöydälle",
+ "Enable the grid view" : "Käytä ruudukkonäkymää",
+ "Enable folder tree" : "Ota kansiopuu käyttöön",
+ "Copy to clipboard" : "Kopioi leikepöydälle",
+ "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
+ "Deletion cancelled" : "Poistaminen peruttu",
+ "Move cancelled" : "Siirtäminen peruttu",
+ "Cancelled move or copy operation" : "Siirto- tai kopiointitoiminto peruttu",
+ "Open details" : "Avaa yksityiskohdat",
+ "Photos and images" : "Valokuvat ja kuvat",
+ "New folder creation cancelled" : "Kansion luominen peruttu",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kansio","{folderCount} kansiota"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} tiedosto","{fileCount} tiedostoa"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tiedosto ja {folderCount} kansio","1 tiedosto ja {folderCount} kansiota"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} tiedosto ja 1 kansio","{fileCount} tiedostoa ja 1 kansio"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} tiedostoa ja {folderCount} kansiota",
+ "All folders" : "Kaikki kansiot",
+ "Personal Files" : "Henkilökohtaiset tiedostot",
"Text file" : "Tekstitiedosto",
"New text file.txt" : "Uusi tekstitiedosto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ryhmäkansio \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Erillinen tallennustila \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
- "_matches '{filter}'_::_match '{filter}'_" : ["vastaa '{filter}'","vastaa '{filter}'"]
+ "%1$s (renamed)" : "%1$s (nimetty uudelleen)",
+ "Filter file names …" : "Suodata tiedostonimiä…",
+ "Speed up your Files experience with these quick shortcuts." : "Nopeuta tiedostonhallinnan kokemusta näillä pikanäppäimillä.",
+ "Open the actions menu for a file" : "Avaa tiedoston toimintovalikko",
+ "Rename a file" : "Nimeä tiedosto uudelleen",
+ "Delete a file" : "Poista tiedosto",
+ "Favorite or remove a file from favorites" : "Lisää tai poista tiedosto suosikeista",
+ "Manage tags for a file" : "Hallinnoi tiedosto tunnisteita",
+ "Deselect all files" : "Poista kaikkien tiedostojen valinta",
+ "Select or deselect a file" : "Valitse tiedosto tai poista sen valinta",
+ "Open the sidebar for a file" : "Avaa tiedoston sivupalkki"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json
index a757f9b571a..82e7f7f4985 100644
--- a/apps/files/l10n/fi.json
+++ b/apps/files/l10n/fi.json
@@ -1,14 +1,317 @@
{ "translations": {
- "Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
- "Storage invalid" : "Virheellinen tallennustila",
+ "Added to favorites" : "Lisätty suosikkeihin",
+ "Removed from favorites" : "Poistettu suosikeista",
+ "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin",
+ "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista",
+ "Favorites" : "Suosikit",
+ "File changes" : "Tiedostomuutokset",
+ "Created by {user}" : "Tekijänä {user}",
+ "Changed by {user}" : "Muokkaajana {user}",
+ "Deleted by {user}" : "Poistanut {user}",
+ "Restored by {user}" : "Palauttanut {user}",
+ "Renamed by {user}" : "Uudelleennimennyt {user}",
+ "Moved by {user}" : "Siirtänyt {user}",
+ "\"remote account\"" : "\"etätili\"",
+ "You created {file}" : "Loit tiedoston {file}",
+ "You created an encrypted file in {file}" : "Loit salatun tiedoston {file}",
+ "{user} created {file}" : "{user} loi tiedoston {file}",
+ "{user} created an encrypted file in {file}" : "{user} loi salatun tiedoston {file}",
+ "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa",
+ "You changed {file}" : "Muutit tiedostoa {file}",
+ "You changed an encrypted file in {file}" : "Muutit salattua tiedostoa {file}",
+ "{user} changed {file}" : "{user} muutti tiedostoa {file}",
+ "{user} changed an encrypted file in {file}" : "{user} muutti salattua tiedostoa {file}",
+ "You deleted {file}" : "Poistit tiedoston {file}",
+ "You deleted an encrypted file in {file}" : "Poistit salatun tiedoston {file}",
+ "{user} deleted {file}" : "{user} poisti tiedoston {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} poisti salatun tiedoston {file}",
+ "You restored {file}" : "Palautit tiedoston {file}",
+ "{user} restored {file}" : "{user} palautti tiedoston {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Uudelleennimesit tiedoston {oldfile} (piilotettu) tiedostoksi {newfile} (piilotettu)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Uudelleennimesit tiedoston {oldfile} (piilotettu) tiedostoksi {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Uudelleennimesit tiedoston {oldfile} tiedostoksi {newfile} (piilotettu)",
+ "You renamed {oldfile} to {newfile}" : "Annoit tiedostolle {oldfile} uuden nimen {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} uudelleennimesi tiedoston {oldfile} (piilotettu) tiedostoksi {newfile} (piilotettu)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} (piilotettu) tiedostoksi {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile} (piilotettu)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile}",
+ "You moved {oldfile} to {newfile}" : "Siirsit tiedoston {oldfile} tiedostoksi {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} siirsi tiedoston {oldfile} tiedostoksi {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Tiedosto on lisätty tai poistettu <strong>suosikeista</strong>",
+ "Files" : "Tiedostot",
+ "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Suosikkitiedostoa tai -kansiota on <strong>muutettu</strong>",
+ "Failed to authorize" : "Valtuuttaminen epäonnistui",
+ "Invalid folder path" : "Virheellinen kansion polku",
+ "Folder not found" : "Kansiota ei löytynyt",
+ "The file cannot be found" : "Tiedostoa ei löytynyt",
+ "The destination path does not exist: %1$s" : "Kohdepolkua ei ole olemassa: %1$s",
+ "You do not have permission to create a file at the specified location" : "Sinulla ei ole oikeutta luoda tiedostoa määriteltyyn sijaintiin.",
+ "The file could not be converted." : "Tiedostoa ei voitu muuntaa.",
+ "Could not get relative path to converted file" : "Muunnetun tiedoston suhteellista polkua ei voitu hakea",
+ "Favorite files" : "Suosikkitiedostot",
+ "No favorites" : "Ei suosikkeja",
+ "More favorites" : "Lisää suosikeja",
+ "Accept" : "Hyväksy",
+ "Reject" : "Hylkää",
+ "Incoming ownership transfer from {user}" : "Saapuva omistajuuden siirto käyttäjältä {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Hyväksytkö kohteen {path}?\n\nHuomio: Siirtotoimenpiteet hyväksynnän jälkeen saattavat kestää tunnin.",
+ "Ownership transfer denied" : "Omistajuuden siirto kielletty",
+ "Ownership transfer failed" : "Omistajuuden siirto epäonnistui",
+ "Your ownership transfer of {path} to {user} failed." : "Kohteen {path} omistajuussiirtosi käyttäjälle {user} epäonnistui.",
+ "The ownership transfer of {path} from {user} failed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} epäonnistui.",
+ "Ownership transfer done" : "Omistajuuden siirto valmis",
+ "Your ownership transfer of {path} to {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} valmistui.",
+ "The ownership transfer of {path} from {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjältä {user} valmistui.",
+ "in %s" : "polussa %s",
+ "Files compatibility" : "Tiedostojen yhteensopivuus",
+ "Enforce Windows compatibility" : "Pakota Windows-yhteensopivuus",
+ "File Management" : "Tiedostohallinta",
+ "Home" : "Koti",
+ "Target folder does not exist any more" : "Kohdekansiota ei ole enää olemassa",
+ "Reload current directory" : "Lataa nykyinen kansio uudelleen",
+ "Go to the \"{dir}\" directory" : "Siirry kansioon \"{dir}\"",
+ "Current directory path" : "Nykyisen kansion polku",
+ "Your have used your space quota and cannot upload files anymore" : "Olet käyttänyt tilakiintiösi, joten et voi lähettää enempää tiedostoja",
+ "You do not have permission to upload or create files here." : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tänne.",
+ "Drag and drop files here to upload" : "Vedä ja pudota tiedostot tähän lähettääksesi",
+ "Favorite" : "Suosikki",
+ "Back" : "Takaisin",
+ "File is loading" : "Tiedostoa ladataan",
+ "Folder is loading" : "Kansiota ladataan",
+ "Filename" : "Tiedostonimi",
+ "Folder name" : "Kansion nimi",
+ "Invalid filename." : "Epäkelpo tiedostonimi.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"",
+ "Rename file" : "Nimeä tiedosto uudelleen",
+ "Folder" : "Kansio",
+ "Unknown file type" : "Tuntematon tiedostotyyppi",
+ "{ext} image" : "{ext} kuva",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} ääni",
+ "{ext} text" : "{ext} teksti",
+ "Pending" : "Odottaa",
+ "Unknown date" : "Tuntematon päivämäärä",
+ "Clear filter" : "Tyhjennä suodatin",
+ "Modified" : "Muokattu",
+ "Search everywhere" : "Etsi kaikkialta",
+ "Type" : "Tyyppi",
+ "Active filters" : "Aktiiviset suodattimet",
+ "Remove filter" : "Poista suodatin",
+ "Name" : "Nimi",
+ "File type" : "Tiedoston tyyppi",
+ "Size" : "Koko",
+ "Actions" : "Toiminnot",
+ "(selected)" : "(valittu)",
+ "List of files and folders." : "Luettelo tiedostoista ja kansioista.",
+ "You have used your space quota and cannot upload files anymore." : "Olet käyttänyt tilakiintiösi, etkä voi enää ladata tiedostoja.",
+ "Column headers with buttons are sortable." : "Painikkeilla varustetut sarakeotsikot ovat järjestettävissä.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
+ "File not found" : "Tiedostoa ei löytynyt",
+ "{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
+ "{used} of {quota} used" : "{used}/{quota} käytetty",
+ "{relative}% used" : "{relative} % käytetty",
+ "Could not refresh storage stats" : "Tallennustilan tilastoja ei voitu päivittää",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
+ "Storage information" : "Tallennustilan tiedot",
+ "Storage quota" : "Tallennustilan kiintiö",
+ "New folder" : "Uusi kansio",
+ "Create new folder" : "Luo uusi kansio",
+ "This name is already in use." : "Tämä nimi on jo käytössä.",
+ "Create" : "Luo",
+ "Submit" : "Lähetä",
+ "Choose a file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
+ "Transfer" : "Siirrä",
+ "Transfer {path} to {userid}" : "Siirrä {path} käyttäjälle {userid}",
+ "Invalid path selected" : "Valittu virheellinen polku",
"Unknown error" : "Tuntematon virhe",
- "File could not be found" : "Tiedostoa ei löytynyt",
- "Move or copy" : "Siirrä tai kopioi",
- "Download" : "Lataa",
+ "Ownership transfer request sent" : "Pyyntö omistajuuden vaihdosta lähetetty",
+ "Cannot transfer ownership of a file or folder you do not own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista",
+ "Transfer ownership of a file or folder" : "Siirrä tiedoston tai kansion omistajuus",
+ "Choose file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
+ "Change" : "Muuta",
+ "New owner" : "Uusi omistaja",
+ "Keep {old}" : "Pidä {old}",
+ "Use {new}" : "Käytä {new}",
+ "Remove extension" : "Poista tiedostopääte",
+ "Change file extension" : "Vaihda tiedostopäätettä",
+ "Do not show this dialog again." : "Älä näytä uudelleen",
+ "Select file or folder to link to" : "Valitse tiedosto tai kansio, johon linkitetään",
+ "Choose {file}" : "Valitse {file}",
+ "Share" : "Jaa",
+ "Shared by link" : "Jaettu linkillä",
+ "Shared" : "Jaettu",
+ "Switch to list view" : "Vaihda taulukkonäkymään",
+ "Switch to grid view" : "Vaihda ruudukkonäkymään",
+ "The file could not be found" : "Tiedostoa ei löytynyt",
+ "Upload was cancelled by user" : "Käyttäjä peruutti latauksen",
+ "Not enough free space" : "Ei tarpeeksi vapaata tilaa",
+ "Operation is blocked by access control" : "Pääsynhallinta estää toiminnon",
+ "Error during upload: {message}" : "Virhe lähettäessä: {message}",
+ "Error during upload, status code {status}" : "Virhe lähettäessä, tilakoodi {status}",
+ "Unknown error during upload" : "Tuntematon virhe lähettämisen aikana",
+ "Loading current folder" : "Ladataan nykyistä kansiota",
+ "Retry" : "Yritä uudelleen",
+ "No files in here" : "Täällä ei ole tiedostoja",
+ "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
+ "Go back" : "Mene takaisin",
+ "Views" : "Näkymät",
+ "Files settings" : "Tiedostojen asetukset",
+ "Your files" : "Tiedostot",
+ "Open in files" : "Avaa tiedostosovelluksessa",
+ "File cannot be accessed" : "Tiedostoa ei voi käyttää",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Tiedostoa ei löytynyt tai oikeutesi eivät riitä sen katseluun. Pyydä lähettäjää jakamaan se.",
+ "Clipboard is not available" : "Leikepöytä ei ole käytettävissä",
+ "General" : "Yleiset",
+ "All files" : "Kaikki tiedostot",
+ "Personal files" : "Henkilökohtaiset tiedostot",
+ "Sort favorites first" : "Järjestä suosikit ensiksi",
+ "Sort folders before files" : "Järjestä kansiot ennen tiedostoja",
+ "Appearance" : "Ulkoasu",
+ "Show hidden files" : "Näytä piilotetut tiedostot",
+ "Show file type column" : "Näytä tiedostotyypin sarake",
+ "Crop image previews" : "Rajaa kuvien esikatseluja",
+ "Additional settings" : "Lisäasetukset",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV:in URL-osoite",
+ "Copy" : "Kopioi",
+ "Warnings" : "Varoitukset",
+ "Keyboard shortcuts" : "Pikanäppäimet",
+ "File actions" : "Tiedostotoiminnot",
+ "Rename" : "Nimeä uudelleen",
"Delete" : "Poista",
- "Home" : "Koti",
+ "Manage tags" : "Hallitse tunnisteita",
+ "Selection" : "Valinta",
+ "Select all files" : "Valitse kaikki tiedostot",
+ "Deselect all" : "Poista valinnat",
+ "Navigation" : "Navigointi",
+ "View" : "Näytä",
+ "Toggle grid view" : "Ruudukkonäkymä päälle/pois",
+ "You" : "Sinä",
+ "Shared multiple times with different people" : "Jaettu useita kertoja eri ihmisten kanssa",
+ "Error while loading the file data" : "Virhe tiedostoa ladatessa",
+ "Owner" : "Omistaja",
+ "Remove from favorites" : "Poista suosikeista",
+ "Add to favorites" : "Lisää suosikkeihin",
+ "Tags" : "Tunnisteet",
+ "Blank" : "Tyhjä",
+ "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda",
+ "Pick a template for {name}" : "Valtise mallipohja tiedostolle {name}",
+ "Create a new file with the selected template" : "Luo uusi tiedosto valitulla mallipohjalla",
+ "Creating file" : "Luodaan tiedostoa",
+ "Save as {displayName}" : "Tallenna nimellä {displayName}",
+ "Save as …" : "Tallenna nimellä",
+ "Converting files …" : "Muunnetaan tiedostoja…",
+ "Failed to convert files: {message}" : "Tiedostojen muuntaminen epäonnistui: {message}",
+ "All files failed to be converted" : "Mitään tiedostoista ei voitu muuntaa",
+ "One file could not be converted: {message}" : "Yhtä tiedostoa ei voitu muuntaa: {message}",
+ "Files successfully converted" : "Tiedostot muunnettu onnistuneesti",
+ "Failed to convert files" : "Tiedostojen muuntaminen epäonnistui",
+ "Converting file …" : "Muunnetaan tiedostoa…",
+ "File successfully converted" : "Tiedosto muunnettu onnistuneesti",
+ "Failed to convert file: {message}" : "Tiedoston muuntaminen epäonnistui: {message}",
+ "Failed to convert file" : "Tiedoston muuntaminen epäonnistui",
+ "Leave this share" : "Poistu tästä jaosta",
+ "Disconnect storage" : "Katkaise yhteys tallennustilaan",
+ "Disconnect storages" : "Katkaise yhteys tallennustiloihin",
+ "Delete permanently" : "Poista pysyvästi",
+ "Delete and unshare" : "Poista ja lopeta jakaminen",
+ "Delete file" : "Poista tiedosto",
+ "Delete files" : "Poista tiedostot",
+ "Delete folder" : "Poista kansio",
+ "Delete folders" : "Poista kansio",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Olet poistamassa {count} kohteen lopullisesti","Olet poistamassa {count} kohdetta lopullisesti"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Olet poistamassa {count} kohteen","Olet poistamassa {count} kohdetta"],
+ "Confirm deletion" : "Vahvista poistaminen",
+ "Cancel" : "Peruuta",
+ "Download" : "Lataa",
+ "Moving \"{source}\" to \"{destination}\" …" : "Siirretään \"{source}\" kohteeseen \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopioidaan \"{source}\" kohteeseen \"{destination}\" …",
+ "Destination is not a folder" : "Kohde ei ole kansio",
+ "This file/folder is already in that directory" : "Tämä tiedosto/kansio on jo kyseisessä kansiossa",
+ "(copy)" : "(kopioi)",
+ "A file or folder with that name already exists in this folder" : "Tiedosto tai kansio tällä nimellä on jo olemassa tässä kansiossa",
+ "The files are locked" : "Tiedostot on lukittu",
+ "The file does not exist anymore" : "Tiedostoa ei ole enää olemassa",
+ "Choose destination" : "Valitse kohde",
+ "Copy to {target}" : "Kopioi kohteeseen {target}",
+ "Move to {target}" : "Siirrä kohteeseen {target}",
+ "Move" : "Siirrä",
+ "Move or copy operation failed" : "Siirto- tai kopiointitoiminto epäonnistui",
+ "Move or copy" : "Siirrä tai kopioi",
+ "Open folder {displayName}" : "Avaa kansio {displayName}",
+ "Open in Files" : "Avaa tiedostosovelluksessa",
+ "Open locally" : "Avaa paikallisesti",
+ "Failed to redirect to client" : "Uudelleenohjaus asiakkaaseen epäonnistui",
+ "Open file locally" : "Avaa tiedosto paikallisesti",
+ "Retry and close" : "Yritä uudelleen ja sulje",
+ "Details" : "Tiedot",
+ "View in folder" : "Näe kansiossa",
+ "Today" : "Tänään",
+ "Last 7 days" : "Edelliset 7 päivää",
+ "Last 30 days" : "Edelliset 30 päivää",
+ "This year ({year})" : "Tämä vuosi ({year})",
+ "Last year ({year})" : "Viime vuosi ({year})",
+ "Documents" : "Asiakirjat",
+ "Spreadsheets" : "Laskentataulukot",
+ "Presentations" : "Esitykset",
+ "PDFs" : "PDF-tiedostot",
+ "Folders" : "Kansiot",
+ "Audio" : "Ääni",
+ "Images" : "Kuvat",
+ "Videos" : "Videot",
+ "Created new folder \"{name}\"" : "Luotu uusi kansio \"{name}\"",
+ "Unable to initialize the templates directory" : "Mallipohjien kansiota ei voitu alustaa",
+ "Create templates folder" : "Luo mallipohjien kansio",
+ "Templates" : "Mallipohjat",
+ "New template folder" : "Uusi mallipohjien kansio",
+ "In folder" : "Kansiossa",
+ "Search in folder: {folder}" : "Etsi kansiosta: {folder}",
+ "One of the dropped files could not be processed" : "Yhtä pudotetuista tiedostoista ei voitu prosessoida",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Selaimesi ei tue Filesystem API -rajapintaa. Kansioita ei lähetetä",
+ "No files to upload" : "Ei lähetettäviä tiedostoja",
+ "Unable to create the directory {directory}" : "Kansiota {directory} ei voi luoda",
+ "Some files could not be uploaded" : "Joitain tiedostoja ei voitu lähettää",
+ "Files uploaded successfully" : "Tiedostot lähetetty onnistuneesti",
+ "No files to process" : "Ei tiedostoja käsiteltäväksi",
+ "Some files could not be copied" : "Joitain tiedostoja ei voitu kopioida",
+ "Some files could not be moved" : "Joitain tiedostoja ei voitu siirtää",
+ "Files copied successfully" : "Tiedostot kopioitu onnistuneesti",
+ "Files moved successfully" : "Tiedostot siirretty onnistuneesti",
+ "Upload cancelled" : "Lataus peruutettu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kohdetta \"{oldName}\" ei voitu nimetä uudelleen, koska sitä ei ole enää olemassa",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{newName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
+ "Could not rename \"{oldName}\"" : "Ei voitu nimetä uudelleen \"{oldName}\"",
+ "This operation is forbidden" : "Tämä toiminto on kielletty",
+ "Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
+ "Unexpected error: {error}" : "Odottamaton virhe: {error}",
+ "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
+ "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"],
+ "_%n hidden_::_%n hidden_" : ["%n piilotettu","%n piilotettua"],
+ "Filename must not be empty." : "Tiedostonimi ei voi olla tyhjä.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" ei ole sallittu tiedoston nimessä.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ei ole sallitttu tiedostotyyppi.",
+ "Filenames must not end with \"{extension}\"." : "Tiedostojen nimet eivät voi päättyä \"{extension}\".",
+ "List of favorite files and folders." : "Luettelo suosikkitiedostoista ja -kansioista.",
+ "No favorites yet" : "Ei vielä suosikkeja",
+ "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
+ "List of your files and folders." : "Luettelo tiedostoistasi ja kansioistasi.",
+ "List of your files and folders that are not shared." : "Luettelo tiedostoistasi ja kansioistasi, joita ei ole jaettu.",
+ "No personal files found" : "Henkilökohtaisia tiedostoja ei löytynyt",
+ "Files that are not shared will show up here." : "Tiedostot, joita ei ole jasettu, näkyvät täällä.",
+ "Recent" : "Viimeaikaiset",
+ "List of recently modified files and folders." : "Luettelo äskettäin muokatuista tiedostoista ja kansioista.",
+ "No recently modified files" : "Ei äskettäin muokattuja tiedostoja",
+ "Files and folders you recently modified will show up here." : "Äskettäin muokkaamasi tiedostot ja kansiot näkyvät täällä.",
+ "Search" : "Etsi",
+ "No entries found in this folder" : "Ei kohteita tässä kansiossa",
+ "Select all" : "Valitse kaikki",
+ "Upload too large" : "Lähetettävä tiedosto on liian suuri",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
+ "File could not be found" : "Tiedostoa ei löytynyt",
+ "Show list view" : "Näytä listanäkymä",
+ "Show grid view" : "Näytä ruudukkonäkymä",
"Close" : "Sulje",
- "Favorites" : "Suosikit",
"Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda",
"This will stop your current uploads." : "Tämä pysäyttää meneillään olevat lähetykset.",
"Upload cancelled." : "Lähetys peruttu.",
@@ -17,32 +320,24 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä",
"Target folder \"{dir}\" does not exist any more" : "Kohdekansio \"{dir}\" ei ole enää olemassa",
- "Not enough free space" : "Ei tarpeeksi vapaata tilaa",
"An unknown error has occurred" : "Tapahtui tuntematon virhe",
+ "File could not be uploaded" : "Tiedostoa ei voi lähettää",
"Uploading …" : "Lähetetään…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Lähetetään… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize} ({bitrate})",
"Uploading that item is not supported" : "Kyseisen kohteen lähettäminen ei ole tuettu",
- "Target folder does not exist any more" : "Kohdekansiota ei ole enää olemassa",
- "Operation is blocked by access control" : "Pääsynhallinta estää toiminnon",
"Error when assembling chunks, status code {status}" : "Virhe koottaessa lohkoja, tilakoodi {status}",
- "Actions" : "Toiminnot",
- "Rename" : "Nimeä uudelleen",
- "Copy" : "Kopioi",
"Choose target folder" : "Valitse kohdekansio",
+ "Set reminder" : "Aseta muistutus",
+ "Edit locally" : "Muokkaa paikallisesti",
"Open" : "Avaa",
- "Delete file" : "Poista tiedosto",
- "Delete folder" : "Poista kansio",
- "Disconnect storage" : "Katkaise yhteys tallennustilaan",
- "Leave this share" : "Poistu tästä jaosta",
"Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja",
- "Files" : "Tiedostot",
- "Details" : "Tiedot",
"Please select tag(s) to add to the selection" : "Valitse lisättävät tunnisteet valinnalle",
"Apply tag(s) to selection" : "Hyväksy tunnisteet valinnalle",
- "Select" : "Valitse",
- "Pending" : "Odottaa",
+ "Select directory \"{dirName}\"" : "Valitse kansio \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Valitse tiedosto \"{fileName}\"",
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
- "This operation is forbidden" : "Tämä toiminto on kielletty",
"This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.",
"Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa",
"Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut",
@@ -52,9 +347,6 @@
"Copied {origin} inside {destination}" : "Kopioitu {origin} kohteeseen {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Kopioitu {origin} ja {nbfiles} muuta tiedostoa kohteeseen {destination}",
"{newName} already exists" : "{newName} on jo olemassa",
- "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.",
- "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut",
"Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda",
"Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa",
"Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa",
@@ -62,23 +354,20 @@
"Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Ei hakutuloksia muissa kansioissa haulla {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Kirjoita enemmän kuin kaksi merkkiä etsiäksesi muista kansioista",
- "Name" : "Nimi",
- "Size" : "Koko",
- "Modified" : "Muokattu",
- "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"],
- "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"],
"{dirs} and {files}" : "{dirs} ja {files}",
"_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"],
- "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin",
+ "You do not have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai luomiseen tähän sijaintiin",
"_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"],
"New" : "Uusi",
+ "New file/folder menu" : "Uusi tiedosto/kansio -valikko",
"Select file range" : "Valitse tiedostojoukko",
- "{used} of {quota} used" : "{used}/{quota} käytetty",
+ "{used}%" : "{used} %",
"{used} used" : "{used} käytetty",
"\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.",
"File name cannot be empty." : "Tiedoston nimi ei voi olla tyhjä.",
"\"/\" is not allowed inside a file name." : "\"/\" ei ole sallittu merkki tiedostonimessä.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ei ole sallittu tiedostomuoto",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ryhmäkansio \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Erillinen tallennustila \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
"Your storage is full, files cannot be updated or synced anymore!" : "Tallennustilasi on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
@@ -87,122 +376,47 @@
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Erillinen tallennustila \"{mountPoint}\" on melkein täynnä ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Tallennustila on melkein täynnä ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["vastaa \"{filter}\"","vastaa \"{filter}\""],
- "View in folder" : "Näe kansiossa",
- "Copied!" : "Kopioitu!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopioi suora linkki (toimii vain käyttäjillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Suora linkki kopioitu (toimii vain henkilöillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
"Path" : "Polku",
"_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"],
- "Favorited" : "Lisätty suosikkeihin",
- "Favorite" : "Suosikki",
- "You can only favorite a single file or folder at a time" : "Voit valita suosikiksi vain yhden tiedoston tai kansion kerrallaan",
- "New folder" : "Uusi kansio",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopioi suora linkki (toimii vain henkilöillä, joilla on pääsyoikeus tähän tiedostoon/kansioon)",
"Upload file" : "Lähetä tiedosto",
- "Recent" : "Viimeaikaiset",
- "Not favorited" : "Ei suosikeissa",
- "Remove from favorites" : "Poista suosikeista",
- "Add to favorites" : "Lisää suosikkeihin",
"An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe",
- "Added to favorites" : "Lisätty suosikkeihin",
- "Removed from favorites" : "Poistettu suosikeista",
- "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin",
- "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista",
- "File changes" : "Tiedostomuutokset",
- "Created by {user}" : "Tekijänä {user}",
- "Changed by {user}" : "Muokkaajana {user}",
- "Deleted by {user}" : "Poistanut {user}",
- "Restored by {user}" : "Palauttanut {user}",
- "Renamed by {user}" : "Uudelleennimennyt {user}",
- "Moved by {user}" : "Siirtänyt {user}",
- "\"remote user\"" : "\"etäkäyttäjä\"",
- "You created {file}" : "Loit tiedoston {file}",
- "You created an encrypted file in {file}" : "Loit salatun tiedoston {file}",
- "{user} created {file}" : "{user} loi tiedoston {file}",
- "{user} created an encrypted file in {file}" : "{user} loi salatun tiedoston {file}",
- "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa",
- "You changed {file}" : "Muutit tiedostoa {file}",
- "You changed an encrypted file in {file}" : "Muutit salattua tiedostoa {file}",
- "{user} changed {file}" : "{user} muutti tiedostoa {file}",
- "{user} changed an encrypted file in {file}" : "{user} muutti salattua tiedostoa {file}",
- "You deleted {file}" : "Poistit tiedoston {file}",
- "You deleted an encrypted file in {file}" : "Poistit salatun tiedoston {file}",
- "{user} deleted {file}" : "{user} poisti tiedoston {file}",
- "{user} deleted an encrypted file in {file}" : "{user} poisti salatun tiedoston {file}",
- "You restored {file}" : "Palautit tiedoston {file}",
- "{user} restored {file}" : "{user} palautti tiedoston {file}",
- "You renamed {oldfile} to {newfile}" : "Uudelleennimesit tiedoston {oldfile} tiedostoksi {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} uudelleennimesi tiedoston {oldfile} tiedostoksi {newfile}",
- "You moved {oldfile} to {newfile}" : "Siirsit tiedoston {oldfile} tiedostoksi {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} siirsi tiedoston {oldfile} tiedostoksi {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Tiedosto on lisätty tai poistettu <strong>suosikeista</strong>",
- "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Suosikkitiedostoa tai -kansiota on <strong>muutettu</strong>",
- "All files" : "Kaikki tiedostot",
- "Unlimited" : "Rajoittamaton",
"Upload (max. %s)" : "Lähetys (enintään %s)",
- "Accept" : "Hyväksy",
- "Reject" : "Hylkää",
- "Incoming ownership transfer from {user}" : "Saapuva omistajuussiirto käyttäjältä {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Hyväksytkö kohteen {path}?\n\nHuomio: Siirtotoimenpiteet hyväksynnän jälkeen saattavat kestää tunnin.",
- "Ownership transfer failed" : "Omistajuuden siirto epäonnistui",
- "Your ownership transfer of {path} to {user} failed." : "Kohteen {path} omistajuussiirtosi käyttäjälle {user} epäonnistui.",
- "The ownership transfer of {path} from {user} failed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} epäonnistui.",
- "Ownership transfer done" : "Omistajuuden siirto valmis",
- "Your ownership transfer of {path} to {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjälle {user} valmistui.",
- "The ownership transfer of {path} from {user} has completed." : "Kohteen {path} omistajuussiirto käyttäjältä {user} valmistui.",
- "in %s" : "polussa %s",
- "File Management" : "Tiedostohallinta",
- "Transfer ownership of a file or folder" : "Siirrä tiedoston tai kansion omistajuus",
- "Choose file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
- "Change" : "Muuta",
- "New owner" : "Uusi omistaja",
- "Search users" : "Etsi käyttäjistä",
- "Choose a file or folder to transfer" : "Valitse siirrettävä tiedosto tai kansio",
- "Transfer" : "Siirrä",
- "Transfer {path} to {userid}" : "Siirrä {path} käyttäjälle {userid}",
- "Invalid path selected" : "Valittu virheellinen polku",
- "Ownership transfer request sent" : "Pyyntö omistajuuden vaihdosta lähetetty",
- "Cannot transfer ownership of a file or folder you don't own" : "Et voi siirtää sellaisen tiedoston tai kansion omistajuutta, jota et itse omista",
- "Tags" : "Tunnisteet",
- "Unable to change the favourite state of the file" : "Suosikki-tilan muuttaminen epäonnistui.",
- "Error while loading the file data" : "Virhe tiedostoa ladatessa",
- "Cancel" : "Peruuta",
- "Create" : "Luo",
- "Create a new file with the selected template" : "Luo uusi tiedosto valitulla mallipohjalla",
- "Creating file" : "Luodaan tiedostoa",
- "Blank" : "Tyhjä",
- "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda",
- "Set up templates folder" : "Aseta mallipohjien kansio",
- "Templates" : "Mallipohjat",
- "%s used" : "%s käytetty",
- "%s%% of %s used" : "%s%% / %s käytetty",
- "%1$s of %2$s used" : "%1$s/%2$s käytetty",
- "Settings" : "Asetukset",
- "Show hidden files" : "Näytä piilotetut tiedostot",
- "Crop image previews" : "Rajaa kuvien esikatseluja",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Käytä kyseistä osoitetta yhdistääksesi tiedostosi WebDAV kautta",
- "Toggle grid view" : "Ruudukkonäkymä päälle/pois",
- "No files in here" : "Täällä ei ole tiedostoja",
- "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
- "No entries found in this folder" : "Ei kohteita tässä kansiossa",
- "Select all" : "Valitse kaikki",
- "Upload too large" : "Lähetettävä tiedosto on liian suuri",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
- "No favorites yet" : "Ei vielä suosikkeja",
- "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä",
- "Deleted files" : "Poistetut tiedostot",
- "Shares" : "Jaot",
- "Shared with others" : "Jaettu muille",
- "Shared with you" : "Jaettu kanssasi",
- "Shared by link" : "Jaettu linkillä",
- "Deleted shares" : "Poistetut jaot",
- "Pending shares" : "Odottavat jaot",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massatoiminto suoritettu",
+ "Submitting fields…" : "Lähetetään tietoja...",
+ "Filter filenames…" : "Suodata tiedostonimiä...",
+ "WebDAV URL copied to clipboard" : "WebDAV-osoite kopioitu leikepöydälle",
+ "Enable the grid view" : "Käytä ruudukkonäkymää",
+ "Enable folder tree" : "Ota kansiopuu käyttöön",
+ "Copy to clipboard" : "Kopioi leikepöydälle",
+ "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta yhdistääksesi tiedostosi WebDAV:in kautta",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jos sinulla on kaksivaiheinen todennus käytössä, sinun täytyy luoda uusi sovellussalasana ja käyttää sitä napsauttamalla tästä.",
+ "Deletion cancelled" : "Poistaminen peruttu",
+ "Move cancelled" : "Siirtäminen peruttu",
+ "Cancelled move or copy operation" : "Siirto- tai kopiointitoiminto peruttu",
+ "Open details" : "Avaa yksityiskohdat",
+ "Photos and images" : "Valokuvat ja kuvat",
+ "New folder creation cancelled" : "Kansion luominen peruttu",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} kansio","{folderCount} kansiota"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} tiedosto","{fileCount} tiedostoa"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tiedosto ja {folderCount} kansio","1 tiedosto ja {folderCount} kansiota"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} tiedosto ja 1 kansio","{fileCount} tiedostoa ja 1 kansio"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} tiedostoa ja {folderCount} kansiota",
+ "All folders" : "Kaikki kansiot",
+ "Personal Files" : "Henkilökohtaiset tiedostot",
"Text file" : "Tekstitiedosto",
"New text file.txt" : "Uusi tekstitiedosto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Ryhmäkansio \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Erillinen tallennustila \"{mountPoint}\" on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
- "_matches '{filter}'_::_match '{filter}'_" : ["vastaa '{filter}'","vastaa '{filter}'"]
+ "%1$s (renamed)" : "%1$s (nimetty uudelleen)",
+ "Filter file names …" : "Suodata tiedostonimiä…",
+ "Speed up your Files experience with these quick shortcuts." : "Nopeuta tiedostonhallinnan kokemusta näillä pikanäppäimillä.",
+ "Open the actions menu for a file" : "Avaa tiedoston toimintovalikko",
+ "Rename a file" : "Nimeä tiedosto uudelleen",
+ "Delete a file" : "Poista tiedosto",
+ "Favorite or remove a file from favorites" : "Lisää tai poista tiedosto suosikeista",
+ "Manage tags for a file" : "Hallinnoi tiedosto tunnisteita",
+ "Deselect all files" : "Poista kaikkien tiedostojen valinta",
+ "Select or deselect a file" : "Valitse tiedosto tai poista sen valinta",
+ "Open the sidebar for a file" : "Avaa tiedoston sivupalkki"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 34fb95fc5f4..a96eb527d98 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
- "Storage invalid" : "Support de stockage invalide",
- "Unknown error" : "Erreur inconnue ",
- "File could not be found" : "Fichier introuvable",
- "Move or copy" : "Déplacer ou copier",
- "Download" : "Télécharger",
- "Delete" : "Supprimer",
- "Home" : "Accueil",
- "Close" : "Fermer",
- "Favorites" : "Favoris",
- "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
- "This will stop your current uploads." : "Cela va arrêter vos envois en cours.",
- "Upload cancelled." : "Envoi annulé.",
- "Processing files …" : "Fichiers en cours de traitement …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un dossier ou d'un fichier vide",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles",
- "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus",
- "Not enough free space" : "Espace disponible insuffisant",
- "An unknown error has occurred" : "Une erreur inconnue est survenue",
- "Uploading …" : "Envoi en cours...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté",
- "Target folder does not exist any more" : "Le dossier cible n'existe plus",
- "Operation is blocked by access control" : "L'opération est bloquée par le contrôle d'accès",
- "Error when assembling chunks, status code {status}" : "Erreur lors de l'assemblage des blocs, code d'état {status}",
- "Actions" : "Actions",
- "Rename" : "Renommer",
- "Copy" : "Copier",
- "Choose target folder" : "Sélectionner le dossier cible",
- "Open" : "Ouvrir",
- "Delete file" : "Supprimer le fichier",
- "Delete folder" : "Supprimer le dossier",
- "Disconnect storage" : "Déconnecter ce support de stockage",
- "Leave this share" : "Quitter ce partage",
- "Could not load info for file \"{file}\"" : "Impossible de charger les informations du fichier \"{file}\"",
- "Files" : "Fichiers",
- "Details" : "Détails",
- "Please select tag(s) to add to the selection" : "Veuillez sélectionner la ou les étiquette(s) à ajouter à la sélection",
- "Apply tag(s) to selection" : "Appliquer la ou les étiquette(s) à la sélection",
- "Select" : "Sélectionner",
- "Pending" : "En attente",
- "Unable to determine date" : "Impossible de déterminer la date",
- "This operation is forbidden" : "Cette opération est interdite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire est indisponible, merci de consulter les journaux ou de contacter votre administrateur",
- "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
- "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
- "copy" : "copie",
- "Could not copy \"{file}\", target exists" : "Impossible de copier \"{file}\", la cible existe",
- "Could not copy \"{file}\"" : "Impossible de copier \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} copié dans {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} et {nbfiles} autres fichiers copiés dans {destination}",
- "{newName} already exists" : "{newName} existe déjà",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{fileName}\" car il n'existe plus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.",
- "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà",
- "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
- "Could not fetch file details \"{file}\"" : "Impossible de récupérer les détails du fichier \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Aucun résultat dans d'autres dossiers pour {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Entrez plus de deux caractères pour effectuer une recherche dans d'autres dossiers",
- "Name" : "Nom",
- "Size" : "Taille",
- "Modified" : "Modifié",
- "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
- "_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
- "{dirs} and {files}" : "{dirs} et {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","dont %n masqués"],
- "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
- "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers"],
- "New" : "Nouveau",
- "Select file range" : "Activer la sélection d'une plage de fichiers",
- "{used} of {quota} used" : "{used} utilisés sur {quota}",
- "{used} used" : "{used} utilisés",
- "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.",
- "File name cannot be empty." : "Le nom de fichier ne peut pas être vide.",
- "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans un nom de fichier.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un type de fichier autorisé",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés !",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Your storage is full, files cannot be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Le dossier de groupe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'espace de stockage externe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Votre espace de stockage est presque plein ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["correspond à \"{filter}\"","correspondent à '{filter}'"],
- "View in folder" : "Afficher dans le dossier",
- "Copied!" : "Copié !",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copier le Lien direct (fonctionne uniquement pour les utilisateurs autorisés à accéder à ce fichier ou à ce dossier)",
- "Path" : "Chemin",
- "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
- "Favorited" : "Marqué comme favori",
- "Favorite" : "Favoris",
- "You can only favorite a single file or folder at a time" : "Vous ne pouvez ajouter qu'un seul favori de dossier ou de fichier à la fois.",
- "New folder" : "Nouveau dossier",
- "Upload file" : "Envoyer un fichier",
- "Recent" : "Récent",
- "Not favorited" : "Non marqué comme favori",
- "Remove from favorites" : "Retirer des favoris",
- "Add to favorites" : "Ajouter aux favoris",
- "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
"Added to favorites" : "Ajouté aux favoris",
"Removed from favorites" : "Retiré des favoris",
"You added {file} to your favorites" : "Vous avez ajouté {file} à vos favoris",
"You removed {file} from your favorites" : "Vous avez retiré {file} de vos favoris",
+ "Favorites" : "Favoris",
"File changes" : "Modifications de fichiers",
"Created by {user}" : "Créé par {user}",
"Changed by {user}" : "Modifié par {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Restauré par {user}",
"Renamed by {user}" : "Renommé par {user}",
"Moved by {user}" : "Déplacé par {user}",
- "\"remote user\"" : "\"utilisateur distant\"",
+ "\"remote account\"" : "\"compte distant\"",
"You created {file}" : "Vous avez créé {file}",
"You created an encrypted file in {file}" : "Vous avez créé un fichier chiffré dans {file}",
"{user} created {file}" : "{user} a créé {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Vous avez déplacé {oldfile} dans {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} a déplacé {oldfile} dans {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un fichier a été ajouté ou retiré de vos <strong>favoris</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>",
+ "Files" : "Fichiers",
+ "A file or folder has been <strong>changed</strong>" : "Un fichier ou un dossier a été <strong>modifié</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Un fichier ou un dossier favori a été <strong>modifié </strong>",
- "All files" : "Tous les fichiers",
- "Unlimited" : "Illimité",
- "Upload (max. %s)" : "Envoi (max. %s)",
+ "Failed to authorize" : "Échec de l'autorisation",
+ "Invalid folder path" : "Chemin d'accès du dossier invalide",
+ "Folder not found" : "Dossier introuvable",
+ "The file cannot be found" : "Le fichier n'a pas pu être trouvé",
+ "The destination path does not exist: %1$s" : "Le chemin de destination %1$s n'existe pas",
+ "You do not have permission to create a file at the specified location" : "Vous n'avez pas la permission de créer un fichier à l'endroit spécifié",
+ "The file could not be converted." : "Le fichier n'a pas pu être converti",
+ "Could not get relative path to converted file" : "Impossible de récupérer le chemin relatif du fichier converti",
+ "Favorite files" : "Fichiers favoris",
+ "No favorites" : "Aucun favori",
+ "More favorites" : "Plus de favoris",
"Accept" : "Accepter",
"Reject" : "Refuser",
"Incoming ownership transfer from {user}" : "Transfert de propriété de la part de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voulez-vous accepter {path} ?\n\nN. B. : L'opération de transfert après acceptation peut prendre jusqu'à 1 heure.",
+ "Ownership transfer denied" : "Transfert de propriété refusé",
+ "Your ownership transfer of {path} was denied by {user}." : "Votre transfert de propriété de {path} a été refusé par {user}.",
"Ownership transfer failed" : "Le transfert de propriétaire a échoué",
"Your ownership transfer of {path} to {user} failed." : "Votre transfert de propriété de {path} à {user} a échoué.",
"The ownership transfer of {path} from {user} failed." : "Le transfert de propriété de {path} de {user} a échoué.",
@@ -159,62 +67,409 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Votre transfert de propriété de {path} à {user} est terminé.",
"The ownership transfer of {path} from {user} has completed." : "Le transfert de propriété de {path} de {user} est terminé.",
"in %s" : "dans %s",
- "File Management" : "Gestion de fichier",
- "Transfer ownership of a file or folder" : "Transférer la propriété d'un fichier ou d'un dossier",
- "Choose file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
- "Change" : "Modifier",
- "New owner" : "Nouveau propriétaire",
- "Search users" : "Rechercher des utilisateurs",
+ "Transferred from %1$s on %2$s" : "Transféré de %1$s à %2$s",
+ "Files compatibility" : "Compatibilité des fichiers",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet de restreindre les noms de fichiers pour s'assurer que les fichiers peuvent être synchronisés avec tous les clients. Par défaut, tous les noms de fichier valides sur POSIX (c'est à dire sur Linux ou MacOS) sont acceptés.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés mais peuvent être renommés avec de nouveaux noms valides par leur propriétaire.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Il est également possible de migrer les fichiers automatiquement après avoir activé ce paramètre, veuillez vous référer à la documentation sur la commande occ.",
+ "Enforce Windows compatibility" : "Forcer la compatibilité Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cela va bloquer les noms de fichier non valides sur les systèmes Windows, comme utiliser des noms réservés ou des caractères spéciaux. Mais cela ne renforcera pas la compatibilité de la sensibilité à la casse.",
+ "File Management" : "Gestion de fichiers",
+ "Home" : "Accueil",
+ "Target folder does not exist any more" : "Le dossier cible n'existe plus",
+ "Reload current directory" : "Rafraîchir le dossier courant",
+ "Go to the \"{dir}\" directory" : "Aller au dossier \"{dir}\"",
+ "Current directory path" : "Chemin du répertoire courant",
+ "Your have used your space quota and cannot upload files anymore" : "Vous avez utilisé votre quota d'espace et vous ne pouvez plus téléverser de fichiers",
+ "You do not have permission to upload or create files here." : "Vous n'avez pas la permission de téléverser ou créer des fichiers ici.",
+ "Drag and drop files here to upload" : "Glissez-déposez les fichiers ici pour les téléverser",
+ "Favorite" : "Favoris",
+ "Back" : "Retour",
+ "Toggle selection for file \"{displayName}\"" : "Basculer la sélection pour le fichier \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Basculer la sélection pour le dossier \"{displayName}\"",
+ "File is loading" : "Fichier en cours de chargement",
+ "Folder is loading" : "Dossier en cours de chargement",
+ "Filename" : "Nom du fichier",
+ "Folder name" : "Nom du dossier",
+ "This node is unavailable" : "Ce nœud est indisponible ",
+ "Another entry with the same name already exists." : "Une autre entrée avec le même nom existe déjà.",
+ "Invalid filename." : "Nom de fichier invalide.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" renommé en \"{newName}\"",
+ "Rename file" : "Renommer le fichier",
+ "Folder" : "Dossier",
+ "Unknown file type" : "Type de fichier inconnu",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} vidéo",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} texte",
+ "Pending" : "En attente",
+ "Unknown date" : "Date inconnue",
+ "Clear filter" : "Supprimer le filtre",
+ "Modified" : "Modifié",
+ "Search everywhere" : "Chercher partout",
+ "Type" : "Type",
+ "Active filters" : "Filtres actifs",
+ "Remove filter" : "Retirer le filtre",
+ "Total rows summary" : "Récapitulatif du nombre total de lignes",
+ "Toggle selection for all files and folders" : "Basculer la sélection pour tous les fichiers et dossiers",
+ "Name" : "Nom",
+ "File type" : "Type de fichier",
+ "Size" : "Taille",
+ "Actions" : "Actions",
+ "(selected)" : "(sélectionné)",
+ "List of files and folders." : "Liste des fichiers et dossiers.",
+ "You have used your space quota and cannot upload files anymore." : "Vous avez utilisé votre quota d'espace et vous ne pouvez plus téléverser de fichiers",
+ "Column headers with buttons are sortable." : "L'entête des colonnes avec des boutons sont triables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
+ "File not found" : "Fichier non trouvé",
+ "_{count} selected_::_{count} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
+ "{used} of {quota} used" : "{used} utilisés sur {quota}",
+ "{relative}% used" : "{relative}% utilisés",
+ "Could not refresh storage stats" : "Impossible de rafraîchir les statistiques de stockage",
+ "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Storage information" : "Informations sur le stockage",
+ "Storage quota" : "Quota de stockage",
+ "New folder" : "Nouveau dossier",
+ "Create new folder" : "Créer un nouveau dossier",
+ "This name is already in use." : "Ce nom est déjà utilisé.",
+ "Create" : "Créer",
+ "Fill template fields" : "Remplir les champs modèle",
+ "Submitting fields …" : "Soumission des champs...",
+ "Submit" : "Envoyer",
"Choose a file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
"Transfer" : "Transférer",
"Transfer {path} to {userid}" : "Transférer {path} à {userid}",
"Invalid path selected" : "Chemin sélectionné non valide",
+ "Unknown error" : "Erreur inconnue ",
"Ownership transfer request sent" : "Requête de transfert de propriété envoyée",
- "Cannot transfer ownership of a file or folder you don't own" : "Impossible de transférer la propriété d’un fichier ou d’un dossier dont vous n'êtes pas le propriétaire",
- "Tags" : "Étiquettes",
- "Unable to change the favourite state of the file" : "Impossible de modifier l'état favori du fichier",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossible de transférer la propriété d'un fichier ou d'un dossier que vous ne possédez pas",
+ "Transfer ownership of a file or folder" : "Transférer la propriété d'un fichier ou d'un dossier",
+ "Choose file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
+ "Change" : "Modifier",
+ "New owner" : "Nouveau propriétaire",
+ "Keep {old}" : "Garder {old}",
+ "Keep without extension" : "Garder sans extension",
+ "Use {new}" : "Utiliser {new}",
+ "Remove extension" : "Retirer l'extension du fichier",
+ "Change file extension" : "Changer l'extension du fichier",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changer l'extension du fichier de \"{old}\" à \"{new}\" peut rendre le fichier illisible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Retirer l'extension de fichier \"{old}\" peut rendre le fichier illisible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Ajouter l'extension de fichier \"{new}\" peut rendre le fichier illisible.",
+ "Do not show this dialog again." : "Ne plus montrer cette boite de dialogue.",
+ "Select file or folder to link to" : "Sélection d'un fichier ou d'un dossier à lier",
+ "Choose {file}" : "Choisir {file}",
+ "Share" : "Partager",
+ "Shared by link" : "Partagés par lien",
+ "Shared" : "Partagé",
+ "Switch to list view" : "Passer à la vue en liste",
+ "Switch to grid view" : "Basculer en vue en grille",
+ "The file could not be found" : "Le fichier n'a pas pu être trouvé",
+ "Upload was cancelled by user" : "Le téléversement a été annulé par l'utilisateur",
+ "Not enough free space" : "Espace disponible insuffisant",
+ "Operation is blocked by access control" : "L'opération est bloquée par le contrôle d'accès",
+ "Error during upload: {message}" : "Erreur lors du téléversement : {message}",
+ "Error during upload, status code {status}" : "Erreur lors du téléversement, code d'état {status}",
+ "Unknown error during upload" : "Erreur inconnue lors du téléversement",
+ "Loading current folder" : "Chargement du dossier courant",
+ "Retry" : "Réessayer",
+ "No files in here" : "Aucun fichier",
+ "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
+ "Go back" : "Revenir en arrière",
+ "Views" : "Vues",
+ "Files settings" : "Paramètres de Fichiers",
+ "Your files" : "Vos fichiers",
+ "Open in files" : "Ouvrir dans Fichiers",
+ "File cannot be accessed" : "Impossible d'accéder au fichier",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Le fichier n'a pas été trouv ou vous n'avez pas les permissions pour le voir. Demandez à l'expéditeur de le partager.",
+ "No search results for “{query}”" : "Aucun résultat de recherche pour “{query}”",
+ "Clipboard is not available" : "Le presse-papiers n'est pas disponible",
+ "General" : "Général",
+ "Default view" : "Vue par défaut",
+ "All files" : "Tous les fichiers",
+ "Personal files" : "Fichiers personnels",
+ "Sort favorites first" : "Trier les favoris en premier",
+ "Sort folders before files" : "Trier les dossiers avant les fichiers",
+ "Appearance" : "Apparence",
+ "Show hidden files" : "Montrer les fichiers masqués",
+ "Show file type column" : "Afficher la colonne du type de fichier",
+ "Crop image previews" : "Afficher en miniatures carrées",
+ "Additional settings" : "Paramètres supplémentaires",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copier",
+ "Warnings" : "Avertissements",
+ "Keyboard shortcuts" : "Raccourcis clavier",
+ "File actions" : "Actions de fichiers",
+ "Rename" : "Renommer",
+ "Delete" : "Supprimer",
+ "Manage tags" : "Gérer les étiquettes",
+ "Selection" : "Choix",
+ "Select all files" : "Sélectionner tous les fichiers",
+ "Deselect all" : "Tout désélectionner",
+ "Navigation" : "Navigation",
+ "View" : "Voir",
+ "Toggle grid view" : "Activer/Désactiver l'affichage mosaïque",
+ "Show those shortcuts" : "Montrer ces raccourcis",
+ "You" : "Vous",
+ "Shared multiple times with different people" : "Partagé plusieurs fois avec plusieurs personnes",
+ "Unable to change the favorite state of the file" : "Impossible de modifier l'état de mise en favori du fichier",
"Error while loading the file data" : "Erreur lors du chargement du fichier de données",
+ "Owner" : "Propriétaire",
+ "Remove from favorites" : "Retirer des favoris",
+ "Add to favorites" : "Ajouter aux favoris",
+ "Tags" : "Étiquettes",
+ "Blank" : "Vide",
+ "Unable to create new file from template" : "Impossible de créer un nouveau fichier à partir du modèle",
"Pick a template for {name}" : "Choisissez un modèle pour {name}",
- "Cancel" : "Annuler",
- "Create" : "Créer",
"Create a new file with the selected template" : "Créer un nouveau fichier avec le modèle sélectionné",
"Creating file" : "Créer un fichier",
- "Blank" : "Vide",
- "Unable to create new file from template" : "Impossible de créer un nouveau fichier à partir du modèle",
- "Set up templates folder" : "Configurer le dossier des modèles",
+ "Save as {displayName}" : "Enregistrer sous {displayName}",
+ "Save as …" : "Enregistrer sous...",
+ "Converting files …" : "Conversion des fichiers...",
+ "Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}",
+ "All files failed to be converted" : "Aucun fichier n'a pu être converti",
+ "One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un fichier n'a pas pu être converti","%n fichiers n'ont pas pu être convertis","%n fichiers n'ont pas pu être convertis"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"],
+ "Files successfully converted" : "Fichiers convertis avec succès",
+ "Failed to convert files" : "Impossible de convertir les fichiers",
+ "Converting file …" : "Conversion du fichier...",
+ "File successfully converted" : "Fichier converti avec succès",
+ "Failed to convert file: {message}" : "Impossible de convertir le fichier : {message}",
+ "Failed to convert file" : "Impossible de convertir le fichier",
+ "Leave this share" : "Quitter ce partage",
+ "Leave these shares" : "Quitter ces partages",
+ "Disconnect storage" : "Déconnecter ce support de stockage",
+ "Disconnect storages" : "Déconnecter ces supports de stockage",
+ "Delete permanently" : "Supprimer définitivement",
+ "Delete and unshare" : "Supprimer et quitter le(s) partage(s)",
+ "Delete file" : "Supprimer le fichier ",
+ "Delete files" : "Supprimer les fichiers",
+ "Delete folder" : "Supprimer ce dossier",
+ "Delete folders" : "Supprimer ces dossiers",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Vous êtes sur le point de supprimer définitivement {count} élément","Vous êtes sur le point de supprimer définitivement {count} éléments","Vous êtes sur le point de supprimer définitivement {count} éléments"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Vous êtes sur le point de supprimer {count} élément","Vous êtes sur le point de supprimer {count} éléments","Vous êtes sur le point de supprimer {count} éléments"],
+ "Confirm deletion" : "Confirmer la suppression",
+ "Cancel" : "Annuler",
+ "Download" : "Télécharger",
+ "Moving \"{source}\" to \"{destination}\" …" : "Déplacement de \"{source}\" vers \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copie de \"{source}\" vers \"{destination}\" …",
+ "Destination is not a folder" : "La destination n'est pas un dossier",
+ "This file/folder is already in that directory" : "Ce fichier/dossier se trouve déjà dans ce dossier",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Vous ne pouvez pas déplacer un fichier/dossier sur lui-même ou dans un sous-dossier de celui-ci",
+ "(copy)" : "(copie)",
+ "(copy %n)" : "(copier %n)",
+ "A file or folder with that name already exists in this folder" : "Un fichier ou un dossier portant ce nom existe déjà dans ce dossier",
+ "The files are locked" : "Les fichiers sont verrouillés",
+ "The file does not exist anymore" : "Le fichier n'existe plus",
+ "Choose destination" : "Choisir la destination",
+ "Copy to {target}" : "Copier vers {target}",
+ "Move to {target}" : "Déplacer vers {target}",
+ "Move" : "Déplacer",
+ "Move or copy operation failed" : "L'opération de copie ou de déplacement a échoué",
+ "Move or copy" : "Déplacer ou copier",
+ "Open folder {displayName}" : "Ouvrir le dossier {displayName}",
+ "Open in Files" : "Ouvrir dans Fichiers",
+ "Open locally" : "Ouvrir localement",
+ "Failed to redirect to client" : "Échec de la redirection vers le client",
+ "Open file locally" : "Ouvrir le fichier localement",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Le fichier devrait maintenant s'ouvrir sur votre appareil. Si ce n'est pas le cas, vérifiez que vous avez installé l'application de bureau.",
+ "Retry and close" : "Réessayer et fermer",
+ "Open online" : "Ouvrir en ligne",
+ "Details" : "Détails",
+ "View in folder" : "Afficher dans le dossier",
+ "Today" : "Aujourd’hui",
+ "Last 7 days" : "7 derniers jours",
+ "Last 30 days" : "30 derniers jours",
+ "This year ({year})" : "Cette année ({year})",
+ "Last year ({year})" : "L'année dernière ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Feuilles de calcul",
+ "Presentations" : "Présentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Dossiers",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Vidéos",
+ "Created new folder \"{name}\"" : "Nouveau dossier \"{name}\" créé",
+ "Unable to initialize the templates directory" : "Impossible d'initialiser le dossier des modèles",
+ "Create templates folder" : "Créer le dossier des modèles",
"Templates" : "Modèles",
- "Unable to initialize the templates directory" : "Impossible d'initialiser le répertoire des modèles",
- "%s used" : "%s utilisés",
- "%s%% of %s used" : "%s%% de %s utilisé",
- "%1$s of %2$s used" : "%1$s utilisés sur %2$s",
- "Settings" : "Paramètres",
- "Show hidden files" : "Afficher les fichiers masqués",
- "Crop image previews" : "Tronquer les prévisualisations d’images",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
- "Toggle %1$s sublist" : "Basculer %1$s sous-liste",
- "Toggle grid view" : "Activer/Désactiver l'affichage mosaïque",
- "No files in here" : "Aucun fichier",
- "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
+ "New template folder" : "Nouveau modèle de dossier",
+ "In folder" : "Dans le dossier",
+ "Search in folder: {folder}" : "Rechercher dans le dossier : {folder}",
+ "One of the dropped files could not be processed" : "L'un des fichiers déposés n'a pas pu être traité",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Votre navigateur n’est pas compatible avec l’API Filesystem. Les dossiers ne seront pas téléversés",
+ "No files to upload" : "Aucun fichier à téléverser",
+ "Unable to create the directory {directory}" : "Impossible de créer le répertoire {directory}",
+ "Some files could not be uploaded" : "Certains fichiers n'ont pu être téléversés",
+ "Files uploaded successfully" : "Fichiers téléversés avec succès",
+ "No files to process" : "Aucun fichier à traiter",
+ "Some files could not be copied" : "Certains des fichiers n’ont pas pu être copiés",
+ "Some files could not be moved" : "Certains fichiers n’ont pu être déplacés",
+ "Files copied successfully" : "Fichiers copiés avec succès",
+ "Files moved successfully" : "Fichiers déplacés avec succès",
+ "Conflicts resolution skipped" : "Résolution des conflits ignorée",
+ "Upload cancelled" : "Téléversement annulé",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossible de renommer \"{oldName}\", il n'existe plus.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{newName}\" est déjà utilisé dans le dossier \"{dir}\". Veuillez choisir un autre nom.",
+ "Could not rename \"{oldName}\"" : "Impossible de renommer \"{oldName}\"",
+ "This operation is forbidden" : "Cette opération est interdite",
+ "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
+ "Unexpected error: {error}" : "Erreur inattendue: {error}",
+ "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"],
+ "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers","%n dossiers"],
+ "_%n hidden_::_%n hidden_" : ["%n caché","%n cachés","%n cachés"],
+ "Filename must not be empty." : "Le nom du fichier ne doit pas être vide.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" n'est pas autorisé dans un nom de fichier.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" est un nom réservé et il n'est pas autorisé dans les noms de fichier.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" est un type de fichier interdit.",
+ "Filenames must not end with \"{extension}\"." : "Les noms de fichier ne doivent pas se terminer par \"{extension}\".",
+ "List of favorite files and folders." : "Liste des fichiers et dossiers favoris.",
+ "No favorites yet" : "Aucun favori pour l'instant",
+ "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
+ "List of your files and folders." : "Liste de vos fichiers et dossiers.",
+ "List of your files and folders that are not shared." : "Liste de vos fichiers et dossiers non partagés.",
+ "No personal files found" : "Aucun fichier personnel trouvé",
+ "Files that are not shared will show up here." : "Les fichiers qui ne sont pas partagés apparaîtront ici.",
+ "Recent" : "Récents",
+ "List of recently modified files and folders." : "Liste des fichiers et dossiers récemment modifiés.",
+ "No recently modified files" : "Pas de fichiers récemment modifiés",
+ "Files and folders you recently modified will show up here." : "Les fichiers et dossiers que vous avez récemment modifiés apparaîtront ici",
+ "Search" : "Rechercher",
+ "Search results within your files." : "Résultats de recherche dans vos fichiers.",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
"Upload too large" : "Données envoyées trop volumineuses",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.",
- "No favorites yet" : "Aucun favori pour l'instant",
- "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
- "Deleted files" : "Fichiers supprimés",
- "Shares" : "Partages",
- "Shared with others" : "Partagés avec d'autres",
- "Shared with you" : "Partagés avec vous",
- "Shared by link" : "Partagés par lien",
- "Deleted shares" : "Partages supprimés",
- "Pending shares" : "Partages en attente",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d’envoyer dépassent la taille maximale d’envoi permise par ce serveur.",
+ "File could not be found" : "Fichier introuvable",
+ "Show list view" : "Afficher la vue en liste",
+ "Show grid view" : "Afficher la vue en grille",
+ "Close" : "Fermer",
+ "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
+ "This will stop your current uploads." : "Cela va arrêter vos envois en cours.",
+ "Upload cancelled." : "Téléversement annulé.",
+ "Processing files …" : "Fichiers en cours de traitement …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de téléverser {filename} car il s'agit d'un dossier ou d'un fichier vide",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d’envoyer {size1} mais seulement {size2} sont disponibles",
+ "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus",
+ "An unknown error has occurred" : "Une erreur inconnue est survenue",
+ "File could not be uploaded" : "Le fichier n'a pas pu être téléversé",
+ "Uploading …" : "Envoi en cours...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Téléversement en cours… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté",
+ "Error when assembling chunks, status code {status}" : "Erreur lors de l'assemblage des blocs, code d'état {status}",
+ "Choose target folder" : "Sélectionner le dossier cible",
+ "Set reminder" : "Définir un rappel",
+ "Edit locally" : "Éditer localement",
+ "Open" : "Ouvrir",
+ "Could not load info for file \"{file}\"" : "Impossible de charger les informations du fichier \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Veuillez sélectionner la ou les étiquette(s) à ajouter à la sélection",
+ "Apply tag(s) to selection" : "Appliquer la ou les étiquette(s) à la sélection",
+ "Select directory \"{dirName}\"" : "Sélectionner le dossier \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Sélectionner le fichier \"{fileName}\"",
+ "Unable to determine date" : "Impossible de déterminer la date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire est indisponible, merci de consulter les journaux ou de contacter votre administrateur",
+ "Could not move \"{file}\", target exists" : "Impossible de déplacer « {file} », la cible existe",
+ "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
+ "copy" : "copie",
+ "Could not copy \"{file}\", target exists" : "Impossible de copier \"{file}\", la cible existe",
+ "Could not copy \"{file}\"" : "Impossible de copier \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} copié dans {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} et {nbfiles} autres fichiers copiés dans {destination}",
+ "{newName} already exists" : "{newName} existe déjà",
+ "Could not create file \"{file}\"" : "Impossible de créer le fichier « {file} »",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier « {file} » car il existe déjà",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
+ "Could not fetch file details \"{file}\"" : "Impossible de récupérer les détails du fichier \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Aucun résultat dans d'autres dossiers pour {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Entrez plus de deux caractères pour effectuer une recherche dans d'autres dossiers",
+ "{dirs} and {files}" : "{dirs} et {files}",
+ "_including %n hidden_::_including %n hidden_" : ["dont %n masqué","dont %n masqués","dont %n masqués"],
+ "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici",
+ "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"],
+ "New" : "Nouveau",
+ "New file/folder menu" : "Menu nouveau fichier/dossier",
+ "Select file range" : "Activer la sélection d'une plage de fichiers",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} utilisés",
+ "\"{name}\" is an invalid file name." : "« {name} » n’est pas un nom de fichier valide.",
+ "File name cannot be empty." : "Le nom de fichier ne peut pas être vide.",
+ "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans un nom de fichier.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un type de fichier autorisé",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés !",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Le dossier de groupe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'espace de stockage externe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Votre espace de stockage est presque plein ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["correspond à \"{filter}\"","correspondent à '{filter}'","correspondent à '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Le lien direct a été copié (fonctionne uniquement pour les personnes qui ont accès à ce fichier ou à ce dossier)",
+ "Path" : "Chemin",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets","%n octets"],
+ "Favored" : "Favoris",
+ "Favor" : "Mettre en favoris",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copier le lien direct (fonctionne uniquement pour les personnes pouvant accéder à ce fichier ou à ce dossier)",
+ "Upload file" : "Téléverser un fichier",
+ "Not favored" : "Non favoris",
+ "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
+ "Upload (max. %s)" : "Envoi (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Action \"{displayName}\" exécutée avec succès",
+ "\"{displayName}\" action failed" : "Échec de l'action \"{displayName}\"",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" a échoué pour certains éléments",
+ "\"{displayName}\" batch action executed successfully" : "L’action « {displayName} » par lot a été exécutée avec succès",
+ "Submitting fields…" : "Validation des champs...",
+ "Filter filenames…" : "Filtrer par nom de fichier…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV copiée dans le presse-papier",
+ "Enable the grid view" : "Activer la vue en grille",
+ "Enable folder tree" : "Activer l'arborescence des dossiers",
+ "Copy to clipboard" : "Copier dans le presse-papiers",
+ "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
+ "Deletion cancelled" : "Suppression annulée",
+ "Move cancelled" : "Déplacement annulé",
+ "Cancelled move or copy of \"{filename}\"." : "Déplacement ou copie de \"{filename}\" annulé.",
+ "Cancelled move or copy operation" : "Opération de déplacement ou de copie annulée",
+ "Open details" : "Ouvrir les détails",
+ "Photos and images" : "Photos et images",
+ "New folder creation cancelled" : "La création du nouveau dossier est annulée",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} dossier","{folderCount} dossiers","{folderCount} dossiers"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fichier","{fileCount} fichiers","{fileCount} fichiers"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fichier et {folderCount} dossier","1 fichier et {folderCount} dossiers","1 fichier et {folderCount} dossiers"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fichier et 1 dossier","{fileCount} fichiers et 1 dossier","{fileCount} fichiers et 1 dossier"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fichiers et {folderCount} dossiers",
+ "All folders" : "Tous les dossiers",
+ "Personal Files" : "Fichiers personnels",
"Text file" : "Fichier texte",
"New text file.txt" : "Nouveau fichier texte.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "_matches '{filter}'_::_match '{filter}'_" : ["correspond à '{filter}'","correspondent à '{filter}'"]
+ "%1$s (renamed)" : "%1$s (renommé)",
+ "renamed file" : "fichier renommé",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés, mais peuvent être renommés avec des noms valides par leur propriétaire.",
+ "Filter file names …" : "Filtrer les noms de fichier…",
+ "Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.",
+ "Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.",
+ "Speed up your Files experience with these quick shortcuts." : "Accélérez votre expérience Fichiers avec ces raccourcis rapides.",
+ "Open the actions menu for a file" : "Ouvrir le menu d'actions pour un fichier",
+ "Rename a file" : "Renommer un fichier",
+ "Delete a file" : "Supprimer un fichier",
+ "Favorite or remove a file from favorites" : "Ajouter ou supprimer un fichier des favoris",
+ "Manage tags for a file" : "Gérer les étiquettes pour un fichier",
+ "Deselect all files" : "Désélectionner tous les fichiers",
+ "Select or deselect a file" : "Sélectionner ou désélectionner un fichier",
+ "Select a range of files" : "Sélectionner une série de fichiers",
+ "Navigate to the parent folder" : "Naviguer vers le dossier parent",
+ "Navigate to the file above" : "Naviguer vers le fichier au-dessus",
+ "Navigate to the file below" : "Naviguer vers le fichier en-dessous",
+ "Navigate to the file on the left (in grid mode)" : "Naviguer vers le fichier à gauche (en mode grille)",
+ "Navigate to the file on the right (in grid mode)" : "Naviguer vers le fichier à droite (en mode grille)",
+ "Toggle the grid view" : "Activer/Désactiver la vue grille",
+ "Open the sidebar for a file" : "Ouvrir la barre latérale pour un fichier"
},
-"nplurals=2; plural=(n > 1);");
+"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 4954a479c53..47535f24491 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
- "Storage invalid" : "Support de stockage invalide",
- "Unknown error" : "Erreur inconnue ",
- "File could not be found" : "Fichier introuvable",
- "Move or copy" : "Déplacer ou copier",
- "Download" : "Télécharger",
- "Delete" : "Supprimer",
- "Home" : "Accueil",
- "Close" : "Fermer",
- "Favorites" : "Favoris",
- "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
- "This will stop your current uploads." : "Cela va arrêter vos envois en cours.",
- "Upload cancelled." : "Envoi annulé.",
- "Processing files …" : "Fichiers en cours de traitement …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un dossier ou d'un fichier vide",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles",
- "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus",
- "Not enough free space" : "Espace disponible insuffisant",
- "An unknown error has occurred" : "Une erreur inconnue est survenue",
- "Uploading …" : "Envoi en cours...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté",
- "Target folder does not exist any more" : "Le dossier cible n'existe plus",
- "Operation is blocked by access control" : "L'opération est bloquée par le contrôle d'accès",
- "Error when assembling chunks, status code {status}" : "Erreur lors de l'assemblage des blocs, code d'état {status}",
- "Actions" : "Actions",
- "Rename" : "Renommer",
- "Copy" : "Copier",
- "Choose target folder" : "Sélectionner le dossier cible",
- "Open" : "Ouvrir",
- "Delete file" : "Supprimer le fichier",
- "Delete folder" : "Supprimer le dossier",
- "Disconnect storage" : "Déconnecter ce support de stockage",
- "Leave this share" : "Quitter ce partage",
- "Could not load info for file \"{file}\"" : "Impossible de charger les informations du fichier \"{file}\"",
- "Files" : "Fichiers",
- "Details" : "Détails",
- "Please select tag(s) to add to the selection" : "Veuillez sélectionner la ou les étiquette(s) à ajouter à la sélection",
- "Apply tag(s) to selection" : "Appliquer la ou les étiquette(s) à la sélection",
- "Select" : "Sélectionner",
- "Pending" : "En attente",
- "Unable to determine date" : "Impossible de déterminer la date",
- "This operation is forbidden" : "Cette opération est interdite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire est indisponible, merci de consulter les journaux ou de contacter votre administrateur",
- "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe",
- "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
- "copy" : "copie",
- "Could not copy \"{file}\", target exists" : "Impossible de copier \"{file}\", la cible existe",
- "Could not copy \"{file}\"" : "Impossible de copier \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} copié dans {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} et {nbfiles} autres fichiers copiés dans {destination}",
- "{newName} already exists" : "{newName} existe déjà",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{fileName}\" car il n'existe plus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.",
- "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà",
- "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
- "Could not fetch file details \"{file}\"" : "Impossible de récupérer les détails du fichier \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Aucun résultat dans d'autres dossiers pour {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Entrez plus de deux caractères pour effectuer une recherche dans d'autres dossiers",
- "Name" : "Nom",
- "Size" : "Taille",
- "Modified" : "Modifié",
- "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
- "_%n file_::_%n files_" : ["%n fichier","%n fichiers"],
- "{dirs} and {files}" : "{dirs} et {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclus %n masqué","dont %n masqués"],
- "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici",
- "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers"],
- "New" : "Nouveau",
- "Select file range" : "Activer la sélection d'une plage de fichiers",
- "{used} of {quota} used" : "{used} utilisés sur {quota}",
- "{used} used" : "{used} utilisés",
- "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.",
- "File name cannot be empty." : "Le nom de fichier ne peut pas être vide.",
- "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans un nom de fichier.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un type de fichier autorisé",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés !",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Your storage is full, files cannot be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Le dossier de groupe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'espace de stockage externe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Votre espace de stockage est presque plein ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["correspond à \"{filter}\"","correspondent à '{filter}'"],
- "View in folder" : "Afficher dans le dossier",
- "Copied!" : "Copié !",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copier le Lien direct (fonctionne uniquement pour les utilisateurs autorisés à accéder à ce fichier ou à ce dossier)",
- "Path" : "Chemin",
- "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
- "Favorited" : "Marqué comme favori",
- "Favorite" : "Favoris",
- "You can only favorite a single file or folder at a time" : "Vous ne pouvez ajouter qu'un seul favori de dossier ou de fichier à la fois.",
- "New folder" : "Nouveau dossier",
- "Upload file" : "Envoyer un fichier",
- "Recent" : "Récent",
- "Not favorited" : "Non marqué comme favori",
- "Remove from favorites" : "Retirer des favoris",
- "Add to favorites" : "Ajouter aux favoris",
- "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
"Added to favorites" : "Ajouté aux favoris",
"Removed from favorites" : "Retiré des favoris",
"You added {file} to your favorites" : "Vous avez ajouté {file} à vos favoris",
"You removed {file} from your favorites" : "Vous avez retiré {file} de vos favoris",
+ "Favorites" : "Favoris",
"File changes" : "Modifications de fichiers",
"Created by {user}" : "Créé par {user}",
"Changed by {user}" : "Modifié par {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Restauré par {user}",
"Renamed by {user}" : "Renommé par {user}",
"Moved by {user}" : "Déplacé par {user}",
- "\"remote user\"" : "\"utilisateur distant\"",
+ "\"remote account\"" : "\"compte distant\"",
"You created {file}" : "Vous avez créé {file}",
"You created an encrypted file in {file}" : "Vous avez créé un fichier chiffré dans {file}",
"{user} created {file}" : "{user} a créé {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Vous avez déplacé {oldfile} dans {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} a déplacé {oldfile} dans {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un fichier a été ajouté ou retiré de vos <strong>favoris</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>",
+ "Files" : "Fichiers",
+ "A file or folder has been <strong>changed</strong>" : "Un fichier ou un dossier a été <strong>modifié</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Un fichier ou un dossier favori a été <strong>modifié </strong>",
- "All files" : "Tous les fichiers",
- "Unlimited" : "Illimité",
- "Upload (max. %s)" : "Envoi (max. %s)",
+ "Failed to authorize" : "Échec de l'autorisation",
+ "Invalid folder path" : "Chemin d'accès du dossier invalide",
+ "Folder not found" : "Dossier introuvable",
+ "The file cannot be found" : "Le fichier n'a pas pu être trouvé",
+ "The destination path does not exist: %1$s" : "Le chemin de destination %1$s n'existe pas",
+ "You do not have permission to create a file at the specified location" : "Vous n'avez pas la permission de créer un fichier à l'endroit spécifié",
+ "The file could not be converted." : "Le fichier n'a pas pu être converti",
+ "Could not get relative path to converted file" : "Impossible de récupérer le chemin relatif du fichier converti",
+ "Favorite files" : "Fichiers favoris",
+ "No favorites" : "Aucun favori",
+ "More favorites" : "Plus de favoris",
"Accept" : "Accepter",
"Reject" : "Refuser",
"Incoming ownership transfer from {user}" : "Transfert de propriété de la part de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Voulez-vous accepter {path} ?\n\nN. B. : L'opération de transfert après acceptation peut prendre jusqu'à 1 heure.",
+ "Ownership transfer denied" : "Transfert de propriété refusé",
+ "Your ownership transfer of {path} was denied by {user}." : "Votre transfert de propriété de {path} a été refusé par {user}.",
"Ownership transfer failed" : "Le transfert de propriétaire a échoué",
"Your ownership transfer of {path} to {user} failed." : "Votre transfert de propriété de {path} à {user} a échoué.",
"The ownership transfer of {path} from {user} failed." : "Le transfert de propriété de {path} de {user} a échoué.",
@@ -157,62 +65,409 @@
"Your ownership transfer of {path} to {user} has completed." : "Votre transfert de propriété de {path} à {user} est terminé.",
"The ownership transfer of {path} from {user} has completed." : "Le transfert de propriété de {path} de {user} est terminé.",
"in %s" : "dans %s",
- "File Management" : "Gestion de fichier",
- "Transfer ownership of a file or folder" : "Transférer la propriété d'un fichier ou d'un dossier",
- "Choose file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
- "Change" : "Modifier",
- "New owner" : "Nouveau propriétaire",
- "Search users" : "Rechercher des utilisateurs",
+ "Transferred from %1$s on %2$s" : "Transféré de %1$s à %2$s",
+ "Files compatibility" : "Compatibilité des fichiers",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet de restreindre les noms de fichiers pour s'assurer que les fichiers peuvent être synchronisés avec tous les clients. Par défaut, tous les noms de fichier valides sur POSIX (c'est à dire sur Linux ou MacOS) sont acceptés.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés mais peuvent être renommés avec de nouveaux noms valides par leur propriétaire.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Il est également possible de migrer les fichiers automatiquement après avoir activé ce paramètre, veuillez vous référer à la documentation sur la commande occ.",
+ "Enforce Windows compatibility" : "Forcer la compatibilité Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cela va bloquer les noms de fichier non valides sur les systèmes Windows, comme utiliser des noms réservés ou des caractères spéciaux. Mais cela ne renforcera pas la compatibilité de la sensibilité à la casse.",
+ "File Management" : "Gestion de fichiers",
+ "Home" : "Accueil",
+ "Target folder does not exist any more" : "Le dossier cible n'existe plus",
+ "Reload current directory" : "Rafraîchir le dossier courant",
+ "Go to the \"{dir}\" directory" : "Aller au dossier \"{dir}\"",
+ "Current directory path" : "Chemin du répertoire courant",
+ "Your have used your space quota and cannot upload files anymore" : "Vous avez utilisé votre quota d'espace et vous ne pouvez plus téléverser de fichiers",
+ "You do not have permission to upload or create files here." : "Vous n'avez pas la permission de téléverser ou créer des fichiers ici.",
+ "Drag and drop files here to upload" : "Glissez-déposez les fichiers ici pour les téléverser",
+ "Favorite" : "Favoris",
+ "Back" : "Retour",
+ "Toggle selection for file \"{displayName}\"" : "Basculer la sélection pour le fichier \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Basculer la sélection pour le dossier \"{displayName}\"",
+ "File is loading" : "Fichier en cours de chargement",
+ "Folder is loading" : "Dossier en cours de chargement",
+ "Filename" : "Nom du fichier",
+ "Folder name" : "Nom du dossier",
+ "This node is unavailable" : "Ce nœud est indisponible ",
+ "Another entry with the same name already exists." : "Une autre entrée avec le même nom existe déjà.",
+ "Invalid filename." : "Nom de fichier invalide.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" renommé en \"{newName}\"",
+ "Rename file" : "Renommer le fichier",
+ "Folder" : "Dossier",
+ "Unknown file type" : "Type de fichier inconnu",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} vidéo",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} texte",
+ "Pending" : "En attente",
+ "Unknown date" : "Date inconnue",
+ "Clear filter" : "Supprimer le filtre",
+ "Modified" : "Modifié",
+ "Search everywhere" : "Chercher partout",
+ "Type" : "Type",
+ "Active filters" : "Filtres actifs",
+ "Remove filter" : "Retirer le filtre",
+ "Total rows summary" : "Récapitulatif du nombre total de lignes",
+ "Toggle selection for all files and folders" : "Basculer la sélection pour tous les fichiers et dossiers",
+ "Name" : "Nom",
+ "File type" : "Type de fichier",
+ "Size" : "Taille",
+ "Actions" : "Actions",
+ "(selected)" : "(sélectionné)",
+ "List of files and folders." : "Liste des fichiers et dossiers.",
+ "You have used your space quota and cannot upload files anymore." : "Vous avez utilisé votre quota d'espace et vous ne pouvez plus téléverser de fichiers",
+ "Column headers with buttons are sortable." : "L'entête des colonnes avec des boutons sont triables.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
+ "File not found" : "Fichier non trouvé",
+ "_{count} selected_::_{count} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
+ "{used} of {quota} used" : "{used} utilisés sur {quota}",
+ "{relative}% used" : "{relative}% utilisés",
+ "Could not refresh storage stats" : "Impossible de rafraîchir les statistiques de stockage",
+ "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Storage information" : "Informations sur le stockage",
+ "Storage quota" : "Quota de stockage",
+ "New folder" : "Nouveau dossier",
+ "Create new folder" : "Créer un nouveau dossier",
+ "This name is already in use." : "Ce nom est déjà utilisé.",
+ "Create" : "Créer",
+ "Fill template fields" : "Remplir les champs modèle",
+ "Submitting fields …" : "Soumission des champs...",
+ "Submit" : "Envoyer",
"Choose a file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
"Transfer" : "Transférer",
"Transfer {path} to {userid}" : "Transférer {path} à {userid}",
"Invalid path selected" : "Chemin sélectionné non valide",
+ "Unknown error" : "Erreur inconnue ",
"Ownership transfer request sent" : "Requête de transfert de propriété envoyée",
- "Cannot transfer ownership of a file or folder you don't own" : "Impossible de transférer la propriété d’un fichier ou d’un dossier dont vous n'êtes pas le propriétaire",
- "Tags" : "Étiquettes",
- "Unable to change the favourite state of the file" : "Impossible de modifier l'état favori du fichier",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossible de transférer la propriété d'un fichier ou d'un dossier que vous ne possédez pas",
+ "Transfer ownership of a file or folder" : "Transférer la propriété d'un fichier ou d'un dossier",
+ "Choose file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
+ "Change" : "Modifier",
+ "New owner" : "Nouveau propriétaire",
+ "Keep {old}" : "Garder {old}",
+ "Keep without extension" : "Garder sans extension",
+ "Use {new}" : "Utiliser {new}",
+ "Remove extension" : "Retirer l'extension du fichier",
+ "Change file extension" : "Changer l'extension du fichier",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changer l'extension du fichier de \"{old}\" à \"{new}\" peut rendre le fichier illisible.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Retirer l'extension de fichier \"{old}\" peut rendre le fichier illisible.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Ajouter l'extension de fichier \"{new}\" peut rendre le fichier illisible.",
+ "Do not show this dialog again." : "Ne plus montrer cette boite de dialogue.",
+ "Select file or folder to link to" : "Sélection d'un fichier ou d'un dossier à lier",
+ "Choose {file}" : "Choisir {file}",
+ "Share" : "Partager",
+ "Shared by link" : "Partagés par lien",
+ "Shared" : "Partagé",
+ "Switch to list view" : "Passer à la vue en liste",
+ "Switch to grid view" : "Basculer en vue en grille",
+ "The file could not be found" : "Le fichier n'a pas pu être trouvé",
+ "Upload was cancelled by user" : "Le téléversement a été annulé par l'utilisateur",
+ "Not enough free space" : "Espace disponible insuffisant",
+ "Operation is blocked by access control" : "L'opération est bloquée par le contrôle d'accès",
+ "Error during upload: {message}" : "Erreur lors du téléversement : {message}",
+ "Error during upload, status code {status}" : "Erreur lors du téléversement, code d'état {status}",
+ "Unknown error during upload" : "Erreur inconnue lors du téléversement",
+ "Loading current folder" : "Chargement du dossier courant",
+ "Retry" : "Réessayer",
+ "No files in here" : "Aucun fichier",
+ "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
+ "Go back" : "Revenir en arrière",
+ "Views" : "Vues",
+ "Files settings" : "Paramètres de Fichiers",
+ "Your files" : "Vos fichiers",
+ "Open in files" : "Ouvrir dans Fichiers",
+ "File cannot be accessed" : "Impossible d'accéder au fichier",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Le fichier n'a pas été trouv ou vous n'avez pas les permissions pour le voir. Demandez à l'expéditeur de le partager.",
+ "No search results for “{query}”" : "Aucun résultat de recherche pour “{query}”",
+ "Clipboard is not available" : "Le presse-papiers n'est pas disponible",
+ "General" : "Général",
+ "Default view" : "Vue par défaut",
+ "All files" : "Tous les fichiers",
+ "Personal files" : "Fichiers personnels",
+ "Sort favorites first" : "Trier les favoris en premier",
+ "Sort folders before files" : "Trier les dossiers avant les fichiers",
+ "Appearance" : "Apparence",
+ "Show hidden files" : "Montrer les fichiers masqués",
+ "Show file type column" : "Afficher la colonne du type de fichier",
+ "Crop image previews" : "Afficher en miniatures carrées",
+ "Additional settings" : "Paramètres supplémentaires",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copier",
+ "Warnings" : "Avertissements",
+ "Keyboard shortcuts" : "Raccourcis clavier",
+ "File actions" : "Actions de fichiers",
+ "Rename" : "Renommer",
+ "Delete" : "Supprimer",
+ "Manage tags" : "Gérer les étiquettes",
+ "Selection" : "Choix",
+ "Select all files" : "Sélectionner tous les fichiers",
+ "Deselect all" : "Tout désélectionner",
+ "Navigation" : "Navigation",
+ "View" : "Voir",
+ "Toggle grid view" : "Activer/Désactiver l'affichage mosaïque",
+ "Show those shortcuts" : "Montrer ces raccourcis",
+ "You" : "Vous",
+ "Shared multiple times with different people" : "Partagé plusieurs fois avec plusieurs personnes",
+ "Unable to change the favorite state of the file" : "Impossible de modifier l'état de mise en favori du fichier",
"Error while loading the file data" : "Erreur lors du chargement du fichier de données",
+ "Owner" : "Propriétaire",
+ "Remove from favorites" : "Retirer des favoris",
+ "Add to favorites" : "Ajouter aux favoris",
+ "Tags" : "Étiquettes",
+ "Blank" : "Vide",
+ "Unable to create new file from template" : "Impossible de créer un nouveau fichier à partir du modèle",
"Pick a template for {name}" : "Choisissez un modèle pour {name}",
- "Cancel" : "Annuler",
- "Create" : "Créer",
"Create a new file with the selected template" : "Créer un nouveau fichier avec le modèle sélectionné",
"Creating file" : "Créer un fichier",
- "Blank" : "Vide",
- "Unable to create new file from template" : "Impossible de créer un nouveau fichier à partir du modèle",
- "Set up templates folder" : "Configurer le dossier des modèles",
+ "Save as {displayName}" : "Enregistrer sous {displayName}",
+ "Save as …" : "Enregistrer sous...",
+ "Converting files …" : "Conversion des fichiers...",
+ "Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}",
+ "All files failed to be converted" : "Aucun fichier n'a pu être converti",
+ "One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un fichier n'a pas pu être converti","%n fichiers n'ont pas pu être convertis","%n fichiers n'ont pas pu être convertis"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"],
+ "Files successfully converted" : "Fichiers convertis avec succès",
+ "Failed to convert files" : "Impossible de convertir les fichiers",
+ "Converting file …" : "Conversion du fichier...",
+ "File successfully converted" : "Fichier converti avec succès",
+ "Failed to convert file: {message}" : "Impossible de convertir le fichier : {message}",
+ "Failed to convert file" : "Impossible de convertir le fichier",
+ "Leave this share" : "Quitter ce partage",
+ "Leave these shares" : "Quitter ces partages",
+ "Disconnect storage" : "Déconnecter ce support de stockage",
+ "Disconnect storages" : "Déconnecter ces supports de stockage",
+ "Delete permanently" : "Supprimer définitivement",
+ "Delete and unshare" : "Supprimer et quitter le(s) partage(s)",
+ "Delete file" : "Supprimer le fichier ",
+ "Delete files" : "Supprimer les fichiers",
+ "Delete folder" : "Supprimer ce dossier",
+ "Delete folders" : "Supprimer ces dossiers",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Vous êtes sur le point de supprimer définitivement {count} élément","Vous êtes sur le point de supprimer définitivement {count} éléments","Vous êtes sur le point de supprimer définitivement {count} éléments"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Vous êtes sur le point de supprimer {count} élément","Vous êtes sur le point de supprimer {count} éléments","Vous êtes sur le point de supprimer {count} éléments"],
+ "Confirm deletion" : "Confirmer la suppression",
+ "Cancel" : "Annuler",
+ "Download" : "Télécharger",
+ "Moving \"{source}\" to \"{destination}\" …" : "Déplacement de \"{source}\" vers \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copie de \"{source}\" vers \"{destination}\" …",
+ "Destination is not a folder" : "La destination n'est pas un dossier",
+ "This file/folder is already in that directory" : "Ce fichier/dossier se trouve déjà dans ce dossier",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Vous ne pouvez pas déplacer un fichier/dossier sur lui-même ou dans un sous-dossier de celui-ci",
+ "(copy)" : "(copie)",
+ "(copy %n)" : "(copier %n)",
+ "A file or folder with that name already exists in this folder" : "Un fichier ou un dossier portant ce nom existe déjà dans ce dossier",
+ "The files are locked" : "Les fichiers sont verrouillés",
+ "The file does not exist anymore" : "Le fichier n'existe plus",
+ "Choose destination" : "Choisir la destination",
+ "Copy to {target}" : "Copier vers {target}",
+ "Move to {target}" : "Déplacer vers {target}",
+ "Move" : "Déplacer",
+ "Move or copy operation failed" : "L'opération de copie ou de déplacement a échoué",
+ "Move or copy" : "Déplacer ou copier",
+ "Open folder {displayName}" : "Ouvrir le dossier {displayName}",
+ "Open in Files" : "Ouvrir dans Fichiers",
+ "Open locally" : "Ouvrir localement",
+ "Failed to redirect to client" : "Échec de la redirection vers le client",
+ "Open file locally" : "Ouvrir le fichier localement",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Le fichier devrait maintenant s'ouvrir sur votre appareil. Si ce n'est pas le cas, vérifiez que vous avez installé l'application de bureau.",
+ "Retry and close" : "Réessayer et fermer",
+ "Open online" : "Ouvrir en ligne",
+ "Details" : "Détails",
+ "View in folder" : "Afficher dans le dossier",
+ "Today" : "Aujourd’hui",
+ "Last 7 days" : "7 derniers jours",
+ "Last 30 days" : "30 derniers jours",
+ "This year ({year})" : "Cette année ({year})",
+ "Last year ({year})" : "L'année dernière ({year})",
+ "Documents" : "Documents",
+ "Spreadsheets" : "Feuilles de calcul",
+ "Presentations" : "Présentations",
+ "PDFs" : "PDFs",
+ "Folders" : "Dossiers",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Vidéos",
+ "Created new folder \"{name}\"" : "Nouveau dossier \"{name}\" créé",
+ "Unable to initialize the templates directory" : "Impossible d'initialiser le dossier des modèles",
+ "Create templates folder" : "Créer le dossier des modèles",
"Templates" : "Modèles",
- "Unable to initialize the templates directory" : "Impossible d'initialiser le répertoire des modèles",
- "%s used" : "%s utilisés",
- "%s%% of %s used" : "%s%% de %s utilisé",
- "%1$s of %2$s used" : "%1$s utilisés sur %2$s",
- "Settings" : "Paramètres",
- "Show hidden files" : "Afficher les fichiers masqués",
- "Crop image previews" : "Tronquer les prévisualisations d’images",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
- "Toggle %1$s sublist" : "Basculer %1$s sous-liste",
- "Toggle grid view" : "Activer/Désactiver l'affichage mosaïque",
- "No files in here" : "Aucun fichier",
- "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
+ "New template folder" : "Nouveau modèle de dossier",
+ "In folder" : "Dans le dossier",
+ "Search in folder: {folder}" : "Rechercher dans le dossier : {folder}",
+ "One of the dropped files could not be processed" : "L'un des fichiers déposés n'a pas pu être traité",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Votre navigateur n’est pas compatible avec l’API Filesystem. Les dossiers ne seront pas téléversés",
+ "No files to upload" : "Aucun fichier à téléverser",
+ "Unable to create the directory {directory}" : "Impossible de créer le répertoire {directory}",
+ "Some files could not be uploaded" : "Certains fichiers n'ont pu être téléversés",
+ "Files uploaded successfully" : "Fichiers téléversés avec succès",
+ "No files to process" : "Aucun fichier à traiter",
+ "Some files could not be copied" : "Certains des fichiers n’ont pas pu être copiés",
+ "Some files could not be moved" : "Certains fichiers n’ont pu être déplacés",
+ "Files copied successfully" : "Fichiers copiés avec succès",
+ "Files moved successfully" : "Fichiers déplacés avec succès",
+ "Conflicts resolution skipped" : "Résolution des conflits ignorée",
+ "Upload cancelled" : "Téléversement annulé",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossible de renommer \"{oldName}\", il n'existe plus.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{newName}\" est déjà utilisé dans le dossier \"{dir}\". Veuillez choisir un autre nom.",
+ "Could not rename \"{oldName}\"" : "Impossible de renommer \"{oldName}\"",
+ "This operation is forbidden" : "Cette opération est interdite",
+ "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
+ "Unexpected error: {error}" : "Erreur inattendue: {error}",
+ "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"],
+ "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers","%n dossiers"],
+ "_%n hidden_::_%n hidden_" : ["%n caché","%n cachés","%n cachés"],
+ "Filename must not be empty." : "Le nom du fichier ne doit pas être vide.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" n'est pas autorisé dans un nom de fichier.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" est un nom réservé et il n'est pas autorisé dans les noms de fichier.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" est un type de fichier interdit.",
+ "Filenames must not end with \"{extension}\"." : "Les noms de fichier ne doivent pas se terminer par \"{extension}\".",
+ "List of favorite files and folders." : "Liste des fichiers et dossiers favoris.",
+ "No favorites yet" : "Aucun favori pour l'instant",
+ "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
+ "List of your files and folders." : "Liste de vos fichiers et dossiers.",
+ "List of your files and folders that are not shared." : "Liste de vos fichiers et dossiers non partagés.",
+ "No personal files found" : "Aucun fichier personnel trouvé",
+ "Files that are not shared will show up here." : "Les fichiers qui ne sont pas partagés apparaîtront ici.",
+ "Recent" : "Récents",
+ "List of recently modified files and folders." : "Liste des fichiers et dossiers récemment modifiés.",
+ "No recently modified files" : "Pas de fichiers récemment modifiés",
+ "Files and folders you recently modified will show up here." : "Les fichiers et dossiers que vous avez récemment modifiés apparaîtront ici",
+ "Search" : "Rechercher",
+ "Search results within your files." : "Résultats de recherche dans vos fichiers.",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
"Upload too large" : "Données envoyées trop volumineuses",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.",
- "No favorites yet" : "Aucun favori pour l'instant",
- "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici",
- "Deleted files" : "Fichiers supprimés",
- "Shares" : "Partages",
- "Shared with others" : "Partagés avec d'autres",
- "Shared with you" : "Partagés avec vous",
- "Shared by link" : "Partagés par lien",
- "Deleted shares" : "Partages supprimés",
- "Pending shares" : "Partages en attente",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d’envoyer dépassent la taille maximale d’envoi permise par ce serveur.",
+ "File could not be found" : "Fichier introuvable",
+ "Show list view" : "Afficher la vue en liste",
+ "Show grid view" : "Afficher la vue en grille",
+ "Close" : "Fermer",
+ "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"",
+ "This will stop your current uploads." : "Cela va arrêter vos envois en cours.",
+ "Upload cancelled." : "Téléversement annulé.",
+ "Processing files …" : "Fichiers en cours de traitement …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de téléverser {filename} car il s'agit d'un dossier ou d'un fichier vide",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d’envoyer {size1} mais seulement {size2} sont disponibles",
+ "Target folder \"{dir}\" does not exist any more" : "Le dossier cible \"{dir}\" n'existe plus",
+ "An unknown error has occurred" : "Une erreur inconnue est survenue",
+ "File could not be uploaded" : "Le fichier n'a pas pu être téléversé",
+ "Uploading …" : "Envoi en cours...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Téléversement en cours… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "L'envoi de cet élément n'est pas supporté",
+ "Error when assembling chunks, status code {status}" : "Erreur lors de l'assemblage des blocs, code d'état {status}",
+ "Choose target folder" : "Sélectionner le dossier cible",
+ "Set reminder" : "Définir un rappel",
+ "Edit locally" : "Éditer localement",
+ "Open" : "Ouvrir",
+ "Could not load info for file \"{file}\"" : "Impossible de charger les informations du fichier \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Veuillez sélectionner la ou les étiquette(s) à ajouter à la sélection",
+ "Apply tag(s) to selection" : "Appliquer la ou les étiquette(s) à la sélection",
+ "Select directory \"{dirName}\"" : "Sélectionner le dossier \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Sélectionner le fichier \"{fileName}\"",
+ "Unable to determine date" : "Impossible de déterminer la date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire est indisponible, merci de consulter les journaux ou de contacter votre administrateur",
+ "Could not move \"{file}\", target exists" : "Impossible de déplacer « {file} », la cible existe",
+ "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"",
+ "copy" : "copie",
+ "Could not copy \"{file}\", target exists" : "Impossible de copier \"{file}\", la cible existe",
+ "Could not copy \"{file}\"" : "Impossible de copier \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} copié dans {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} et {nbfiles} autres fichiers copiés dans {destination}",
+ "{newName} already exists" : "{newName} existe déjà",
+ "Could not create file \"{file}\"" : "Impossible de créer le fichier « {file} »",
+ "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier « {file} » car il existe déjà",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà",
+ "Could not fetch file details \"{file}\"" : "Impossible de récupérer les détails du fichier \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Aucun résultat dans d'autres dossiers pour {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Entrez plus de deux caractères pour effectuer une recherche dans d'autres dossiers",
+ "{dirs} and {files}" : "{dirs} et {files}",
+ "_including %n hidden_::_including %n hidden_" : ["dont %n masqué","dont %n masqués","dont %n masqués"],
+ "You do not have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici",
+ "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Envoi de %n fichiers","Envoi de %n fichiers"],
+ "New" : "Nouveau",
+ "New file/folder menu" : "Menu nouveau fichier/dossier",
+ "Select file range" : "Activer la sélection d'une plage de fichiers",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} utilisés",
+ "\"{name}\" is an invalid file name." : "« {name} » n’est pas un nom de fichier valide.",
+ "File name cannot be empty." : "Le nom de fichier ne peut pas être vide.",
+ "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans un nom de fichier.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un type de fichier autorisé",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés !",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'espace de stockage de {owner} est presque plein ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Le dossier de groupe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'espace de stockage externe \"{mountPoint}\" est presque plein ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Votre espace de stockage est presque plein ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["correspond à \"{filter}\"","correspondent à '{filter}'","correspondent à '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Le lien direct a été copié (fonctionne uniquement pour les personnes qui ont accès à ce fichier ou à ce dossier)",
+ "Path" : "Chemin",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets","%n octets"],
+ "Favored" : "Favoris",
+ "Favor" : "Mettre en favoris",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copier le lien direct (fonctionne uniquement pour les personnes pouvant accéder à ce fichier ou à ce dossier)",
+ "Upload file" : "Téléverser un fichier",
+ "Not favored" : "Non favoris",
+ "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes",
+ "Upload (max. %s)" : "Envoi (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Action \"{displayName}\" exécutée avec succès",
+ "\"{displayName}\" action failed" : "Échec de l'action \"{displayName}\"",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" a échoué pour certains éléments",
+ "\"{displayName}\" batch action executed successfully" : "L’action « {displayName} » par lot a été exécutée avec succès",
+ "Submitting fields…" : "Validation des champs...",
+ "Filter filenames…" : "Filtrer par nom de fichier…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV copiée dans le presse-papier",
+ "Enable the grid view" : "Activer la vue en grille",
+ "Enable folder tree" : "Activer l'arborescence des dossiers",
+ "Copy to clipboard" : "Copier dans le presse-papiers",
+ "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.",
+ "Deletion cancelled" : "Suppression annulée",
+ "Move cancelled" : "Déplacement annulé",
+ "Cancelled move or copy of \"{filename}\"." : "Déplacement ou copie de \"{filename}\" annulé.",
+ "Cancelled move or copy operation" : "Opération de déplacement ou de copie annulée",
+ "Open details" : "Ouvrir les détails",
+ "Photos and images" : "Photos et images",
+ "New folder creation cancelled" : "La création du nouveau dossier est annulée",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} dossier","{folderCount} dossiers","{folderCount} dossiers"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fichier","{fileCount} fichiers","{fileCount} fichiers"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fichier et {folderCount} dossier","1 fichier et {folderCount} dossiers","1 fichier et {folderCount} dossiers"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fichier et 1 dossier","{fileCount} fichiers et 1 dossier","{fileCount} fichiers et 1 dossier"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fichiers et {folderCount} dossiers",
+ "All folders" : "Tous les dossiers",
+ "Personal Files" : "Fichiers personnels",
"Text file" : "Fichier texte",
"New text file.txt" : "Nouveau fichier texte.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Le dossier du groupe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ou synchronisés!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'espace de stockage externe \"{mountPoint}\" est plein, les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !",
- "_matches '{filter}'_::_match '{filter}'_" : ["correspond à '{filter}'","correspondent à '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
+ "%1$s (renamed)" : "%1$s (renommé)",
+ "renamed file" : "fichier renommé",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés, mais peuvent être renommés avec des noms valides par leur propriétaire.",
+ "Filter file names …" : "Filtrer les noms de fichier…",
+ "Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.",
+ "Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.",
+ "Speed up your Files experience with these quick shortcuts." : "Accélérez votre expérience Fichiers avec ces raccourcis rapides.",
+ "Open the actions menu for a file" : "Ouvrir le menu d'actions pour un fichier",
+ "Rename a file" : "Renommer un fichier",
+ "Delete a file" : "Supprimer un fichier",
+ "Favorite or remove a file from favorites" : "Ajouter ou supprimer un fichier des favoris",
+ "Manage tags for a file" : "Gérer les étiquettes pour un fichier",
+ "Deselect all files" : "Désélectionner tous les fichiers",
+ "Select or deselect a file" : "Sélectionner ou désélectionner un fichier",
+ "Select a range of files" : "Sélectionner une série de fichiers",
+ "Navigate to the parent folder" : "Naviguer vers le dossier parent",
+ "Navigate to the file above" : "Naviguer vers le fichier au-dessus",
+ "Navigate to the file below" : "Naviguer vers le fichier en-dessous",
+ "Navigate to the file on the left (in grid mode)" : "Naviguer vers le fichier à gauche (en mode grille)",
+ "Navigate to the file on the right (in grid mode)" : "Naviguer vers le fichier à droite (en mode grille)",
+ "Toggle the grid view" : "Activer/Désactiver la vue grille",
+ "Open the sidebar for a file" : "Ouvrir la barre latérale pour un fichier"
+},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/fy_NL.js b/apps/files/l10n/fy_NL.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/fy_NL.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/fy_NL.json b/apps/files/l10n/fy_NL.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/fy_NL.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ga.js b/apps/files/l10n/ga.js
new file mode 100644
index 00000000000..5078a731823
--- /dev/null
+++ b/apps/files/l10n/ga.js
@@ -0,0 +1,481 @@
+OC.L10N.register(
+ "files",
+ {
+ "Added to favorites" : "Curtha le ceanáin",
+ "Removed from favorites" : "Bainte de cheanáin",
+ "You added {file} to your favorites" : "Chuir tú {file} le do cheanáin",
+ "You removed {file} from your favorites" : "Bhain tú {file} de do cheanáin",
+ "Favorites" : "Ceanáin",
+ "File changes" : "Athruithe comhaid",
+ "Created by {user}" : "Cruthaithe ag {user}",
+ "Changed by {user}" : "Athraithe ag {user}",
+ "Deleted by {user}" : "Scriosta ag {user}",
+ "Restored by {user}" : "Athchóiríodh ag {user}",
+ "Renamed by {user}" : "Athainmnithe ag {user}",
+ "Moved by {user}" : "Ar athraíodh a ionad ag {user}",
+ "\"remote account\"" : "\"cuntas cianda\"",
+ "You created {file}" : "Chruthaigh tú {file}",
+ "You created an encrypted file in {file}" : "Chruthaigh tú comhad criptithe i {file}",
+ "{user} created {file}" : "{user} cruthaithe {file}",
+ "{user} created an encrypted file in {file}" : "{user} chruthaigh sé comhad criptithe i {file}",
+ "{file} was created in a public folder" : "Cruthaíodh {file} i bhfillteán poiblí",
+ "You changed {file}" : "D'athraigh tú {file}",
+ "You changed an encrypted file in {file}" : "D'athraigh tú comhad criptithe i {file}",
+ "{user} changed {file}" : "D'athraigh {user} {file}",
+ "{user} changed an encrypted file in {file}" : "D'athraigh {user} comhad criptithe i {file}",
+ "You deleted {file}" : "Scrios tú {file}",
+ "You deleted an encrypted file in {file}" : "Scrios tú comhad criptithe i {file}",
+ "{user} deleted {file}" : "Scriosadh {user} {file}",
+ "{user} deleted an encrypted file in {file}" : "Scrios {user} comhad criptithe i {file}",
+ "You restored {file}" : "D'aischuir tú {file}",
+ "{user} restored {file}" : "D'aischuir {user} {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "D'athainmnigh tú {oldfile} (i bhfolach) go {newfile} (i bhfolach)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "D'athainmnigh tú {oldfile} (i bhfolach) go {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "D'athainmnigh tú {oldfile} go {newfile} (i bhfolach)",
+ "You renamed {oldfile} to {newfile}" : "D'athainmnigh tú {oldfile} go {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} athainmnithe {oldfile} (i bhfolach) go {newfile} (i bhfolach)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} athainmnithe {oldfile} (i bhfolach) go {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} athainmnithe {oldfile} go {newfile} (i bhfolach)",
+ "{user} renamed {oldfile} to {newfile}" : "Athainmníodh {user} {oldfile} go {newfile}",
+ "You moved {oldfile} to {newfile}" : "Bhog tú {oldfile} go {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "Bhog {user} {oldfile} go {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Cuireadh comhad le do<strong>favorites</strong>nó baineadh de",
+ "Files" : "Comhaid",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Athraíodh</strong>comhad nó fillteán",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Athraíodh</strong>comhad nó fillteán is fearr leat",
+ "Failed to authorize" : "Theip ar údarú",
+ "Invalid folder path" : "Conair fillteáin neamhbhailí",
+ "Folder not found" : "Fillteán gan aimsiú",
+ "The file cannot be found" : "Ní féidir an comhad a aimsiú",
+ "The destination path does not exist: %1$s" : "Níl an cosán sprice ann:%1$s",
+ "You do not have permission to create a file at the specified location" : "Níl cead agat comhad a chruthú ag an suíomh sonraithe",
+ "The file could not be converted." : "Níorbh fhéidir an comhad a thiontú.",
+ "Could not get relative path to converted file" : "Níorbh fhéidir cosán coibhneasta a fháil chuig an gcomhad tiontaithe",
+ "Favorite files" : "Comhaid is fearr leat",
+ "No favorites" : "Gan aon cheanáin",
+ "More favorites" : "Gan aon cheanáin",
+ "Accept" : "Glac",
+ "Reject" : "Diúltaigh",
+ "Incoming ownership transfer from {user}" : "Aistriú úinéireachta isteach ó {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ar mhaith leat glacadh le {path}?\n\nNóta: Féadfaidh an próiseas aistrithe tar éis glacadh suas le 1 uair an chloig a ghlacadh.",
+ "Ownership transfer denied" : "Aistriú úinéireachta diúltaithe",
+ "Your ownership transfer of {path} was denied by {user}." : "Dhiúltaigh {user} d'aistriú úinéireachta ar {path}.",
+ "Ownership transfer failed" : "Theip ar aistriú úinéireachta",
+ "Your ownership transfer of {path} to {user} failed." : "Theip ar d'aistriú úinéireachta de {path} go {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Theip ar aistriú úinéireachta {path} ó {user}.",
+ "Ownership transfer done" : "Aistriú úinéireachta déanta",
+ "Your ownership transfer of {path} to {user} has completed." : "Tá d'aistriú úinéireachta de {path} go {user} críochnaithe.",
+ "The ownership transfer of {path} from {user} has completed." : "Tá aistriú úinéireachta {path} ó {user} críochnaithe.",
+ "in %s" : "i %s",
+ "Transferred from %1$s on %2$s" : "Aistrithe ó %1$s ar %2$s",
+ "Files compatibility" : "Comhoiriúnacht comhaid",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ceadaigh comhaid a shrianadh lena chinntiú gur féidir comhaid a shioncronú le gach cliant. De réir réamhshocraithe ceadaítear gach comhadainm atá bailí ar POSIX (m.sh. Linux nó macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Tar éis na hainmneacha comhad atá comhoiriúnach le Windows a chumasú, ní féidir comhaid atá ann cheana a mhodhnú a thuilleadh ach is féidir lena n-úinéir iad a athainmniú go hainmneacha nua bailí.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Is féidir comhaid a aistriú go huathoibríoch freisin tar éis an socrú seo a chumasú, féach ar an doiciméadú faoin ordú occ.",
+ "Enforce Windows compatibility" : "Comhoiriúnacht Windows a fhorfheidhmiú",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cuirfidh sé seo bac ar ainmneacha comhaid nach bhfuil bailí ar chórais Windows, ar nós ainmneacha forchoimeádta nó carachtair speisialta a úsáid. Ach ní chuirfidh sé seo i bhfeidhm comhoiriúnacht íogaireacht cáis.",
+ "File Management" : "Bainistíocht Comhad",
+ "Home" : "Baile",
+ "Target folder does not exist any more" : "Níl an spriocfhillteán ann a thuilleadh",
+ "Reload current directory" : "Athlódáil an eolaire reatha",
+ "Go to the \"{dir}\" directory" : "Téigh go dtí an eolaire \"{dir}\".",
+ "Current directory path" : "An cosán eolaire reatha",
+ "Your have used your space quota and cannot upload files anymore" : "D'úsáid tú do chuóta spáis agus ní féidir leat comhaid a uaslódáil a thuilleadh",
+ "You do not have permission to upload or create files here." : "Níl cead agat comhaid a uaslódáil nó a chruthú anseo.",
+ "Drag and drop files here to upload" : "Tarraing agus scaoil comhaid anseo le huaslódáil",
+ "Favorite" : "is fearr leat",
+ "Back" : "Ar ais",
+ "Toggle selection for file \"{displayName}\"" : "Scoránaigh an roghnúchán don chomhad \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Scoránaigh an roghnúchán don fhillteán \"{displayName}\"",
+ "File is loading" : "Comhad á luchtú",
+ "Folder is loading" : "Tá an fillteán á luchtú",
+ "Filename" : "Ainm comhaid",
+ "Folder name" : "Ainm fillteáin",
+ "This node is unavailable" : "Níl an nód seo ar fáil",
+ "Another entry with the same name already exists." : "Tá iontráil eile leis an ainm céanna ann cheana féin.",
+ "Invalid filename." : "Ainm comhaid neamhbhailí.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Athainmnithe \"{oldName}\" go \"{newName}\"",
+ "Rename file" : "Athainmnigh an comhad",
+ "Folder" : "Fillteán",
+ "Unknown file type" : "Cineál comhaid anaithnid",
+ "{ext} image" : "íomhá {ext}",
+ "{ext} video" : "físeán {ext}",
+ "{ext} audio" : "fuaim {ext}",
+ "{ext} text" : "téacs {ext}",
+ "Pending" : "Ar feitheamh",
+ "Unknown date" : "Dáta anaithnid",
+ "Clear filter" : "Glan an scagaire",
+ "Modified" : "Athraithe",
+ "Search everywhere" : "Cuardaigh i ngach áit",
+ "Type" : "Cineál",
+ "Active filters" : "Scagairí gníomhacha",
+ "Remove filter" : "Bain an scagaire",
+ "Total rows summary" : "Achoimre ar na sraitheanna iomlána",
+ "Toggle selection for all files and folders" : "Scoránaigh an roghnúchán do gach comhad agus fillteán",
+ "Name" : "Ainm",
+ "File type" : "Cineál comhaid",
+ "Size" : "Méid",
+ "Actions" : "Gníomhartha",
+ "(selected)" : "(roghnaithe)",
+ "List of files and folders." : "Liosta de chomhaid agus fillteáin.",
+ "You have used your space quota and cannot upload files anymore." : "D'úsáid tú do chuóta spáis agus ní féidir leat comhaid a uaslódáil a thuilleadh.",
+ "Column headers with buttons are sortable." : "Is féidir ceanntásca colún le cnaipí a shórtáil.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Níl an liosta seo le fáil go hiomlán ar chúiseanna feidhmíochta. Déanfar na comhaid a rindreáil agus tú ag dul tríd an liosta.",
+ "File not found" : "Comhad gan aimsiú",
+ "_{count} selected_::_{count} selected_" : ["{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe"],
+ "Search scope options" : "Roghanna raon feidhme cuardaigh",
+ "{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
+ "{used} of {quota} used" : "{used} de {quota} in úsáid",
+ "{relative}% used" : "{relative}% in úsáid",
+ "Could not refresh storage stats" : "Níorbh fhéidir na staitisticí stórála a athnuachan",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tá do stóras lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Storage information" : "Faisnéis stórála",
+ "Storage quota" : "Cuóta stórála",
+ "New folder" : "Fillteán nua",
+ "Create new folder" : "Cruthaigh fillteán nua",
+ "This name is already in use." : "Tá an t-ainm seo in úsáid cheana féin.",
+ "Create" : "Cruthaigh",
+ "Files starting with a dot are hidden by default" : "Bíonn comhaid a thosaíonn le ponc i bhfolach de réir réamhshocraithe",
+ "Fill template fields" : "Líon réimsí teimpléid",
+ "Submitting fields …" : "Réimsí á gcur isteach…",
+ "Submit" : "Cuir isteach",
+ "Choose a file or folder to transfer" : "Roghnaigh comhad nó fillteán le haistriú",
+ "Transfer" : "Aistriú",
+ "Transfer {path} to {userid}" : "Aistrigh {path} go {userid}",
+ "Invalid path selected" : "Conair neamhbhailí roghnaithe",
+ "Unknown error" : "Earráid anaithnid",
+ "Ownership transfer request sent" : "Iarratas aistrithe úinéireachta seolta",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ní féidir úinéireacht comhaid nó fillteáin nach leat a aistriú",
+ "Transfer ownership of a file or folder" : "Aistrigh úinéireacht comhaid nó fillteáin",
+ "Choose file or folder to transfer" : "Roghnaigh comhad nó fillteán le haistriú",
+ "Change" : "Athrú",
+ "New owner" : "Úinéir nua",
+ "Keep {old}" : "Coinnigh {old}",
+ "Keep without extension" : "Coinnigh gan síneadh",
+ "Use {new}" : "Úsáid {new}",
+ "Remove extension" : "Bain breiseán",
+ "Change file extension" : "Athraigh síneadh comhad",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Má athraítear iarmhír an chomhaid ó \"{old}\" go \"{new}\" seans go mbeidh an comhad do-léite.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Má bhaintear an iarmhír chomhaid \"{old}\" seans go mbeidh an comhad do-léite.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Má chuirtear an síneadh comhad \"{new}\" leis, seans go mbeidh an comhad do-léite.",
+ "Do not show this dialog again." : "Ná taispeáin an dialóg seo arís.",
+ "Select file or folder to link to" : "Roghnaigh comhad nó fillteán le nascadh leis",
+ "Choose {file}" : "Roghnaigh {file}",
+ "Share" : "Comhroinn",
+ "Shared by link" : "Roinnte ag nasc",
+ "Shared" : "Roinnte",
+ "Switch to list view" : "Athraigh go dtí an amharc liosta",
+ "Switch to grid view" : "Téigh go dtí an radharc greille",
+ "The file could not be found" : "Níorbh fhéidir an comhad a aimsiú",
+ "Upload was cancelled by user" : "Chuir an t-úsáideoir an uaslódáil ar ceal",
+ "Not enough free space" : "Níl go leor spás saor in aisce",
+ "Operation is blocked by access control" : "Cuireann rialú rochtana bac ar an oibríocht",
+ "Error during upload: {message}" : "Earráid le linn uaslódála: {message}",
+ "Error during upload, status code {status}" : "Earráid le linn uaslódála, cód stádais {status}",
+ "Unknown error during upload" : "Earráid anaithnid le linn uaslódála",
+ "Loading current folder" : "An fillteán reatha á lódáil",
+ "Retry" : "Bain triail eile as",
+ "No files in here" : "Níl aon chomhaid istigh anseo",
+ "Upload some content or sync with your devices!" : "Uaslódáil roinnt inneachair nó sioncronaigh le do ghléasanna!",
+ "Go back" : "Dul ar ais",
+ "Views" : "Radhairc",
+ "Files settings" : "Socruithe comhaid",
+ "Your files" : "Do chuid comhad",
+ "Open in files" : "Oscail i gcomhaid",
+ "File cannot be accessed" : "Ní féidir an comhad a rochtain",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Níorbh fhéidir an comhad a aimsiú nó níl cead agat féachaint air. Iarr ar an seoltóir é a roinnt.",
+ "No search results for “{query}”" : "Gan aon torthaí cuardaigh le haghaidh ”{query}”",
+ "Search for files" : "Cuardaigh comhaid",
+ "Clipboard is not available" : "Níl fáil ar an ngearrthaisce",
+ "General" : "Ginearálta",
+ "Default view" : "Amharc réamhshocraithe",
+ "All files" : "Gach comhad",
+ "Personal files" : "Comhaid phearsanta",
+ "Sort favorites first" : "Sórtáil na cinn is ansa leat ar dtús",
+ "Sort folders before files" : "Sórtáil fillteáin roimh chomhaid",
+ "Folder tree" : "Crann fillteán",
+ "Appearance" : "Dealramh",
+ "Show hidden files" : "Taispeáin comhaid i bhfolach",
+ "Show file type column" : "Taispeáin colún cineál comhaid",
+ "Crop image previews" : "Réamhamhairc íomhá barr",
+ "Additional settings" : "Socruithe breise",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Cóipeáil",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tá Fíordheimhniú Dhá Fhachtóir cumasaithe do do chuntas, agus dá bhrí sin ní mór duit pasfhocal aipe a úsáid chun cliant seachtrach WebDAV a nascadh.",
+ "Warnings" : "Rabhaidh",
+ "Keyboard shortcuts" : "Aicearraí méarchláir",
+ "File actions" : "Gníomhartha comhaid",
+ "Rename" : "Athainmnigh",
+ "Delete" : "Scrios",
+ "Manage tags" : "Bainistigh clibeanna",
+ "Selection" : "Roghnú",
+ "Select all files" : "Roghnaigh gach comhad",
+ "Deselect all" : "Díroghnaigh go léir",
+ "Navigation" : "Loingseoireacht",
+ "View" : "Amharc",
+ "Toggle grid view" : "Scoránaigh amharc greille",
+ "Show those shortcuts" : "Taispeáin na haicearraí sin",
+ "You" : "tú",
+ "Shared multiple times with different people" : "Roinnte go minic le daoine éagsúla",
+ "Unable to change the favorite state of the file" : "Ní féidir staid an chomhaid is fearr leat a athrú",
+ "Error while loading the file data" : "Earráid agus sonraí an chomhaid á lódáil",
+ "Owner" : "Úinéir",
+ "Remove from favorites" : "Bain ó cheanáin",
+ "Add to favorites" : "Cuir le ceanáin",
+ "Tags" : "Clibeanna",
+ "Blank" : "Bán",
+ "Unable to create new file from template" : "Ní féidir comhad nua a chruthú ón teimpléad",
+ "Pick a template for {name}" : "Roghnaigh teimpléad le haghaidh {name}",
+ "Create a new file with the selected template" : "Cruthaigh comhad nua leis an teimpléad roghnaithe",
+ "Creating file" : "Comhad a chruthú",
+ "Save as {displayName}" : "Sábháil mar {displayName}",
+ "Save as …" : "Sábháil mar…",
+ "Converting files …" : "Comhaid á thiontú…",
+ "Failed to convert files: {message}" : "Theip ar thiontú comhaid: {message}",
+ "All files failed to be converted" : "Theip ar gach comhad a thiontú",
+ "One file could not be converted: {message}" : "Níorbh fhéidir comhad amháin a thiontú:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Níorbh fhéidir comhad amháin a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["D'éirigh le comhad amháin a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú"],
+ "Files successfully converted" : "Comhaid a thiontú go rathúil",
+ "Failed to convert files" : "Theip ar thiontú comhaid",
+ "Converting file …" : "Comhad á thiontú…",
+ "File successfully converted" : "D'éirigh leis an gcomhad a thiontú",
+ "Failed to convert file: {message}" : "Theip ar an gcomhad a thiontú: {message}",
+ "Failed to convert file" : "Theip ar thiontú an chomhaid",
+ "Leave this share" : "Fág an sciar seo",
+ "Leave these shares" : "Fág na scaireanna seo",
+ "Disconnect storage" : "Déan stóráil a dhícheangal",
+ "Disconnect storages" : "Déan stórais a dhícheangal",
+ "Delete permanently" : "Scrios go buan",
+ "Delete and unshare" : "Scrios agus díroinnte",
+ "Delete file" : "Scrios an comhad",
+ "Delete files" : "Scrios comhaid",
+ "Delete folder" : "Scrios fillteán",
+ "Delete folders" : "Scrios fillteáin",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh"],
+ "Confirm deletion" : "Deimhnigh scriosadh",
+ "Cancel" : "Cealaigh",
+ "Download" : "Íoslódáil",
+ "Moving \"{source}\" to \"{destination}\" …" : "Ag bogadh \"{source}\" go \"{destination}\" ...",
+ "Copying \"{source}\" to \"{destination}\" …" : "“{source}” á chóipeáil go “{destination}”…",
+ "Destination is not a folder" : "Ní fillteán é ceann scríbe",
+ "This file/folder is already in that directory" : "Tá an comhad/fillteán seo san eolaire sin cheana féin",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Ní féidir leat comhad/fillteán a bhogadh isteach ann féin nó isteach i bhfofhillteán de féin",
+ "(copy)" : "(cóip)",
+ "(copy %n)" : "(cóip %n)",
+ "A file or folder with that name already exists in this folder" : "Tá comhad nó fillteán leis an ainm sin san fhillteán seo cheana",
+ "The files are locked" : "Tá na comhaid faoi ghlas",
+ "The file does not exist anymore" : "Níl an comhad ann a thuilleadh",
+ "Choose destination" : "Roghnaigh ceann scríbe",
+ "Copy to {target}" : "Cóipeáil chuig {target}",
+ "Move to {target}" : "Bog go {target}",
+ "Move" : "Bog",
+ "Move or copy operation failed" : "Theip ar an oibríocht a bhogadh nó a chóipeáil",
+ "Move or copy" : "Bog nó cóipeáil",
+ "Open folder {displayName}" : "Oscail fillteán {displayName}",
+ "Open in Files" : "Oscail i Comhaid",
+ "Open locally" : "Oscail go háitiúil",
+ "Failed to redirect to client" : "Theip ar atreorú chuig an gcliant",
+ "Open file locally" : "Oscail comhad go háitiúil",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Ba cheart an comhad a oscailt anois ar do ghléas. Mura ndéanann sé, seiceáil le do thoil go bhfuil an aip deisce suiteáilte agat.",
+ "Retry and close" : "Bain triail eile as agus dún",
+ "Open online" : "Oscail ar líne",
+ "Details" : "Sonraí",
+ "View in folder" : "Amharc san fhillteán",
+ "Today" : "Inniu",
+ "Last 7 days" : "7 lá seo caite",
+ "Last 30 days" : "30 lá anuas",
+ "This year ({year})" : "i mbliana ({year})",
+ "Last year ({year})" : "An bhliain seo caite {year}",
+ "Documents" : "Doiciméid",
+ "Spreadsheets" : "Scarbhileoga",
+ "Presentations" : "Cur i láthair",
+ "PDFs" : "PDFs",
+ "Folders" : "Fillteáin",
+ "Audio" : "Fuaime",
+ "Images" : "Íomhánna",
+ "Videos" : "Físeáin",
+ "Created new folder \"{name}\"" : "Cruthaíodh fillteán nua \"{name}\"",
+ "Unable to initialize the templates directory" : "Ní féidir eolaire na dteimpléad a thúsú",
+ "Create templates folder" : "Cruthaigh fillteán teimpléid",
+ "Templates" : "Teimpléid",
+ "New template folder" : "Fillteán teimpléid nua",
+ "In folder" : "I bhfillteán",
+ "Search in all files" : "Cuardaigh i ngach comhad",
+ "Search in folder: {folder}" : "Cuardaigh i bhfillteán: {folder}",
+ "One of the dropped files could not be processed" : "Níorbh fhéidir ceann de na comhaid a thit a phróiseáil",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ní thacaíonn do bhrabhsálaí leis an API System File. Ní dhéanfar eolaire a uaslódáil",
+ "No files to upload" : "Gan comhaid a uaslódáil",
+ "Unable to create the directory {directory}" : "Ní féidir an t-eolaire {directory} a chruthú",
+ "Some files could not be uploaded" : "Níorbh fhéidir roinnt comhad a uaslódáil",
+ "Files uploaded successfully" : "D'éirigh le huaslódáil comhaid",
+ "No files to process" : "Níl aon chomhaid le próiseáil",
+ "Some files could not be copied" : "Níorbh fhéidir roinnt comhad a chóipeáil",
+ "Some files could not be moved" : "Níorbh fhéidir roinnt comhad a bhogadh",
+ "Files copied successfully" : "D'éirigh le cóipeáil na gcomhaid",
+ "Files moved successfully" : "Bogadh na comhaid go rathúil",
+ "Conflicts resolution skipped" : "Léiríodh réiteach coinbhleachta",
+ "Upload cancelled" : "Cuireadh an t-uaslódáil ar ceal",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Níorbh fhéidir \"{oldName}\" a athainmniú, níl sé ann a thuilleadh",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tá an t-ainm \"{newName}\" in úsáid cheana féin san fhillteán \"{dir}\". Roghnaigh ainm eile le do thoil.",
+ "Could not rename \"{oldName}\"" : "Níorbh fhéidir \"{oldName}\" a athainmniú",
+ "This operation is forbidden" : "Tá an oibríocht seo toirmiscthe",
+ "Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach",
+ "Unexpected error: {error}" : "Earráid gan choinne: {error}",
+ "_%n file_::_%n files_" : ["%n comhad","%n comhaid","%n comhaid","%n comhaid","%n comhaid"],
+ "_%n folder_::_%n folders_" : ["%n fillteán","%n fillteáin","%n fillteáin","%n fillteáin","%n fillteáin"],
+ "_%n hidden_::_%n hidden_" : ["%n i bhfolach","%n i bhfolach","%n i bhfolach","%n i bhfolach","%n i bhfolach"],
+ "Filename must not be empty." : "Ní ceadmhach ainm an chomhaid a bheith folamh.",
+ "\"{char}\" is not allowed inside a filename." : "Ní cheadaítear \"{char}\" taobh istigh d'ainm comhaid.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "Is ainm forchoimeádta é \"{segment}\" agus ní cheadaítear é d'ainmneacha comhaid.",
+ "\"{extension}\" is not an allowed filetype." : "Ní cineál comhaid ceadaithe é \"{extension}\".",
+ "Filenames must not end with \"{extension}\"." : "Níor cheart go gcríochnaíonn comhaid chomhad le \"{extension}\".",
+ "List of favorite files and folders." : "Liosta de na comhaid agus na fillteáin is fearr leat.",
+ "No favorites yet" : "Níl aon cheanáin go fóill",
+ "Files and folders you mark as favorite will show up here" : "Taispeánfar comhaid agus fillteáin a mharcálann tú mar is fearr leat anseo",
+ "List of your files and folders." : "Liosta de do chuid comhad agus fillteáin.",
+ "List of your files and folders that are not shared." : "Liosta de do chuid comhad agus fillteáin nach bhfuil roinnte.",
+ "No personal files found" : "Níor aimsíodh aon chomhaid phearsanta",
+ "Files that are not shared will show up here." : "Taispeánfar comhaid nach bhfuil roinnte anseo.",
+ "Recent" : "le déanaí",
+ "List of recently modified files and folders." : "Liosta de chomhaid agus de fhillteáin a athraíodh le déanaí.",
+ "No recently modified files" : "Níl aon chomhaid athraithe le déanaí",
+ "Files and folders you recently modified will show up here." : "Taispeánfar comhaid agus fillteáin a d'athraigh tú le déanaí anseo.",
+ "Search" : "Cuardach",
+ "Search results within your files." : "Torthaí cuardaigh laistigh de do chuid comhad.",
+ "No entries found in this folder" : "Níor aimsíodh aon iontrálacha san fhillteán seo",
+ "Select all" : "Roghnú go léir",
+ "Upload too large" : "Íoslódáil ró-mhór",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Sáraíonn na comhaid atá tú ag iarraidh a uaslódáil an t-uasmhéid le haghaidh uaslódáil comhad ar an bhfreastalaí seo.",
+ "File could not be found" : "Níorbh fhéidir an comhad a aimsiú",
+ "Show list view" : "Taispeáin amharc liosta",
+ "Show grid view" : "Taispeáin radharc greille",
+ "Close" : "Dún",
+ "Could not create folder \"{dir}\"" : "Níorbh fhéidir fillteán \"{dir}\" a chruthú",
+ "This will stop your current uploads." : "Cuirfidh sé seo stop le d'uaslódálacha reatha.",
+ "Upload cancelled." : "Cuireadh an t-uaslódáil ar ceal.",
+ "Processing files …" : "Comhaid á bpróiseáil…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ní féidir {filename} a uaslódáil mar gur eolaire é nó go bhfuil 0 beart ann",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Níl go leor spáis saor in aisce, tá {size1} á uaslódáil agat ach níl ach {size2} fágtha",
+ "Target folder \"{dir}\" does not exist any more" : "Níl an spriocfhillteán \"{dir}\" ann a thuilleadh",
+ "An unknown error has occurred" : "Tharla earráid anaithnid",
+ "File could not be uploaded" : "Níorbh fhéidir an comhad a uaslódáil",
+ "Uploading …" : "Á uaslódáil…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Á uaslódáil … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ní thacaítear le huaslódáil an mhír sin",
+ "Error when assembling chunks, status code {status}" : "Earráid agus smután á chur le chéile, cód stádais {status}",
+ "Choose target folder" : "Roghnaigh fillteán sprice",
+ "Set reminder" : "Socraigh meabhrúchán",
+ "Edit locally" : "Cuir in eagar go háitiúil",
+ "Open" : "Oscail",
+ "Could not load info for file \"{file}\"" : "Níorbh fhéidir faisnéis don chomhad \"{file}\" a lódáil",
+ "Please select tag(s) to add to the selection" : "Roghnaigh clib(í) le cur leis an rogha le do thoil",
+ "Apply tag(s) to selection" : "Cuir clib(í) i bhfeidhm ar an roghnúchán",
+ "Select directory \"{dirName}\"" : "Roghnaigh eolaire \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Roghnaigh comhad \"{fileName}\"",
+ "Unable to determine date" : "Ní féidir an dáta a chinneadh",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Níl an t-eolaire seo ar fáil, seiceáil na logaí nó déan teagmháil leis an riarthóir le do thoil",
+ "Could not move \"{file}\", target exists" : "Níorbh fhéidir \"{file}\" a bhogadh, tá an sprioc ann",
+ "Could not move \"{file}\"" : "Níorbh fhéidir \"{file}\" a bhogadh",
+ "copy" : "cóip",
+ "Could not copy \"{file}\", target exists" : "Níorbh fhéidir \"{file}\" a chóipeáil, tá an sprioc ann",
+ "Could not copy \"{file}\"" : "Níorbh fhéidir \"{file}\" a chóipeáil",
+ "Copied {origin} inside {destination}" : "Cóipeáladh {origin} taobh istigh de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Cóipeáladh {origin} agus {nbfiles} comhaid eile laistigh de {destination}",
+ "{newName} already exists" : "Tá {newName} ann cheana",
+ "Could not create file \"{file}\"" : "Níorbh fhéidir comhad \"{file}\" a chruthú",
+ "Could not create file \"{file}\" because it already exists" : "Níorbh fhéidir an comhad \"{file}\" a chruthú toisc go bhfuil sé ann cheana",
+ "Could not create folder \"{dir}\" because it already exists" : "Níorbh fhéidir fillteán \"{dir}\" a chruthú toisc go bhfuil sé ann cheana",
+ "Could not fetch file details \"{file}\"" : "Níorbh fhéidir sonraí an chomhaid \"{file}\" a fháil",
+ "Error deleting file \"{fileName}\"." : "Earráid agus comhad \"{fileName}\" á scriosadh.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Níl aon toradh cuardaigh i bhfillteáin eile le haghaidh {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Cuir isteach níos mó ná dhá charachtar chun cuardach a dhéanamh i bhfillteáin eile",
+ "{dirs} and {files}" : "{dirs} agus {files}",
+ "_including %n hidden_::_including %n hidden_" : ["lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach"],
+ "You do not have permission to upload or create files here" : "Níl cead agat comhaid a uaslódáil nó a chruthú anseo",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n comhad á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil"],
+ "New" : "Nua",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Roghnaigh raon comhaid",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} in úsáid",
+ "\"{name}\" is an invalid file name." : "Is ainm comhaid neamhbhailí é \"{name}\".",
+ "File name cannot be empty." : "Ní féidir leis an ainm comhaid a bheith folamh.",
+ "\"/\" is not allowed inside a file name." : "Ní cheadaítear \"/\" taobh istigh d'ainm comhaid.",
+ "\"{name}\" is not an allowed filetype" : "Ní cineál comhaid ceadaithe é \"{name}\".",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Tá stóráil {owner} lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Tá fillteán grúpa \"{mountPoint}\" lán, ní féidir comhaid a nuashonrú nó a shioncronú a thuilleadh!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Tá an stóras seachtrach \"{mountPoint}\" lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tá do stóras lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Tá stóráil {owner} beagnach lán ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Tá fillteán grúpa \"{mountPoint}\" beagnach lán ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Tá an stóras seachtrach \"{mountPoint}\" beagnach lán ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tá do stóras beagnach lán ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["meaitseálann \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Cóipeáladh nasc díreach (oibreacha do dhaoine a bhfuil rochtain acu ar an gcomhad/fillteán seo amháin)",
+ "Path" : "Cosán",
+ "_%n byte_::_%n bytes_" : ["%n beart ","%n bearta ","%n bearta","%n bearta","%n bearta"],
+ "Favored" : "B'fhearr leis",
+ "Favor" : "Fabhar",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Cóipeáil nasc díreach (ní oibríonn ach do dhaoine a bhfuil rochtain acu ar an gcomhad/fillteán seo)",
+ "Upload file" : "Uaslódáil comhad",
+ "Not favored" : "Ní bail ar fónamh orthu",
+ "An error occurred while trying to update the tags" : "Tharla earráid agus iarracht á déanamh na clibeanna a nuashonrú",
+ "Upload (max. %s)" : "Uaslódáil (%s ar a mhéad)",
+ "\"{displayName}\" action executed successfully" : "Cuireadh an gníomh \"{displayName}\" i gcrích go rathúil",
+ "\"{displayName}\" action failed" : "Theip ar an ngníomh \"{displayName}\".",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" theip ar roinnt gnéithe",
+ "\"{displayName}\" batch action executed successfully" : "D'éirigh le beart baisce \"{displayName}\" a rith",
+ "Submitting fields…" : "Réimsí á gcur isteach…",
+ "Filter filenames…" : "Scag ainmneacha comhaid…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV cóipeáilte chuig an ngearrthaisce",
+ "Enable the grid view" : "Cumasaigh an radharc greille",
+ "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
+ "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
+ "Deletion cancelled" : "Scriosadh cealaithe",
+ "Move cancelled" : "Bogadh ar ceal",
+ "Cancelled move or copy of \"{filename}\"." : "Cealaíodh bogadh nó cóip de \"{filename}\".",
+ "Cancelled move or copy operation" : "Oibríocht aistrithe nó cóipeála curtha ar ceal",
+ "Open details" : "Sonraí oscailte",
+ "Photos and images" : "Grianghraif agus íomhánna",
+ "New folder creation cancelled" : "Cruthú fillteán nua curtha ar ceal",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} fillteán","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} comhad","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 chomhad agus {folderCount} fillteán","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} comhad agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán"],
+ "{fileCount} files and {folderCount} folders" : "comhaid {fileCount} agus fillteáin {folderCount}",
+ "All folders" : "Gach fillteáin",
+ "Personal Files" : "Comhaid Phearsanta",
+ "Text file" : "Comhad téacs",
+ "New text file.txt" : "Comhad téacs nua.txt",
+ "%1$s (renamed)" : "%1$s (athainmnithe)",
+ "renamed file" : "comhad athainmnithe",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Tar éis na hainmneacha comhad atá comhoiriúnach le Windows a chumasú, ní féidir comhaid atá ann cheana a mhodhnú a thuilleadh ach is féidir lena n-úinéir iad a athainmniú go hainmneacha nua bailí.",
+ "Filter file names …" : "Scag ainmneacha na gcomhad…",
+ "Prevent warning dialogs from open or reenable them." : "Cosc a chur ar dialóga rabhaidh ó iad a oscailt nó iad a athchumasú.",
+ "Show a warning dialog when changing a file extension." : "Taispeáin dialóg rabhaidh nuair a athraítear síneadh comhad.",
+ "Speed up your Files experience with these quick shortcuts." : "Déan do thaithí Comhaid a bhrostú leis na haicearraí tapa seo.",
+ "Open the actions menu for a file" : "Oscail an roghchlár gníomhartha le haghaidh comhad",
+ "Rename a file" : "Athainmnigh comhad",
+ "Delete a file" : "Scrios comhad",
+ "Favorite or remove a file from favorites" : "Is ansa leat nó bain comhad ó cheanáin",
+ "Manage tags for a file" : "Bainistigh clibeanna le haghaidh comhaid",
+ "Deselect all files" : "Díroghnaigh gach comhad",
+ "Select or deselect a file" : "Roghnaigh nó díroghnaigh comhad",
+ "Select a range of files" : "Roghnaigh raon comhad",
+ "Navigate to the parent folder" : "Déan nascleanúint go dtí an fillteán tuismitheora",
+ "Navigate to the file above" : "Déan nascleanúint go dtí an comhad thuas",
+ "Navigate to the file below" : "Déan nascleanúint go dtí an comhad thíos",
+ "Navigate to the file on the left (in grid mode)" : "Déan nascleanúint go dtí an comhad ar chlé (i mód greille)",
+ "Navigate to the file on the right (in grid mode)" : "Déan nascleanúint go dtí an comhad ar dheis (i mód greille)",
+ "Toggle the grid view" : "Scoránaigh an radharc greille",
+ "Open the sidebar for a file" : "Oscail an barra taoibh le haghaidh comhad"
+},
+"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
diff --git a/apps/files/l10n/ga.json b/apps/files/l10n/ga.json
new file mode 100644
index 00000000000..788ee81200a
--- /dev/null
+++ b/apps/files/l10n/ga.json
@@ -0,0 +1,479 @@
+{ "translations": {
+ "Added to favorites" : "Curtha le ceanáin",
+ "Removed from favorites" : "Bainte de cheanáin",
+ "You added {file} to your favorites" : "Chuir tú {file} le do cheanáin",
+ "You removed {file} from your favorites" : "Bhain tú {file} de do cheanáin",
+ "Favorites" : "Ceanáin",
+ "File changes" : "Athruithe comhaid",
+ "Created by {user}" : "Cruthaithe ag {user}",
+ "Changed by {user}" : "Athraithe ag {user}",
+ "Deleted by {user}" : "Scriosta ag {user}",
+ "Restored by {user}" : "Athchóiríodh ag {user}",
+ "Renamed by {user}" : "Athainmnithe ag {user}",
+ "Moved by {user}" : "Ar athraíodh a ionad ag {user}",
+ "\"remote account\"" : "\"cuntas cianda\"",
+ "You created {file}" : "Chruthaigh tú {file}",
+ "You created an encrypted file in {file}" : "Chruthaigh tú comhad criptithe i {file}",
+ "{user} created {file}" : "{user} cruthaithe {file}",
+ "{user} created an encrypted file in {file}" : "{user} chruthaigh sé comhad criptithe i {file}",
+ "{file} was created in a public folder" : "Cruthaíodh {file} i bhfillteán poiblí",
+ "You changed {file}" : "D'athraigh tú {file}",
+ "You changed an encrypted file in {file}" : "D'athraigh tú comhad criptithe i {file}",
+ "{user} changed {file}" : "D'athraigh {user} {file}",
+ "{user} changed an encrypted file in {file}" : "D'athraigh {user} comhad criptithe i {file}",
+ "You deleted {file}" : "Scrios tú {file}",
+ "You deleted an encrypted file in {file}" : "Scrios tú comhad criptithe i {file}",
+ "{user} deleted {file}" : "Scriosadh {user} {file}",
+ "{user} deleted an encrypted file in {file}" : "Scrios {user} comhad criptithe i {file}",
+ "You restored {file}" : "D'aischuir tú {file}",
+ "{user} restored {file}" : "D'aischuir {user} {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "D'athainmnigh tú {oldfile} (i bhfolach) go {newfile} (i bhfolach)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "D'athainmnigh tú {oldfile} (i bhfolach) go {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "D'athainmnigh tú {oldfile} go {newfile} (i bhfolach)",
+ "You renamed {oldfile} to {newfile}" : "D'athainmnigh tú {oldfile} go {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} athainmnithe {oldfile} (i bhfolach) go {newfile} (i bhfolach)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} athainmnithe {oldfile} (i bhfolach) go {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} athainmnithe {oldfile} go {newfile} (i bhfolach)",
+ "{user} renamed {oldfile} to {newfile}" : "Athainmníodh {user} {oldfile} go {newfile}",
+ "You moved {oldfile} to {newfile}" : "Bhog tú {oldfile} go {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "Bhog {user} {oldfile} go {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Cuireadh comhad le do<strong>favorites</strong>nó baineadh de",
+ "Files" : "Comhaid",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Athraíodh</strong>comhad nó fillteán",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Athraíodh</strong>comhad nó fillteán is fearr leat",
+ "Failed to authorize" : "Theip ar údarú",
+ "Invalid folder path" : "Conair fillteáin neamhbhailí",
+ "Folder not found" : "Fillteán gan aimsiú",
+ "The file cannot be found" : "Ní féidir an comhad a aimsiú",
+ "The destination path does not exist: %1$s" : "Níl an cosán sprice ann:%1$s",
+ "You do not have permission to create a file at the specified location" : "Níl cead agat comhad a chruthú ag an suíomh sonraithe",
+ "The file could not be converted." : "Níorbh fhéidir an comhad a thiontú.",
+ "Could not get relative path to converted file" : "Níorbh fhéidir cosán coibhneasta a fháil chuig an gcomhad tiontaithe",
+ "Favorite files" : "Comhaid is fearr leat",
+ "No favorites" : "Gan aon cheanáin",
+ "More favorites" : "Gan aon cheanáin",
+ "Accept" : "Glac",
+ "Reject" : "Diúltaigh",
+ "Incoming ownership transfer from {user}" : "Aistriú úinéireachta isteach ó {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ar mhaith leat glacadh le {path}?\n\nNóta: Féadfaidh an próiseas aistrithe tar éis glacadh suas le 1 uair an chloig a ghlacadh.",
+ "Ownership transfer denied" : "Aistriú úinéireachta diúltaithe",
+ "Your ownership transfer of {path} was denied by {user}." : "Dhiúltaigh {user} d'aistriú úinéireachta ar {path}.",
+ "Ownership transfer failed" : "Theip ar aistriú úinéireachta",
+ "Your ownership transfer of {path} to {user} failed." : "Theip ar d'aistriú úinéireachta de {path} go {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Theip ar aistriú úinéireachta {path} ó {user}.",
+ "Ownership transfer done" : "Aistriú úinéireachta déanta",
+ "Your ownership transfer of {path} to {user} has completed." : "Tá d'aistriú úinéireachta de {path} go {user} críochnaithe.",
+ "The ownership transfer of {path} from {user} has completed." : "Tá aistriú úinéireachta {path} ó {user} críochnaithe.",
+ "in %s" : "i %s",
+ "Transferred from %1$s on %2$s" : "Aistrithe ó %1$s ar %2$s",
+ "Files compatibility" : "Comhoiriúnacht comhaid",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ceadaigh comhaid a shrianadh lena chinntiú gur féidir comhaid a shioncronú le gach cliant. De réir réamhshocraithe ceadaítear gach comhadainm atá bailí ar POSIX (m.sh. Linux nó macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Tar éis na hainmneacha comhad atá comhoiriúnach le Windows a chumasú, ní féidir comhaid atá ann cheana a mhodhnú a thuilleadh ach is féidir lena n-úinéir iad a athainmniú go hainmneacha nua bailí.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Is féidir comhaid a aistriú go huathoibríoch freisin tar éis an socrú seo a chumasú, féach ar an doiciméadú faoin ordú occ.",
+ "Enforce Windows compatibility" : "Comhoiriúnacht Windows a fhorfheidhmiú",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cuirfidh sé seo bac ar ainmneacha comhaid nach bhfuil bailí ar chórais Windows, ar nós ainmneacha forchoimeádta nó carachtair speisialta a úsáid. Ach ní chuirfidh sé seo i bhfeidhm comhoiriúnacht íogaireacht cáis.",
+ "File Management" : "Bainistíocht Comhad",
+ "Home" : "Baile",
+ "Target folder does not exist any more" : "Níl an spriocfhillteán ann a thuilleadh",
+ "Reload current directory" : "Athlódáil an eolaire reatha",
+ "Go to the \"{dir}\" directory" : "Téigh go dtí an eolaire \"{dir}\".",
+ "Current directory path" : "An cosán eolaire reatha",
+ "Your have used your space quota and cannot upload files anymore" : "D'úsáid tú do chuóta spáis agus ní féidir leat comhaid a uaslódáil a thuilleadh",
+ "You do not have permission to upload or create files here." : "Níl cead agat comhaid a uaslódáil nó a chruthú anseo.",
+ "Drag and drop files here to upload" : "Tarraing agus scaoil comhaid anseo le huaslódáil",
+ "Favorite" : "is fearr leat",
+ "Back" : "Ar ais",
+ "Toggle selection for file \"{displayName}\"" : "Scoránaigh an roghnúchán don chomhad \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Scoránaigh an roghnúchán don fhillteán \"{displayName}\"",
+ "File is loading" : "Comhad á luchtú",
+ "Folder is loading" : "Tá an fillteán á luchtú",
+ "Filename" : "Ainm comhaid",
+ "Folder name" : "Ainm fillteáin",
+ "This node is unavailable" : "Níl an nód seo ar fáil",
+ "Another entry with the same name already exists." : "Tá iontráil eile leis an ainm céanna ann cheana féin.",
+ "Invalid filename." : "Ainm comhaid neamhbhailí.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Athainmnithe \"{oldName}\" go \"{newName}\"",
+ "Rename file" : "Athainmnigh an comhad",
+ "Folder" : "Fillteán",
+ "Unknown file type" : "Cineál comhaid anaithnid",
+ "{ext} image" : "íomhá {ext}",
+ "{ext} video" : "físeán {ext}",
+ "{ext} audio" : "fuaim {ext}",
+ "{ext} text" : "téacs {ext}",
+ "Pending" : "Ar feitheamh",
+ "Unknown date" : "Dáta anaithnid",
+ "Clear filter" : "Glan an scagaire",
+ "Modified" : "Athraithe",
+ "Search everywhere" : "Cuardaigh i ngach áit",
+ "Type" : "Cineál",
+ "Active filters" : "Scagairí gníomhacha",
+ "Remove filter" : "Bain an scagaire",
+ "Total rows summary" : "Achoimre ar na sraitheanna iomlána",
+ "Toggle selection for all files and folders" : "Scoránaigh an roghnúchán do gach comhad agus fillteán",
+ "Name" : "Ainm",
+ "File type" : "Cineál comhaid",
+ "Size" : "Méid",
+ "Actions" : "Gníomhartha",
+ "(selected)" : "(roghnaithe)",
+ "List of files and folders." : "Liosta de chomhaid agus fillteáin.",
+ "You have used your space quota and cannot upload files anymore." : "D'úsáid tú do chuóta spáis agus ní féidir leat comhaid a uaslódáil a thuilleadh.",
+ "Column headers with buttons are sortable." : "Is féidir ceanntásca colún le cnaipí a shórtáil.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Níl an liosta seo le fáil go hiomlán ar chúiseanna feidhmíochta. Déanfar na comhaid a rindreáil agus tú ag dul tríd an liosta.",
+ "File not found" : "Comhad gan aimsiú",
+ "_{count} selected_::_{count} selected_" : ["{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe"],
+ "Search scope options" : "Roghanna raon feidhme cuardaigh",
+ "{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
+ "{used} of {quota} used" : "{used} de {quota} in úsáid",
+ "{relative}% used" : "{relative}% in úsáid",
+ "Could not refresh storage stats" : "Níorbh fhéidir na staitisticí stórála a athnuachan",
+ "Your storage is full, files can not be updated or synced anymore!" : "Tá do stóras lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Storage information" : "Faisnéis stórála",
+ "Storage quota" : "Cuóta stórála",
+ "New folder" : "Fillteán nua",
+ "Create new folder" : "Cruthaigh fillteán nua",
+ "This name is already in use." : "Tá an t-ainm seo in úsáid cheana féin.",
+ "Create" : "Cruthaigh",
+ "Files starting with a dot are hidden by default" : "Bíonn comhaid a thosaíonn le ponc i bhfolach de réir réamhshocraithe",
+ "Fill template fields" : "Líon réimsí teimpléid",
+ "Submitting fields …" : "Réimsí á gcur isteach…",
+ "Submit" : "Cuir isteach",
+ "Choose a file or folder to transfer" : "Roghnaigh comhad nó fillteán le haistriú",
+ "Transfer" : "Aistriú",
+ "Transfer {path} to {userid}" : "Aistrigh {path} go {userid}",
+ "Invalid path selected" : "Conair neamhbhailí roghnaithe",
+ "Unknown error" : "Earráid anaithnid",
+ "Ownership transfer request sent" : "Iarratas aistrithe úinéireachta seolta",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ní féidir úinéireacht comhaid nó fillteáin nach leat a aistriú",
+ "Transfer ownership of a file or folder" : "Aistrigh úinéireacht comhaid nó fillteáin",
+ "Choose file or folder to transfer" : "Roghnaigh comhad nó fillteán le haistriú",
+ "Change" : "Athrú",
+ "New owner" : "Úinéir nua",
+ "Keep {old}" : "Coinnigh {old}",
+ "Keep without extension" : "Coinnigh gan síneadh",
+ "Use {new}" : "Úsáid {new}",
+ "Remove extension" : "Bain breiseán",
+ "Change file extension" : "Athraigh síneadh comhad",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Má athraítear iarmhír an chomhaid ó \"{old}\" go \"{new}\" seans go mbeidh an comhad do-léite.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Má bhaintear an iarmhír chomhaid \"{old}\" seans go mbeidh an comhad do-léite.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Má chuirtear an síneadh comhad \"{new}\" leis, seans go mbeidh an comhad do-léite.",
+ "Do not show this dialog again." : "Ná taispeáin an dialóg seo arís.",
+ "Select file or folder to link to" : "Roghnaigh comhad nó fillteán le nascadh leis",
+ "Choose {file}" : "Roghnaigh {file}",
+ "Share" : "Comhroinn",
+ "Shared by link" : "Roinnte ag nasc",
+ "Shared" : "Roinnte",
+ "Switch to list view" : "Athraigh go dtí an amharc liosta",
+ "Switch to grid view" : "Téigh go dtí an radharc greille",
+ "The file could not be found" : "Níorbh fhéidir an comhad a aimsiú",
+ "Upload was cancelled by user" : "Chuir an t-úsáideoir an uaslódáil ar ceal",
+ "Not enough free space" : "Níl go leor spás saor in aisce",
+ "Operation is blocked by access control" : "Cuireann rialú rochtana bac ar an oibríocht",
+ "Error during upload: {message}" : "Earráid le linn uaslódála: {message}",
+ "Error during upload, status code {status}" : "Earráid le linn uaslódála, cód stádais {status}",
+ "Unknown error during upload" : "Earráid anaithnid le linn uaslódála",
+ "Loading current folder" : "An fillteán reatha á lódáil",
+ "Retry" : "Bain triail eile as",
+ "No files in here" : "Níl aon chomhaid istigh anseo",
+ "Upload some content or sync with your devices!" : "Uaslódáil roinnt inneachair nó sioncronaigh le do ghléasanna!",
+ "Go back" : "Dul ar ais",
+ "Views" : "Radhairc",
+ "Files settings" : "Socruithe comhaid",
+ "Your files" : "Do chuid comhad",
+ "Open in files" : "Oscail i gcomhaid",
+ "File cannot be accessed" : "Ní féidir an comhad a rochtain",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Níorbh fhéidir an comhad a aimsiú nó níl cead agat féachaint air. Iarr ar an seoltóir é a roinnt.",
+ "No search results for “{query}”" : "Gan aon torthaí cuardaigh le haghaidh ”{query}”",
+ "Search for files" : "Cuardaigh comhaid",
+ "Clipboard is not available" : "Níl fáil ar an ngearrthaisce",
+ "General" : "Ginearálta",
+ "Default view" : "Amharc réamhshocraithe",
+ "All files" : "Gach comhad",
+ "Personal files" : "Comhaid phearsanta",
+ "Sort favorites first" : "Sórtáil na cinn is ansa leat ar dtús",
+ "Sort folders before files" : "Sórtáil fillteáin roimh chomhaid",
+ "Folder tree" : "Crann fillteán",
+ "Appearance" : "Dealramh",
+ "Show hidden files" : "Taispeáin comhaid i bhfolach",
+ "Show file type column" : "Taispeáin colún cineál comhaid",
+ "Crop image previews" : "Réamhamhairc íomhá barr",
+ "Additional settings" : "Socruithe breise",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Cóipeáil",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tá Fíordheimhniú Dhá Fhachtóir cumasaithe do do chuntas, agus dá bhrí sin ní mór duit pasfhocal aipe a úsáid chun cliant seachtrach WebDAV a nascadh.",
+ "Warnings" : "Rabhaidh",
+ "Keyboard shortcuts" : "Aicearraí méarchláir",
+ "File actions" : "Gníomhartha comhaid",
+ "Rename" : "Athainmnigh",
+ "Delete" : "Scrios",
+ "Manage tags" : "Bainistigh clibeanna",
+ "Selection" : "Roghnú",
+ "Select all files" : "Roghnaigh gach comhad",
+ "Deselect all" : "Díroghnaigh go léir",
+ "Navigation" : "Loingseoireacht",
+ "View" : "Amharc",
+ "Toggle grid view" : "Scoránaigh amharc greille",
+ "Show those shortcuts" : "Taispeáin na haicearraí sin",
+ "You" : "tú",
+ "Shared multiple times with different people" : "Roinnte go minic le daoine éagsúla",
+ "Unable to change the favorite state of the file" : "Ní féidir staid an chomhaid is fearr leat a athrú",
+ "Error while loading the file data" : "Earráid agus sonraí an chomhaid á lódáil",
+ "Owner" : "Úinéir",
+ "Remove from favorites" : "Bain ó cheanáin",
+ "Add to favorites" : "Cuir le ceanáin",
+ "Tags" : "Clibeanna",
+ "Blank" : "Bán",
+ "Unable to create new file from template" : "Ní féidir comhad nua a chruthú ón teimpléad",
+ "Pick a template for {name}" : "Roghnaigh teimpléad le haghaidh {name}",
+ "Create a new file with the selected template" : "Cruthaigh comhad nua leis an teimpléad roghnaithe",
+ "Creating file" : "Comhad a chruthú",
+ "Save as {displayName}" : "Sábháil mar {displayName}",
+ "Save as …" : "Sábháil mar…",
+ "Converting files …" : "Comhaid á thiontú…",
+ "Failed to convert files: {message}" : "Theip ar thiontú comhaid: {message}",
+ "All files failed to be converted" : "Theip ar gach comhad a thiontú",
+ "One file could not be converted: {message}" : "Níorbh fhéidir comhad amháin a thiontú:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Níorbh fhéidir comhad amháin a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú","Níorbh fhéidir %n comhad a thiontú"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["D'éirigh le comhad amháin a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú","D'éirigh le %n comhad a thiontú"],
+ "Files successfully converted" : "Comhaid a thiontú go rathúil",
+ "Failed to convert files" : "Theip ar thiontú comhaid",
+ "Converting file …" : "Comhad á thiontú…",
+ "File successfully converted" : "D'éirigh leis an gcomhad a thiontú",
+ "Failed to convert file: {message}" : "Theip ar an gcomhad a thiontú: {message}",
+ "Failed to convert file" : "Theip ar thiontú an chomhaid",
+ "Leave this share" : "Fág an sciar seo",
+ "Leave these shares" : "Fág na scaireanna seo",
+ "Disconnect storage" : "Déan stóráil a dhícheangal",
+ "Disconnect storages" : "Déan stórais a dhícheangal",
+ "Delete permanently" : "Scrios go buan",
+ "Delete and unshare" : "Scrios agus díroinnte",
+ "Delete file" : "Scrios an comhad",
+ "Delete files" : "Scrios comhaid",
+ "Delete folder" : "Scrios fillteán",
+ "Delete folders" : "Scrios fillteáin",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan","Tá tú ar tí {count} mír a scriosadh go buan"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh","Tá tú ar tí {count} mír a scriosadh"],
+ "Confirm deletion" : "Deimhnigh scriosadh",
+ "Cancel" : "Cealaigh",
+ "Download" : "Íoslódáil",
+ "Moving \"{source}\" to \"{destination}\" …" : "Ag bogadh \"{source}\" go \"{destination}\" ...",
+ "Copying \"{source}\" to \"{destination}\" …" : "“{source}” á chóipeáil go “{destination}”…",
+ "Destination is not a folder" : "Ní fillteán é ceann scríbe",
+ "This file/folder is already in that directory" : "Tá an comhad/fillteán seo san eolaire sin cheana féin",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Ní féidir leat comhad/fillteán a bhogadh isteach ann féin nó isteach i bhfofhillteán de féin",
+ "(copy)" : "(cóip)",
+ "(copy %n)" : "(cóip %n)",
+ "A file or folder with that name already exists in this folder" : "Tá comhad nó fillteán leis an ainm sin san fhillteán seo cheana",
+ "The files are locked" : "Tá na comhaid faoi ghlas",
+ "The file does not exist anymore" : "Níl an comhad ann a thuilleadh",
+ "Choose destination" : "Roghnaigh ceann scríbe",
+ "Copy to {target}" : "Cóipeáil chuig {target}",
+ "Move to {target}" : "Bog go {target}",
+ "Move" : "Bog",
+ "Move or copy operation failed" : "Theip ar an oibríocht a bhogadh nó a chóipeáil",
+ "Move or copy" : "Bog nó cóipeáil",
+ "Open folder {displayName}" : "Oscail fillteán {displayName}",
+ "Open in Files" : "Oscail i Comhaid",
+ "Open locally" : "Oscail go háitiúil",
+ "Failed to redirect to client" : "Theip ar atreorú chuig an gcliant",
+ "Open file locally" : "Oscail comhad go háitiúil",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Ba cheart an comhad a oscailt anois ar do ghléas. Mura ndéanann sé, seiceáil le do thoil go bhfuil an aip deisce suiteáilte agat.",
+ "Retry and close" : "Bain triail eile as agus dún",
+ "Open online" : "Oscail ar líne",
+ "Details" : "Sonraí",
+ "View in folder" : "Amharc san fhillteán",
+ "Today" : "Inniu",
+ "Last 7 days" : "7 lá seo caite",
+ "Last 30 days" : "30 lá anuas",
+ "This year ({year})" : "i mbliana ({year})",
+ "Last year ({year})" : "An bhliain seo caite {year}",
+ "Documents" : "Doiciméid",
+ "Spreadsheets" : "Scarbhileoga",
+ "Presentations" : "Cur i láthair",
+ "PDFs" : "PDFs",
+ "Folders" : "Fillteáin",
+ "Audio" : "Fuaime",
+ "Images" : "Íomhánna",
+ "Videos" : "Físeáin",
+ "Created new folder \"{name}\"" : "Cruthaíodh fillteán nua \"{name}\"",
+ "Unable to initialize the templates directory" : "Ní féidir eolaire na dteimpléad a thúsú",
+ "Create templates folder" : "Cruthaigh fillteán teimpléid",
+ "Templates" : "Teimpléid",
+ "New template folder" : "Fillteán teimpléid nua",
+ "In folder" : "I bhfillteán",
+ "Search in all files" : "Cuardaigh i ngach comhad",
+ "Search in folder: {folder}" : "Cuardaigh i bhfillteán: {folder}",
+ "One of the dropped files could not be processed" : "Níorbh fhéidir ceann de na comhaid a thit a phróiseáil",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ní thacaíonn do bhrabhsálaí leis an API System File. Ní dhéanfar eolaire a uaslódáil",
+ "No files to upload" : "Gan comhaid a uaslódáil",
+ "Unable to create the directory {directory}" : "Ní féidir an t-eolaire {directory} a chruthú",
+ "Some files could not be uploaded" : "Níorbh fhéidir roinnt comhad a uaslódáil",
+ "Files uploaded successfully" : "D'éirigh le huaslódáil comhaid",
+ "No files to process" : "Níl aon chomhaid le próiseáil",
+ "Some files could not be copied" : "Níorbh fhéidir roinnt comhad a chóipeáil",
+ "Some files could not be moved" : "Níorbh fhéidir roinnt comhad a bhogadh",
+ "Files copied successfully" : "D'éirigh le cóipeáil na gcomhaid",
+ "Files moved successfully" : "Bogadh na comhaid go rathúil",
+ "Conflicts resolution skipped" : "Léiríodh réiteach coinbhleachta",
+ "Upload cancelled" : "Cuireadh an t-uaslódáil ar ceal",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Níorbh fhéidir \"{oldName}\" a athainmniú, níl sé ann a thuilleadh",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tá an t-ainm \"{newName}\" in úsáid cheana féin san fhillteán \"{dir}\". Roghnaigh ainm eile le do thoil.",
+ "Could not rename \"{oldName}\"" : "Níorbh fhéidir \"{oldName}\" a athainmniú",
+ "This operation is forbidden" : "Tá an oibríocht seo toirmiscthe",
+ "Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach",
+ "Unexpected error: {error}" : "Earráid gan choinne: {error}",
+ "_%n file_::_%n files_" : ["%n comhad","%n comhaid","%n comhaid","%n comhaid","%n comhaid"],
+ "_%n folder_::_%n folders_" : ["%n fillteán","%n fillteáin","%n fillteáin","%n fillteáin","%n fillteáin"],
+ "_%n hidden_::_%n hidden_" : ["%n i bhfolach","%n i bhfolach","%n i bhfolach","%n i bhfolach","%n i bhfolach"],
+ "Filename must not be empty." : "Ní ceadmhach ainm an chomhaid a bheith folamh.",
+ "\"{char}\" is not allowed inside a filename." : "Ní cheadaítear \"{char}\" taobh istigh d'ainm comhaid.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "Is ainm forchoimeádta é \"{segment}\" agus ní cheadaítear é d'ainmneacha comhaid.",
+ "\"{extension}\" is not an allowed filetype." : "Ní cineál comhaid ceadaithe é \"{extension}\".",
+ "Filenames must not end with \"{extension}\"." : "Níor cheart go gcríochnaíonn comhaid chomhad le \"{extension}\".",
+ "List of favorite files and folders." : "Liosta de na comhaid agus na fillteáin is fearr leat.",
+ "No favorites yet" : "Níl aon cheanáin go fóill",
+ "Files and folders you mark as favorite will show up here" : "Taispeánfar comhaid agus fillteáin a mharcálann tú mar is fearr leat anseo",
+ "List of your files and folders." : "Liosta de do chuid comhad agus fillteáin.",
+ "List of your files and folders that are not shared." : "Liosta de do chuid comhad agus fillteáin nach bhfuil roinnte.",
+ "No personal files found" : "Níor aimsíodh aon chomhaid phearsanta",
+ "Files that are not shared will show up here." : "Taispeánfar comhaid nach bhfuil roinnte anseo.",
+ "Recent" : "le déanaí",
+ "List of recently modified files and folders." : "Liosta de chomhaid agus de fhillteáin a athraíodh le déanaí.",
+ "No recently modified files" : "Níl aon chomhaid athraithe le déanaí",
+ "Files and folders you recently modified will show up here." : "Taispeánfar comhaid agus fillteáin a d'athraigh tú le déanaí anseo.",
+ "Search" : "Cuardach",
+ "Search results within your files." : "Torthaí cuardaigh laistigh de do chuid comhad.",
+ "No entries found in this folder" : "Níor aimsíodh aon iontrálacha san fhillteán seo",
+ "Select all" : "Roghnú go léir",
+ "Upload too large" : "Íoslódáil ró-mhór",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Sáraíonn na comhaid atá tú ag iarraidh a uaslódáil an t-uasmhéid le haghaidh uaslódáil comhad ar an bhfreastalaí seo.",
+ "File could not be found" : "Níorbh fhéidir an comhad a aimsiú",
+ "Show list view" : "Taispeáin amharc liosta",
+ "Show grid view" : "Taispeáin radharc greille",
+ "Close" : "Dún",
+ "Could not create folder \"{dir}\"" : "Níorbh fhéidir fillteán \"{dir}\" a chruthú",
+ "This will stop your current uploads." : "Cuirfidh sé seo stop le d'uaslódálacha reatha.",
+ "Upload cancelled." : "Cuireadh an t-uaslódáil ar ceal.",
+ "Processing files …" : "Comhaid á bpróiseáil…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ní féidir {filename} a uaslódáil mar gur eolaire é nó go bhfuil 0 beart ann",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Níl go leor spáis saor in aisce, tá {size1} á uaslódáil agat ach níl ach {size2} fágtha",
+ "Target folder \"{dir}\" does not exist any more" : "Níl an spriocfhillteán \"{dir}\" ann a thuilleadh",
+ "An unknown error has occurred" : "Tharla earráid anaithnid",
+ "File could not be uploaded" : "Níorbh fhéidir an comhad a uaslódáil",
+ "Uploading …" : "Á uaslódáil…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Á uaslódáil … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ní thacaítear le huaslódáil an mhír sin",
+ "Error when assembling chunks, status code {status}" : "Earráid agus smután á chur le chéile, cód stádais {status}",
+ "Choose target folder" : "Roghnaigh fillteán sprice",
+ "Set reminder" : "Socraigh meabhrúchán",
+ "Edit locally" : "Cuir in eagar go háitiúil",
+ "Open" : "Oscail",
+ "Could not load info for file \"{file}\"" : "Níorbh fhéidir faisnéis don chomhad \"{file}\" a lódáil",
+ "Please select tag(s) to add to the selection" : "Roghnaigh clib(í) le cur leis an rogha le do thoil",
+ "Apply tag(s) to selection" : "Cuir clib(í) i bhfeidhm ar an roghnúchán",
+ "Select directory \"{dirName}\"" : "Roghnaigh eolaire \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Roghnaigh comhad \"{fileName}\"",
+ "Unable to determine date" : "Ní féidir an dáta a chinneadh",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Níl an t-eolaire seo ar fáil, seiceáil na logaí nó déan teagmháil leis an riarthóir le do thoil",
+ "Could not move \"{file}\", target exists" : "Níorbh fhéidir \"{file}\" a bhogadh, tá an sprioc ann",
+ "Could not move \"{file}\"" : "Níorbh fhéidir \"{file}\" a bhogadh",
+ "copy" : "cóip",
+ "Could not copy \"{file}\", target exists" : "Níorbh fhéidir \"{file}\" a chóipeáil, tá an sprioc ann",
+ "Could not copy \"{file}\"" : "Níorbh fhéidir \"{file}\" a chóipeáil",
+ "Copied {origin} inside {destination}" : "Cóipeáladh {origin} taobh istigh de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Cóipeáladh {origin} agus {nbfiles} comhaid eile laistigh de {destination}",
+ "{newName} already exists" : "Tá {newName} ann cheana",
+ "Could not create file \"{file}\"" : "Níorbh fhéidir comhad \"{file}\" a chruthú",
+ "Could not create file \"{file}\" because it already exists" : "Níorbh fhéidir an comhad \"{file}\" a chruthú toisc go bhfuil sé ann cheana",
+ "Could not create folder \"{dir}\" because it already exists" : "Níorbh fhéidir fillteán \"{dir}\" a chruthú toisc go bhfuil sé ann cheana",
+ "Could not fetch file details \"{file}\"" : "Níorbh fhéidir sonraí an chomhaid \"{file}\" a fháil",
+ "Error deleting file \"{fileName}\"." : "Earráid agus comhad \"{fileName}\" á scriosadh.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Níl aon toradh cuardaigh i bhfillteáin eile le haghaidh {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Cuir isteach níos mó ná dhá charachtar chun cuardach a dhéanamh i bhfillteáin eile",
+ "{dirs} and {files}" : "{dirs} agus {files}",
+ "_including %n hidden_::_including %n hidden_" : ["lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach","lena n-áirítear %n i bhfolach"],
+ "You do not have permission to upload or create files here" : "Níl cead agat comhaid a uaslódáil nó a chruthú anseo",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n comhad á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil","%n comhaid á uaslódáil"],
+ "New" : "Nua",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Roghnaigh raon comhaid",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} in úsáid",
+ "\"{name}\" is an invalid file name." : "Is ainm comhaid neamhbhailí é \"{name}\".",
+ "File name cannot be empty." : "Ní féidir leis an ainm comhaid a bheith folamh.",
+ "\"/\" is not allowed inside a file name." : "Ní cheadaítear \"/\" taobh istigh d'ainm comhaid.",
+ "\"{name}\" is not an allowed filetype" : "Ní cineál comhaid ceadaithe é \"{name}\".",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Tá stóráil {owner} lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Tá fillteán grúpa \"{mountPoint}\" lán, ní féidir comhaid a nuashonrú nó a shioncronú a thuilleadh!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Tá an stóras seachtrach \"{mountPoint}\" lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Tá do stóras lán, ní féidir comhaid a nuashonrú ná a shioncronú a thuilleadh!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Tá stóráil {owner} beagnach lán ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Tá fillteán grúpa \"{mountPoint}\" beagnach lán ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Tá an stóras seachtrach \"{mountPoint}\" beagnach lán ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tá do stóras beagnach lán ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["meaitseálann \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\"","mheaitseáil \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Cóipeáladh nasc díreach (oibreacha do dhaoine a bhfuil rochtain acu ar an gcomhad/fillteán seo amháin)",
+ "Path" : "Cosán",
+ "_%n byte_::_%n bytes_" : ["%n beart ","%n bearta ","%n bearta","%n bearta","%n bearta"],
+ "Favored" : "B'fhearr leis",
+ "Favor" : "Fabhar",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Cóipeáil nasc díreach (ní oibríonn ach do dhaoine a bhfuil rochtain acu ar an gcomhad/fillteán seo)",
+ "Upload file" : "Uaslódáil comhad",
+ "Not favored" : "Ní bail ar fónamh orthu",
+ "An error occurred while trying to update the tags" : "Tharla earráid agus iarracht á déanamh na clibeanna a nuashonrú",
+ "Upload (max. %s)" : "Uaslódáil (%s ar a mhéad)",
+ "\"{displayName}\" action executed successfully" : "Cuireadh an gníomh \"{displayName}\" i gcrích go rathúil",
+ "\"{displayName}\" action failed" : "Theip ar an ngníomh \"{displayName}\".",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" theip ar roinnt gnéithe",
+ "\"{displayName}\" batch action executed successfully" : "D'éirigh le beart baisce \"{displayName}\" a rith",
+ "Submitting fields…" : "Réimsí á gcur isteach…",
+ "Filter filenames…" : "Scag ainmneacha comhaid…",
+ "WebDAV URL copied to clipboard" : "URL WebDAV cóipeáilte chuig an ngearrthaisce",
+ "Enable the grid view" : "Cumasaigh an radharc greille",
+ "Enable folder tree" : "Cumasaigh crann fillteáin",
+ "Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
+ "Use this address to access your Files via WebDAV" : "Úsáid an seoladh seo chun do Chomhaid a rochtain trí WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Má tá 2FA cumasaithe agat, ní mór duit pasfhocal aip nua a chruthú agus a úsáid trí chliceáil anseo.",
+ "Deletion cancelled" : "Scriosadh cealaithe",
+ "Move cancelled" : "Bogadh ar ceal",
+ "Cancelled move or copy of \"{filename}\"." : "Cealaíodh bogadh nó cóip de \"{filename}\".",
+ "Cancelled move or copy operation" : "Oibríocht aistrithe nó cóipeála curtha ar ceal",
+ "Open details" : "Sonraí oscailte",
+ "Photos and images" : "Grianghraif agus íomhánna",
+ "New folder creation cancelled" : "Cruthú fillteán nua curtha ar ceal",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} fillteán","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin","{folderCount} fillteáin"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} comhad","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid","{fileCount} comhaid"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 chomhad agus {folderCount} fillteán","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin","1 chomhad agus {folderCount} fillteáin"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} comhad agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán","{fileCount} comhaid agus 1 fillteán"],
+ "{fileCount} files and {folderCount} folders" : "comhaid {fileCount} agus fillteáin {folderCount}",
+ "All folders" : "Gach fillteáin",
+ "Personal Files" : "Comhaid Phearsanta",
+ "Text file" : "Comhad téacs",
+ "New text file.txt" : "Comhad téacs nua.txt",
+ "%1$s (renamed)" : "%1$s (athainmnithe)",
+ "renamed file" : "comhad athainmnithe",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Tar éis na hainmneacha comhad atá comhoiriúnach le Windows a chumasú, ní féidir comhaid atá ann cheana a mhodhnú a thuilleadh ach is féidir lena n-úinéir iad a athainmniú go hainmneacha nua bailí.",
+ "Filter file names …" : "Scag ainmneacha na gcomhad…",
+ "Prevent warning dialogs from open or reenable them." : "Cosc a chur ar dialóga rabhaidh ó iad a oscailt nó iad a athchumasú.",
+ "Show a warning dialog when changing a file extension." : "Taispeáin dialóg rabhaidh nuair a athraítear síneadh comhad.",
+ "Speed up your Files experience with these quick shortcuts." : "Déan do thaithí Comhaid a bhrostú leis na haicearraí tapa seo.",
+ "Open the actions menu for a file" : "Oscail an roghchlár gníomhartha le haghaidh comhad",
+ "Rename a file" : "Athainmnigh comhad",
+ "Delete a file" : "Scrios comhad",
+ "Favorite or remove a file from favorites" : "Is ansa leat nó bain comhad ó cheanáin",
+ "Manage tags for a file" : "Bainistigh clibeanna le haghaidh comhaid",
+ "Deselect all files" : "Díroghnaigh gach comhad",
+ "Select or deselect a file" : "Roghnaigh nó díroghnaigh comhad",
+ "Select a range of files" : "Roghnaigh raon comhad",
+ "Navigate to the parent folder" : "Déan nascleanúint go dtí an fillteán tuismitheora",
+ "Navigate to the file above" : "Déan nascleanúint go dtí an comhad thuas",
+ "Navigate to the file below" : "Déan nascleanúint go dtí an comhad thíos",
+ "Navigate to the file on the left (in grid mode)" : "Déan nascleanúint go dtí an comhad ar chlé (i mód greille)",
+ "Navigate to the file on the right (in grid mode)" : "Déan nascleanúint go dtí an comhad ar dheis (i mód greille)",
+ "Toggle the grid view" : "Scoránaigh an radharc greille",
+ "Open the sidebar for a file" : "Oscail an barra taoibh le haghaidh comhad"
+},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
+} \ No newline at end of file
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 47489006d37..c282ebfbaed 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -1,16 +1,337 @@
OC.L10N.register(
"files",
{
+ "Added to favorites" : "Engadido a favoritos",
+ "Removed from favorites" : "Retirado de favoritos",
+ "You added {file} to your favorites" : "Engadiu {file} aos seus favoritos",
+ "You removed {file} from your favorites" : "Retirou {file} dos seus favoritos",
+ "Favorites" : "Favoritos",
+ "File changes" : "Cambios do ficheiro",
+ "Created by {user}" : "Creado por {user}",
+ "Changed by {user}" : "Cambiado por {user}",
+ "Deleted by {user}" : "Eliminado por {user}",
+ "Restored by {user}" : "Restaurado por {user}",
+ "Renamed by {user}" : "Renomeado por {user}",
+ "Moved by {user}" : "Movido por {user}",
+ "\"remote account\"" : "«conta remota»",
+ "You created {file}" : "{file} foi creado por Vde.",
+ "You created an encrypted file in {file}" : "Vde. creo un ficheiro cifrado en {file}",
+ "{user} created {file}" : "{user} creou {file}",
+ "{user} created an encrypted file in {file}" : "{user} creou un ficheiro cifrado en {file}",
+ "{file} was created in a public folder" : "{file} foi creado nun cartafol público",
+ "You changed {file}" : "{file} foi cambiado por Vde.",
+ "You changed an encrypted file in {file}" : "Vde. cambiou un ficheiro cifrado en {file}",
+ "{user} changed {file}" : "{file} foi cambiado por {user}",
+ "{user} changed an encrypted file in {file}" : "{user} cambiou un ficheiro cifrado en {file}",
+ "You deleted {file}" : "{file} foi eliminado por Vde.",
+ "You deleted an encrypted file in {file}" : "Vde. eliminou un ficheiro cifrado en {file}",
+ "{user} deleted {file}" : "{file} foi eliminado por {user}",
+ "{user} deleted an encrypted file in {file}" : "{user} eliminou un ficheiro cifrado en {file}",
+ "You restored {file}" : "{file} foi restaurado por Vde.",
+ "{user} restored {file}" : "{file} foi restaurado por {user}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Vde. renomeou {oldfile} (agochado) como {newfile} (agochado)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Vde. renomeou {oldfile} (agochado) como {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Vde. renomeou {oldfile} como {newfile} (agochado)",
+ "You renamed {oldfile} to {newfile}" : "Vde. renomeou {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (agochado) como {newfile} (agochado)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (agochado) como {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomeou {oldfile} como {newfile} (agochado)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} como {newfile}",
+ "You moved {oldfile} to {newfile}" : "Vde. moveu {oldfile} para {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Engadiuse ou retirouse un ficheiro dos seus <strong>favoritos</strong>",
+ "Files" : "Ficheiros",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol favorito",
+ "Failed to authorize" : "Produciuse un fallo ao autorizar",
+ "Invalid folder path" : "A ruta ao cartafol non é correcta.",
+ "Folder not found" : "Non se atopou o cartafolNon se atopou o cartafol",
+ "The file cannot be found" : "Non é posíbel atopar o ficheiro",
+ "The destination path does not exist: %1$s" : "Non existe a ruta de destino: %1$s",
+ "You do not have permission to create a file at the specified location" : "Vde. non ten permiso para crear un ficheiro na localización especificada",
+ "The file could not be converted." : "Non foi posíbel converter o ficheiro.",
+ "Could not get relative path to converted file" : "Non foi posíbel obter a ruta relativa ao ficheiro convertido",
+ "Favorite files" : "Ficheiros favoritos",
+ "No favorites" : "Non hai favoritos",
+ "More favorites" : "Máis favoritos",
+ "Accept" : "Aceptar",
+ "Reject" : "Rexeitar",
+ "Incoming ownership transfer from {user}" : "Transferencia da propiedade entrante de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quere aceptar {path}?\n\nNota: Ao proceso de transferencia após aceptar pode levarlle ata 1 hora.",
+ "Ownership transfer denied" : "Denegouse a transferencia de propiedade",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} denegou a súa transferencia de propiedade de {path}.",
+ "Ownership transfer failed" : "Produciuse un fallo na transferencia da propiedade",
+ "Your ownership transfer of {path} to {user} failed." : "Produciuse un fallo na súa transferencia da propiedade de {path} cara a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Produciuse un fallo na transferencia da propiedade de {path} cara a {user}.",
+ "Ownership transfer done" : "Feita a transferencia da propiedade",
+ "Your ownership transfer of {path} to {user} has completed." : "Completouse a súa transferencia da propiedade de {path} cara a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Completouse a transferencia da propiedade de {path} cara a {user}.",
+ "in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Transferido desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidade de ficheiros",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restrinxir os nomes de ficheiros para garantir que os ficheiros se poidan sincronizar con todos os clientes. De xeito predeterminado, permítense todos os nomes de ficheiro válidos en POSIX (p. ex., Linux ou macOS).",
+ "Enforce Windows compatibility" : "Forzar a compatibilidade con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Isto bloqueará os nomes de ficheiros non válidos en sistemas Windows, coma o uso de nomes reservados ou caracteres especiais. Porén, isto non forzará á compatibilidade da distinción entre maiúsculas e minúsculas.",
+ "File Management" : "Xestión de ficheiros",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "O cartafol de destino xa non existe",
+ "Reload current directory" : "Recargar o directorio actual",
+ "Go to the \"{dir}\" directory" : "Vaia ao directorio «{dir}».",
+ "Current directory path" : "Ruta do directorio actual",
+ "Your have used your space quota and cannot upload files anymore" : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
+ "You do not have permission to upload or create files here." : "Non ten permiso para enviar ou crear ficheiros aquí.",
+ "Drag and drop files here to upload" : "Arrastre e solte os ficheiros aquí para envialos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Conmutar a selección para o ficheiro «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Conmutar a selección para o cartafol «{displayName}»",
+ "File is loading" : "Estase a cargar o ficheiro",
+ "Folder is loading" : "Estase a cargar o cartafol",
+ "Filename" : "Nome de ficheiro",
+ "Folder name" : "Nome do cartafol",
+ "This node is unavailable" : "Este nodo non está dispoñíbel",
+ "Another entry with the same name already exists." : "Xa existe outra entrada co mesmo nome.",
+ "Invalid filename." : "Nome de ficheiro incorrecto.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Cambiouse o nome de «{oldName}» a «{newName}»",
+ "Rename file" : "Cambiar o nome do ficheiro",
+ "Folder" : "Cartafol",
+ "Pending" : "Pendentes",
+ "Unknown date" : "Data descoñecida",
+ "Clear filter" : "Limpar o filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar por todas partes",
+ "Type" : "Escribir",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Retirar o filtro",
+ "Total rows summary" : "Resumo total de filas",
+ "Toggle selection for all files and folders" : "Conmutar a selección para todos os ficheiros e cartafoles",
+ "Name" : "Nome",
+ "Size" : "Tamaño",
+ "Actions" : "Accións",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de ficheiros e cartafoles",
+ "You have used your space quota and cannot upload files anymore." : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
+ "Column headers with buttons are sortable." : "As cabeceiras das columnas con botóns pódense ordenar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres se despraza pola lista.",
+ "File not found" : "Non se atopou o ficheiro",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "Usados {used} de {quota}",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Non foi posíbel actualizar as estatísticas de almacenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
+ "Storage information" : "Información de almacenamento",
+ "Storage quota" : "Cota de almacenamento",
+ "New folder" : "Novo cartafol",
+ "Create new folder" : "Crear un cartafol novo",
+ "This name is already in use." : "Este nome xa está a ser usado",
+ "Create" : "Crear",
+ "Fill template fields" : "Encher os campos do modelo",
+ "Submitting fields …" : "Enviando os campos...",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Escolla un ficheiro ou cartafol para transferir",
+ "Transfer" : "Transferencia",
+ "Transfer {path} to {userid}" : "Transferir {path} cara a {userid}",
+ "Invalid path selected" : "Seleccionou unha ruta incorrecta.",
+ "Unknown error" : "Produciuse un erro descoñecido",
+ "Ownership transfer request sent" : "Enviouse solicitude de transferencia da propiedade",
+ "Cannot transfer ownership of a file or folder you do not own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol do que non es o propietario",
+ "Transfer ownership of a file or folder" : "Transferencia da propiedade dun ficheiro ou cartafol",
+ "Choose file or folder to transfer" : "Escolla o ficheiro ou cartafol para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Novo propietario",
+ "Keep {old}" : "Conservar {old}",
+ "Keep without extension" : "Conservar sen extensión",
+ "Use {new}" : "Empregar {new}",
+ "Remove extension" : "Retirar a extensión",
+ "Change file extension" : "Cambiar a extensión do ficheiro",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar a extensión de ficheiro de «{old}» a «{new}» pode facer que o ficheiro sexa ilexíbel.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Retirar a extensión de ficheiro «{old}» pode facer que o ficheiro sexa ilexíbel.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Engadir a extensión de ficheiro «{new}» pode facer que o ficheiro sexa ilexíbel.",
+ "Do not show this dialog again." : "Non volver amosar este diálogo",
+ "Select file or folder to link to" : "Seleccione o ficheiro ou cartafol ao que ligar",
+ "Choose {file}" : "Escoller {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por ligazón",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar á vista de lista",
+ "Switch to grid view" : "Cambiar á vista de grade",
+ "The file could not be found" : "Non foi posíbel atopar o ficheiro",
+ "Upload was cancelled by user" : "O envío foi cancelado polo usuario",
+ "Not enough free space" : "Non hai espazo libre abondo",
+ "Operation is blocked by access control" : "A operación está a se bloqueda polo control de acceso",
+ "Error during upload: {message}" : "Produciuse un erro durante o envío: {message}",
+ "Error during upload, status code {status}" : "Produciuse un erro durante o envío, código de estado {status}",
+ "Unknown error during upload" : "Produciuse un erro descoñecido durante o envío",
+ "Loading current folder" : "Cargando o cartafol actual",
+ "Retry" : "Volver tentar",
+ "No files in here" : "Aquí non hai ficheiros",
+ "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
+ "Go back" : "Volver",
+ "Views" : "Vistas",
+ "Files settings" : "Axustes de Ficheiros",
+ "Your files" : "Os seus ficheiros",
+ "Open in files" : "Abrir en ficheiros",
+ "File cannot be accessed" : "Non é posíbel acceder ao ficheiro",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Non foi posíbel atopar o ficheiro ou non ten permiso para velo. Pídalle ao remitente que o comparta.",
+ "Clipboard is not available" : "O portapapeis non está dispoñíbel",
+ "General" : "Xeral",
+ "All files" : "Todos os ficheiros",
+ "Personal files" : "Ficheiros persoais",
+ "Sort favorites first" : "Ordene antes os favoritos",
+ "Sort folders before files" : "Ordenar os cartafoles diante dos ficheiros",
+ "Appearance" : "Aparencia",
+ "Show hidden files" : "Amosar os ficheiros agochados",
+ "Crop image previews" : "Recortar a vista previa das imaxes",
+ "Additional settings" : "Axustes adicionais",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "Warnings" : "Advertencias",
+ "Keyboard shortcuts" : "Atallos de teclado",
+ "File actions" : "Accións de ficheiro",
+ "Rename" : "Cambiar o nome",
+ "Delete" : "Eliminar",
+ "Manage tags" : "Xestionar as etiquetas",
+ "Selection" : "Selección",
+ "Select all files" : "Seleccionar todos os ficheiros",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar a vista como grade",
+ "Show those shortcuts" : "Amosar eses atallos",
+ "You" : "Vde.",
+ "Shared multiple times with different people" : "Compartido varias veces con diferentes persoas",
+ "Unable to change the favorite state of the file" : "Non é posíbel cambiar o estado de favorito do ficheiro",
+ "Error while loading the file data" : "Produciuse un erro ao cargar os datos do ficheiro",
+ "Owner" : "Propietario",
+ "Remove from favorites" : "Retirar de favoritos",
+ "Add to favorites" : "Engadir a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Baleiro",
+ "Unable to create new file from template" : "Non é posíbel crear un novo ficheiro a partir do modelo",
+ "Pick a template for {name}" : "Escolla un modelo para {name}",
+ "Create a new file with the selected template" : "Crear un novo ficheiro co modelo seleccionado",
+ "Creating file" : "Creando o ficheiro",
+ "Save as {displayName}" : "Gardar como {displayName}",
+ "Save as …" : "Gardar como…",
+ "Converting files …" : "Convertendo ficheiros…",
+ "Failed to convert files: {message}" : "Produciuse un fallo ao converter os ficheiros: {message}",
+ "All files failed to be converted" : "Non foi posíbel converter ningún ficheiro",
+ "One file could not be converted: {message}" : "Non foi posíbel converter un ficheiro: {message}",
+ "Files successfully converted" : "Os ficheiros foron convertidos correctamente",
+ "Failed to convert files" : "Produciuse un fallo ao converter os ficheiros",
+ "Converting file …" : "Convertendo o ficheiro…",
+ "File successfully converted" : "O ficheiro foi convertido correctamente",
+ "Failed to convert file: {message}" : "Produciuse un fallo ao converter o ficheiro: {message}",
+ "Failed to convert file" : "Produciuse un fallo ao converter o ficheiro",
+ "Leave this share" : "Deixar esta compartición",
+ "Leave these shares" : "Deixar estas comparticións",
+ "Disconnect storage" : "Desconectar o almacenamento",
+ "Disconnect storages" : "Desconectar os almacenamentos",
+ "Delete permanently" : "Eliminar definitivamente",
+ "Delete and unshare" : "Eliminar e deixar de compartir",
+ "Delete file" : "Eliminar ficheiro",
+ "Delete files" : "Eliminar ficheiros",
+ "Delete folder" : "Eliminar o cartafol",
+ "Delete folders" : "Eliminar cartafoles",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a piques de eliminar definitivamente {count} elemento","Está a piques de eliminar definitivamente {count} elementos"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a piques de eliminar {count} elemento","Está a piques de eliminar {count} elementos"],
+ "Confirm deletion" : "Confirmar a eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…",
+ "Destination is not a folder" : "O destino non é un cartafol",
+ "This file/folder is already in that directory" : "Este ficheiro/cartafol xa está nese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Neste cartafol xa existe un ficheiro ou cartafol con ese nome",
+ "The files are locked" : "Os ficheiros están bloqueados",
+ "The file does not exist anymore" : "O ficheiro xa non existe",
+ "Choose destination" : "Escoller o destino",
+ "Copy to {target}" : "Copiar en {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "Produciuse un erro na operación de copia ou de movemento",
+ "Move or copy" : "Mover ou copiar",
+ "Open folder {displayName}" : "Abrir o cartafol {displayName}",
+ "Open in Files" : "Abrir en Ficheiros",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente",
+ "Open file locally" : "Abrir o ficheiro localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "O ficheiro debería abrirse agora no seu dispositivo. Se non é así, comprobe se ten instalada a aplicación de escritorio.",
+ "Retry and close" : "Tentar de novo e pechar",
+ "Open online" : "Abrir en liña",
+ "Details" : "Detalles",
+ "View in folder" : "Ver no cartafol",
+ "Today" : "Hoxe",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este ano ({year})",
+ "Last year ({year})" : "O ano pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Follas de cálculo",
+ "Presentations" : "Presentacións",
+ "PDFs" : "PDF",
+ "Folders" : "Cartafoles",
+ "Audio" : "Son",
+ "Images" : "Imaxes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Creouse un novo cartafol «{name}»",
+ "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos",
+ "Create templates folder" : "Crear o cartafol de modelos",
+ "Templates" : "Modelos",
+ "New template folder" : "Novo cartafol de modelos",
+ "In folder" : "No cartafol",
+ "Search in folder: {folder}" : "Buscar no cartafol: {folder}",
+ "One of the dropped files could not be processed" : "Non foi posíbel procesar un dos ficheiros arrastrados",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "O seu navegador non é compatíbel coa API do sistema de ficheiros. Os directorios non van ser enviados",
+ "No files to upload" : "Non hai ficheiros que enviar",
+ "Unable to create the directory {directory}" : "Non foi posíbel crear o directorio {directory}",
+ "Some files could not be uploaded" : "Non foi posíbel enviar algúns ficheiros",
+ "Files uploaded successfully" : "Ficheiros enviados satisfactoriamente",
+ "No files to process" : "Non hai ficheiros para procesar",
+ "Some files could not be copied" : "Non foi posíbel copiar algúns ficheiros",
+ "Some files could not be moved" : "Non foi posíbel mover algúns ficheiros",
+ "Files copied successfully" : "Ficheiros copiados correctamente",
+ "Files moved successfully" : "Ficheiros movidos correctamente",
+ "Conflicts resolution skipped" : "Omitiuse a resolución dos conflitos",
+ "Upload cancelled" : "Envío cancelado",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Non foi posíbel cambiarlle o nome a «{oldName}», xa non existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome «{newName}» xa se utiliza no cartafol «{dir}». Escolla un nome diferente.",
+ "Could not rename \"{oldName}\"" : "Non foi posíbel cambiarlle o nome a «{oldName}»",
+ "This operation is forbidden" : "Esta operación está prohibida",
"Storage is temporarily not available" : "O almacenamento non está dispoñíbel temporalmente",
- "Storage invalid" : "Almacenamento incorrecto",
- "Unknown error" : "Erro descoñecido",
+ "Unexpected error: {error}" : "Produciuse un erro non agardado: {error}",
+ "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
+ "_%n folder_::_%n folders_" : ["%n cartafol","%n cartafoles"],
+ "Filename must not be empty." : "O nome de ficheiro non debe estar baleiro",
+ "\"{char}\" is not allowed inside a filename." : "«{char}» non está permitido nun nome de ficheiro.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "«{segment}» é un nome reservado e non está permitido para os nomes de ficheiro.",
+ "\"{extension}\" is not an allowed filetype." : "«{extension}» non é un tipo de ficheiro permitido.",
+ "Filenames must not end with \"{extension}\"." : "Os nomes de ficheiros non deben rematar con «{extension}».",
+ "List of favorite files and folders." : "Lista de ficheiros e cartafoles favoritos.",
+ "No favorites yet" : "Aínda non hai favoritos",
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
+ "List of your files and folders." : "Lista dos seus ficheiros e cartafoles",
+ "List of your files and folders that are not shared." : "Lista dos seus ficheiros e cartafoles que non están a seren compartidos.",
+ "No personal files found" : "Non se atopou ningún ficheiro persoal",
+ "Files that are not shared will show up here." : "Os ficheiros que non se comparten amosaranse aquí.",
+ "Recent" : "Recente",
+ "List of recently modified files and folders." : "Lista de ficheiros e cartafoles modificados recentemente.",
+ "No recently modified files" : "Non hai ficheiros modificados recentemente",
+ "Files and folders you recently modified will show up here." : "Os ficheiros e cartafoles que modificou recentemente amosaranse aquí.",
+ "Search" : "Buscar",
+ "No entries found in this folder" : "Non se atopou ningunha entrada neste cartafol",
+ "Select all" : "Seleccionar todo",
+ "Upload too large" : "Envío grande de máis",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"File could not be found" : "Non foi posíbel atopar o ficheiro",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Descargar",
- "Delete" : "Eliminar",
- "Home" : "Inicio",
+ "Show list view" : "Amosar a vista de lista",
+ "Show grid view" : "Amosar a vista de grade",
"Close" : "Pechar",
- "Favorites" : "Favoritos",
"Could not create folder \"{dir}\"" : "Non foi posíbel crear o cartafol «{dir}»",
"This will stop your current uploads." : "Isto deterá os envíos actuais.",
"Upload cancelled." : "Envío cancelado.",
@@ -19,33 +340,25 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}",
"Target folder \"{dir}\" does not exist any more" : "O cartafol de destino «{dir}» xa non existe",
- "Not enough free space" : "Non hai espazo libre abondo",
"An unknown error has occurred" : "Produciuse un erro descoñecido",
+ "File could not be uploaded" : "Non foi posíbel enviar o ficheiro",
"Uploading …" : "Enviando…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Enviando… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Non se admite o envío deste elemento",
- "Target folder does not exist any more" : "O cartafol de destino xa non existe",
- "Operation is blocked by access control" : "A operación está a se bloqueda polo control de acceso",
"Error when assembling chunks, status code {status}" : "Produciuse un erro ao ensamblar os bloques, código de estado {status}",
- "Actions" : "Accións",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
"Choose target folder" : "Escoller o cartafol de destino",
+ "Set reminder" : "Definir un lembrete",
+ "Edit locally" : "Editar localmente",
"Open" : "Abrir",
- "Delete file" : "Eliminar ficheiro",
- "Delete folder" : "Eliminar cartafol",
- "Disconnect storage" : "Desconectar o almacenamento",
- "Leave this share" : "Deixar esta compartición",
"Could not load info for file \"{file}\"" : "Non foi posíbel cargar información para o ficheiro «{file}»",
- "Files" : "Ficheiros",
- "Details" : "Detalles",
- "Please select tag(s) to add to the selection" : "Elixe a etiqueta(s) para engadir á selección",
+ "Please select tag(s) to add to the selection" : "Escolla a etiqueta(s) para engadir á selección",
"Apply tag(s) to selection" : "Aplicar etiqueta(s) á selección",
- "Select" : "Seleccionar",
- "Pending" : "Pendentes",
+ "Select directory \"{dirName}\"" : "Seleccione o directorio «{dirName}»",
+ "Select file \"{fileName}\"" : "Seleccione o ficheiro «{fileName}»",
"Unable to determine date" : "Non é posíbel determinar a data",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, consulte os ficheiros de rexistro ou póñase en contacto coa administración desta instancia.",
"Could not move \"{file}\", target exists" : "Non foi posíbel mover «{file}», o destino xa existe",
"Could not move \"{file}\"" : "Non foi posíbel mover «{file}»",
"copy" : "copiar",
@@ -54,165 +367,91 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "Copiado {origin} en {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copiado {origin} e outros {nbfiles} ficheiros en {destination} ",
"{newName} already exists" : "Xa existe {newName}",
- "Could not rename \"{fileName}\", it does not exist any more" : "Non foi posíbel renomear «{fileName}», xa non existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome «{targetName}» xa se utiliza no cartafol «{dir}». Escolla outro nome.",
- "Could not rename \"{fileName}\"" : "Non foi posíbel renomear «{fileName}»",
"Could not create file \"{file}\"" : "Non foi posíbel crear o ficheiro «{file}»",
"Could not create file \"{file}\" because it already exists" : "Non foi posíbel crear o ficheiro «{file}» por mor de que xa existe",
"Could not create folder \"{dir}\" because it already exists" : "Non foi posíbel crear o cartafol «{dir}» por mor de que xa existe",
- "Could not fetch file details \"{file}\"" : "Non foi posíbel obter os detalles do ficheiro «{file}»",
+ "Could not fetch file details \"{file}\"" : "Non foi posíbel recuperar os detalles do ficheiro «{file}»",
"Error deleting file \"{fileName}\"." : "Produciuse un erro ao eliminar o ficheiro «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "Non foi posíbel atopar resultados de busca noutros cartafoles para {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduza máis de dous caracteres para buscar noutros cartafoles",
- "Name" : "Nome",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n cartafol","%n cartafoles"],
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
"{dirs} and {files}" : "{dirs} e {files}",
"_including %n hidden_::_including %n hidden_" : ["incluíndo %n agachado","incluíndo %n agochados"],
- "You don’t have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí.",
+ "You do not have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí",
"_Uploading %n file_::_Uploading %n files_" : ["Enviando %n ficheiro","Enviando %n ficheiros"],
"New" : "Novo",
+ "New file/folder menu" : "Novo menú ficheiro/cartafol",
"Select file range" : "Seleccionar o intervalo de ficheiros ",
- "{used} of {quota} used" : "Usados {used} de {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "{used} usados",
"\"{name}\" is an invalid file name." : "«{name}» é un nome incorrecto de ficheiro.",
"File name cannot be empty." : "O nome de ficheiro non pode estar baleiro",
"\"/\" is not allowed inside a file name." : "«/» non está permitido nun nome de ficheiro",
"\"{name}\" is not an allowed filetype" : "«{name}» non é un tipo de ficheiro permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "A almacenaxe de {owner} está chea, non se poden actualizar nin sincronizar os ficheiros!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O cartafol \"{mountPoint}\" do grupo está completo, non se poderán subir nin sincronizar ficheiros!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A almacenaxe externa \"{mountPoint}\" está chea, non se pode actualizar ou sincronizar ficheiros!",
- "Your storage is full, files cannot be updated or synced anymore!" : "A almacenaxe está completa, non se pode sincronizar ou actualizar ficheiros!",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O espazo de almacenamento de {owner} está cheo, xa é posíbel actualizar nin sincronizar os ficheiros!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O cartafol «{mountPoint}» do grupo está completo, non se poderán actualizar nin sincronizar ficheiros!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O almacenamento externo «{mountPoint}» está cheo, xa non é posíbel actualizar nin sincronizar os ficheiros.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non é posíbel actualizar nin sincronizar os ficheiros!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "O espazo de almacenamento de {owner} está case cheo ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O cartafol de grupo «{mountPoint}» está case cheo ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O almacenamento externo «{mountPoint}» está case cheo ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O almacenamento externo «{mountPoint}» está case cheo ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)." : "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%).",
- "View in folder" : "Ver no cartafol",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar a ligazón directa (só funciona para usuarios con acceso a este ficheiro/cartafol)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide con «{filter}»","coinciden con «{filter}»"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Foi copiada a ligazón directa (só funciona para as persoas que teñen acceso a este ficheiro/cartafol)",
"Path" : "Ruta",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Só pode marcar como favorito un único ficheiro ou cartafol por vez",
- "New folder" : "Novo cartafol",
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar a ligazón directa (só funciona para persoas con acceso a este ficheiro/cartafol)",
"Upload file" : "Enviar ficheiro",
- "Recent" : "Recente",
- "Not favorited" : "Non marcado como favorito",
- "Remove from favorites" : "Retirar de favoritos",
- "Add to favorites" : "Engadir a favoritos",
+ "Not favored" : "Non favorecido",
"An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas",
- "Added to favorites" : "Engadido a favoritos",
- "Removed from favorites" : "Retirado de favoritos",
- "You added {file} to your favorites" : "Engadiu {file} aos seus favoritos",
- "You removed {file} from your favorites" : "Retirou {file} dos seus favoritos",
- "File changes" : "Cambios do ficheiro",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Eliminado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renomeado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "«usuario remoto»",
- "You created {file}" : "{file} foi creado por vostede",
- "You created an encrypted file in {file}" : "Vostede creo un ficheiro cifrado en {file}",
- "{user} created {file}" : "{user} creou {file}",
- "{user} created an encrypted file in {file}" : "{user} creou un ficheiro cifrado en {file}",
- "{file} was created in a public folder" : "{file} foi creado nun cartafol público",
- "You changed {file}" : "{file} foi cambiado por vostede",
- "You changed an encrypted file in {file}" : "Vostede cambiou un ficheiro cifrado en {file}",
- "{user} changed {file}" : "{file} foi cambiado por {user}",
- "{user} changed an encrypted file in {file}" : "{user} cambiou un ficheiro cifrado en {file}",
- "You deleted {file}" : "{file} foi eliminado por vostede",
- "You deleted an encrypted file in {file}" : "Vostede eliminou un ficheiro cifrado en {file}",
- "{user} deleted {file}" : "{file} foi eliminado por {user}",
- "{user} deleted an encrypted file in {file}" : "{user} eliminou un ficheiro cifrado en {file}",
- "You restored {file}" : "{file} foi restaurado por vostede",
- "{user} restored {file}" : "{file} foi restaurado por {user}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Vostede renomeou {oldfile} (agochado) como {newfile} (agochado)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Vostede renomeou {oldfile} (agochado) como {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Vostede renomeou {oldfile} como {newfile} (agochado)",
- "You renamed {oldfile} to {newfile}" : "Vostede renomeou {oldfile} como {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (agochado) como {newfile} (agochado)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (agochado) como {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} {oldfile} como {newfile} (agochado)",
- "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Vostede moveu {oldfile} para {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Engadiuse ou retirouse un ficheiro dos seus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
- "A favorite file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol favorito",
- "All files" : "Todos os ficheiros",
- "Unlimited" : "Sen límites",
"Upload (max. %s)" : "Envío (máx. %s)",
- "Accept" : "Aceptar",
- "Reject" : "Rexeitar",
- "Incoming ownership transfer from {user}" : "Transferencia da propiedade entrante de {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quere aceptar {path}?\n\nNota: ao proceso de transferencia após aceptar pode levarlle ata 1 hora.",
- "Ownership transfer failed" : "Produciuse un fallo na transferencia da propiedade",
- "Your ownership transfer of {path} to {user} failed." : "Produciuse un fallo na súa transferencia da propiedade de {path} cara a {user}.",
- "The ownership transfer of {path} from {user} failed." : "Produciuse un fallo na transferencia da propiedade de {path} cara a {user}.",
- "Ownership transfer done" : "Feita a transferencia da propiedade",
- "Your ownership transfer of {path} to {user} has completed." : "Completouse a súa transferencia da propiedade de {path} cara a {user}.",
- "The ownership transfer of {path} from {user} has completed." : "Completouse a transferencia da propiedade de {path} cara a {user}.",
- "in %s" : "en %s",
- "File Management" : "Xestión de ficheiros",
- "Transfer ownership of a file or folder" : "Transferencia da propiedade dun ficheiro ou cartafol",
- "Choose file or folder to transfer" : "Escolla o ficheiro ou cartafol para transferir",
- "Change" : "Cambiar",
- "New owner" : "Novo propietario",
- "Search users" : "Buscar usuarios",
- "Choose a file or folder to transfer" : "Escolla un ficheiro ou cartafol para transferir",
- "Transfer" : "Transferencia",
- "Transfer {path} to {userid}" : "Transferir {path} cara a {userid}",
- "Invalid path selected" : "Seleccionou unha ruta incorrecta.",
- "Ownership transfer request sent" : "Enviouse solicitude de transferencia da propiedade",
- "Cannot transfer ownership of a file or folder you don't own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol que non é de seu",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "Non é posíbel cambiar o estado favorito do ficheiro",
- "Error while loading the file data" : "Produciuse un erro ao cargar os datos do ficheiro",
- "Pick a template for {name}" : "Escolla un modelo para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "Create a new file with the selected template" : "Crear un novo ficheiro co modelo seleccionado",
- "Creating file" : "Creando o ficheiro",
- "Blank" : "Baleiro",
- "Unable to create new file from template" : "Non é posíbel crear un novo ficheiro a partir do modelo",
- "Set up templates folder" : "Estabelecer un cartafol de modelos",
- "Templates" : "Modelos",
- "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos",
- "%s used" : "%s utilizado",
- "%s%% of %s used" : "%s%% de %s utilizado",
- "%1$s of %2$s used" : "%s de %s utilizado",
- "Settings" : "Axustes",
- "Show hidden files" : "Amosar os ficheiros agochados",
- "Crop image previews" : "Recortar a vista previa das imaxes",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "A acción «{displayName}» executouse correctamente",
+ "\"{displayName}\" action failed" : "Produciuse un fallo na acción «{displayName}»",
+ "\"{displayName}\" failed on some elements" : "Produciuse un fallo nalgúns elementos de «{displayName}»",
+ "\"{displayName}\" batch action executed successfully" : "A acción por lotes «{displayName}» executouse correctamente",
+ "Submitting fields…" : "Enviando os campos...",
+ "Filter filenames…" : "Filtrar os nomes de ficheiro…",
+ "WebDAV URL copied to clipboard" : "O URL de WebDAV foi copiado no portapapeis",
+ "Enable the grid view" : "Activar á vista de grade",
+ "Enable folder tree" : "Activar a árbore de cartafoles",
+ "Copy to clipboard" : "Copiar no portapapeis.",
"Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
- "Toggle grid view" : "Alternar a vista como grella",
- "No files in here" : "Aquí non hai ficheiros",
- "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
- "No entries found in this folder" : "Non se atoparon entradas neste cartafol",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "Envío grande de máis",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
- "No favorites yet" : "Aínda non hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
- "Deleted files" : "Ficheiros eliminados",
- "Shares" : "Comparticións",
- "Shared with others" : "Compartido con outros",
- "Shared with you" : "Compartido con vostede",
- "Shared by link" : "Compartido por ligazón",
- "Deleted shares" : "Recursos compartidos eliminados",
- "Pending shares" : "Comparticións pendentes",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
+ "Deletion cancelled" : "Foi cancelada a eliminación",
+ "Move cancelled" : "Cancelouse o movemento",
+ "Cancelled move or copy of \"{filename}\"." : "Foi cancelado o movemento ou copia de «{filename}»",
+ "Cancelled move or copy operation" : "Foi cancelada a operación de movemento ou copia",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imaxes",
+ "New folder creation cancelled" : "Cancelouse a creación dun novo cartafol",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartafol","{folderCount} cartafoles"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheiro","{fileCount} ficheiros"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheiro e {folderCount} cartafol","1 ficheiro e {folderCount} cartafoles"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheiro e 1 cartafol","{fileCount} ficheiros e 1 cartafol"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheiros e {folderCount} cartafoles",
+ "All folders" : "Todos os cartafoles",
+ "Personal Files" : "Ficheiros persoais",
"Text file" : "Ficheiro de texto",
"New text file.txt" : "Novo ficheiro de texto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O espazo de almacenamento de {owner} está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O cartafol de grupo «{mountPoint}» está cheo, xa non é posíbel actualizar oun sincronizar os ficheiros.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O almacenamento externo «{mountPoint}» está cheo, xa non é posíbel actualizar oun sincronizar os ficheiros.",
- "Your storage is full, files can not be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincidente con «{filter}»","coincidentes con «{filter}»"]
+ "Filter file names …" : "Filtrar os nomes de ficheiro…",
+ "Prevent warning dialogs from open or reenable them." : "Impedir abrir ou reactivar os diálogos de advertencia",
+ "Show a warning dialog when changing a file extension." : "Amosar un diálogo de advertencia ao cambiar unha extensión de ficheiro.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere a súa experiencia con Ficheiros con estes atallos rápidos.",
+ "Open the actions menu for a file" : "Abrir o menú de accións dun ficheiro",
+ "Rename a file" : "Cambiar o nome dun ficheiro",
+ "Delete a file" : "Eliminar un ficheiro",
+ "Favorite or remove a file from favorites" : "Marcar como favorito ou retirar un ficheiro dos favoritos",
+ "Manage tags for a file" : "Xestionar etiquetas para un ficheiro",
+ "Deselect all files" : "Deseleccionar todos os ficheiros",
+ "Select or deselect a file" : "Seleccione ou deseleccione un ficheiro",
+ "Select a range of files" : "Seleccionar un intervalo de ficheiros",
+ "Navigate to the parent folder" : "Navegar ata o cartafol principal",
+ "Navigate to the file above" : "Navegar ata o ficheiro anterior",
+ "Navigate to the file below" : "Navegar ata o ficheiro seguinte",
+ "Navigate to the file on the left (in grid mode)" : "Navegar ata o ficheiro da esquerda (en modo de grade)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar ata o ficheiro da dereita (en modo de grade)",
+ "Toggle the grid view" : "Cambiar á vista de grade",
+ "Open the sidebar for a file" : "Abrir a barra lateral dun ficheiro"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index 72e7a80762d..2a3eed12997 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -1,14 +1,335 @@
{ "translations": {
+ "Added to favorites" : "Engadido a favoritos",
+ "Removed from favorites" : "Retirado de favoritos",
+ "You added {file} to your favorites" : "Engadiu {file} aos seus favoritos",
+ "You removed {file} from your favorites" : "Retirou {file} dos seus favoritos",
+ "Favorites" : "Favoritos",
+ "File changes" : "Cambios do ficheiro",
+ "Created by {user}" : "Creado por {user}",
+ "Changed by {user}" : "Cambiado por {user}",
+ "Deleted by {user}" : "Eliminado por {user}",
+ "Restored by {user}" : "Restaurado por {user}",
+ "Renamed by {user}" : "Renomeado por {user}",
+ "Moved by {user}" : "Movido por {user}",
+ "\"remote account\"" : "«conta remota»",
+ "You created {file}" : "{file} foi creado por Vde.",
+ "You created an encrypted file in {file}" : "Vde. creo un ficheiro cifrado en {file}",
+ "{user} created {file}" : "{user} creou {file}",
+ "{user} created an encrypted file in {file}" : "{user} creou un ficheiro cifrado en {file}",
+ "{file} was created in a public folder" : "{file} foi creado nun cartafol público",
+ "You changed {file}" : "{file} foi cambiado por Vde.",
+ "You changed an encrypted file in {file}" : "Vde. cambiou un ficheiro cifrado en {file}",
+ "{user} changed {file}" : "{file} foi cambiado por {user}",
+ "{user} changed an encrypted file in {file}" : "{user} cambiou un ficheiro cifrado en {file}",
+ "You deleted {file}" : "{file} foi eliminado por Vde.",
+ "You deleted an encrypted file in {file}" : "Vde. eliminou un ficheiro cifrado en {file}",
+ "{user} deleted {file}" : "{file} foi eliminado por {user}",
+ "{user} deleted an encrypted file in {file}" : "{user} eliminou un ficheiro cifrado en {file}",
+ "You restored {file}" : "{file} foi restaurado por Vde.",
+ "{user} restored {file}" : "{file} foi restaurado por {user}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Vde. renomeou {oldfile} (agochado) como {newfile} (agochado)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Vde. renomeou {oldfile} (agochado) como {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Vde. renomeou {oldfile} como {newfile} (agochado)",
+ "You renamed {oldfile} to {newfile}" : "Vde. renomeou {oldfile} como {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (agochado) como {newfile} (agochado)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (agochado) como {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomeou {oldfile} como {newfile} (agochado)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} como {newfile}",
+ "You moved {oldfile} to {newfile}" : "Vde. moveu {oldfile} para {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Engadiuse ou retirouse un ficheiro dos seus <strong>favoritos</strong>",
+ "Files" : "Ficheiros",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol favorito",
+ "Failed to authorize" : "Produciuse un fallo ao autorizar",
+ "Invalid folder path" : "A ruta ao cartafol non é correcta.",
+ "Folder not found" : "Non se atopou o cartafolNon se atopou o cartafol",
+ "The file cannot be found" : "Non é posíbel atopar o ficheiro",
+ "The destination path does not exist: %1$s" : "Non existe a ruta de destino: %1$s",
+ "You do not have permission to create a file at the specified location" : "Vde. non ten permiso para crear un ficheiro na localización especificada",
+ "The file could not be converted." : "Non foi posíbel converter o ficheiro.",
+ "Could not get relative path to converted file" : "Non foi posíbel obter a ruta relativa ao ficheiro convertido",
+ "Favorite files" : "Ficheiros favoritos",
+ "No favorites" : "Non hai favoritos",
+ "More favorites" : "Máis favoritos",
+ "Accept" : "Aceptar",
+ "Reject" : "Rexeitar",
+ "Incoming ownership transfer from {user}" : "Transferencia da propiedade entrante de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quere aceptar {path}?\n\nNota: Ao proceso de transferencia após aceptar pode levarlle ata 1 hora.",
+ "Ownership transfer denied" : "Denegouse a transferencia de propiedade",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} denegou a súa transferencia de propiedade de {path}.",
+ "Ownership transfer failed" : "Produciuse un fallo na transferencia da propiedade",
+ "Your ownership transfer of {path} to {user} failed." : "Produciuse un fallo na súa transferencia da propiedade de {path} cara a {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Produciuse un fallo na transferencia da propiedade de {path} cara a {user}.",
+ "Ownership transfer done" : "Feita a transferencia da propiedade",
+ "Your ownership transfer of {path} to {user} has completed." : "Completouse a súa transferencia da propiedade de {path} cara a {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Completouse a transferencia da propiedade de {path} cara a {user}.",
+ "in %s" : "en %s",
+ "Transferred from %1$s on %2$s" : "Transferido desde %1$s en %2$s",
+ "Files compatibility" : "Compatibilidade de ficheiros",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restrinxir os nomes de ficheiros para garantir que os ficheiros se poidan sincronizar con todos os clientes. De xeito predeterminado, permítense todos os nomes de ficheiro válidos en POSIX (p. ex., Linux ou macOS).",
+ "Enforce Windows compatibility" : "Forzar a compatibilidade con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Isto bloqueará os nomes de ficheiros non válidos en sistemas Windows, coma o uso de nomes reservados ou caracteres especiais. Porén, isto non forzará á compatibilidade da distinción entre maiúsculas e minúsculas.",
+ "File Management" : "Xestión de ficheiros",
+ "Home" : "Inicio",
+ "Target folder does not exist any more" : "O cartafol de destino xa non existe",
+ "Reload current directory" : "Recargar o directorio actual",
+ "Go to the \"{dir}\" directory" : "Vaia ao directorio «{dir}».",
+ "Current directory path" : "Ruta do directorio actual",
+ "Your have used your space quota and cannot upload files anymore" : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
+ "You do not have permission to upload or create files here." : "Non ten permiso para enviar ou crear ficheiros aquí.",
+ "Drag and drop files here to upload" : "Arrastre e solte os ficheiros aquí para envialos",
+ "Favorite" : "Favorito",
+ "Back" : "Atrás",
+ "Toggle selection for file \"{displayName}\"" : "Conmutar a selección para o ficheiro «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Conmutar a selección para o cartafol «{displayName}»",
+ "File is loading" : "Estase a cargar o ficheiro",
+ "Folder is loading" : "Estase a cargar o cartafol",
+ "Filename" : "Nome de ficheiro",
+ "Folder name" : "Nome do cartafol",
+ "This node is unavailable" : "Este nodo non está dispoñíbel",
+ "Another entry with the same name already exists." : "Xa existe outra entrada co mesmo nome.",
+ "Invalid filename." : "Nome de ficheiro incorrecto.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Cambiouse o nome de «{oldName}» a «{newName}»",
+ "Rename file" : "Cambiar o nome do ficheiro",
+ "Folder" : "Cartafol",
+ "Pending" : "Pendentes",
+ "Unknown date" : "Data descoñecida",
+ "Clear filter" : "Limpar o filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Buscar por todas partes",
+ "Type" : "Escribir",
+ "Active filters" : "Filtros activos",
+ "Remove filter" : "Retirar o filtro",
+ "Total rows summary" : "Resumo total de filas",
+ "Toggle selection for all files and folders" : "Conmutar a selección para todos os ficheiros e cartafoles",
+ "Name" : "Nome",
+ "Size" : "Tamaño",
+ "Actions" : "Accións",
+ "(selected)" : "(seleccionado)",
+ "List of files and folders." : "Lista de ficheiros e cartafoles",
+ "You have used your space quota and cannot upload files anymore." : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
+ "Column headers with buttons are sortable." : "As cabeceiras das columnas con botóns pódense ordenar.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres se despraza pola lista.",
+ "File not found" : "Non se atopou o ficheiro",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "Usados {used} de {quota}",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Non foi posíbel actualizar as estatísticas de almacenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
+ "Storage information" : "Información de almacenamento",
+ "Storage quota" : "Cota de almacenamento",
+ "New folder" : "Novo cartafol",
+ "Create new folder" : "Crear un cartafol novo",
+ "This name is already in use." : "Este nome xa está a ser usado",
+ "Create" : "Crear",
+ "Fill template fields" : "Encher os campos do modelo",
+ "Submitting fields …" : "Enviando os campos...",
+ "Submit" : "Enviar",
+ "Choose a file or folder to transfer" : "Escolla un ficheiro ou cartafol para transferir",
+ "Transfer" : "Transferencia",
+ "Transfer {path} to {userid}" : "Transferir {path} cara a {userid}",
+ "Invalid path selected" : "Seleccionou unha ruta incorrecta.",
+ "Unknown error" : "Produciuse un erro descoñecido",
+ "Ownership transfer request sent" : "Enviouse solicitude de transferencia da propiedade",
+ "Cannot transfer ownership of a file or folder you do not own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol do que non es o propietario",
+ "Transfer ownership of a file or folder" : "Transferencia da propiedade dun ficheiro ou cartafol",
+ "Choose file or folder to transfer" : "Escolla o ficheiro ou cartafol para transferir",
+ "Change" : "Cambiar",
+ "New owner" : "Novo propietario",
+ "Keep {old}" : "Conservar {old}",
+ "Keep without extension" : "Conservar sen extensión",
+ "Use {new}" : "Empregar {new}",
+ "Remove extension" : "Retirar a extensión",
+ "Change file extension" : "Cambiar a extensión do ficheiro",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Cambiar a extensión de ficheiro de «{old}» a «{new}» pode facer que o ficheiro sexa ilexíbel.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Retirar a extensión de ficheiro «{old}» pode facer que o ficheiro sexa ilexíbel.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Engadir a extensión de ficheiro «{new}» pode facer que o ficheiro sexa ilexíbel.",
+ "Do not show this dialog again." : "Non volver amosar este diálogo",
+ "Select file or folder to link to" : "Seleccione o ficheiro ou cartafol ao que ligar",
+ "Choose {file}" : "Escoller {file}",
+ "Share" : "Compartir",
+ "Shared by link" : "Compartido por ligazón",
+ "Shared" : "Compartido",
+ "Switch to list view" : "Cambiar á vista de lista",
+ "Switch to grid view" : "Cambiar á vista de grade",
+ "The file could not be found" : "Non foi posíbel atopar o ficheiro",
+ "Upload was cancelled by user" : "O envío foi cancelado polo usuario",
+ "Not enough free space" : "Non hai espazo libre abondo",
+ "Operation is blocked by access control" : "A operación está a se bloqueda polo control de acceso",
+ "Error during upload: {message}" : "Produciuse un erro durante o envío: {message}",
+ "Error during upload, status code {status}" : "Produciuse un erro durante o envío, código de estado {status}",
+ "Unknown error during upload" : "Produciuse un erro descoñecido durante o envío",
+ "Loading current folder" : "Cargando o cartafol actual",
+ "Retry" : "Volver tentar",
+ "No files in here" : "Aquí non hai ficheiros",
+ "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
+ "Go back" : "Volver",
+ "Views" : "Vistas",
+ "Files settings" : "Axustes de Ficheiros",
+ "Your files" : "Os seus ficheiros",
+ "Open in files" : "Abrir en ficheiros",
+ "File cannot be accessed" : "Non é posíbel acceder ao ficheiro",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Non foi posíbel atopar o ficheiro ou non ten permiso para velo. Pídalle ao remitente que o comparta.",
+ "Clipboard is not available" : "O portapapeis non está dispoñíbel",
+ "General" : "Xeral",
+ "All files" : "Todos os ficheiros",
+ "Personal files" : "Ficheiros persoais",
+ "Sort favorites first" : "Ordene antes os favoritos",
+ "Sort folders before files" : "Ordenar os cartafoles diante dos ficheiros",
+ "Appearance" : "Aparencia",
+ "Show hidden files" : "Amosar os ficheiros agochados",
+ "Crop image previews" : "Recortar a vista previa das imaxes",
+ "Additional settings" : "Axustes adicionais",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL de WebDAV",
+ "Copy" : "Copiar",
+ "Warnings" : "Advertencias",
+ "Keyboard shortcuts" : "Atallos de teclado",
+ "File actions" : "Accións de ficheiro",
+ "Rename" : "Cambiar o nome",
+ "Delete" : "Eliminar",
+ "Manage tags" : "Xestionar as etiquetas",
+ "Selection" : "Selección",
+ "Select all files" : "Seleccionar todos os ficheiros",
+ "Deselect all" : "Deseleccionar todo",
+ "Navigation" : "Navegación",
+ "View" : "Ver",
+ "Toggle grid view" : "Alternar a vista como grade",
+ "Show those shortcuts" : "Amosar eses atallos",
+ "You" : "Vde.",
+ "Shared multiple times with different people" : "Compartido varias veces con diferentes persoas",
+ "Unable to change the favorite state of the file" : "Non é posíbel cambiar o estado de favorito do ficheiro",
+ "Error while loading the file data" : "Produciuse un erro ao cargar os datos do ficheiro",
+ "Owner" : "Propietario",
+ "Remove from favorites" : "Retirar de favoritos",
+ "Add to favorites" : "Engadir a favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Baleiro",
+ "Unable to create new file from template" : "Non é posíbel crear un novo ficheiro a partir do modelo",
+ "Pick a template for {name}" : "Escolla un modelo para {name}",
+ "Create a new file with the selected template" : "Crear un novo ficheiro co modelo seleccionado",
+ "Creating file" : "Creando o ficheiro",
+ "Save as {displayName}" : "Gardar como {displayName}",
+ "Save as …" : "Gardar como…",
+ "Converting files …" : "Convertendo ficheiros…",
+ "Failed to convert files: {message}" : "Produciuse un fallo ao converter os ficheiros: {message}",
+ "All files failed to be converted" : "Non foi posíbel converter ningún ficheiro",
+ "One file could not be converted: {message}" : "Non foi posíbel converter un ficheiro: {message}",
+ "Files successfully converted" : "Os ficheiros foron convertidos correctamente",
+ "Failed to convert files" : "Produciuse un fallo ao converter os ficheiros",
+ "Converting file …" : "Convertendo o ficheiro…",
+ "File successfully converted" : "O ficheiro foi convertido correctamente",
+ "Failed to convert file: {message}" : "Produciuse un fallo ao converter o ficheiro: {message}",
+ "Failed to convert file" : "Produciuse un fallo ao converter o ficheiro",
+ "Leave this share" : "Deixar esta compartición",
+ "Leave these shares" : "Deixar estas comparticións",
+ "Disconnect storage" : "Desconectar o almacenamento",
+ "Disconnect storages" : "Desconectar os almacenamentos",
+ "Delete permanently" : "Eliminar definitivamente",
+ "Delete and unshare" : "Eliminar e deixar de compartir",
+ "Delete file" : "Eliminar ficheiro",
+ "Delete files" : "Eliminar ficheiros",
+ "Delete folder" : "Eliminar o cartafol",
+ "Delete folders" : "Eliminar cartafoles",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Está a piques de eliminar definitivamente {count} elemento","Está a piques de eliminar definitivamente {count} elementos"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Está a piques de eliminar {count} elemento","Está a piques de eliminar {count} elementos"],
+ "Confirm deletion" : "Confirmar a eliminación",
+ "Cancel" : "Cancelar",
+ "Download" : "Descargar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…",
+ "Destination is not a folder" : "O destino non é un cartafol",
+ "This file/folder is already in that directory" : "Este ficheiro/cartafol xa está nese directorio",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo",
+ "(copy)" : "(copiar)",
+ "(copy %n)" : "(copiar %n)",
+ "A file or folder with that name already exists in this folder" : "Neste cartafol xa existe un ficheiro ou cartafol con ese nome",
+ "The files are locked" : "Os ficheiros están bloqueados",
+ "The file does not exist anymore" : "O ficheiro xa non existe",
+ "Choose destination" : "Escoller o destino",
+ "Copy to {target}" : "Copiar en {target}",
+ "Move to {target}" : "Mover a {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "Produciuse un erro na operación de copia ou de movemento",
+ "Move or copy" : "Mover ou copiar",
+ "Open folder {displayName}" : "Abrir o cartafol {displayName}",
+ "Open in Files" : "Abrir en Ficheiros",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente",
+ "Open file locally" : "Abrir o ficheiro localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "O ficheiro debería abrirse agora no seu dispositivo. Se non é así, comprobe se ten instalada a aplicación de escritorio.",
+ "Retry and close" : "Tentar de novo e pechar",
+ "Open online" : "Abrir en liña",
+ "Details" : "Detalles",
+ "View in folder" : "Ver no cartafol",
+ "Today" : "Hoxe",
+ "Last 7 days" : "Últimos 7 días",
+ "Last 30 days" : "Últimos 30 días",
+ "This year ({year})" : "Este ano ({year})",
+ "Last year ({year})" : "O ano pasado ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Follas de cálculo",
+ "Presentations" : "Presentacións",
+ "PDFs" : "PDF",
+ "Folders" : "Cartafoles",
+ "Audio" : "Son",
+ "Images" : "Imaxes",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Creouse un novo cartafol «{name}»",
+ "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos",
+ "Create templates folder" : "Crear o cartafol de modelos",
+ "Templates" : "Modelos",
+ "New template folder" : "Novo cartafol de modelos",
+ "In folder" : "No cartafol",
+ "Search in folder: {folder}" : "Buscar no cartafol: {folder}",
+ "One of the dropped files could not be processed" : "Non foi posíbel procesar un dos ficheiros arrastrados",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "O seu navegador non é compatíbel coa API do sistema de ficheiros. Os directorios non van ser enviados",
+ "No files to upload" : "Non hai ficheiros que enviar",
+ "Unable to create the directory {directory}" : "Non foi posíbel crear o directorio {directory}",
+ "Some files could not be uploaded" : "Non foi posíbel enviar algúns ficheiros",
+ "Files uploaded successfully" : "Ficheiros enviados satisfactoriamente",
+ "No files to process" : "Non hai ficheiros para procesar",
+ "Some files could not be copied" : "Non foi posíbel copiar algúns ficheiros",
+ "Some files could not be moved" : "Non foi posíbel mover algúns ficheiros",
+ "Files copied successfully" : "Ficheiros copiados correctamente",
+ "Files moved successfully" : "Ficheiros movidos correctamente",
+ "Conflicts resolution skipped" : "Omitiuse a resolución dos conflitos",
+ "Upload cancelled" : "Envío cancelado",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Non foi posíbel cambiarlle o nome a «{oldName}», xa non existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome «{newName}» xa se utiliza no cartafol «{dir}». Escolla un nome diferente.",
+ "Could not rename \"{oldName}\"" : "Non foi posíbel cambiarlle o nome a «{oldName}»",
+ "This operation is forbidden" : "Esta operación está prohibida",
"Storage is temporarily not available" : "O almacenamento non está dispoñíbel temporalmente",
- "Storage invalid" : "Almacenamento incorrecto",
- "Unknown error" : "Erro descoñecido",
+ "Unexpected error: {error}" : "Produciuse un erro non agardado: {error}",
+ "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
+ "_%n folder_::_%n folders_" : ["%n cartafol","%n cartafoles"],
+ "Filename must not be empty." : "O nome de ficheiro non debe estar baleiro",
+ "\"{char}\" is not allowed inside a filename." : "«{char}» non está permitido nun nome de ficheiro.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "«{segment}» é un nome reservado e non está permitido para os nomes de ficheiro.",
+ "\"{extension}\" is not an allowed filetype." : "«{extension}» non é un tipo de ficheiro permitido.",
+ "Filenames must not end with \"{extension}\"." : "Os nomes de ficheiros non deben rematar con «{extension}».",
+ "List of favorite files and folders." : "Lista de ficheiros e cartafoles favoritos.",
+ "No favorites yet" : "Aínda non hai favoritos",
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
+ "List of your files and folders." : "Lista dos seus ficheiros e cartafoles",
+ "List of your files and folders that are not shared." : "Lista dos seus ficheiros e cartafoles que non están a seren compartidos.",
+ "No personal files found" : "Non se atopou ningún ficheiro persoal",
+ "Files that are not shared will show up here." : "Os ficheiros que non se comparten amosaranse aquí.",
+ "Recent" : "Recente",
+ "List of recently modified files and folders." : "Lista de ficheiros e cartafoles modificados recentemente.",
+ "No recently modified files" : "Non hai ficheiros modificados recentemente",
+ "Files and folders you recently modified will show up here." : "Os ficheiros e cartafoles que modificou recentemente amosaranse aquí.",
+ "Search" : "Buscar",
+ "No entries found in this folder" : "Non se atopou ningunha entrada neste cartafol",
+ "Select all" : "Seleccionar todo",
+ "Upload too large" : "Envío grande de máis",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"File could not be found" : "Non foi posíbel atopar o ficheiro",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Descargar",
- "Delete" : "Eliminar",
- "Home" : "Inicio",
+ "Show list view" : "Amosar a vista de lista",
+ "Show grid view" : "Amosar a vista de grade",
"Close" : "Pechar",
- "Favorites" : "Favoritos",
"Could not create folder \"{dir}\"" : "Non foi posíbel crear o cartafol «{dir}»",
"This will stop your current uploads." : "Isto deterá os envíos actuais.",
"Upload cancelled." : "Envío cancelado.",
@@ -17,33 +338,25 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}",
"Target folder \"{dir}\" does not exist any more" : "O cartafol de destino «{dir}» xa non existe",
- "Not enough free space" : "Non hai espazo libre abondo",
"An unknown error has occurred" : "Produciuse un erro descoñecido",
+ "File could not be uploaded" : "Non foi posíbel enviar o ficheiro",
"Uploading …" : "Enviando…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Enviando… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Non se admite o envío deste elemento",
- "Target folder does not exist any more" : "O cartafol de destino xa non existe",
- "Operation is blocked by access control" : "A operación está a se bloqueda polo control de acceso",
"Error when assembling chunks, status code {status}" : "Produciuse un erro ao ensamblar os bloques, código de estado {status}",
- "Actions" : "Accións",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
"Choose target folder" : "Escoller o cartafol de destino",
+ "Set reminder" : "Definir un lembrete",
+ "Edit locally" : "Editar localmente",
"Open" : "Abrir",
- "Delete file" : "Eliminar ficheiro",
- "Delete folder" : "Eliminar cartafol",
- "Disconnect storage" : "Desconectar o almacenamento",
- "Leave this share" : "Deixar esta compartición",
"Could not load info for file \"{file}\"" : "Non foi posíbel cargar información para o ficheiro «{file}»",
- "Files" : "Ficheiros",
- "Details" : "Detalles",
- "Please select tag(s) to add to the selection" : "Elixe a etiqueta(s) para engadir á selección",
+ "Please select tag(s) to add to the selection" : "Escolla a etiqueta(s) para engadir á selección",
"Apply tag(s) to selection" : "Aplicar etiqueta(s) á selección",
- "Select" : "Seleccionar",
- "Pending" : "Pendentes",
+ "Select directory \"{dirName}\"" : "Seleccione o directorio «{dirName}»",
+ "Select file \"{fileName}\"" : "Seleccione o ficheiro «{fileName}»",
"Unable to determine date" : "Non é posíbel determinar a data",
- "This operation is forbidden" : "Esta operación está prohibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, consulte os ficheiros de rexistro ou póñase en contacto coa administración desta instancia.",
"Could not move \"{file}\", target exists" : "Non foi posíbel mover «{file}», o destino xa existe",
"Could not move \"{file}\"" : "Non foi posíbel mover «{file}»",
"copy" : "copiar",
@@ -52,165 +365,91 @@
"Copied {origin} inside {destination}" : "Copiado {origin} en {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copiado {origin} e outros {nbfiles} ficheiros en {destination} ",
"{newName} already exists" : "Xa existe {newName}",
- "Could not rename \"{fileName}\", it does not exist any more" : "Non foi posíbel renomear «{fileName}», xa non existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome «{targetName}» xa se utiliza no cartafol «{dir}». Escolla outro nome.",
- "Could not rename \"{fileName}\"" : "Non foi posíbel renomear «{fileName}»",
"Could not create file \"{file}\"" : "Non foi posíbel crear o ficheiro «{file}»",
"Could not create file \"{file}\" because it already exists" : "Non foi posíbel crear o ficheiro «{file}» por mor de que xa existe",
"Could not create folder \"{dir}\" because it already exists" : "Non foi posíbel crear o cartafol «{dir}» por mor de que xa existe",
- "Could not fetch file details \"{file}\"" : "Non foi posíbel obter os detalles do ficheiro «{file}»",
+ "Could not fetch file details \"{file}\"" : "Non foi posíbel recuperar os detalles do ficheiro «{file}»",
"Error deleting file \"{fileName}\"." : "Produciuse un erro ao eliminar o ficheiro «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "Non foi posíbel atopar resultados de busca noutros cartafoles para {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduza máis de dous caracteres para buscar noutros cartafoles",
- "Name" : "Nome",
- "Size" : "Tamaño",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n cartafol","%n cartafoles"],
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
"{dirs} and {files}" : "{dirs} e {files}",
"_including %n hidden_::_including %n hidden_" : ["incluíndo %n agachado","incluíndo %n agochados"],
- "You don’t have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí.",
+ "You do not have permission to upload or create files here" : "Non ten permiso para enviar ou crear ficheiros aquí",
"_Uploading %n file_::_Uploading %n files_" : ["Enviando %n ficheiro","Enviando %n ficheiros"],
"New" : "Novo",
+ "New file/folder menu" : "Novo menú ficheiro/cartafol",
"Select file range" : "Seleccionar o intervalo de ficheiros ",
- "{used} of {quota} used" : "Usados {used} de {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "{used} usados",
"\"{name}\" is an invalid file name." : "«{name}» é un nome incorrecto de ficheiro.",
"File name cannot be empty." : "O nome de ficheiro non pode estar baleiro",
"\"/\" is not allowed inside a file name." : "«/» non está permitido nun nome de ficheiro",
"\"{name}\" is not an allowed filetype" : "«{name}» non é un tipo de ficheiro permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "A almacenaxe de {owner} está chea, non se poden actualizar nin sincronizar os ficheiros!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O cartafol \"{mountPoint}\" do grupo está completo, non se poderán subir nin sincronizar ficheiros!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A almacenaxe externa \"{mountPoint}\" está chea, non se pode actualizar ou sincronizar ficheiros!",
- "Your storage is full, files cannot be updated or synced anymore!" : "A almacenaxe está completa, non se pode sincronizar ou actualizar ficheiros!",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O espazo de almacenamento de {owner} está cheo, xa é posíbel actualizar nin sincronizar os ficheiros!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O cartafol «{mountPoint}» do grupo está completo, non se poderán actualizar nin sincronizar ficheiros!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O almacenamento externo «{mountPoint}» está cheo, xa non é posíbel actualizar nin sincronizar os ficheiros.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non é posíbel actualizar nin sincronizar os ficheiros!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "O espazo de almacenamento de {owner} está case cheo ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O cartafol de grupo «{mountPoint}» está case cheo ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O almacenamento externo «{mountPoint}» está case cheo ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O almacenamento externo «{mountPoint}» está case cheo ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)." : "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%).",
- "View in folder" : "Ver no cartafol",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar a ligazón directa (só funciona para usuarios con acceso a este ficheiro/cartafol)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide con «{filter}»","coinciden con «{filter}»"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Foi copiada a ligazón directa (só funciona para as persoas que teñen acceso a este ficheiro/cartafol)",
"Path" : "Ruta",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Marcado como favorito",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Só pode marcar como favorito un único ficheiro ou cartafol por vez",
- "New folder" : "Novo cartafol",
+ "Favored" : "Favorecido",
+ "Favor" : "Favorecer",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar a ligazón directa (só funciona para persoas con acceso a este ficheiro/cartafol)",
"Upload file" : "Enviar ficheiro",
- "Recent" : "Recente",
- "Not favorited" : "Non marcado como favorito",
- "Remove from favorites" : "Retirar de favoritos",
- "Add to favorites" : "Engadir a favoritos",
+ "Not favored" : "Non favorecido",
"An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas",
- "Added to favorites" : "Engadido a favoritos",
- "Removed from favorites" : "Retirado de favoritos",
- "You added {file} to your favorites" : "Engadiu {file} aos seus favoritos",
- "You removed {file} from your favorites" : "Retirou {file} dos seus favoritos",
- "File changes" : "Cambios do ficheiro",
- "Created by {user}" : "Creado por {user}",
- "Changed by {user}" : "Cambiado por {user}",
- "Deleted by {user}" : "Eliminado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renomeado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "«usuario remoto»",
- "You created {file}" : "{file} foi creado por vostede",
- "You created an encrypted file in {file}" : "Vostede creo un ficheiro cifrado en {file}",
- "{user} created {file}" : "{user} creou {file}",
- "{user} created an encrypted file in {file}" : "{user} creou un ficheiro cifrado en {file}",
- "{file} was created in a public folder" : "{file} foi creado nun cartafol público",
- "You changed {file}" : "{file} foi cambiado por vostede",
- "You changed an encrypted file in {file}" : "Vostede cambiou un ficheiro cifrado en {file}",
- "{user} changed {file}" : "{file} foi cambiado por {user}",
- "{user} changed an encrypted file in {file}" : "{user} cambiou un ficheiro cifrado en {file}",
- "You deleted {file}" : "{file} foi eliminado por vostede",
- "You deleted an encrypted file in {file}" : "Vostede eliminou un ficheiro cifrado en {file}",
- "{user} deleted {file}" : "{file} foi eliminado por {user}",
- "{user} deleted an encrypted file in {file}" : "{user} eliminou un ficheiro cifrado en {file}",
- "You restored {file}" : "{file} foi restaurado por vostede",
- "{user} restored {file}" : "{file} foi restaurado por {user}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Vostede renomeou {oldfile} (agochado) como {newfile} (agochado)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Vostede renomeou {oldfile} (agochado) como {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Vostede renomeou {oldfile} como {newfile} (agochado)",
- "You renamed {oldfile} to {newfile}" : "Vostede renomeou {oldfile} como {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (agochado) como {newfile} (agochado)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (agochado) como {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} {oldfile} como {newfile} (agochado)",
- "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} como {newfile}",
- "You moved {oldfile} to {newfile}" : "Vostede moveu {oldfile} para {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Engadiuse ou retirouse un ficheiro dos seus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol",
- "A favorite file or folder has been <strong>changed</strong>" : "<strong>Cambiouse</strong> un ficheiro ou cartafol favorito",
- "All files" : "Todos os ficheiros",
- "Unlimited" : "Sen límites",
"Upload (max. %s)" : "Envío (máx. %s)",
- "Accept" : "Aceptar",
- "Reject" : "Rexeitar",
- "Incoming ownership transfer from {user}" : "Transferencia da propiedade entrante de {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quere aceptar {path}?\n\nNota: ao proceso de transferencia após aceptar pode levarlle ata 1 hora.",
- "Ownership transfer failed" : "Produciuse un fallo na transferencia da propiedade",
- "Your ownership transfer of {path} to {user} failed." : "Produciuse un fallo na súa transferencia da propiedade de {path} cara a {user}.",
- "The ownership transfer of {path} from {user} failed." : "Produciuse un fallo na transferencia da propiedade de {path} cara a {user}.",
- "Ownership transfer done" : "Feita a transferencia da propiedade",
- "Your ownership transfer of {path} to {user} has completed." : "Completouse a súa transferencia da propiedade de {path} cara a {user}.",
- "The ownership transfer of {path} from {user} has completed." : "Completouse a transferencia da propiedade de {path} cara a {user}.",
- "in %s" : "en %s",
- "File Management" : "Xestión de ficheiros",
- "Transfer ownership of a file or folder" : "Transferencia da propiedade dun ficheiro ou cartafol",
- "Choose file or folder to transfer" : "Escolla o ficheiro ou cartafol para transferir",
- "Change" : "Cambiar",
- "New owner" : "Novo propietario",
- "Search users" : "Buscar usuarios",
- "Choose a file or folder to transfer" : "Escolla un ficheiro ou cartafol para transferir",
- "Transfer" : "Transferencia",
- "Transfer {path} to {userid}" : "Transferir {path} cara a {userid}",
- "Invalid path selected" : "Seleccionou unha ruta incorrecta.",
- "Ownership transfer request sent" : "Enviouse solicitude de transferencia da propiedade",
- "Cannot transfer ownership of a file or folder you don't own" : "Non é posíbel transferir a propiedade dun ficheiro ou cartafol que non é de seu",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "Non é posíbel cambiar o estado favorito do ficheiro",
- "Error while loading the file data" : "Produciuse un erro ao cargar os datos do ficheiro",
- "Pick a template for {name}" : "Escolla un modelo para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Crear",
- "Create a new file with the selected template" : "Crear un novo ficheiro co modelo seleccionado",
- "Creating file" : "Creando o ficheiro",
- "Blank" : "Baleiro",
- "Unable to create new file from template" : "Non é posíbel crear un novo ficheiro a partir do modelo",
- "Set up templates folder" : "Estabelecer un cartafol de modelos",
- "Templates" : "Modelos",
- "Unable to initialize the templates directory" : "Non é posíbel iniciar o directorio de modelos",
- "%s used" : "%s utilizado",
- "%s%% of %s used" : "%s%% de %s utilizado",
- "%1$s of %2$s used" : "%s de %s utilizado",
- "Settings" : "Axustes",
- "Show hidden files" : "Amosar os ficheiros agochados",
- "Crop image previews" : "Recortar a vista previa das imaxes",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "A acción «{displayName}» executouse correctamente",
+ "\"{displayName}\" action failed" : "Produciuse un fallo na acción «{displayName}»",
+ "\"{displayName}\" failed on some elements" : "Produciuse un fallo nalgúns elementos de «{displayName}»",
+ "\"{displayName}\" batch action executed successfully" : "A acción por lotes «{displayName}» executouse correctamente",
+ "Submitting fields…" : "Enviando os campos...",
+ "Filter filenames…" : "Filtrar os nomes de ficheiro…",
+ "WebDAV URL copied to clipboard" : "O URL de WebDAV foi copiado no portapapeis",
+ "Enable the grid view" : "Activar á vista de grade",
+ "Enable folder tree" : "Activar a árbore de cartafoles",
+ "Copy to clipboard" : "Copiar no portapapeis.",
"Use this address to access your Files via WebDAV" : "Empregue este enderezo para acceder ao seu Ficheiros mediante WebDAV",
- "Toggle grid view" : "Alternar a vista como grella",
- "No files in here" : "Aquí non hai ficheiros",
- "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
- "No entries found in this folder" : "Non se atoparon entradas neste cartafol",
- "Select all" : "Seleccionar todo",
- "Upload too large" : "Envío grande de máis",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
- "No favorites yet" : "Aínda non hai favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí",
- "Deleted files" : "Ficheiros eliminados",
- "Shares" : "Comparticións",
- "Shared with others" : "Compartido con outros",
- "Shared with you" : "Compartido con vostede",
- "Shared by link" : "Compartido por ligazón",
- "Deleted shares" : "Recursos compartidos eliminados",
- "Pending shares" : "Comparticións pendentes",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se activou 2FA, cree e utilice un novo contrasinal de aplicación premendo aquí.",
+ "Deletion cancelled" : "Foi cancelada a eliminación",
+ "Move cancelled" : "Cancelouse o movemento",
+ "Cancelled move or copy of \"{filename}\"." : "Foi cancelado o movemento ou copia de «{filename}»",
+ "Cancelled move or copy operation" : "Foi cancelada a operación de movemento ou copia",
+ "Open details" : "Abrir detalles",
+ "Photos and images" : "Fotos e imaxes",
+ "New folder creation cancelled" : "Cancelouse a creación dun novo cartafol",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartafol","{folderCount} cartafoles"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheiro","{fileCount} ficheiros"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheiro e {folderCount} cartafol","1 ficheiro e {folderCount} cartafoles"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheiro e 1 cartafol","{fileCount} ficheiros e 1 cartafol"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheiros e {folderCount} cartafoles",
+ "All folders" : "Todos os cartafoles",
+ "Personal Files" : "Ficheiros persoais",
"Text file" : "Ficheiro de texto",
"New text file.txt" : "Novo ficheiro de texto.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O espazo de almacenamento de {owner} está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O cartafol de grupo «{mountPoint}» está cheo, xa non é posíbel actualizar oun sincronizar os ficheiros.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O almacenamento externo «{mountPoint}» está cheo, xa non é posíbel actualizar oun sincronizar os ficheiros.",
- "Your storage is full, files can not be updated or synced anymore!" : "O seu espazo de almacenamento está cheo, xa non se poden actualizar nin sincronizar os ficheiros.",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincidente con «{filter}»","coincidentes con «{filter}»"]
+ "Filter file names …" : "Filtrar os nomes de ficheiro…",
+ "Prevent warning dialogs from open or reenable them." : "Impedir abrir ou reactivar os diálogos de advertencia",
+ "Show a warning dialog when changing a file extension." : "Amosar un diálogo de advertencia ao cambiar unha extensión de ficheiro.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere a súa experiencia con Ficheiros con estes atallos rápidos.",
+ "Open the actions menu for a file" : "Abrir o menú de accións dun ficheiro",
+ "Rename a file" : "Cambiar o nome dun ficheiro",
+ "Delete a file" : "Eliminar un ficheiro",
+ "Favorite or remove a file from favorites" : "Marcar como favorito ou retirar un ficheiro dos favoritos",
+ "Manage tags for a file" : "Xestionar etiquetas para un ficheiro",
+ "Deselect all files" : "Deseleccionar todos os ficheiros",
+ "Select or deselect a file" : "Seleccione ou deseleccione un ficheiro",
+ "Select a range of files" : "Seleccionar un intervalo de ficheiros",
+ "Navigate to the parent folder" : "Navegar ata o cartafol principal",
+ "Navigate to the file above" : "Navegar ata o ficheiro anterior",
+ "Navigate to the file below" : "Navegar ata o ficheiro seguinte",
+ "Navigate to the file on the left (in grid mode)" : "Navegar ata o ficheiro da esquerda (en modo de grade)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar ata o ficheiro da dereita (en modo de grade)",
+ "Toggle the grid view" : "Cambiar á vista de grade",
+ "Open the sidebar for a file" : "Abrir a barra lateral dun ficheiro"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/gu.js b/apps/files/l10n/gu.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/gu.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/gu.json b/apps/files/l10n/gu.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/gu.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js
deleted file mode 100644
index f324bd26ea5..00000000000
--- a/apps/files/l10n/he.js
+++ /dev/null
@@ -1,198 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "האחסון אינו זמין באופן זמני",
- "Storage invalid" : "אחסון לא חוקי",
- "Unknown error" : "שגיאה בלתי ידועה",
- "File could not be found" : "הקובץ לא ניתן לאיתור",
- "Move or copy" : "העברה או העתקה",
- "Download" : "הורדה",
- "Delete" : "מחיקה",
- "Home" : "בית",
- "Close" : "סגירה",
- "Favorites" : "מועדפים",
- "Could not create folder \"{dir}\"" : "לא ניתן ליצור את התיקייה \"{dir}\"",
- "This will stop your current uploads." : "פעולה זו תעצור את השליחות הנוכחיות שלך.",
- "Upload cancelled." : "ההעלאה בוטלה.",
- "Processing files …" : "הקבצים עוברים עיבוד…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "לא ניתן להעלות {filename} כיוון שמדובר בתיקייה או שגודלו 0 בייט",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "לא קיים מספיק מקום פנוי, הקובץ המיועד להעלאה {size1} אבל נשאר {size2} בלבד",
- "Target folder \"{dir}\" does not exist any more" : "תיקיית היעד „{dir}” לא קיים עוד",
- "Not enough free space" : "אין מספיק מקום פנוי",
- "An unknown error has occurred" : "אירעה שגיאה בלתי ידועה",
- "Uploading …" : "מתבצעת העלאה…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} מתוך {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "העלאת הפריט הזה אינה נתמכת",
- "Target folder does not exist any more" : "תיקיית היעד אינה קיימת עוד",
- "Operation is blocked by access control" : "הפעולה נחסמה על ידי בקרת גישה",
- "Error when assembling chunks, status code {status}" : "שגיאה באיסוף הנתחים, קוד המצב {status}",
- "Actions" : "פעולות",
- "Rename" : "שינוי שם",
- "Copy" : "העתקה",
- "Choose target folder" : "נא לבחור תיקיית יעד",
- "Open" : "פתיחה",
- "Delete file" : "מחיקת קבצים",
- "Delete folder" : "מחיקת תיקייה",
- "Disconnect storage" : "ניתוק אחסון",
- "Leave this share" : "לעזוב את השיתוף הזה",
- "Could not load info for file \"{file}\"" : "לא ניתן לטעון מידע על הקובץ „{file}”",
- "Files" : "קבצים",
- "Details" : "פרטים",
- "Select" : "בחר",
- "Pending" : "ממתין",
- "Unable to determine date" : "לא ניתן לקבוע תאריך",
- "This operation is forbidden" : "פעולה זו אסורה",
- "This directory is unavailable, please check the logs or contact the administrator" : "תיקייה זו לא קיימת, יש לבדוק את הלוגים או ליצור קשר עם המנהל",
- "Could not move \"{file}\", target exists" : "לא ניתן להעביר \"{file}\", קובץ מטרה קיים",
- "Could not move \"{file}\"" : "לא ניתן להעביר \"{file}\"",
- "copy" : "עותק",
- "Could not copy \"{file}\", target exists" : "לא ניתן להעתיק את „{file}”, היעד קיים",
- "Could not copy \"{file}\"" : "לא ניתן להעתיק את „{file}”",
- "Copied {origin} inside {destination}" : "{origin} הועתק לתוך {destination} ",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "הועתקו {origin} ו־{nbfiles} קבצים אחרים לתוך {destination}",
- "{newName} already exists" : "{newName} כבר קיים",
- "Could not rename \"{fileName}\", it does not exist any more" : "לא ניתן לשנות שם \"{fileName}\", הוא כבר לא קיים יותר",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "השם \"{targetName}\" כבר קיים בתיקייה \"{dir}\". יש לבחור שם אחר.",
- "Could not rename \"{fileName}\"" : "לא ניתן לשנות את השם \"{fileName}\"",
- "Could not create file \"{file}\"" : "לא ניתן ליצור את הקובץ \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "לא ניתן ליצור את הקובץ \"{file}\" כיוון שהוא כבר קיים",
- "Could not create folder \"{dir}\" because it already exists" : "לא ניתן ליצור את התיקייה \"{dir}\" כיוון שהיא כבר קיימת",
- "Could not fetch file details \"{file}\"" : "לא ניתן לקבל את פרטי הקובץ „{file}”",
- "Error deleting file \"{fileName}\"." : "שגיאה בזמן מחיקת קובץ \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "אין תוצאות חיפוש בתיקיות אחרות עבור {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "יש להקליד למעלה משני תווים כדי לחפש בתיקיות אחרות",
- "Name" : "שם",
- "Size" : "גודל",
- "Modified" : "זמן שינוי",
- "_%n folder_::_%n folders_" : ["%n תיקייה","%n תיקיות","%n תיקיות","%n תיקיות"],
- "_%n file_::_%n files_" : ["%n קובץ","%n קבצים","%n קבצים","%n קבצים"],
- "{dirs} and {files}" : "{dirs} וכן {files}",
- "_including %n hidden_::_including %n hidden_" : ["לרבות %n מוסתר","לרבות %n מוסתרים","לרבות %n מוסתרים","לרבות %n מוסתרים"],
- "You don’t have permission to upload or create files here" : "אין לך הרשאות להעלות או ליצור קבצים כאן",
- "_Uploading %n file_::_Uploading %n files_" : ["מעלה %n קובץ","מעלה %n קבצים","מעלה %n קבצים","מעלה %n קבצים"],
- "New" : "חדש",
- "Select file range" : "בחירת טווח קבצים",
- "{used} of {quota} used" : "{used} מתוך {quota} בשימוש",
- "{used} used" : "{used} בשימוש",
- "\"{name}\" is an invalid file name." : "\"{name}\" הנו שם קובץ לא חוקי.",
- "File name cannot be empty." : "שם קובץ אינו יכול להיות ריק",
- "\"/\" is not allowed inside a file name." : "אסור להשתמש ב־„/” בתוך שם קובץ.",
- "\"{name}\" is not an allowed filetype" : "סוד הקובץ „{name}” אינו מורשה",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "התיקיה הקבוצתית \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "האחסון שלך כמעט מלא ({usedSpacePercent}%).",
- "View in folder" : "הצג בתיקייה",
- "Copied!" : "ההעתקה הושלמה!",
- "Copy direct link (only works for users who have access to this file/folder)" : "העתקת קישור ישיר (עובד רק עבור משתמשים שיש להם גישה לקובץ/תיקייה זו)",
- "Path" : "נתיב",
- "_%n byte_::_%n bytes_" : ["%n בייט","%n בייטים","%n בייטים","%n בייטים"],
- "Favorited" : "מועדף",
- "Favorite" : "מועדף",
- "You can only favorite a single file or folder at a time" : "ניתן להוסיף קובץ או תיקייה בודדים כמועדף בכל פעם",
- "New folder" : "תיקייה חדשה",
- "Upload file" : "העלאת קובץ",
- "Recent" : "אחרונים",
- "Not favorited" : "לא במועדפים",
- "Remove from favorites" : "הסרה מהמועדפים",
- "Add to favorites" : "הוספה למועדפים",
- "An error occurred while trying to update the tags" : "שגיאה אירעה בזמן עדכון התגיות",
- "Added to favorites" : "נוסף למועדפים",
- "Removed from favorites" : "הוסר מהמועדפים",
- "You added {file} to your favorites" : "הוספת את {file} למועדפים שלך",
- "You removed {file} from your favorites" : "הסרת את {file} מהמועדפים שלך",
- "File changes" : "שינויים בקובץ",
- "Created by {user}" : "נוצר על ידי {user}",
- "Changed by {user}" : "נערך על ידי {user}",
- "Deleted by {user}" : "נמחק על ידי {user}",
- "Restored by {user}" : "שוחזר על ידי {user}",
- "Renamed by {user}" : "השם השתנה על ידי {user}",
- "Moved by {user}" : "הועבר על ידי {user}",
- "\"remote user\"" : "„משתמש מרוחק”",
- "You created {file}" : "יצרת את {file}",
- "You created an encrypted file in {file}" : "יצרת קובץ מוצפן בתוך {file}",
- "{user} created {file}" : " {file} נוצר על ידי {user}",
- "{user} created an encrypted file in {file}" : "נוצר קובץ מוצפן בתוך {file} על ידי {user}",
- "{file} was created in a public folder" : "{file} נוצר בתוך תיקייה ציבורית",
- "You changed {file}" : "שינית את {file}",
- "You changed an encrypted file in {file}" : "שינית קובץ מוצפן בתוך {file}",
- "{user} changed {file}" : "{file} נערך על ידי {user}",
- "{user} changed an encrypted file in {file}" : "קובץ מוצפן בתוך {file} נערך על ידי {user}",
- "You deleted {file}" : "מחקת את {file}",
- "You deleted an encrypted file in {file}" : "מחקת קובץ מוצפן תחת {file}",
- "{user} deleted {file}" : "{file} נמחק על ידי {user}",
- "{user} deleted an encrypted file in {file}" : "קובץ מוצפן בתוך {file} נמחק על ידי {user}",
- "You restored {file}" : "שחזרת את {file}",
- "{user} restored {file}" : "{file} שוחזר על ידי {user}",
- "You renamed {oldfile} to {newfile}" : "שינית את השם של {oldfile} לשם {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "השם של {oldfile} השתנה אל {newfile} על ידי {user}",
- "You moved {oldfile} to {newfile}" : "העברת את {oldfile} אל {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{oldfile} הועבר אל {newfile} על ידי {user}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "קובץ נוסף או הוסר מה<strong>מועדפים</strong> שלך",
- "A file or folder has been <strong>changed</strong>" : "קובץ או תיקייה <strong>שונו<strong/>",
- "A favorite file or folder has been <strong>changed</strong>" : "קובץ או תיקייה מהמועדפים <strong>נערכו</strong>",
- "All files" : "כל הקבצים",
- "Unlimited" : "ללא הגבלה",
- "Upload (max. %s)" : "העלאה (מקסימום %s)",
- "Accept" : "קבלה",
- "Reject" : "דחייה",
- "Incoming ownership transfer from {user}" : "העברת בעלות נכנסת מאת {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "לקבל את {path}?\n\nלתשומת לך: תהליך ההעברה לאחר האישור עשוי לארוך עד כשעה.",
- "Ownership transfer failed" : "העברת הבעלות נכשלה",
- "Your ownership transfer of {path} to {user} failed." : "העברת הבעלות על {path} לידי {user} ממך נכשלה.",
- "The ownership transfer of {path} from {user} failed." : "העברת הבעלות על {path} לידי {user} נכשלה.",
- "Ownership transfer done" : "העברת הבעלות הושלמה",
- "Your ownership transfer of {path} to {user} has completed." : "העברת הבעלות על {path} לידי {user} ממך הושלמה.",
- "The ownership transfer of {path} from {user} has completed." : "העברת הבעלות על {path} לידי {user} הושלמה.",
- "in %s" : "ב־%s",
- "File Management" : "ניהול קבצים",
- "Transfer ownership of a file or folder" : "העברת בעלות על קובץ או תיקייה",
- "Choose file or folder to transfer" : "נא לבחור קובץ או תיקייה להעברה",
- "Change" : "שינוי",
- "New owner" : "בעלים חדשים",
- "Search users" : "חיפוש משתמשים",
- "Choose a file or folder to transfer" : "נא לבחור קובץ או תיקייה להעברה",
- "Transfer" : "העברה",
- "Transfer {path} to {userid}" : "העברת {path} לידי {userid}",
- "Invalid path selected" : "הנתיב שנבחר שגוי",
- "Ownership transfer request sent" : "נשלחה בקשת העברת בעלות",
- "Cannot transfer ownership of a file or folder you don't own" : "אין לך אפשרות להעביר בעלות על קובץ או תיקייה שאין לך בעלות עליהם",
- "Tags" : "תגיות",
- "Unable to change the favourite state of the file" : "לא ניתן לשנות את מצב ההעדפה של הקובץ",
- "Error while loading the file data" : "שגיאה בטעינת נתוני הקובץ",
- "Cancel" : "ביטול",
- "Create" : "יצירה",
- "%s used" : "%s בשימוש",
- "%s%% of %s used" : "%s%% מתוך %s בשימוש",
- "%1$s of %2$s used" : "%1$s מתוך %2$s בשימוש",
- "Settings" : "הגדרות",
- "Show hidden files" : "הצגת קבצים נסתרים",
- "Crop image previews" : "חיתוך תצוגות מקדימות של תמונות",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "יש להשתמש בכתובת הזאת כדי לגשת לקבצים שלך דרך WebDAV",
- "Toggle grid view" : "החלפת תצוגת טבלה",
- "No files in here" : "אין כאן קבצים",
- "Upload some content or sync with your devices!" : "יש להעלות קצת תוכן או לסנכרן עם ההתקנים שלך!",
- "No entries found in this folder" : "לא נמצאו כניסות לתיקייה זו",
- "Select all" : "לבחור הכול",
- "Upload too large" : "העלאה גדולה מידי",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
- "No favorites yet" : "אין מועדפים עדיין",
- "Files and folders you mark as favorite will show up here" : "קבצים ותיקיות שסומנו על ידך כמועדפים יוצגו כאן",
- "Deleted files" : "קבצים שנמחקו",
- "Shares" : "שיתופים",
- "Shared with others" : "משותף עם אחרים",
- "Shared with you" : "משותף אתך",
- "Shared by link" : "משותף על ידי קישור",
- "Deleted shares" : "שיתופים שנמחקו",
- "Pending shares" : "שיתופים ממתינים",
- "Text file" : "קובץ טקסט",
- "New text file.txt" : "קובץ טקסט חדש.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "האחסון של {owner} מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "תיקיית הקבוצה \"{mountPoint}\" מלאה, לא ניתן לעדכן או לסנכרן קבצים יותר!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "האחסון החיצוני \"{mountPoint}\" מלא, לא ניתן לעדכן או לסנכרן קבצים יותר!",
- "Your storage is full, files can not be updated or synced anymore!" : "האחסון שלך מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
- "_matches '{filter}'_::_match '{filter}'_" : ["מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'"]
-},
-"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;");
diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json
deleted file mode 100644
index 170a32aaeb3..00000000000
--- a/apps/files/l10n/he.json
+++ /dev/null
@@ -1,196 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "האחסון אינו זמין באופן זמני",
- "Storage invalid" : "אחסון לא חוקי",
- "Unknown error" : "שגיאה בלתי ידועה",
- "File could not be found" : "הקובץ לא ניתן לאיתור",
- "Move or copy" : "העברה או העתקה",
- "Download" : "הורדה",
- "Delete" : "מחיקה",
- "Home" : "בית",
- "Close" : "סגירה",
- "Favorites" : "מועדפים",
- "Could not create folder \"{dir}\"" : "לא ניתן ליצור את התיקייה \"{dir}\"",
- "This will stop your current uploads." : "פעולה זו תעצור את השליחות הנוכחיות שלך.",
- "Upload cancelled." : "ההעלאה בוטלה.",
- "Processing files …" : "הקבצים עוברים עיבוד…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "לא ניתן להעלות {filename} כיוון שמדובר בתיקייה או שגודלו 0 בייט",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "לא קיים מספיק מקום פנוי, הקובץ המיועד להעלאה {size1} אבל נשאר {size2} בלבד",
- "Target folder \"{dir}\" does not exist any more" : "תיקיית היעד „{dir}” לא קיים עוד",
- "Not enough free space" : "אין מספיק מקום פנוי",
- "An unknown error has occurred" : "אירעה שגיאה בלתי ידועה",
- "Uploading …" : "מתבצעת העלאה…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} מתוך {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "העלאת הפריט הזה אינה נתמכת",
- "Target folder does not exist any more" : "תיקיית היעד אינה קיימת עוד",
- "Operation is blocked by access control" : "הפעולה נחסמה על ידי בקרת גישה",
- "Error when assembling chunks, status code {status}" : "שגיאה באיסוף הנתחים, קוד המצב {status}",
- "Actions" : "פעולות",
- "Rename" : "שינוי שם",
- "Copy" : "העתקה",
- "Choose target folder" : "נא לבחור תיקיית יעד",
- "Open" : "פתיחה",
- "Delete file" : "מחיקת קבצים",
- "Delete folder" : "מחיקת תיקייה",
- "Disconnect storage" : "ניתוק אחסון",
- "Leave this share" : "לעזוב את השיתוף הזה",
- "Could not load info for file \"{file}\"" : "לא ניתן לטעון מידע על הקובץ „{file}”",
- "Files" : "קבצים",
- "Details" : "פרטים",
- "Select" : "בחר",
- "Pending" : "ממתין",
- "Unable to determine date" : "לא ניתן לקבוע תאריך",
- "This operation is forbidden" : "פעולה זו אסורה",
- "This directory is unavailable, please check the logs or contact the administrator" : "תיקייה זו לא קיימת, יש לבדוק את הלוגים או ליצור קשר עם המנהל",
- "Could not move \"{file}\", target exists" : "לא ניתן להעביר \"{file}\", קובץ מטרה קיים",
- "Could not move \"{file}\"" : "לא ניתן להעביר \"{file}\"",
- "copy" : "עותק",
- "Could not copy \"{file}\", target exists" : "לא ניתן להעתיק את „{file}”, היעד קיים",
- "Could not copy \"{file}\"" : "לא ניתן להעתיק את „{file}”",
- "Copied {origin} inside {destination}" : "{origin} הועתק לתוך {destination} ",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "הועתקו {origin} ו־{nbfiles} קבצים אחרים לתוך {destination}",
- "{newName} already exists" : "{newName} כבר קיים",
- "Could not rename \"{fileName}\", it does not exist any more" : "לא ניתן לשנות שם \"{fileName}\", הוא כבר לא קיים יותר",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "השם \"{targetName}\" כבר קיים בתיקייה \"{dir}\". יש לבחור שם אחר.",
- "Could not rename \"{fileName}\"" : "לא ניתן לשנות את השם \"{fileName}\"",
- "Could not create file \"{file}\"" : "לא ניתן ליצור את הקובץ \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "לא ניתן ליצור את הקובץ \"{file}\" כיוון שהוא כבר קיים",
- "Could not create folder \"{dir}\" because it already exists" : "לא ניתן ליצור את התיקייה \"{dir}\" כיוון שהיא כבר קיימת",
- "Could not fetch file details \"{file}\"" : "לא ניתן לקבל את פרטי הקובץ „{file}”",
- "Error deleting file \"{fileName}\"." : "שגיאה בזמן מחיקת קובץ \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "אין תוצאות חיפוש בתיקיות אחרות עבור {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "יש להקליד למעלה משני תווים כדי לחפש בתיקיות אחרות",
- "Name" : "שם",
- "Size" : "גודל",
- "Modified" : "זמן שינוי",
- "_%n folder_::_%n folders_" : ["%n תיקייה","%n תיקיות","%n תיקיות","%n תיקיות"],
- "_%n file_::_%n files_" : ["%n קובץ","%n קבצים","%n קבצים","%n קבצים"],
- "{dirs} and {files}" : "{dirs} וכן {files}",
- "_including %n hidden_::_including %n hidden_" : ["לרבות %n מוסתר","לרבות %n מוסתרים","לרבות %n מוסתרים","לרבות %n מוסתרים"],
- "You don’t have permission to upload or create files here" : "אין לך הרשאות להעלות או ליצור קבצים כאן",
- "_Uploading %n file_::_Uploading %n files_" : ["מעלה %n קובץ","מעלה %n קבצים","מעלה %n קבצים","מעלה %n קבצים"],
- "New" : "חדש",
- "Select file range" : "בחירת טווח קבצים",
- "{used} of {quota} used" : "{used} מתוך {quota} בשימוש",
- "{used} used" : "{used} בשימוש",
- "\"{name}\" is an invalid file name." : "\"{name}\" הנו שם קובץ לא חוקי.",
- "File name cannot be empty." : "שם קובץ אינו יכול להיות ריק",
- "\"/\" is not allowed inside a file name." : "אסור להשתמש ב־„/” בתוך שם קובץ.",
- "\"{name}\" is not an allowed filetype" : "סוד הקובץ „{name}” אינו מורשה",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "התיקיה הקבוצתית \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "האחסון שלך כמעט מלא ({usedSpacePercent}%).",
- "View in folder" : "הצג בתיקייה",
- "Copied!" : "ההעתקה הושלמה!",
- "Copy direct link (only works for users who have access to this file/folder)" : "העתקת קישור ישיר (עובד רק עבור משתמשים שיש להם גישה לקובץ/תיקייה זו)",
- "Path" : "נתיב",
- "_%n byte_::_%n bytes_" : ["%n בייט","%n בייטים","%n בייטים","%n בייטים"],
- "Favorited" : "מועדף",
- "Favorite" : "מועדף",
- "You can only favorite a single file or folder at a time" : "ניתן להוסיף קובץ או תיקייה בודדים כמועדף בכל פעם",
- "New folder" : "תיקייה חדשה",
- "Upload file" : "העלאת קובץ",
- "Recent" : "אחרונים",
- "Not favorited" : "לא במועדפים",
- "Remove from favorites" : "הסרה מהמועדפים",
- "Add to favorites" : "הוספה למועדפים",
- "An error occurred while trying to update the tags" : "שגיאה אירעה בזמן עדכון התגיות",
- "Added to favorites" : "נוסף למועדפים",
- "Removed from favorites" : "הוסר מהמועדפים",
- "You added {file} to your favorites" : "הוספת את {file} למועדפים שלך",
- "You removed {file} from your favorites" : "הסרת את {file} מהמועדפים שלך",
- "File changes" : "שינויים בקובץ",
- "Created by {user}" : "נוצר על ידי {user}",
- "Changed by {user}" : "נערך על ידי {user}",
- "Deleted by {user}" : "נמחק על ידי {user}",
- "Restored by {user}" : "שוחזר על ידי {user}",
- "Renamed by {user}" : "השם השתנה על ידי {user}",
- "Moved by {user}" : "הועבר על ידי {user}",
- "\"remote user\"" : "„משתמש מרוחק”",
- "You created {file}" : "יצרת את {file}",
- "You created an encrypted file in {file}" : "יצרת קובץ מוצפן בתוך {file}",
- "{user} created {file}" : " {file} נוצר על ידי {user}",
- "{user} created an encrypted file in {file}" : "נוצר קובץ מוצפן בתוך {file} על ידי {user}",
- "{file} was created in a public folder" : "{file} נוצר בתוך תיקייה ציבורית",
- "You changed {file}" : "שינית את {file}",
- "You changed an encrypted file in {file}" : "שינית קובץ מוצפן בתוך {file}",
- "{user} changed {file}" : "{file} נערך על ידי {user}",
- "{user} changed an encrypted file in {file}" : "קובץ מוצפן בתוך {file} נערך על ידי {user}",
- "You deleted {file}" : "מחקת את {file}",
- "You deleted an encrypted file in {file}" : "מחקת קובץ מוצפן תחת {file}",
- "{user} deleted {file}" : "{file} נמחק על ידי {user}",
- "{user} deleted an encrypted file in {file}" : "קובץ מוצפן בתוך {file} נמחק על ידי {user}",
- "You restored {file}" : "שחזרת את {file}",
- "{user} restored {file}" : "{file} שוחזר על ידי {user}",
- "You renamed {oldfile} to {newfile}" : "שינית את השם של {oldfile} לשם {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "השם של {oldfile} השתנה אל {newfile} על ידי {user}",
- "You moved {oldfile} to {newfile}" : "העברת את {oldfile} אל {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{oldfile} הועבר אל {newfile} על ידי {user}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "קובץ נוסף או הוסר מה<strong>מועדפים</strong> שלך",
- "A file or folder has been <strong>changed</strong>" : "קובץ או תיקייה <strong>שונו<strong/>",
- "A favorite file or folder has been <strong>changed</strong>" : "קובץ או תיקייה מהמועדפים <strong>נערכו</strong>",
- "All files" : "כל הקבצים",
- "Unlimited" : "ללא הגבלה",
- "Upload (max. %s)" : "העלאה (מקסימום %s)",
- "Accept" : "קבלה",
- "Reject" : "דחייה",
- "Incoming ownership transfer from {user}" : "העברת בעלות נכנסת מאת {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "לקבל את {path}?\n\nלתשומת לך: תהליך ההעברה לאחר האישור עשוי לארוך עד כשעה.",
- "Ownership transfer failed" : "העברת הבעלות נכשלה",
- "Your ownership transfer of {path} to {user} failed." : "העברת הבעלות על {path} לידי {user} ממך נכשלה.",
- "The ownership transfer of {path} from {user} failed." : "העברת הבעלות על {path} לידי {user} נכשלה.",
- "Ownership transfer done" : "העברת הבעלות הושלמה",
- "Your ownership transfer of {path} to {user} has completed." : "העברת הבעלות על {path} לידי {user} ממך הושלמה.",
- "The ownership transfer of {path} from {user} has completed." : "העברת הבעלות על {path} לידי {user} הושלמה.",
- "in %s" : "ב־%s",
- "File Management" : "ניהול קבצים",
- "Transfer ownership of a file or folder" : "העברת בעלות על קובץ או תיקייה",
- "Choose file or folder to transfer" : "נא לבחור קובץ או תיקייה להעברה",
- "Change" : "שינוי",
- "New owner" : "בעלים חדשים",
- "Search users" : "חיפוש משתמשים",
- "Choose a file or folder to transfer" : "נא לבחור קובץ או תיקייה להעברה",
- "Transfer" : "העברה",
- "Transfer {path} to {userid}" : "העברת {path} לידי {userid}",
- "Invalid path selected" : "הנתיב שנבחר שגוי",
- "Ownership transfer request sent" : "נשלחה בקשת העברת בעלות",
- "Cannot transfer ownership of a file or folder you don't own" : "אין לך אפשרות להעביר בעלות על קובץ או תיקייה שאין לך בעלות עליהם",
- "Tags" : "תגיות",
- "Unable to change the favourite state of the file" : "לא ניתן לשנות את מצב ההעדפה של הקובץ",
- "Error while loading the file data" : "שגיאה בטעינת נתוני הקובץ",
- "Cancel" : "ביטול",
- "Create" : "יצירה",
- "%s used" : "%s בשימוש",
- "%s%% of %s used" : "%s%% מתוך %s בשימוש",
- "%1$s of %2$s used" : "%1$s מתוך %2$s בשימוש",
- "Settings" : "הגדרות",
- "Show hidden files" : "הצגת קבצים נסתרים",
- "Crop image previews" : "חיתוך תצוגות מקדימות של תמונות",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "יש להשתמש בכתובת הזאת כדי לגשת לקבצים שלך דרך WebDAV",
- "Toggle grid view" : "החלפת תצוגת טבלה",
- "No files in here" : "אין כאן קבצים",
- "Upload some content or sync with your devices!" : "יש להעלות קצת תוכן או לסנכרן עם ההתקנים שלך!",
- "No entries found in this folder" : "לא נמצאו כניסות לתיקייה זו",
- "Select all" : "לבחור הכול",
- "Upload too large" : "העלאה גדולה מידי",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
- "No favorites yet" : "אין מועדפים עדיין",
- "Files and folders you mark as favorite will show up here" : "קבצים ותיקיות שסומנו על ידך כמועדפים יוצגו כאן",
- "Deleted files" : "קבצים שנמחקו",
- "Shares" : "שיתופים",
- "Shared with others" : "משותף עם אחרים",
- "Shared with you" : "משותף אתך",
- "Shared by link" : "משותף על ידי קישור",
- "Deleted shares" : "שיתופים שנמחקו",
- "Pending shares" : "שיתופים ממתינים",
- "Text file" : "קובץ טקסט",
- "New text file.txt" : "קובץ טקסט חדש.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "האחסון של {owner} מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "תיקיית הקבוצה \"{mountPoint}\" מלאה, לא ניתן לעדכן או לסנכרן קבצים יותר!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "האחסון החיצוני \"{mountPoint}\" מלא, לא ניתן לעדכן או לסנכרן קבצים יותר!",
- "Your storage is full, files can not be updated or synced anymore!" : "האחסון שלך מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
- "_matches '{filter}'_::_match '{filter}'_" : ["מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'"]
-},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js
deleted file mode 100644
index bd8af2283db..00000000000
--- a/apps/files/l10n/hr.js
+++ /dev/null
@@ -1,218 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Pohrana privremeno nije dostupna",
- "Storage invalid" : "Neispravna pohrana",
- "Unknown error" : "Nepoznata pogreška",
- "File could not be found" : "Datoteka nije pronađena",
- "Move or copy" : "Premjesti ili kopiraj",
- "Download" : "Preuzmi",
- "Delete" : "Izbriši",
- "Home" : "Početna",
- "Close" : "Zatvori",
- "Favorites" : "Favoriti",
- "Could not create folder \"{dir}\"" : "Nije moguće stvoriti mapu „{dir}”",
- "This will stop your current uploads." : "Ovo će zaustaviti vaše trenutačne otpreme.",
- "Upload cancelled." : "Otpremanje je prekinuto.",
- "Processing files …" : "Obrada datoteka...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće otpremiti {filename} jer je direktorij ili ima 0 bajta",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, otpremate {size1} a preostalo je samo {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa „{dir}” više ne postoji",
- "Not enough free space" : "Nema dovoljno slobodnog prostora",
- "An unknown error has occurred" : "Došlo je do nepoznate pogreške",
- "Uploading …" : "Otpremanje...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nije podržano otpremanje ove stavke",
- "Target folder does not exist any more" : "Ciljna mapa više ne postoji",
- "Operation is blocked by access control" : "Radnju je blokirala kontrola pristupa",
- "Error when assembling chunks, status code {status}" : "Pogreška prilikom sastavljanja komada, šifra statusa {status}",
- "Actions" : "Radnje",
- "Rename" : "Preimenuj",
- "Copy" : "Kopiraj",
- "Choose target folder" : "Odaberi ciljnu mapu",
- "Open" : "Otvori",
- "Delete file" : "Izbriši datoteku",
- "Delete folder" : "Izbriši mapu",
- "Disconnect storage" : "Odspoji pohranu",
- "Leave this share" : "Napustite ovo dijeljenje",
- "Could not load info for file \"{file}\"" : "Nije moguće učitati podatke za datoteku „{file}”",
- "Files" : "Datoteke",
- "Details" : "Pojedinosti",
- "Select" : "Odaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Nije moguće odrediti datum",
- "This operation is forbidden" : "Ova radnja je zabranjena",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ovaj direktorij je nedostupan, provjerite zapise ili se obratite administratoru",
- "Could not move \"{file}\", target exists" : "Neuspješno premještanje „{file}”, ciljna datoteka postoji",
- "Could not move \"{file}\"" : "Neuspješno premještanje „{file}”",
- "copy" : "kopiraj",
- "Could not copy \"{file}\", target exists" : "Neuspješno kopiranje „{file}”, ciljna datoteka postoji",
- "Could not copy \"{file}\"" : "Neuspješno kopiranje „{file}”",
- "Copied {origin} inside {destination}" : "Kopirano {origin} unutar {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} i {nbfiles} ostalih datoteka unutar {destination}",
- "{newName} already exists" : "{newName} već postoji",
- "Could not rename \"{fileName}\", it does not exist any more" : "Neuspješno preimenovanje „{fileName}”, datoteka više ne postoji",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Naziv „{targetName}” upotrebljava se u mapi „{dir}”. Odaberite drugi naziv.",
- "Could not rename \"{fileName}\"" : "Neuspješno preimenovanje „{fileName}”",
- "Could not create file \"{file}\"" : "Nije moguće stvoriti datoteku „{file}”",
- "Could not create file \"{file}\" because it already exists" : "Nije moguće stvoriti datoteku „{file}” jer već postoji",
- "Could not create folder \"{dir}\" because it already exists" : "Nije moguće stvoriti mapu „{dir}” jer već postoji",
- "Could not fetch file details \"{file}\"" : "Neuspješno dohvaćanje pojedinosti o datoteci „{file}“",
- "Error deleting file \"{fileName}\"." : "Pogreška pri brisanju datoteke „{fileName}”.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nema rezultata pretraživanja u drugim mapama za {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Unesite više od dva znaka za pretraživanje u drugim mapama",
- "Name" : "Naziv",
- "Size" : "Veličina",
- "Modified" : "Promijenjeno",
- "_%n folder_::_%n folders_" : ["%n mapa","%n mapa","%n mapa"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteka","%n datoteka"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "_including %n hidden_::_including %n hidden_" : ["uključujući %n skrivenih","uključujući %n skrivenih","uključujući %n skrivenih"],
- "You don’t have permission to upload or create files here" : "Ovdje ne smijete otpremati ili stvarati datoteke",
- "_Uploading %n file_::_Uploading %n files_" : ["Otpremanje %n datoteku","Prenosim %n datoteka","Prenosim %n datoteka"],
- "New" : "Novo",
- "Select file range" : "Odaberi raspon datoteka",
- "{used} of {quota} used" : "Iskorišteno {used} od {quota}",
- "{used} used" : "Iskorišteno {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.",
- "File name cannot be empty." : "Naziv datoteke ne može biti prazan.",
- "\"/\" is not allowed inside a file name." : "„/” nije dopušteno unutar naziva datoteke.",
- "\"{name}\" is not an allowed filetype" : "„{name}” nije dopuštena vrsta datoteke",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Pohrana {owner} je puna, datoteke više nije moguće ažurirati niti sinkronizirati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Mapa grupe „{mountPoint}“ je puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Vanjsko spremište za pohranu „{mountPoint}“ je puno, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaša je pohrana puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Pohrana {owner} je skoro puna ({usedSpacePercent} %).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Mapa grupe „{mountPoint}“ je skoro puna ({usedSpacePercent} %).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Vanjsko spremište za pohranu „{mountPoint}“ je skoro puno ({usedSpacePercent} %).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent} %).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odgovara „{filter}“","podudaranje „{filter}“","podudaranje „{filter}“"],
- "View in folder" : "Prikaži u mapi",
- "Copied!" : "Kopirano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiraj izravnu poveznicu (samo za korisnike koji smiju pristupiti ovoj datoteci/mapi)",
- "Path" : "Put",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajtova","%n bajtova"],
- "Favorited" : "Favorit",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Istovremeno možete označiti samo jednu datoteku ili mapu kao favorita",
- "New folder" : "Nova mapa",
- "Upload file" : "Otpremi datoteku",
- "Recent" : "Nedavni",
- "Not favorited" : "Nije označeno kao favorit",
- "Remove from favorites" : "Ukloni iz favorita",
- "Add to favorites" : "Dodaj u favorite",
- "An error occurred while trying to update the tags" : "Došlo je do pogreške prilikom ažuriranja oznaka",
- "Added to favorites" : "Dodano u favorite",
- "Removed from favorites" : "Uklonjeno iz favorita",
- "You added {file} to your favorites" : "Dodali ste {file} u svoje favorite",
- "You removed {file} from your favorites" : "Uklonili ste {file} iz svojih favorita",
- "File changes" : "Promjene datoteka",
- "Created by {user}" : "Stvorio {user}",
- "Changed by {user}" : "Izmijenio {user}",
- "Deleted by {user}" : "Izbrisao {user}",
- "Restored by {user}" : "Vratio {user}",
- "Renamed by {user}" : "Preimenovao {user}",
- "Moved by {user}" : "Premjestio {user}",
- "\"remote user\"" : "„udaljeni korisnik”",
- "You created {file}" : "Stvorili ste {file}",
- "You created an encrypted file in {file}" : "Stvorili ste šifriranu datoteku u {file}",
- "{user} created {file}" : "{user} je stvorio {file}",
- "{user} created an encrypted file in {file}" : "{user} je stvorio šifriranu datoteku u {file}",
- "{file} was created in a public folder" : "{file} je stvorena u javnoj mapi",
- "You changed {file}" : "Promijenili ste {file}",
- "You changed an encrypted file in {file}" : "Promijenili ste šifriranu datoteku u {file}",
- "{user} changed {file}" : "{user} je promijenio {file}",
- "{user} changed an encrypted file in {file}" : "{user} je promijenio šifriranu datoteku u {file}",
- "You deleted {file}" : "Izbrisali ste {file}",
- "You deleted an encrypted file in {file}" : "Izbrisali ste šifriranu datoteku u {file}",
- "{user} deleted {file}" : "{user} je izbrisao {file}",
- "{user} deleted an encrypted file in {file}" : "{user} je izbrisao šifriranu datoteku u {file}",
- "You restored {file}" : "Vratili ste {file}",
- "{user} restored {file}" : "{user} je vratio {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Preimenovali ste {oldfile} (skriveno) u {newfile} (skriveno)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Preimenovali ste {oldfile} (skriveno) u {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Preimenovali ste {oldfile} u {newfile} (skriveno)",
- "You renamed {oldfile} to {newfile}" : "Preimenovali ste {oldfile} u {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} je preimenovao {oldfile} (skriveno) u {newfile} (skriveno)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} je preimenovao {oldfile} (skriveno) u {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} je preimenovao {oldfile} u {newfile} (skriveno)",
- "{user} renamed {oldfile} to {newfile}" : "{user} je preimenovao {oldfile} u {newfile}",
- "You moved {oldfile} to {newfile}" : "Premjestili ste {oldfile} u {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} je premjestio {oldfile} u {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je dodana ili uklonjena iz vaših <strong>favorita</strong>",
- "A file or folder has been <strong>changed</strong>" : "Datoteka ili mapa su <strong>promijenjeni</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Omiljena datoteka ili mapa je <strong>promijenjena</strong>",
- "All files" : "Sve datoteke",
- "Unlimited" : "Neograničeno",
- "Upload (max. %s)" : "Otprema (maks. %s)",
- "Accept" : "Prihvati",
- "Reject" : "Odbij",
- "Incoming ownership transfer from {user}" : "Dolazni prijenos vlasništva od {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Želite li prihvatiti {path}?\n\nNapomena: nakon prihvaćanja prijenos može potrajati do sat vremena.",
- "Ownership transfer failed" : "Prijenos vlasništva nije uspio",
- "Your ownership transfer of {path} to {user} failed." : "Nije uspio vaš prijenos vlasništva {path} na {user}.",
- "The ownership transfer of {path} from {user} failed." : "Nije uspio prijenos vlasništva {path} od {user}.",
- "Ownership transfer done" : "Prijenos vlasništva je završen",
- "Your ownership transfer of {path} to {user} has completed." : "Vaš prijenos vlasništva {path} na {user} je završen.",
- "The ownership transfer of {path} from {user} has completed." : "Prijenos vlasništva {path} od {user} je završen.",
- "in %s" : "za %s",
- "File Management" : "Upravljanje datotekama",
- "Transfer ownership of a file or folder" : "Prenesi vlasništvo nad datotekom ili mapom",
- "Choose file or folder to transfer" : "Odaberite datoteku ili mapu za prijenos",
- "Change" : "Promijeni",
- "New owner" : "Novi vlasnik",
- "Search users" : "Pretraži korisnike",
- "Choose a file or folder to transfer" : "Odaberite datoteku ili mapu za prijenos",
- "Transfer" : "Prijenos",
- "Transfer {path} to {userid}" : "Prijenos {path} na {userid}",
- "Invalid path selected" : "Odabran nevažeći put",
- "Ownership transfer request sent" : "Zahtjev za prijenos vlasništva je poslan",
- "Cannot transfer ownership of a file or folder you don't own" : "Ne možete prenijeti vlasništvo nad datotekom ili mapom koja nije u vašem vlasništvu",
- "Tags" : "Oznake",
- "Unable to change the favourite state of the file" : "Nije moguće promijeniti status favorita datoteke",
- "Error while loading the file data" : "Pogreška pri učitavanju podataka iz datoteke",
- "Pick a template for {name}" : "Odaberite predložak za {name}",
- "Cancel" : "Odustani",
- "Create" : "Stvori",
- "Create a new file with the selected template" : "Stvorite novu datoteku s odabranim predloškom",
- "Creating file" : "Stvaranje datoteke",
- "Blank" : "Prazno",
- "Unable to create new file from template" : "Nije moguće stvoriti novu datoteku iz predloška",
- "Set up templates folder" : "Postavi mapu predložaka",
- "Templates" : "Predlošci",
- "Unable to initialize the templates directory" : "Nije moguće inicijalizirati direktorij predložaka",
- "%s used" : "Iskorišteno %s",
- "%s%% of %s used" : "Iskorišteno %s%% od %s",
- "%1$s of %2$s used" : "Iskorišteno %1$s od %2$s",
- "Settings" : "Postavke",
- "Show hidden files" : "Prikaz skrivenih datoteka",
- "Crop image previews" : "Obreži pretpreglede slika",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Upotrijebite ovu adresu za pristupanje svojim datotekama putem WebDAVa",
- "Toggle %1$s sublist" : "Uključivanje/isključivanje potpopisa %1$s",
- "Toggle grid view" : "Uključi/isključi prikaz rešetke",
- "No files in here" : "Nema datoteka",
- "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinkronizirajte sa svojim uređajima!",
- "No entries found in this folder" : "U ovoj mapi nisu pronađeni nikakvi zapisi",
- "Select all" : "Odaberi sve",
- "Upload too large" : "Otprema je prevelika",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate otpremiti premašuju maksimalnu veličinu za otpremu datoteka na ovom poslužitelju.",
- "No favorites yet" : "Još nema favorita",
- "Files and folders you mark as favorite will show up here" : "Ovdje će se prikazati datoteke i mape koje označite kao favorite",
- "Deleted files" : "Izbrisane datoteke",
- "Shares" : "Dijeljenja",
- "Shared with others" : "Podijeljeno s ostalima",
- "Shared with you" : "Podijeljeno s vama",
- "Shared by link" : "Podijeljeno putem poveznice",
- "Deleted shares" : "Izbrisana dijeljenja",
- "Pending shares" : "Dijeljenja na čekanju",
- "Text file" : "Tekstna datoteka",
- "New text file.txt" : "Nova tekstna datoteka.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Pohrana {owner} je puna, datoteke više nije moguće ažurirati niti sinkronizirati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Mapa grupe „{mountPoint}“ je puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Vanjsko spremište za pohranu „{mountPoint}“ je puno, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaša je pohrana puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["odgovara '{filter}'","podudaranje '{filter}'","podudaranje '{filter}'"]
-},
-"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json
deleted file mode 100644
index 5d72e02bee7..00000000000
--- a/apps/files/l10n/hr.json
+++ /dev/null
@@ -1,216 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Pohrana privremeno nije dostupna",
- "Storage invalid" : "Neispravna pohrana",
- "Unknown error" : "Nepoznata pogreška",
- "File could not be found" : "Datoteka nije pronađena",
- "Move or copy" : "Premjesti ili kopiraj",
- "Download" : "Preuzmi",
- "Delete" : "Izbriši",
- "Home" : "Početna",
- "Close" : "Zatvori",
- "Favorites" : "Favoriti",
- "Could not create folder \"{dir}\"" : "Nije moguće stvoriti mapu „{dir}”",
- "This will stop your current uploads." : "Ovo će zaustaviti vaše trenutačne otpreme.",
- "Upload cancelled." : "Otpremanje je prekinuto.",
- "Processing files …" : "Obrada datoteka...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće otpremiti {filename} jer je direktorij ili ima 0 bajta",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, otpremate {size1} a preostalo je samo {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa „{dir}” više ne postoji",
- "Not enough free space" : "Nema dovoljno slobodnog prostora",
- "An unknown error has occurred" : "Došlo je do nepoznate pogreške",
- "Uploading …" : "Otpremanje...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nije podržano otpremanje ove stavke",
- "Target folder does not exist any more" : "Ciljna mapa više ne postoji",
- "Operation is blocked by access control" : "Radnju je blokirala kontrola pristupa",
- "Error when assembling chunks, status code {status}" : "Pogreška prilikom sastavljanja komada, šifra statusa {status}",
- "Actions" : "Radnje",
- "Rename" : "Preimenuj",
- "Copy" : "Kopiraj",
- "Choose target folder" : "Odaberi ciljnu mapu",
- "Open" : "Otvori",
- "Delete file" : "Izbriši datoteku",
- "Delete folder" : "Izbriši mapu",
- "Disconnect storage" : "Odspoji pohranu",
- "Leave this share" : "Napustite ovo dijeljenje",
- "Could not load info for file \"{file}\"" : "Nije moguće učitati podatke za datoteku „{file}”",
- "Files" : "Datoteke",
- "Details" : "Pojedinosti",
- "Select" : "Odaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Nije moguće odrediti datum",
- "This operation is forbidden" : "Ova radnja je zabranjena",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ovaj direktorij je nedostupan, provjerite zapise ili se obratite administratoru",
- "Could not move \"{file}\", target exists" : "Neuspješno premještanje „{file}”, ciljna datoteka postoji",
- "Could not move \"{file}\"" : "Neuspješno premještanje „{file}”",
- "copy" : "kopiraj",
- "Could not copy \"{file}\", target exists" : "Neuspješno kopiranje „{file}”, ciljna datoteka postoji",
- "Could not copy \"{file}\"" : "Neuspješno kopiranje „{file}”",
- "Copied {origin} inside {destination}" : "Kopirano {origin} unutar {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} i {nbfiles} ostalih datoteka unutar {destination}",
- "{newName} already exists" : "{newName} već postoji",
- "Could not rename \"{fileName}\", it does not exist any more" : "Neuspješno preimenovanje „{fileName}”, datoteka više ne postoji",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Naziv „{targetName}” upotrebljava se u mapi „{dir}”. Odaberite drugi naziv.",
- "Could not rename \"{fileName}\"" : "Neuspješno preimenovanje „{fileName}”",
- "Could not create file \"{file}\"" : "Nije moguće stvoriti datoteku „{file}”",
- "Could not create file \"{file}\" because it already exists" : "Nije moguće stvoriti datoteku „{file}” jer već postoji",
- "Could not create folder \"{dir}\" because it already exists" : "Nije moguće stvoriti mapu „{dir}” jer već postoji",
- "Could not fetch file details \"{file}\"" : "Neuspješno dohvaćanje pojedinosti o datoteci „{file}“",
- "Error deleting file \"{fileName}\"." : "Pogreška pri brisanju datoteke „{fileName}”.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nema rezultata pretraživanja u drugim mapama za {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Unesite više od dva znaka za pretraživanje u drugim mapama",
- "Name" : "Naziv",
- "Size" : "Veličina",
- "Modified" : "Promijenjeno",
- "_%n folder_::_%n folders_" : ["%n mapa","%n mapa","%n mapa"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteka","%n datoteka"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "_including %n hidden_::_including %n hidden_" : ["uključujući %n skrivenih","uključujući %n skrivenih","uključujući %n skrivenih"],
- "You don’t have permission to upload or create files here" : "Ovdje ne smijete otpremati ili stvarati datoteke",
- "_Uploading %n file_::_Uploading %n files_" : ["Otpremanje %n datoteku","Prenosim %n datoteka","Prenosim %n datoteka"],
- "New" : "Novo",
- "Select file range" : "Odaberi raspon datoteka",
- "{used} of {quota} used" : "Iskorišteno {used} od {quota}",
- "{used} used" : "Iskorišteno {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.",
- "File name cannot be empty." : "Naziv datoteke ne može biti prazan.",
- "\"/\" is not allowed inside a file name." : "„/” nije dopušteno unutar naziva datoteke.",
- "\"{name}\" is not an allowed filetype" : "„{name}” nije dopuštena vrsta datoteke",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Pohrana {owner} je puna, datoteke više nije moguće ažurirati niti sinkronizirati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Mapa grupe „{mountPoint}“ je puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Vanjsko spremište za pohranu „{mountPoint}“ je puno, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaša je pohrana puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Pohrana {owner} je skoro puna ({usedSpacePercent} %).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Mapa grupe „{mountPoint}“ je skoro puna ({usedSpacePercent} %).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Vanjsko spremište za pohranu „{mountPoint}“ je skoro puno ({usedSpacePercent} %).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent} %).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odgovara „{filter}“","podudaranje „{filter}“","podudaranje „{filter}“"],
- "View in folder" : "Prikaži u mapi",
- "Copied!" : "Kopirano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiraj izravnu poveznicu (samo za korisnike koji smiju pristupiti ovoj datoteci/mapi)",
- "Path" : "Put",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajtova","%n bajtova"],
- "Favorited" : "Favorit",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Istovremeno možete označiti samo jednu datoteku ili mapu kao favorita",
- "New folder" : "Nova mapa",
- "Upload file" : "Otpremi datoteku",
- "Recent" : "Nedavni",
- "Not favorited" : "Nije označeno kao favorit",
- "Remove from favorites" : "Ukloni iz favorita",
- "Add to favorites" : "Dodaj u favorite",
- "An error occurred while trying to update the tags" : "Došlo je do pogreške prilikom ažuriranja oznaka",
- "Added to favorites" : "Dodano u favorite",
- "Removed from favorites" : "Uklonjeno iz favorita",
- "You added {file} to your favorites" : "Dodali ste {file} u svoje favorite",
- "You removed {file} from your favorites" : "Uklonili ste {file} iz svojih favorita",
- "File changes" : "Promjene datoteka",
- "Created by {user}" : "Stvorio {user}",
- "Changed by {user}" : "Izmijenio {user}",
- "Deleted by {user}" : "Izbrisao {user}",
- "Restored by {user}" : "Vratio {user}",
- "Renamed by {user}" : "Preimenovao {user}",
- "Moved by {user}" : "Premjestio {user}",
- "\"remote user\"" : "„udaljeni korisnik”",
- "You created {file}" : "Stvorili ste {file}",
- "You created an encrypted file in {file}" : "Stvorili ste šifriranu datoteku u {file}",
- "{user} created {file}" : "{user} je stvorio {file}",
- "{user} created an encrypted file in {file}" : "{user} je stvorio šifriranu datoteku u {file}",
- "{file} was created in a public folder" : "{file} je stvorena u javnoj mapi",
- "You changed {file}" : "Promijenili ste {file}",
- "You changed an encrypted file in {file}" : "Promijenili ste šifriranu datoteku u {file}",
- "{user} changed {file}" : "{user} je promijenio {file}",
- "{user} changed an encrypted file in {file}" : "{user} je promijenio šifriranu datoteku u {file}",
- "You deleted {file}" : "Izbrisali ste {file}",
- "You deleted an encrypted file in {file}" : "Izbrisali ste šifriranu datoteku u {file}",
- "{user} deleted {file}" : "{user} je izbrisao {file}",
- "{user} deleted an encrypted file in {file}" : "{user} je izbrisao šifriranu datoteku u {file}",
- "You restored {file}" : "Vratili ste {file}",
- "{user} restored {file}" : "{user} je vratio {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Preimenovali ste {oldfile} (skriveno) u {newfile} (skriveno)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Preimenovali ste {oldfile} (skriveno) u {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Preimenovali ste {oldfile} u {newfile} (skriveno)",
- "You renamed {oldfile} to {newfile}" : "Preimenovali ste {oldfile} u {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} je preimenovao {oldfile} (skriveno) u {newfile} (skriveno)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} je preimenovao {oldfile} (skriveno) u {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} je preimenovao {oldfile} u {newfile} (skriveno)",
- "{user} renamed {oldfile} to {newfile}" : "{user} je preimenovao {oldfile} u {newfile}",
- "You moved {oldfile} to {newfile}" : "Premjestili ste {oldfile} u {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} je premjestio {oldfile} u {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je dodana ili uklonjena iz vaših <strong>favorita</strong>",
- "A file or folder has been <strong>changed</strong>" : "Datoteka ili mapa su <strong>promijenjeni</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Omiljena datoteka ili mapa je <strong>promijenjena</strong>",
- "All files" : "Sve datoteke",
- "Unlimited" : "Neograničeno",
- "Upload (max. %s)" : "Otprema (maks. %s)",
- "Accept" : "Prihvati",
- "Reject" : "Odbij",
- "Incoming ownership transfer from {user}" : "Dolazni prijenos vlasništva od {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Želite li prihvatiti {path}?\n\nNapomena: nakon prihvaćanja prijenos može potrajati do sat vremena.",
- "Ownership transfer failed" : "Prijenos vlasništva nije uspio",
- "Your ownership transfer of {path} to {user} failed." : "Nije uspio vaš prijenos vlasništva {path} na {user}.",
- "The ownership transfer of {path} from {user} failed." : "Nije uspio prijenos vlasništva {path} od {user}.",
- "Ownership transfer done" : "Prijenos vlasništva je završen",
- "Your ownership transfer of {path} to {user} has completed." : "Vaš prijenos vlasništva {path} na {user} je završen.",
- "The ownership transfer of {path} from {user} has completed." : "Prijenos vlasništva {path} od {user} je završen.",
- "in %s" : "za %s",
- "File Management" : "Upravljanje datotekama",
- "Transfer ownership of a file or folder" : "Prenesi vlasništvo nad datotekom ili mapom",
- "Choose file or folder to transfer" : "Odaberite datoteku ili mapu za prijenos",
- "Change" : "Promijeni",
- "New owner" : "Novi vlasnik",
- "Search users" : "Pretraži korisnike",
- "Choose a file or folder to transfer" : "Odaberite datoteku ili mapu za prijenos",
- "Transfer" : "Prijenos",
- "Transfer {path} to {userid}" : "Prijenos {path} na {userid}",
- "Invalid path selected" : "Odabran nevažeći put",
- "Ownership transfer request sent" : "Zahtjev za prijenos vlasništva je poslan",
- "Cannot transfer ownership of a file or folder you don't own" : "Ne možete prenijeti vlasništvo nad datotekom ili mapom koja nije u vašem vlasništvu",
- "Tags" : "Oznake",
- "Unable to change the favourite state of the file" : "Nije moguće promijeniti status favorita datoteke",
- "Error while loading the file data" : "Pogreška pri učitavanju podataka iz datoteke",
- "Pick a template for {name}" : "Odaberite predložak za {name}",
- "Cancel" : "Odustani",
- "Create" : "Stvori",
- "Create a new file with the selected template" : "Stvorite novu datoteku s odabranim predloškom",
- "Creating file" : "Stvaranje datoteke",
- "Blank" : "Prazno",
- "Unable to create new file from template" : "Nije moguće stvoriti novu datoteku iz predloška",
- "Set up templates folder" : "Postavi mapu predložaka",
- "Templates" : "Predlošci",
- "Unable to initialize the templates directory" : "Nije moguće inicijalizirati direktorij predložaka",
- "%s used" : "Iskorišteno %s",
- "%s%% of %s used" : "Iskorišteno %s%% od %s",
- "%1$s of %2$s used" : "Iskorišteno %1$s od %2$s",
- "Settings" : "Postavke",
- "Show hidden files" : "Prikaz skrivenih datoteka",
- "Crop image previews" : "Obreži pretpreglede slika",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Upotrijebite ovu adresu za pristupanje svojim datotekama putem WebDAVa",
- "Toggle %1$s sublist" : "Uključivanje/isključivanje potpopisa %1$s",
- "Toggle grid view" : "Uključi/isključi prikaz rešetke",
- "No files in here" : "Nema datoteka",
- "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinkronizirajte sa svojim uređajima!",
- "No entries found in this folder" : "U ovoj mapi nisu pronađeni nikakvi zapisi",
- "Select all" : "Odaberi sve",
- "Upload too large" : "Otprema je prevelika",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate otpremiti premašuju maksimalnu veličinu za otpremu datoteka na ovom poslužitelju.",
- "No favorites yet" : "Još nema favorita",
- "Files and folders you mark as favorite will show up here" : "Ovdje će se prikazati datoteke i mape koje označite kao favorite",
- "Deleted files" : "Izbrisane datoteke",
- "Shares" : "Dijeljenja",
- "Shared with others" : "Podijeljeno s ostalima",
- "Shared with you" : "Podijeljeno s vama",
- "Shared by link" : "Podijeljeno putem poveznice",
- "Deleted shares" : "Izbrisana dijeljenja",
- "Pending shares" : "Dijeljenja na čekanju",
- "Text file" : "Tekstna datoteka",
- "New text file.txt" : "Nova tekstna datoteka.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Pohrana {owner} je puna, datoteke više nije moguće ažurirati niti sinkronizirati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Mapa grupe „{mountPoint}“ je puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Vanjsko spremište za pohranu „{mountPoint}“ je puno, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaša je pohrana puna, datoteke više nije moguće ažurirati ni sinkronizirati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["odgovara '{filter}'","podudaranje '{filter}'","podudaranje '{filter}'"]
-},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js
index 94d32e64b31..e4eed2d145e 100644
--- a/apps/files/l10n/hu.js
+++ b/apps/files/l10n/hu.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
- "Storage invalid" : "A tároló érvénytelen",
- "Unknown error" : "Ismeretlen hiba",
- "File could not be found" : "Fájl nem található",
- "Move or copy" : "Áthelyezés vagy másolás",
- "Download" : "Letöltés",
- "Delete" : "Törlés",
- "Home" : "Saját mappa",
- "Close" : "Bezárás",
- "Favorites" : "Kedvencek",
- "Could not create folder \"{dir}\"" : "A(z) „{dir}” mappa nem hozható létre",
- "This will stop your current uploads." : "Ez meg fogja állítani a jelenlegi feltöltéseket.",
- "Upload cancelled." : "Feltöltés megszakítva.",
- "Processing files …" : "Fájlok feldolgozása…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} fájl nem tölthető fel, mert vagy egy könyvtár, vagy 0 bájtos",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely, a feltöltés mérete {size1}, de csak {size2} hely van",
- "Target folder \"{dir}\" does not exist any more" : "A(z) „{dir}” célmappa már nem létezik",
- "Not enough free space" : "Nincs elég szabad hely",
- "An unknown error has occurred" : "Ismeretlen hiba történt",
- "Uploading …" : "Feltöltés…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Ezen elem feltöltése nem támogatott",
- "Target folder does not exist any more" : "A célmappa már nem létezik",
- "Operation is blocked by access control" : "A hozzáférés-vezérlés letiltotta a műveletet",
- "Error when assembling chunks, status code {status}" : "Hiba a darabok összerakásakor, állapotkód: {status}",
- "Actions" : "Műveletek",
- "Rename" : "Átnevezés",
- "Copy" : "Másolás",
- "Choose target folder" : "Válasszon célmappát",
- "Open" : "Megnyitás",
- "Delete file" : "Fájl törlése",
- "Delete folder" : "Mappa törlése",
- "Disconnect storage" : "Tároló leválasztása",
- "Leave this share" : "Megosztás elhagyása",
- "Could not load info for file \"{file}\"" : "Nem sikerült betölteni a(z) „{file}” fájl információit",
- "Files" : "Fájlok",
- "Details" : "Részletek",
- "Please select tag(s) to add to the selection" : "Válassza ki a kijelöléshez adandó címkéket",
- "Apply tag(s) to selection" : "Címkék alkalmazása a kijelölésre",
- "Select" : "Kiválasztás",
- "Pending" : "Függőben",
- "Unable to determine date" : "Nem lehet meghatározni a dátumot",
- "This operation is forbidden" : "Ez a művelet tiltott",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem érhető el, nézze meg a naplófájlokat vagy lépjen kapcsolatba az adminisztrátorral",
- "Could not move \"{file}\", target exists" : "A(z) „{file}” nem helyezhető át, mert a cél már létezik",
- "Could not move \"{file}\"" : "A(z) „{file}” nem helyezhető át",
- "copy" : "másolat",
- "Could not copy \"{file}\", target exists" : "A(z) „{file}” másolása sikertelen, a cél már létezik",
- "Could not copy \"{file}\"" : "A(z) „{file}” másolása sikertelen",
- "Copied {origin} inside {destination}" : "A(z) {origin} átmásolva ide: {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "A(z) {origin} és {nbfiles} egyéb fájl átmásolva ide: {destination}",
- "{newName} already exists" : "A(z) {newName} már létezik",
- "Could not rename \"{fileName}\", it does not exist any more" : "A(z) „{fileName}” átnevetése sikertelen, mert már nem létezik",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "A(z) „{targetName}” név már használatban van a(z) „{dir}” mappában. Válasszon másik nevet.",
- "Could not rename \"{fileName}\"" : "A(z) „{fileName}” nem nevezhető át",
- "Could not create file \"{file}\"" : "A(z) „{file}” nem hozható létre",
- "Could not create file \"{file}\" because it already exists" : "A(z) „{file}” fájl nem hozható létre, mert már létezik",
- "Could not create folder \"{dir}\" because it already exists" : "A(z) „{dir}” mappa nem hozható létre, mert már létezik",
- "Could not fetch file details \"{file}\"" : "A(z) „{file}” fájl részleteinek lekérése sikertelen",
- "Error deleting file \"{fileName}\"." : "Hiba történt a(z) „{fileName}” fájl törlése során.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek találatok más mappákban: {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Vigyen be legalább két karaktert a más mappákban való kereséshez",
- "Name" : "Név",
- "Size" : "Méret",
- "Modified" : "Módosítva",
- "_%n folder_::_%n folders_" : ["%n mappa","%n mappa"],
- "_%n file_::_%n files_" : ["%n fájl","%n fájl"],
- "{dirs} and {files}" : "{dirs} és {files}",
- "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"],
- "You don’t have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához",
- "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"],
- "New" : "Új",
- "Select file range" : "Válasszon fájltartományt",
- "{used} of {quota} used" : "{used} / {quota} felhasználva",
- "{used} used" : "{used} felhasználva",
- "\"{name}\" is an invalid file name." : "A(z) „{name}” fájlnév érvénytelen.",
- "File name cannot be empty." : "A fájlnév nem lehet üres.",
- "\"/\" is not allowed inside a file name." : "„/” nem szerepelhet fájlnévben.",
- "\"{name}\" is not an allowed filetype" : "A(z) „{name}” nem engedélyezett fájltípus",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} tárolója megtelt, a fájlok többé nem frissíthetők és szinkronizálhatók.q",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” külső tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "Your storage is full, files cannot be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} tárhelye majdnem megtelt ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) \"{mountPoint}\" csoportmappa majdnem megtelt ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) „{mountPoint}” külső tárhely majdnem megtelt ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tárhelye majdnem megtelt ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"],
- "View in folder" : "Megtekintés mappában",
- "Copied!" : "Másolva!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a felhasználóknál működik, akiknek hozzáférése van a fájlhoz/mappához)",
- "Path" : "Útvonal",
- "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
- "Favorited" : "Kedvenc",
- "Favorite" : "Kedvenc",
- "You can only favorite a single file or folder at a time" : "Egyszerre csak egy fájlt vagy mappát jelölhet meg kedvencként",
- "New folder" : "Új mappa",
- "Upload file" : "Fájl feltöltése",
- "Recent" : "Legutóbbi",
- "Not favorited" : "Nincs a kedvencek között",
- "Remove from favorites" : "Eltávolítás a kedvencekből",
- "Add to favorites" : "Hozzáadás a kedvencekhez",
- "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
"Added to favorites" : "Hozzáadva a kedvencekhez",
"Removed from favorites" : "Eltávolítva a kedvencekből",
"You added {file} to your favorites" : "Hozzáadta a kedvencekhez: {file}",
"You removed {file} from your favorites" : "Eltávolította a kedvencek közül: {file}",
+ "Favorites" : "Kedvencek",
"File changes" : "Fájlváltozások",
"Created by {user}" : "Létrehozta: {user}",
"Changed by {user}" : "Módosította: {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Helyreállította: {user}",
"Renamed by {user}" : "Átnevezte: {user}",
"Moved by {user}" : "Áthelyezte: {user}",
- "\"remote user\"" : "„távoli felhasználó”",
+ "\"remote account\"" : "„távoli fiók”",
"You created {file}" : "Létrehozta: {file}",
"You created an encrypted file in {file}" : "Létrehozott egy titkosított fájlt ebben: {file}",
"{user} created {file}" : "{user} létrehozta: {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Áthelyezte a(z) {oldfile} fájlt ide: {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} áthelyezte a(z) {oldfile} fájlt ide: {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Egy fájl eltávolítva vagy hozzáadva a <strong>kedvencekhez</strong>",
+ "Files" : "Fájlok",
"A file or folder has been <strong>changed</strong>" : "Egy fájl vagy mappa <strong>megváltozott</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Egy kedvenc fájl vagy mappa <strong> megváltozott</strong>",
- "All files" : "Az összes fájl",
- "Unlimited" : "Korlátlan",
- "Upload (max. %s)" : "Feltöltés (legfeljebb %s)",
+ "Failed to authorize" : "Sikertelen hitelesítés",
+ "Invalid folder path" : "Érvénytelen mappaútvonal",
+ "Folder not found" : "A mappa nem található",
+ "The file cannot be found" : "A fájl nem található",
+ "The destination path does not exist: %1$s" : "Az elérési útvonal nem létezik: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nincs jogosultsága fájl létrehozására a megadott helyen",
+ "The file could not be converted." : "A fájl nem alakítható át.",
+ "Could not get relative path to converted file" : "Nem sikerült lekérni az átalakított fájl relatív elérési útját",
+ "Favorite files" : "Kedvenc fájlok",
+ "No favorites" : "Nincsenek kedvencek",
+ "More favorites" : "További kedvencek",
"Accept" : "Elfogadás",
"Reject" : "Elutasítás",
"Incoming ownership transfer from {user}" : "Bejövő tulajdonjog-átruházás {user} részéről",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Elfogadja a(z) {path} útvonalat?\n\nMegjegyzés: Az átruházási folyamat akár 1 órát is igénybe vehet az elfogadás után.",
+ "Ownership transfer denied" : "Tulajdonjog átadása visszautasítva",
+ "Your ownership transfer of {path} was denied by {user}." : "A(z) {path} tulajdonjogának átadását {user} visszautasította.",
"Ownership transfer failed" : "Tulajdonjog átadása sikertelen",
"Your ownership transfer of {path} to {user} failed." : "A(z) {path} tulajdonjogának átruházása {user} számára sikertelen.",
"The ownership transfer of {path} from {user} failed." : "A(z) {path} tulajdonjogának átruházása {user} részéről sikertelen.",
@@ -159,62 +67,406 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "A(z) {path} tulajdonjogának átruházása {user} számára befejeződött.",
"The ownership transfer of {path} from {user} has completed." : "A(z) {path} tulajdonjogának átruházása {user} részéről sikeres.",
"in %s" : "itt: %s",
+ "Transferred from %1$s on %2$s" : "Átadva tőle: %1$s, ekkor %2$s",
+ "Files compatibility" : "Fájlok kompatibilitása",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Fájlnevek korlátozásának engedélyezése, amely biztosítja, hogy a fájlok szinkronizálhatók legyenek az összes klienssel. Alapállapotban az összes fájlnév engedélyezett, amely a POSIX (mint a Linux vagy a macOS) rendszereken érvényes.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "A Windows-kompatibilis fájlnevek engedélyezése után a meglévő fájlok már nem módosíthatóak, de a tulajdonosaik átnevezhetik őket érvényes új fájlnevekre.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Továbbá lehetséges a fájlok automatikus átköltöztetése is a beállítás engedélyezése után, kövesse az occ parancs dokumentációját.",
+ "Enforce Windows compatibility" : "Windows-kompatibilitás kényszerítése",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ez megakadályozza a Windows rendszereken érvénytelen fájlneveket, mint például a foglalt neveket vagy a speciális karaktereket. De ez nem fogja érvényesíteni a kis- és nagybetűk egyezőnek tekintését.",
"File Management" : "Fájlkezelés",
- "Transfer ownership of a file or folder" : "Fájl vagy mappa tulajdonjogának átruházása",
- "Choose file or folder to transfer" : "Válasszon egy fájlt vagy mappát az átruházáshoz",
- "Change" : "Módosítás",
- "New owner" : "Új tulajdonos",
- "Search users" : "Fehasználók keresése",
+ "Home" : "Saját mappa",
+ "Target folder does not exist any more" : "A célmappa már nem létezik",
+ "Reload current directory" : "Jelenlegi könyvtár újratöltése",
+ "Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
+ "Current directory path" : "Jelenlegi könyvtár útvonala",
+ "Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
+ "You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
+ "Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
+ "Favorite" : "Kedvenc",
+ "Back" : "Vissza",
+ "Toggle selection for file \"{displayName}\"" : "„{displayName}” fájl kijelölésének átváltása",
+ "Toggle selection for folder \"{displayName}\"" : "„{displayName}” mappa kijelölésének átváltása",
+ "File is loading" : "A fájl épp betöltődik",
+ "Folder is loading" : "A mappa épp betöltődik",
+ "Filename" : "Fájlnév",
+ "Folder name" : "Mappanév",
+ "This node is unavailable" : "Ez az elem nem érhető el",
+ "Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
+ "Invalid filename." : "Érvénytelen fájlnév.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "A(z) „{oldName}” átnevezve erre: „{newName}”",
+ "Rename file" : "Fájl átnevezése",
+ "Folder" : "Mappa",
+ "Unknown file type" : "Ismeretlen fájltípus",
+ "{ext} image" : "{ext}-kép",
+ "{ext} video" : "{ext}-videó",
+ "{ext} audio" : "{ext}-hang",
+ "{ext} text" : "{ext}-szöveg",
+ "Pending" : "Függőben",
+ "Unknown date" : "Ismeretlen dátum",
+ "Clear filter" : "Szűrő törlése",
+ "Modified" : "Módosítva",
+ "Search everywhere" : "Keresés mindenhol",
+ "Type" : "Típus",
+ "Active filters" : "Aktív szűrők",
+ "Remove filter" : "Szűrő eltávolítása",
+ "Total rows summary" : "Összes sor összegzése",
+ "Toggle selection for all files and folders" : "Minden fájl és mappa kijelölésének átváltása",
+ "Name" : "Név",
+ "File type" : "Fájltípus",
+ "Size" : "Méret",
+ "Actions" : "Műveletek",
+ "(selected)" : "(kiválasztva)",
+ "List of files and folders." : "Fájlok és mappák felsorolása.",
+ "You have used your space quota and cannot upload files anymore." : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat.",
+ "Column headers with buttons are sortable." : "A gombot tartalmazó oszlopfejlécek rendezhetők.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg.",
+ "File not found" : "A fájl nem található",
+ "_{count} selected_::_{count} selected_" : ["{count} kijelölve","{count} kijelölve"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} felhasználva",
+ "{used} of {quota} used" : "{used} / {quota} felhasználva",
+ "{relative}% used" : "{relative}% felhasználva",
+ "Could not refresh storage stats" : "Nem sikerült frissíteni a tárhelystatisztikákat",
+ "Your storage is full, files can not be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Storage information" : "Tárhely-információ",
+ "Storage quota" : "Tárhelykvóta",
+ "New folder" : "Új mappa",
+ "Create new folder" : "Új mappa létrehozása",
+ "This name is already in use." : "Ez a név már foglalt.",
+ "Create" : "Létrehozás",
+ "Fill template fields" : "Töltse ki a sablon mezőit",
+ "Submitting fields …" : "Mezők beküldése…",
+ "Submit" : "Beküldés",
"Choose a file or folder to transfer" : "Válassz egy átruházandó fájlt vagy mappát",
"Transfer" : "Átruházás",
"Transfer {path} to {userid}" : "{path} átruházása {userid} számára",
"Invalid path selected" : "Érvénytelen útvonal kiválasztva",
+ "Unknown error" : "Ismeretlen hiba",
"Ownership transfer request sent" : "Tulajdonjog átruházási kérés elküldve",
- "Cannot transfer ownership of a file or folder you don't own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné",
- "Tags" : "Címkék",
- "Unable to change the favourite state of the file" : "Nem lehet megváltoztatni a fájl kedvenc állapotát",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné",
+ "Transfer ownership of a file or folder" : "Fájl vagy mappa tulajdonjogának átruházása",
+ "Choose file or folder to transfer" : "Válasszon egy fájlt vagy mappát az átruházáshoz",
+ "Change" : "Módosítás",
+ "New owner" : "Új tulajdonos",
+ "Keep {old}" : "{old} megtartása",
+ "Keep without extension" : "Megtartás kiterjesztés nélkül",
+ "Use {new}" : "{new} használata",
+ "Remove extension" : "Kiterjesztés eltávolítása",
+ "Change file extension" : "Kiterjesztés módosítása",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésről „{new}” kiterjesztésre változtatása olvashatatlanná teheti azt.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
+ "Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
+ "Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
+ "Choose {file}" : "{file} kiválasztása",
+ "Share" : "Megosztás",
+ "Shared by link" : "Megosztva hivatkozással",
+ "Shared" : "Megosztva",
+ "Switch to list view" : "Váltás listanézetre",
+ "Switch to grid view" : "Váltás rácsnézetre",
+ "The file could not be found" : "A fájl nem található",
+ "Upload was cancelled by user" : "Feltöltés megszakítva a felhasználó által",
+ "Not enough free space" : "Nincs elég szabad hely",
+ "Operation is blocked by access control" : "A hozzáférés-vezérlés letiltotta a műveletet",
+ "Error during upload: {message}" : "Hiba a feltöltés során: {message}",
+ "Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
+ "Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
+ "Loading current folder" : "Jelenlegi mappa betöltése",
+ "Retry" : "Újra",
+ "No files in here" : "Itt nincsenek fájlok",
+ "Upload some content or sync with your devices!" : "Töltsön fel néhány tartalmat, vagy szinkronizáljon az eszközeivel.",
+ "Go back" : "Visszalépés",
+ "Views" : "Nézetek",
+ "Files settings" : "Fájlok beállításai",
+ "Your files" : "Saját fájlok",
+ "Open in files" : "Megnyitás a fájlokban",
+ "File cannot be accessed" : "A fájl nem érhető el",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "A fájl nem található, vagy nincs jogosultsága a megtekintéséhez. Kérje meg a feladót, hogy ossza meg.",
+ "Clipboard is not available" : "A vágólap nem érhető el",
+ "General" : "Általános",
+ "All files" : "Az összes fájl",
+ "Personal files" : "Személyes fájlok",
+ "Sort favorites first" : "Kedvencek előre rendezése",
+ "Sort folders before files" : "Mappák fájlok elé rendezése",
+ "Appearance" : "Megjelenés",
+ "Show hidden files" : "Rejtett fájlok megjelenítése",
+ "Show file type column" : "Fájltípus oszlop megjelenítése",
+ "Crop image previews" : "Kép előnézetek vágása",
+ "Additional settings" : "További beállítások",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-webcím",
+ "Copy" : "Másolás",
+ "Warnings" : "Figyelmeztetések",
+ "Keyboard shortcuts" : "Gyorsbillentyűk",
+ "File actions" : "Fájlműveletek",
+ "Rename" : "Átnevezés",
+ "Delete" : "Törlés",
+ "Manage tags" : "Címkék kezelése",
+ "Selection" : "Kijelölés",
+ "Select all files" : "Összes fájl kijelölése",
+ "Deselect all" : "Kijelölés megszüntetése",
+ "Navigation" : "Navigáció",
+ "View" : "Nézet",
+ "Toggle grid view" : "Rácsnézet be/ki",
+ "Show those shortcuts" : "Gyorsbillentyűk megjelenítése",
+ "You" : "Ön",
+ "Shared multiple times with different people" : "Többször megosztva különböző személyekkel",
+ "Unable to change the favorite state of the file" : "Nem lehet megváltoztatni a fájl kedvenc állapotát",
"Error while loading the file data" : "Hiba történt a fájladatok betöltése közben",
+ "Owner" : "Tulajdonos",
+ "Remove from favorites" : "Eltávolítás a kedvencekből",
+ "Add to favorites" : "Hozzáadás a kedvencekhez",
+ "Tags" : "Címkék",
+ "Blank" : "Üres",
+ "Unable to create new file from template" : "Nem lehet új fájlt létrehozni a sablonból",
"Pick a template for {name}" : "Válassz sablont a(z) {name} fájlnak",
- "Cancel" : "Mégse",
- "Create" : "Létrehozás",
"Create a new file with the selected template" : "Új fájl létrehozása a kiválasztott sablonnal",
"Creating file" : "Fájl létrehozása",
- "Blank" : "Üres",
- "Unable to create new file from template" : "Nem lehet új fájlt létrehozni a sablonból",
- "Set up templates folder" : "Személyes sablonmappa beállítása",
- "Templates" : "Sablonok",
+ "Save as {displayName}" : "Mentés mint {displayName}",
+ "Save as …" : "Mentés másként…",
+ "Converting files …" : "Fájlok átalakítása…",
+ "Failed to convert files: {message}" : "A fájlok átalakítása sikertelen: {message}",
+ "All files failed to be converted" : "Az összes fájl átalakítása sikertelen",
+ "One file could not be converted: {message}" : "Egy fájl nem alakítható át: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Egy fájl nem alakítható át","%n fájl nem alakítható át"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Egy fájl sikeresen átalakítva","%n fájl sikeresen átalakítva"],
+ "Files successfully converted" : "Fájlok sikeresen átalakítva",
+ "Failed to convert files" : "A fájlok átalakítása sikertelen",
+ "Converting file …" : "Fájl átalakítása…",
+ "File successfully converted" : "Fájl sikeresen átalakítva",
+ "Failed to convert file: {message}" : "A fájl átalakítása sikertelen: {message}",
+ "Failed to convert file" : "A fájl átalakítása sikertelen",
+ "Leave this share" : "Megosztás elhagyása",
+ "Leave these shares" : "Megosztások elhagyása",
+ "Disconnect storage" : "Tároló leválasztása",
+ "Disconnect storages" : "Tárolók leválasztása",
+ "Delete permanently" : "Végleges törlés",
+ "Delete and unshare" : "Törlés és megosztás visszavonása",
+ "Delete file" : "Fájl törlése",
+ "Delete files" : "Fájlok törlése",
+ "Delete folder" : "Mappa törlése",
+ "Delete folders" : "Mappák törlése",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count} elem végleges törlésére készül","{count} elem végleges törlésére készül"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count} elem törlésére készül","{count} elem törlésére készül"],
+ "Confirm deletion" : "Törlés megerősítése",
+ "Cancel" : "Mégse",
+ "Download" : "Letöltés",
+ "Moving \"{source}\" to \"{destination}\" …" : "„{source}” áthelyezése ide: „{destination}” …",
+ "Copying \"{source}\" to \"{destination}\" …" : "„{source}” másolása ide: „{destination}” …",
+ "Destination is not a folder" : "A cél nem mappa",
+ "This file/folder is already in that directory" : "Ez a fájl/mappa már létezik a mappában",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "A fájl/mappa önmagába, vagy saját almappájába áthelyezése nem lehetséges",
+ "(copy)" : "(másolat)",
+ "(copy %n)" : "(%n. másolat)",
+ "A file or folder with that name already exists in this folder" : "Már létezik ilyen nevű fájl vagy mappa ebben a mappában",
+ "The files are locked" : "A fájlok zárolva vannak",
+ "The file does not exist anymore" : "Ez a fájl már nem létezik",
+ "Choose destination" : "Válasszon célt",
+ "Copy to {target}" : "Másolás ide: {target}",
+ "Move to {target}" : "Áthelyezés ide: {target}",
+ "Move" : "Áthelyezés",
+ "Move or copy operation failed" : "Az áthelyezés vagy a másolás művelet sikertelen",
+ "Move or copy" : "Áthelyezés vagy másolás",
+ "Open folder {displayName}" : "A(z) {displayName} mappa megnyitása",
+ "Open in Files" : "Megnyitás a Fájlokban",
+ "Open locally" : "Megnyitás helyben",
+ "Failed to redirect to client" : "Nem sikerült az átirányítás a klienshez",
+ "Open file locally" : "A fájl megnyitása helyben",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "A fájlnak most már meg kellene nyílni az eszközén. Ha mégsem, ellenőrizze, hogy telepítve van-e az asztali alkalmazás.",
+ "Retry and close" : "Újrapróbálás és bezárás",
+ "Open online" : "Megnyitás online",
+ "Details" : "Részletek",
+ "View in folder" : "Megtekintés mappában",
+ "Today" : "Ma",
+ "Last 7 days" : "Előző 7 nap",
+ "Last 30 days" : "Előző 30 nap",
+ "This year ({year})" : "Idén ({year})",
+ "Last year ({year})" : "Tavaly ({year})",
+ "Documents" : "Dokumentumok",
+ "Spreadsheets" : "Munkafüzetek",
+ "Presentations" : "Bemutatók",
+ "PDFs" : "PDF-ek",
+ "Folders" : "Mappák",
+ "Audio" : "Hangok",
+ "Images" : "Képek",
+ "Videos" : "Videók",
+ "Created new folder \"{name}\"" : "Új „{name}” mappa létrehozva",
"Unable to initialize the templates directory" : "A sablonkönyvtár előkészítése sikertelen",
- "%s used" : "%s használt",
- "%s%% of %s used" : "%s %% / %s felhasználva",
- "%1$s of %2$s used" : "%1$s / %2$s felhasználva",
- "Settings" : "Beállítások",
- "Show hidden files" : "Rejtett fájlok megjelenítése",
- "Crop image previews" : "Kép előnézetek vágása",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
- "Toggle %1$s sublist" : "%1$s allista be/ki",
- "Toggle grid view" : "Rácsnézet be/ki",
- "No files in here" : "Itt nincsenek fájlok",
- "Upload some content or sync with your devices!" : "Töltsön fel néhány tartalmat, vagy szinkronizáljon az eszközeivel.",
+ "Create templates folder" : "Sablonmappa létrehozása",
+ "Templates" : "Sablonok",
+ "New template folder" : "Új sablonmappa",
+ "In folder" : "Könyvtárban",
+ "Search in folder: {folder}" : "Keresés a mappában: {folder}",
+ "One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "A böngészője nem támogatja a fájlrendszer API-t. Könyvtárak nem lesznek feltöltve.",
+ "No files to upload" : "Nincsenek feltöltendő fájlok",
+ "Unable to create the directory {directory}" : "Nem hozható létre a(z) {directory} könyvtár",
+ "Some files could not be uploaded" : "Néhány fájlt nem lehet feltölteni",
+ "Files uploaded successfully" : "Fájlok sikeresen feltöltve",
+ "No files to process" : "Nincsenek feldolgozandó fájlok",
+ "Some files could not be copied" : "Néhány fájlt nem lehetett másolni",
+ "Some files could not be moved" : "Néhány fájlt nem lehetett áthelyezni",
+ "Files copied successfully" : "A fájlok másolása sikeres",
+ "Files moved successfully" : "A fájlok áthelyezése sikeres",
+ "Conflicts resolution skipped" : "Konfliktusfeloldás kihagyva",
+ "Upload cancelled" : "Feltöltés megszakítva",
+ "Could not rename \"{oldName}\", it does not exist any more" : "A(z) „{oldName}” nem nevezhető át, mert már nem létezik",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "A(z) „{newName}” név már használatban van a(z) „{dir}” mappában. Válasszon másik nevet.",
+ "Could not rename \"{oldName}\"" : "A(z) „{oldName}” nem nevezhető át",
+ "This operation is forbidden" : "Ez a művelet tiltott",
+ "Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
+ "Unexpected error: {error}" : "Váratlan hiba: {error}",
+ "_%n file_::_%n files_" : ["%n fájl","%n fájl"],
+ "_%n folder_::_%n folders_" : ["%n mappa","%n mappa"],
+ "_%n hidden_::_%n hidden_" : ["%n rejtett","%n rejtett"],
+ "Filename must not be empty." : "A fájlnév nem lehet üres.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}” nem szerepelhet a fájlnévben.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "A(z) „{segment}” egy fenntartott név és fájlnevek esetén nem engedélyezett.",
+ "\"{extension}\" is not an allowed filetype." : "A(z) „{extension}” nem engedélyezett fájltípus.",
+ "Filenames must not end with \"{extension}\"." : "Fájlnév nem végződhet ezzel: „{extension}”.",
+ "List of favorite files and folders." : "Kedvenc fájlok és mappák felsorolása.",
+ "No favorites yet" : "Még nincsenek kedvencek",
+ "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találja meg",
+ "List of your files and folders." : "Saját fájlok és mappák felsorolása.",
+ "List of your files and folders that are not shared." : "Meg nem osztott fájlok és mappák felsorolása.",
+ "No personal files found" : "Nem találhatóak személyes fájlok",
+ "Files that are not shared will show up here." : "A meg nem osztott fájlok itt fognak megjelenni.",
+ "Recent" : "Legutóbbi",
+ "List of recently modified files and folders." : "Közelmúltban módosított fájlok és mappák felsorolása.",
+ "No recently modified files" : "Nincs a közelmúltban módosított fájl",
+ "Files and folders you recently modified will show up here." : "Az Ön által módosított fájlok és mappák itt jelennek meg.",
+ "Search" : "Keresés",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a mappában",
"Select all" : "Összes kijelölése",
"Upload too large" : "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltölteni próbált fájlok mérete meghaladja a kiszolgálón megengedett legnagyobb méretet.",
- "No favorites yet" : "Még nincsenek kedvencek",
- "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találja meg",
- "Deleted files" : "Törölt fájlok",
- "Shares" : "Megosztások",
- "Shared with others" : "Megosztva másokkal",
- "Shared with you" : "Megosztva Önnel",
- "Shared by link" : "Megosztva hivatkozással",
- "Deleted shares" : "Törölt megosztások",
- "Pending shares" : "Függőben lévő megosztások",
+ "File could not be found" : "A fájl nem található",
+ "Show list view" : "Listanézet megjelenítése",
+ "Show grid view" : "Rácsnézet megjelenítése",
+ "Close" : "Bezárás",
+ "Could not create folder \"{dir}\"" : "A(z) „{dir}” mappa nem hozható létre",
+ "This will stop your current uploads." : "Ez meg fogja állítani a jelenlegi feltöltéseket.",
+ "Upload cancelled." : "Feltöltés megszakítva.",
+ "Processing files …" : "Fájlok feldolgozása…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} fájl nem tölthető fel, mert vagy egy könyvtár, vagy 0 bájtos",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely, a feltöltés mérete {size1}, de csak {size2} hely van",
+ "Target folder \"{dir}\" does not exist any more" : "A(z) „{dir}” célmappa már nem létezik",
+ "An unknown error has occurred" : "Ismeretlen hiba történt",
+ "File could not be uploaded" : "A fájlt nem lehetett feltölteni",
+ "Uploading …" : "Feltöltés…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Feltöltés… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ezen elem feltöltése nem támogatott",
+ "Error when assembling chunks, status code {status}" : "Hiba a darabok összerakásakor, állapotkód: {status}",
+ "Choose target folder" : "Válasszon célmappát",
+ "Set reminder" : "Emlékeztető beállítása",
+ "Edit locally" : "Szerkesztés helyileg",
+ "Open" : "Megnyitás",
+ "Could not load info for file \"{file}\"" : "Nem sikerült betölteni a(z) „{file}” fájl információit",
+ "Please select tag(s) to add to the selection" : "Válassza ki a kijelöléshez adandó címkéket",
+ "Apply tag(s) to selection" : "Címkék alkalmazása a kijelölésre",
+ "Select directory \"{dirName}\"" : "A(z) „{dirName}” könyvtár kiválasztása",
+ "Select file \"{fileName}\"" : "A(z) „{fileName}” fájl kiválasztása",
+ "Unable to determine date" : "Nem lehet meghatározni a dátumot",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem érhető el, nézze meg a naplófájlokat vagy lépjen kapcsolatba az adminisztrátorral",
+ "Could not move \"{file}\", target exists" : "A(z) „{file}” nem helyezhető át, mert a cél már létezik",
+ "Could not move \"{file}\"" : "A(z) „{file}” nem helyezhető át",
+ "copy" : "másolat",
+ "Could not copy \"{file}\", target exists" : "A(z) „{file}” másolása sikertelen, a cél már létezik",
+ "Could not copy \"{file}\"" : "A(z) „{file}” másolása sikertelen",
+ "Copied {origin} inside {destination}" : "A(z) {origin} átmásolva ide: {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "A(z) {origin} és {nbfiles} egyéb fájl átmásolva ide: {destination}",
+ "{newName} already exists" : "A(z) {newName} már létezik",
+ "Could not create file \"{file}\"" : "A(z) „{file}” nem hozható létre",
+ "Could not create file \"{file}\" because it already exists" : "A(z) „{file}” fájl nem hozható létre, mert már létezik",
+ "Could not create folder \"{dir}\" because it already exists" : "A(z) „{dir}” mappa nem hozható létre, mert már létezik",
+ "Could not fetch file details \"{file}\"" : "A(z) „{file}” fájl részleteinek lekérése sikertelen",
+ "Error deleting file \"{fileName}\"." : "Hiba történt a(z) „{fileName}” fájl törlése során.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek találatok más mappákban: {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Vigyen be legalább két karaktert a más mappákban való kereséshez",
+ "{dirs} and {files}" : "{dirs} és {files}",
+ "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"],
+ "You do not have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"],
+ "New" : "Új",
+ "New file/folder menu" : "Új fájl/mappa menü",
+ "Select file range" : "Válasszon fájltartományt",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} felhasználva",
+ "\"{name}\" is an invalid file name." : "A(z) „{name}” fájlnév érvénytelen.",
+ "File name cannot be empty." : "A fájlnév nem lehet üres.",
+ "\"/\" is not allowed inside a file name." : "„/” nem szerepelhet fájlnévben.",
+ "\"{name}\" is not an allowed filetype" : "A(z) „{name}” nem engedélyezett fájltípus",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} tárolója megtelt, a fájlok többé nem frissíthetők és szinkronizálhatók.",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” külső tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} tárhelye majdnem megtelt ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) \"{mountPoint}\" csoportmappa majdnem megtelt ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) „{mountPoint}” külső tárhely majdnem megtelt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tárhelye majdnem megtelt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "A közvetlen hivatkozás másolva (csak azon személyeknek működik, akik elérik ezt a fájlt/mappát)",
+ "Path" : "Útvonal",
+ "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
+ "Favored" : "Kedvelve",
+ "Favor" : "Kedvelés",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a személyeknél működik, akiknek hozzáférése van a fájlhoz/mappához)",
+ "Upload file" : "Fájl feltöltése",
+ "Not favored" : "Nincs a kedveltek között",
+ "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
+ "Upload (max. %s)" : "Feltöltés (legfeljebb %s)",
+ "\"{displayName}\" action executed successfully" : "A(z) „{displayName}” művelet sikeresen végrehajtva",
+ "\"{displayName}\" action failed" : "A(z) „{displayName}” művelet sikertelen",
+ "\"{displayName}\" failed on some elements" : "A(z) „{displayName}” egyes elemeken nem sikerült",
+ "\"{displayName}\" batch action executed successfully" : "A(z) „{displayName}” tömeges művelet sikeresen végrehajtva",
+ "Submitting fields…" : "Mezők beküldése…",
+ "Filter filenames…" : "Fájlnevek szűrése…",
+ "WebDAV URL copied to clipboard" : "A WebDAV-cím a vágólapra másolva",
+ "Enable the grid view" : "Rácsnézet engedélyezése",
+ "Enable folder tree" : "Mappafa engedélyezése",
+ "Copy to clipboard" : "Másolás a vágólapra",
+ "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
+ "Deletion cancelled" : "Törlés megszakítva",
+ "Move cancelled" : "Áthelyezés megszakítva",
+ "Cancelled move or copy of \"{filename}\"." : "„{filename}” áthelyezése vagy másolása megszakítva",
+ "Cancelled move or copy operation" : "Az áthelyezés vagy másolás művelet megszakítva",
+ "Open details" : "Részletek megnyitása",
+ "Photos and images" : "Fényképek és képek",
+ "New folder creation cancelled" : "Az új mappa létrehozása megszakítva",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} mappa"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fájl","{fileCount} fájl"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fájl és {folderCount} mappa","1 fájl és {folderCount} mappa"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fájl és 1 mappa","{fileCount} fájl és 1 mappa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fájl és {folderCount} mappa",
+ "All folders" : "Összes mappa",
+ "Personal Files" : "Személyes fájlok",
"Text file" : "Szövegfájl",
"New text file.txt" : "Új szövegfájl.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} tárhelye betelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A(z) „{mountPoint}” külső tárhely megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "Your storage is full, files can not be updated or synced anymore!" : "A tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "_matches '{filter}'_::_match '{filter}'_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"]
+ "%1$s (renamed)" : "%1$s (átnevezve)",
+ "renamed file" : "átnevezett fájl",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "A Windows-kompatibilis fájlnevek engedélyezése után a meglévő fájlok már nem módosíthatóak, de a tulajdonosaik átnevezhetik őket érvényes új nevekre.",
+ "Filter file names …" : "Fájlnevek szűrése…",
+ "Prevent warning dialogs from open or reenable them." : "Figyelmeztető párbeszédablakok megnyitásának megakadályozása vagy engedélyezése.",
+ "Show a warning dialog when changing a file extension." : "Figyelmeztető párbeszédablakok megnyitása a fájlkiterjesztés módosításakor.",
+ "Speed up your Files experience with these quick shortcuts." : "Gyorsítsa fel a fájlböngészést ezekkel a billentyűparancsokkal.",
+ "Open the actions menu for a file" : "Nyissa meg a fájl műveletek menüjét",
+ "Rename a file" : "Fájl átnevezése",
+ "Delete a file" : "Fájl törlése",
+ "Favorite or remove a file from favorites" : "Fájl hozzáadása vagy eltávolítása a kedvencek közül",
+ "Manage tags for a file" : "Fájl címkéinek kezelése",
+ "Deselect all files" : "Összes fájl kijelölésének törlése",
+ "Select or deselect a file" : "Fájl kijelölése vagy kijelölés törlése",
+ "Select a range of files" : "Válasszon ki fájlokat",
+ "Navigate to the parent folder" : "Navigálás a szülőmappához",
+ "Navigate to the file above" : "Navigálás a fentebbi fájlhoz",
+ "Navigate to the file below" : "Navigálás a lentebbi fájlhoz",
+ "Navigate to the file on the left (in grid mode)" : "Navigálás a balra lévő fájlhoz (rács módban)",
+ "Navigate to the file on the right (in grid mode)" : "Navigálás a jobbra lévő fájlhoz (rács módban)",
+ "Toggle the grid view" : "Rácsnézet be/ki",
+ "Open the sidebar for a file" : "Oldalsáv megnyitása a fájlhoz"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json
index cfa0631a4de..098ac1f1464 100644
--- a/apps/files/l10n/hu.json
+++ b/apps/files/l10n/hu.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
- "Storage invalid" : "A tároló érvénytelen",
- "Unknown error" : "Ismeretlen hiba",
- "File could not be found" : "Fájl nem található",
- "Move or copy" : "Áthelyezés vagy másolás",
- "Download" : "Letöltés",
- "Delete" : "Törlés",
- "Home" : "Saját mappa",
- "Close" : "Bezárás",
- "Favorites" : "Kedvencek",
- "Could not create folder \"{dir}\"" : "A(z) „{dir}” mappa nem hozható létre",
- "This will stop your current uploads." : "Ez meg fogja állítani a jelenlegi feltöltéseket.",
- "Upload cancelled." : "Feltöltés megszakítva.",
- "Processing files …" : "Fájlok feldolgozása…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} fájl nem tölthető fel, mert vagy egy könyvtár, vagy 0 bájtos",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely, a feltöltés mérete {size1}, de csak {size2} hely van",
- "Target folder \"{dir}\" does not exist any more" : "A(z) „{dir}” célmappa már nem létezik",
- "Not enough free space" : "Nincs elég szabad hely",
- "An unknown error has occurred" : "Ismeretlen hiba történt",
- "Uploading …" : "Feltöltés…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Ezen elem feltöltése nem támogatott",
- "Target folder does not exist any more" : "A célmappa már nem létezik",
- "Operation is blocked by access control" : "A hozzáférés-vezérlés letiltotta a műveletet",
- "Error when assembling chunks, status code {status}" : "Hiba a darabok összerakásakor, állapotkód: {status}",
- "Actions" : "Műveletek",
- "Rename" : "Átnevezés",
- "Copy" : "Másolás",
- "Choose target folder" : "Válasszon célmappát",
- "Open" : "Megnyitás",
- "Delete file" : "Fájl törlése",
- "Delete folder" : "Mappa törlése",
- "Disconnect storage" : "Tároló leválasztása",
- "Leave this share" : "Megosztás elhagyása",
- "Could not load info for file \"{file}\"" : "Nem sikerült betölteni a(z) „{file}” fájl információit",
- "Files" : "Fájlok",
- "Details" : "Részletek",
- "Please select tag(s) to add to the selection" : "Válassza ki a kijelöléshez adandó címkéket",
- "Apply tag(s) to selection" : "Címkék alkalmazása a kijelölésre",
- "Select" : "Kiválasztás",
- "Pending" : "Függőben",
- "Unable to determine date" : "Nem lehet meghatározni a dátumot",
- "This operation is forbidden" : "Ez a művelet tiltott",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem érhető el, nézze meg a naplófájlokat vagy lépjen kapcsolatba az adminisztrátorral",
- "Could not move \"{file}\", target exists" : "A(z) „{file}” nem helyezhető át, mert a cél már létezik",
- "Could not move \"{file}\"" : "A(z) „{file}” nem helyezhető át",
- "copy" : "másolat",
- "Could not copy \"{file}\", target exists" : "A(z) „{file}” másolása sikertelen, a cél már létezik",
- "Could not copy \"{file}\"" : "A(z) „{file}” másolása sikertelen",
- "Copied {origin} inside {destination}" : "A(z) {origin} átmásolva ide: {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "A(z) {origin} és {nbfiles} egyéb fájl átmásolva ide: {destination}",
- "{newName} already exists" : "A(z) {newName} már létezik",
- "Could not rename \"{fileName}\", it does not exist any more" : "A(z) „{fileName}” átnevetése sikertelen, mert már nem létezik",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "A(z) „{targetName}” név már használatban van a(z) „{dir}” mappában. Válasszon másik nevet.",
- "Could not rename \"{fileName}\"" : "A(z) „{fileName}” nem nevezhető át",
- "Could not create file \"{file}\"" : "A(z) „{file}” nem hozható létre",
- "Could not create file \"{file}\" because it already exists" : "A(z) „{file}” fájl nem hozható létre, mert már létezik",
- "Could not create folder \"{dir}\" because it already exists" : "A(z) „{dir}” mappa nem hozható létre, mert már létezik",
- "Could not fetch file details \"{file}\"" : "A(z) „{file}” fájl részleteinek lekérése sikertelen",
- "Error deleting file \"{fileName}\"." : "Hiba történt a(z) „{fileName}” fájl törlése során.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek találatok más mappákban: {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Vigyen be legalább két karaktert a más mappákban való kereséshez",
- "Name" : "Név",
- "Size" : "Méret",
- "Modified" : "Módosítva",
- "_%n folder_::_%n folders_" : ["%n mappa","%n mappa"],
- "_%n file_::_%n files_" : ["%n fájl","%n fájl"],
- "{dirs} and {files}" : "{dirs} és {files}",
- "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"],
- "You don’t have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához",
- "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"],
- "New" : "Új",
- "Select file range" : "Válasszon fájltartományt",
- "{used} of {quota} used" : "{used} / {quota} felhasználva",
- "{used} used" : "{used} felhasználva",
- "\"{name}\" is an invalid file name." : "A(z) „{name}” fájlnév érvénytelen.",
- "File name cannot be empty." : "A fájlnév nem lehet üres.",
- "\"/\" is not allowed inside a file name." : "„/” nem szerepelhet fájlnévben.",
- "\"{name}\" is not an allowed filetype" : "A(z) „{name}” nem engedélyezett fájltípus",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} tárolója megtelt, a fájlok többé nem frissíthetők és szinkronizálhatók.q",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” külső tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "Your storage is full, files cannot be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} tárhelye majdnem megtelt ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) \"{mountPoint}\" csoportmappa majdnem megtelt ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) „{mountPoint}” külső tárhely majdnem megtelt ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Tárhelye majdnem megtelt ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"],
- "View in folder" : "Megtekintés mappában",
- "Copied!" : "Másolva!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a felhasználóknál működik, akiknek hozzáférése van a fájlhoz/mappához)",
- "Path" : "Útvonal",
- "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
- "Favorited" : "Kedvenc",
- "Favorite" : "Kedvenc",
- "You can only favorite a single file or folder at a time" : "Egyszerre csak egy fájlt vagy mappát jelölhet meg kedvencként",
- "New folder" : "Új mappa",
- "Upload file" : "Fájl feltöltése",
- "Recent" : "Legutóbbi",
- "Not favorited" : "Nincs a kedvencek között",
- "Remove from favorites" : "Eltávolítás a kedvencekből",
- "Add to favorites" : "Hozzáadás a kedvencekhez",
- "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
"Added to favorites" : "Hozzáadva a kedvencekhez",
"Removed from favorites" : "Eltávolítva a kedvencekből",
"You added {file} to your favorites" : "Hozzáadta a kedvencekhez: {file}",
"You removed {file} from your favorites" : "Eltávolította a kedvencek közül: {file}",
+ "Favorites" : "Kedvencek",
"File changes" : "Fájlváltozások",
"Created by {user}" : "Létrehozta: {user}",
"Changed by {user}" : "Módosította: {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Helyreállította: {user}",
"Renamed by {user}" : "Átnevezte: {user}",
"Moved by {user}" : "Áthelyezte: {user}",
- "\"remote user\"" : "„távoli felhasználó”",
+ "\"remote account\"" : "„távoli fiók”",
"You created {file}" : "Létrehozta: {file}",
"You created an encrypted file in {file}" : "Létrehozott egy titkosított fájlt ebben: {file}",
"{user} created {file}" : "{user} létrehozta: {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Áthelyezte a(z) {oldfile} fájlt ide: {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} áthelyezte a(z) {oldfile} fájlt ide: {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Egy fájl eltávolítva vagy hozzáadva a <strong>kedvencekhez</strong>",
+ "Files" : "Fájlok",
"A file or folder has been <strong>changed</strong>" : "Egy fájl vagy mappa <strong>megváltozott</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Egy kedvenc fájl vagy mappa <strong> megváltozott</strong>",
- "All files" : "Az összes fájl",
- "Unlimited" : "Korlátlan",
- "Upload (max. %s)" : "Feltöltés (legfeljebb %s)",
+ "Failed to authorize" : "Sikertelen hitelesítés",
+ "Invalid folder path" : "Érvénytelen mappaútvonal",
+ "Folder not found" : "A mappa nem található",
+ "The file cannot be found" : "A fájl nem található",
+ "The destination path does not exist: %1$s" : "Az elérési útvonal nem létezik: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nincs jogosultsága fájl létrehozására a megadott helyen",
+ "The file could not be converted." : "A fájl nem alakítható át.",
+ "Could not get relative path to converted file" : "Nem sikerült lekérni az átalakított fájl relatív elérési útját",
+ "Favorite files" : "Kedvenc fájlok",
+ "No favorites" : "Nincsenek kedvencek",
+ "More favorites" : "További kedvencek",
"Accept" : "Elfogadás",
"Reject" : "Elutasítás",
"Incoming ownership transfer from {user}" : "Bejövő tulajdonjog-átruházás {user} részéről",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Elfogadja a(z) {path} útvonalat?\n\nMegjegyzés: Az átruházási folyamat akár 1 órát is igénybe vehet az elfogadás után.",
+ "Ownership transfer denied" : "Tulajdonjog átadása visszautasítva",
+ "Your ownership transfer of {path} was denied by {user}." : "A(z) {path} tulajdonjogának átadását {user} visszautasította.",
"Ownership transfer failed" : "Tulajdonjog átadása sikertelen",
"Your ownership transfer of {path} to {user} failed." : "A(z) {path} tulajdonjogának átruházása {user} számára sikertelen.",
"The ownership transfer of {path} from {user} failed." : "A(z) {path} tulajdonjogának átruházása {user} részéről sikertelen.",
@@ -157,62 +65,406 @@
"Your ownership transfer of {path} to {user} has completed." : "A(z) {path} tulajdonjogának átruházása {user} számára befejeződött.",
"The ownership transfer of {path} from {user} has completed." : "A(z) {path} tulajdonjogának átruházása {user} részéről sikeres.",
"in %s" : "itt: %s",
+ "Transferred from %1$s on %2$s" : "Átadva tőle: %1$s, ekkor %2$s",
+ "Files compatibility" : "Fájlok kompatibilitása",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Fájlnevek korlátozásának engedélyezése, amely biztosítja, hogy a fájlok szinkronizálhatók legyenek az összes klienssel. Alapállapotban az összes fájlnév engedélyezett, amely a POSIX (mint a Linux vagy a macOS) rendszereken érvényes.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "A Windows-kompatibilis fájlnevek engedélyezése után a meglévő fájlok már nem módosíthatóak, de a tulajdonosaik átnevezhetik őket érvényes új fájlnevekre.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Továbbá lehetséges a fájlok automatikus átköltöztetése is a beállítás engedélyezése után, kövesse az occ parancs dokumentációját.",
+ "Enforce Windows compatibility" : "Windows-kompatibilitás kényszerítése",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ez megakadályozza a Windows rendszereken érvénytelen fájlneveket, mint például a foglalt neveket vagy a speciális karaktereket. De ez nem fogja érvényesíteni a kis- és nagybetűk egyezőnek tekintését.",
"File Management" : "Fájlkezelés",
- "Transfer ownership of a file or folder" : "Fájl vagy mappa tulajdonjogának átruházása",
- "Choose file or folder to transfer" : "Válasszon egy fájlt vagy mappát az átruházáshoz",
- "Change" : "Módosítás",
- "New owner" : "Új tulajdonos",
- "Search users" : "Fehasználók keresése",
+ "Home" : "Saját mappa",
+ "Target folder does not exist any more" : "A célmappa már nem létezik",
+ "Reload current directory" : "Jelenlegi könyvtár újratöltése",
+ "Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
+ "Current directory path" : "Jelenlegi könyvtár útvonala",
+ "Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
+ "You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
+ "Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
+ "Favorite" : "Kedvenc",
+ "Back" : "Vissza",
+ "Toggle selection for file \"{displayName}\"" : "„{displayName}” fájl kijelölésének átváltása",
+ "Toggle selection for folder \"{displayName}\"" : "„{displayName}” mappa kijelölésének átváltása",
+ "File is loading" : "A fájl épp betöltődik",
+ "Folder is loading" : "A mappa épp betöltődik",
+ "Filename" : "Fájlnév",
+ "Folder name" : "Mappanév",
+ "This node is unavailable" : "Ez az elem nem érhető el",
+ "Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
+ "Invalid filename." : "Érvénytelen fájlnév.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "A(z) „{oldName}” átnevezve erre: „{newName}”",
+ "Rename file" : "Fájl átnevezése",
+ "Folder" : "Mappa",
+ "Unknown file type" : "Ismeretlen fájltípus",
+ "{ext} image" : "{ext}-kép",
+ "{ext} video" : "{ext}-videó",
+ "{ext} audio" : "{ext}-hang",
+ "{ext} text" : "{ext}-szöveg",
+ "Pending" : "Függőben",
+ "Unknown date" : "Ismeretlen dátum",
+ "Clear filter" : "Szűrő törlése",
+ "Modified" : "Módosítva",
+ "Search everywhere" : "Keresés mindenhol",
+ "Type" : "Típus",
+ "Active filters" : "Aktív szűrők",
+ "Remove filter" : "Szűrő eltávolítása",
+ "Total rows summary" : "Összes sor összegzése",
+ "Toggle selection for all files and folders" : "Minden fájl és mappa kijelölésének átváltása",
+ "Name" : "Név",
+ "File type" : "Fájltípus",
+ "Size" : "Méret",
+ "Actions" : "Műveletek",
+ "(selected)" : "(kiválasztva)",
+ "List of files and folders." : "Fájlok és mappák felsorolása.",
+ "You have used your space quota and cannot upload files anymore." : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat.",
+ "Column headers with buttons are sortable." : "A gombot tartalmazó oszlopfejlécek rendezhetők.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg.",
+ "File not found" : "A fájl nem található",
+ "_{count} selected_::_{count} selected_" : ["{count} kijelölve","{count} kijelölve"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} felhasználva",
+ "{used} of {quota} used" : "{used} / {quota} felhasználva",
+ "{relative}% used" : "{relative}% felhasználva",
+ "Could not refresh storage stats" : "Nem sikerült frissíteni a tárhelystatisztikákat",
+ "Your storage is full, files can not be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Storage information" : "Tárhely-információ",
+ "Storage quota" : "Tárhelykvóta",
+ "New folder" : "Új mappa",
+ "Create new folder" : "Új mappa létrehozása",
+ "This name is already in use." : "Ez a név már foglalt.",
+ "Create" : "Létrehozás",
+ "Fill template fields" : "Töltse ki a sablon mezőit",
+ "Submitting fields …" : "Mezők beküldése…",
+ "Submit" : "Beküldés",
"Choose a file or folder to transfer" : "Válassz egy átruházandó fájlt vagy mappát",
"Transfer" : "Átruházás",
"Transfer {path} to {userid}" : "{path} átruházása {userid} számára",
"Invalid path selected" : "Érvénytelen útvonal kiválasztva",
+ "Unknown error" : "Ismeretlen hiba",
"Ownership transfer request sent" : "Tulajdonjog átruházási kérés elküldve",
- "Cannot transfer ownership of a file or folder you don't own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné",
- "Tags" : "Címkék",
- "Unable to change the favourite state of the file" : "Nem lehet megváltoztatni a fájl kedvenc állapotát",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nem ruházható át olyan fájl vagy mappa tulajdonjoga, amely nem Öné",
+ "Transfer ownership of a file or folder" : "Fájl vagy mappa tulajdonjogának átruházása",
+ "Choose file or folder to transfer" : "Válasszon egy fájlt vagy mappát az átruházáshoz",
+ "Change" : "Módosítás",
+ "New owner" : "Új tulajdonos",
+ "Keep {old}" : "{old} megtartása",
+ "Keep without extension" : "Megtartás kiterjesztés nélkül",
+ "Use {new}" : "{new} használata",
+ "Remove extension" : "Kiterjesztés eltávolítása",
+ "Change file extension" : "Kiterjesztés módosítása",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésről „{new}” kiterjesztésre változtatása olvashatatlanná teheti azt.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
+ "Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
+ "Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
+ "Choose {file}" : "{file} kiválasztása",
+ "Share" : "Megosztás",
+ "Shared by link" : "Megosztva hivatkozással",
+ "Shared" : "Megosztva",
+ "Switch to list view" : "Váltás listanézetre",
+ "Switch to grid view" : "Váltás rácsnézetre",
+ "The file could not be found" : "A fájl nem található",
+ "Upload was cancelled by user" : "Feltöltés megszakítva a felhasználó által",
+ "Not enough free space" : "Nincs elég szabad hely",
+ "Operation is blocked by access control" : "A hozzáférés-vezérlés letiltotta a műveletet",
+ "Error during upload: {message}" : "Hiba a feltöltés során: {message}",
+ "Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
+ "Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
+ "Loading current folder" : "Jelenlegi mappa betöltése",
+ "Retry" : "Újra",
+ "No files in here" : "Itt nincsenek fájlok",
+ "Upload some content or sync with your devices!" : "Töltsön fel néhány tartalmat, vagy szinkronizáljon az eszközeivel.",
+ "Go back" : "Visszalépés",
+ "Views" : "Nézetek",
+ "Files settings" : "Fájlok beállításai",
+ "Your files" : "Saját fájlok",
+ "Open in files" : "Megnyitás a fájlokban",
+ "File cannot be accessed" : "A fájl nem érhető el",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "A fájl nem található, vagy nincs jogosultsága a megtekintéséhez. Kérje meg a feladót, hogy ossza meg.",
+ "Clipboard is not available" : "A vágólap nem érhető el",
+ "General" : "Általános",
+ "All files" : "Az összes fájl",
+ "Personal files" : "Személyes fájlok",
+ "Sort favorites first" : "Kedvencek előre rendezése",
+ "Sort folders before files" : "Mappák fájlok elé rendezése",
+ "Appearance" : "Megjelenés",
+ "Show hidden files" : "Rejtett fájlok megjelenítése",
+ "Show file type column" : "Fájltípus oszlop megjelenítése",
+ "Crop image previews" : "Kép előnézetek vágása",
+ "Additional settings" : "További beállítások",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV-webcím",
+ "Copy" : "Másolás",
+ "Warnings" : "Figyelmeztetések",
+ "Keyboard shortcuts" : "Gyorsbillentyűk",
+ "File actions" : "Fájlműveletek",
+ "Rename" : "Átnevezés",
+ "Delete" : "Törlés",
+ "Manage tags" : "Címkék kezelése",
+ "Selection" : "Kijelölés",
+ "Select all files" : "Összes fájl kijelölése",
+ "Deselect all" : "Kijelölés megszüntetése",
+ "Navigation" : "Navigáció",
+ "View" : "Nézet",
+ "Toggle grid view" : "Rácsnézet be/ki",
+ "Show those shortcuts" : "Gyorsbillentyűk megjelenítése",
+ "You" : "Ön",
+ "Shared multiple times with different people" : "Többször megosztva különböző személyekkel",
+ "Unable to change the favorite state of the file" : "Nem lehet megváltoztatni a fájl kedvenc állapotát",
"Error while loading the file data" : "Hiba történt a fájladatok betöltése közben",
+ "Owner" : "Tulajdonos",
+ "Remove from favorites" : "Eltávolítás a kedvencekből",
+ "Add to favorites" : "Hozzáadás a kedvencekhez",
+ "Tags" : "Címkék",
+ "Blank" : "Üres",
+ "Unable to create new file from template" : "Nem lehet új fájlt létrehozni a sablonból",
"Pick a template for {name}" : "Válassz sablont a(z) {name} fájlnak",
- "Cancel" : "Mégse",
- "Create" : "Létrehozás",
"Create a new file with the selected template" : "Új fájl létrehozása a kiválasztott sablonnal",
"Creating file" : "Fájl létrehozása",
- "Blank" : "Üres",
- "Unable to create new file from template" : "Nem lehet új fájlt létrehozni a sablonból",
- "Set up templates folder" : "Személyes sablonmappa beállítása",
- "Templates" : "Sablonok",
+ "Save as {displayName}" : "Mentés mint {displayName}",
+ "Save as …" : "Mentés másként…",
+ "Converting files …" : "Fájlok átalakítása…",
+ "Failed to convert files: {message}" : "A fájlok átalakítása sikertelen: {message}",
+ "All files failed to be converted" : "Az összes fájl átalakítása sikertelen",
+ "One file could not be converted: {message}" : "Egy fájl nem alakítható át: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Egy fájl nem alakítható át","%n fájl nem alakítható át"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Egy fájl sikeresen átalakítva","%n fájl sikeresen átalakítva"],
+ "Files successfully converted" : "Fájlok sikeresen átalakítva",
+ "Failed to convert files" : "A fájlok átalakítása sikertelen",
+ "Converting file …" : "Fájl átalakítása…",
+ "File successfully converted" : "Fájl sikeresen átalakítva",
+ "Failed to convert file: {message}" : "A fájl átalakítása sikertelen: {message}",
+ "Failed to convert file" : "A fájl átalakítása sikertelen",
+ "Leave this share" : "Megosztás elhagyása",
+ "Leave these shares" : "Megosztások elhagyása",
+ "Disconnect storage" : "Tároló leválasztása",
+ "Disconnect storages" : "Tárolók leválasztása",
+ "Delete permanently" : "Végleges törlés",
+ "Delete and unshare" : "Törlés és megosztás visszavonása",
+ "Delete file" : "Fájl törlése",
+ "Delete files" : "Fájlok törlése",
+ "Delete folder" : "Mappa törlése",
+ "Delete folders" : "Mappák törlése",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count} elem végleges törlésére készül","{count} elem végleges törlésére készül"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count} elem törlésére készül","{count} elem törlésére készül"],
+ "Confirm deletion" : "Törlés megerősítése",
+ "Cancel" : "Mégse",
+ "Download" : "Letöltés",
+ "Moving \"{source}\" to \"{destination}\" …" : "„{source}” áthelyezése ide: „{destination}” …",
+ "Copying \"{source}\" to \"{destination}\" …" : "„{source}” másolása ide: „{destination}” …",
+ "Destination is not a folder" : "A cél nem mappa",
+ "This file/folder is already in that directory" : "Ez a fájl/mappa már létezik a mappában",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "A fájl/mappa önmagába, vagy saját almappájába áthelyezése nem lehetséges",
+ "(copy)" : "(másolat)",
+ "(copy %n)" : "(%n. másolat)",
+ "A file or folder with that name already exists in this folder" : "Már létezik ilyen nevű fájl vagy mappa ebben a mappában",
+ "The files are locked" : "A fájlok zárolva vannak",
+ "The file does not exist anymore" : "Ez a fájl már nem létezik",
+ "Choose destination" : "Válasszon célt",
+ "Copy to {target}" : "Másolás ide: {target}",
+ "Move to {target}" : "Áthelyezés ide: {target}",
+ "Move" : "Áthelyezés",
+ "Move or copy operation failed" : "Az áthelyezés vagy a másolás művelet sikertelen",
+ "Move or copy" : "Áthelyezés vagy másolás",
+ "Open folder {displayName}" : "A(z) {displayName} mappa megnyitása",
+ "Open in Files" : "Megnyitás a Fájlokban",
+ "Open locally" : "Megnyitás helyben",
+ "Failed to redirect to client" : "Nem sikerült az átirányítás a klienshez",
+ "Open file locally" : "A fájl megnyitása helyben",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "A fájlnak most már meg kellene nyílni az eszközén. Ha mégsem, ellenőrizze, hogy telepítve van-e az asztali alkalmazás.",
+ "Retry and close" : "Újrapróbálás és bezárás",
+ "Open online" : "Megnyitás online",
+ "Details" : "Részletek",
+ "View in folder" : "Megtekintés mappában",
+ "Today" : "Ma",
+ "Last 7 days" : "Előző 7 nap",
+ "Last 30 days" : "Előző 30 nap",
+ "This year ({year})" : "Idén ({year})",
+ "Last year ({year})" : "Tavaly ({year})",
+ "Documents" : "Dokumentumok",
+ "Spreadsheets" : "Munkafüzetek",
+ "Presentations" : "Bemutatók",
+ "PDFs" : "PDF-ek",
+ "Folders" : "Mappák",
+ "Audio" : "Hangok",
+ "Images" : "Képek",
+ "Videos" : "Videók",
+ "Created new folder \"{name}\"" : "Új „{name}” mappa létrehozva",
"Unable to initialize the templates directory" : "A sablonkönyvtár előkészítése sikertelen",
- "%s used" : "%s használt",
- "%s%% of %s used" : "%s %% / %s felhasználva",
- "%1$s of %2$s used" : "%1$s / %2$s felhasználva",
- "Settings" : "Beállítások",
- "Show hidden files" : "Rejtett fájlok megjelenítése",
- "Crop image previews" : "Kép előnézetek vágása",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
- "Toggle %1$s sublist" : "%1$s allista be/ki",
- "Toggle grid view" : "Rácsnézet be/ki",
- "No files in here" : "Itt nincsenek fájlok",
- "Upload some content or sync with your devices!" : "Töltsön fel néhány tartalmat, vagy szinkronizáljon az eszközeivel.",
+ "Create templates folder" : "Sablonmappa létrehozása",
+ "Templates" : "Sablonok",
+ "New template folder" : "Új sablonmappa",
+ "In folder" : "Könyvtárban",
+ "Search in folder: {folder}" : "Keresés a mappában: {folder}",
+ "One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "A böngészője nem támogatja a fájlrendszer API-t. Könyvtárak nem lesznek feltöltve.",
+ "No files to upload" : "Nincsenek feltöltendő fájlok",
+ "Unable to create the directory {directory}" : "Nem hozható létre a(z) {directory} könyvtár",
+ "Some files could not be uploaded" : "Néhány fájlt nem lehet feltölteni",
+ "Files uploaded successfully" : "Fájlok sikeresen feltöltve",
+ "No files to process" : "Nincsenek feldolgozandó fájlok",
+ "Some files could not be copied" : "Néhány fájlt nem lehetett másolni",
+ "Some files could not be moved" : "Néhány fájlt nem lehetett áthelyezni",
+ "Files copied successfully" : "A fájlok másolása sikeres",
+ "Files moved successfully" : "A fájlok áthelyezése sikeres",
+ "Conflicts resolution skipped" : "Konfliktusfeloldás kihagyva",
+ "Upload cancelled" : "Feltöltés megszakítva",
+ "Could not rename \"{oldName}\", it does not exist any more" : "A(z) „{oldName}” nem nevezhető át, mert már nem létezik",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "A(z) „{newName}” név már használatban van a(z) „{dir}” mappában. Válasszon másik nevet.",
+ "Could not rename \"{oldName}\"" : "A(z) „{oldName}” nem nevezhető át",
+ "This operation is forbidden" : "Ez a művelet tiltott",
+ "Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
+ "Unexpected error: {error}" : "Váratlan hiba: {error}",
+ "_%n file_::_%n files_" : ["%n fájl","%n fájl"],
+ "_%n folder_::_%n folders_" : ["%n mappa","%n mappa"],
+ "_%n hidden_::_%n hidden_" : ["%n rejtett","%n rejtett"],
+ "Filename must not be empty." : "A fájlnév nem lehet üres.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}” nem szerepelhet a fájlnévben.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "A(z) „{segment}” egy fenntartott név és fájlnevek esetén nem engedélyezett.",
+ "\"{extension}\" is not an allowed filetype." : "A(z) „{extension}” nem engedélyezett fájltípus.",
+ "Filenames must not end with \"{extension}\"." : "Fájlnév nem végződhet ezzel: „{extension}”.",
+ "List of favorite files and folders." : "Kedvenc fájlok és mappák felsorolása.",
+ "No favorites yet" : "Még nincsenek kedvencek",
+ "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találja meg",
+ "List of your files and folders." : "Saját fájlok és mappák felsorolása.",
+ "List of your files and folders that are not shared." : "Meg nem osztott fájlok és mappák felsorolása.",
+ "No personal files found" : "Nem találhatóak személyes fájlok",
+ "Files that are not shared will show up here." : "A meg nem osztott fájlok itt fognak megjelenni.",
+ "Recent" : "Legutóbbi",
+ "List of recently modified files and folders." : "Közelmúltban módosított fájlok és mappák felsorolása.",
+ "No recently modified files" : "Nincs a közelmúltban módosított fájl",
+ "Files and folders you recently modified will show up here." : "Az Ön által módosított fájlok és mappák itt jelennek meg.",
+ "Search" : "Keresés",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a mappában",
"Select all" : "Összes kijelölése",
"Upload too large" : "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltölteni próbált fájlok mérete meghaladja a kiszolgálón megengedett legnagyobb méretet.",
- "No favorites yet" : "Még nincsenek kedvencek",
- "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találja meg",
- "Deleted files" : "Törölt fájlok",
- "Shares" : "Megosztások",
- "Shared with others" : "Megosztva másokkal",
- "Shared with you" : "Megosztva Önnel",
- "Shared by link" : "Megosztva hivatkozással",
- "Deleted shares" : "Törölt megosztások",
- "Pending shares" : "Függőben lévő megosztások",
+ "File could not be found" : "A fájl nem található",
+ "Show list view" : "Listanézet megjelenítése",
+ "Show grid view" : "Rácsnézet megjelenítése",
+ "Close" : "Bezárás",
+ "Could not create folder \"{dir}\"" : "A(z) „{dir}” mappa nem hozható létre",
+ "This will stop your current uploads." : "Ez meg fogja állítani a jelenlegi feltöltéseket.",
+ "Upload cancelled." : "Feltöltés megszakítva.",
+ "Processing files …" : "Fájlok feldolgozása…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} fájl nem tölthető fel, mert vagy egy könyvtár, vagy 0 bájtos",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely, a feltöltés mérete {size1}, de csak {size2} hely van",
+ "Target folder \"{dir}\" does not exist any more" : "A(z) „{dir}” célmappa már nem létezik",
+ "An unknown error has occurred" : "Ismeretlen hiba történt",
+ "File could not be uploaded" : "A fájlt nem lehetett feltölteni",
+ "Uploading …" : "Feltöltés…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Feltöltés… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Ezen elem feltöltése nem támogatott",
+ "Error when assembling chunks, status code {status}" : "Hiba a darabok összerakásakor, állapotkód: {status}",
+ "Choose target folder" : "Válasszon célmappát",
+ "Set reminder" : "Emlékeztető beállítása",
+ "Edit locally" : "Szerkesztés helyileg",
+ "Open" : "Megnyitás",
+ "Could not load info for file \"{file}\"" : "Nem sikerült betölteni a(z) „{file}” fájl információit",
+ "Please select tag(s) to add to the selection" : "Válassza ki a kijelöléshez adandó címkéket",
+ "Apply tag(s) to selection" : "Címkék alkalmazása a kijelölésre",
+ "Select directory \"{dirName}\"" : "A(z) „{dirName}” könyvtár kiválasztása",
+ "Select file \"{fileName}\"" : "A(z) „{fileName}” fájl kiválasztása",
+ "Unable to determine date" : "Nem lehet meghatározni a dátumot",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem érhető el, nézze meg a naplófájlokat vagy lépjen kapcsolatba az adminisztrátorral",
+ "Could not move \"{file}\", target exists" : "A(z) „{file}” nem helyezhető át, mert a cél már létezik",
+ "Could not move \"{file}\"" : "A(z) „{file}” nem helyezhető át",
+ "copy" : "másolat",
+ "Could not copy \"{file}\", target exists" : "A(z) „{file}” másolása sikertelen, a cél már létezik",
+ "Could not copy \"{file}\"" : "A(z) „{file}” másolása sikertelen",
+ "Copied {origin} inside {destination}" : "A(z) {origin} átmásolva ide: {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "A(z) {origin} és {nbfiles} egyéb fájl átmásolva ide: {destination}",
+ "{newName} already exists" : "A(z) {newName} már létezik",
+ "Could not create file \"{file}\"" : "A(z) „{file}” nem hozható létre",
+ "Could not create file \"{file}\" because it already exists" : "A(z) „{file}” fájl nem hozható létre, mert már létezik",
+ "Could not create folder \"{dir}\" because it already exists" : "A(z) „{dir}” mappa nem hozható létre, mert már létezik",
+ "Could not fetch file details \"{file}\"" : "A(z) „{file}” fájl részleteinek lekérése sikertelen",
+ "Error deleting file \"{fileName}\"." : "Hiba történt a(z) „{fileName}” fájl törlése során.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek találatok más mappákban: {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Vigyen be legalább két karaktert a más mappákban való kereséshez",
+ "{dirs} and {files}" : "{dirs} és {files}",
+ "_including %n hidden_::_including %n hidden_" : ["köztük %n rejtett","köztük %n rejtett"],
+ "You do not have permission to upload or create files here" : "Nincs jogosultsága fájlok ide feltöltéséhez vagy létrehozásához",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n fájl feltöltése","%n fájl feltöltése"],
+ "New" : "Új",
+ "New file/folder menu" : "Új fájl/mappa menü",
+ "Select file range" : "Válasszon fájltartományt",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} felhasználva",
+ "\"{name}\" is an invalid file name." : "A(z) „{name}” fájlnév érvénytelen.",
+ "File name cannot be empty." : "A fájlnév nem lehet üres.",
+ "\"/\" is not allowed inside a file name." : "„/” nem szerepelhet fájlnévben.",
+ "\"{name}\" is not an allowed filetype" : "A(z) „{name}” nem engedélyezett fájltípus",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} tárolója megtelt, a fájlok többé nem frissíthetők és szinkronizálhatók.",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A(z) „{mountPoint}” külső tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Your storage is full, files cannot be updated or synced anymore!" : "A tárhelye megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók.",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} tárhelye majdnem megtelt ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) \"{mountPoint}\" csoportmappa majdnem megtelt ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A(z) „{mountPoint}” külső tárhely majdnem megtelt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Tárhelye majdnem megtelt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "A közvetlen hivatkozás másolva (csak azon személyeknek működik, akik elérik ezt a fájlt/mappát)",
+ "Path" : "Útvonal",
+ "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
+ "Favored" : "Kedvelve",
+ "Favor" : "Kedvelés",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Közvetlen hivatkozás másolása (csak azoknál a személyeknél működik, akiknek hozzáférése van a fájlhoz/mappához)",
+ "Upload file" : "Fájl feltöltése",
+ "Not favored" : "Nincs a kedveltek között",
+ "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket",
+ "Upload (max. %s)" : "Feltöltés (legfeljebb %s)",
+ "\"{displayName}\" action executed successfully" : "A(z) „{displayName}” művelet sikeresen végrehajtva",
+ "\"{displayName}\" action failed" : "A(z) „{displayName}” művelet sikertelen",
+ "\"{displayName}\" failed on some elements" : "A(z) „{displayName}” egyes elemeken nem sikerült",
+ "\"{displayName}\" batch action executed successfully" : "A(z) „{displayName}” tömeges művelet sikeresen végrehajtva",
+ "Submitting fields…" : "Mezők beküldése…",
+ "Filter filenames…" : "Fájlnevek szűrése…",
+ "WebDAV URL copied to clipboard" : "A WebDAV-cím a vágólapra másolva",
+ "Enable the grid view" : "Rácsnézet engedélyezése",
+ "Enable folder tree" : "Mappafa engedélyezése",
+ "Copy to clipboard" : "Másolás a vágólapra",
+ "Use this address to access your Files via WebDAV" : "Ezzel a címmel férhet hozzá a Fájlokhoz a WebDAV-on keresztül",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ha engedélyezte a kétfaktoros hitelesítést, akkor kattintson ide, hogy létrehozzon egy új alkalmazásjelszót, és azt használja.",
+ "Deletion cancelled" : "Törlés megszakítva",
+ "Move cancelled" : "Áthelyezés megszakítva",
+ "Cancelled move or copy of \"{filename}\"." : "„{filename}” áthelyezése vagy másolása megszakítva",
+ "Cancelled move or copy operation" : "Az áthelyezés vagy másolás művelet megszakítva",
+ "Open details" : "Részletek megnyitása",
+ "Photos and images" : "Fényképek és képek",
+ "New folder creation cancelled" : "Az új mappa létrehozása megszakítva",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} mappa"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fájl","{fileCount} fájl"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fájl és {folderCount} mappa","1 fájl és {folderCount} mappa"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fájl és 1 mappa","{fileCount} fájl és 1 mappa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fájl és {folderCount} mappa",
+ "All folders" : "Összes mappa",
+ "Personal Files" : "Személyes fájlok",
"Text file" : "Szövegfájl",
"New text file.txt" : "Új szövegfájl.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} tárhelye betelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A(z) „{mountPoint}” csoportmappa megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A(z) „{mountPoint}” külső tárhely megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "Your storage is full, files can not be updated or synced anymore!" : "A tároló megtelt, a fájlok többé nem frissíthetők vagy szinkronizálhatók!",
- "_matches '{filter}'_::_match '{filter}'_" : ["megfelel ennek: „{filter}”","megfelel ennek: „{filter}”"]
+ "%1$s (renamed)" : "%1$s (átnevezve)",
+ "renamed file" : "átnevezett fájl",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "A Windows-kompatibilis fájlnevek engedélyezése után a meglévő fájlok már nem módosíthatóak, de a tulajdonosaik átnevezhetik őket érvényes új nevekre.",
+ "Filter file names …" : "Fájlnevek szűrése…",
+ "Prevent warning dialogs from open or reenable them." : "Figyelmeztető párbeszédablakok megnyitásának megakadályozása vagy engedélyezése.",
+ "Show a warning dialog when changing a file extension." : "Figyelmeztető párbeszédablakok megnyitása a fájlkiterjesztés módosításakor.",
+ "Speed up your Files experience with these quick shortcuts." : "Gyorsítsa fel a fájlböngészést ezekkel a billentyűparancsokkal.",
+ "Open the actions menu for a file" : "Nyissa meg a fájl műveletek menüjét",
+ "Rename a file" : "Fájl átnevezése",
+ "Delete a file" : "Fájl törlése",
+ "Favorite or remove a file from favorites" : "Fájl hozzáadása vagy eltávolítása a kedvencek közül",
+ "Manage tags for a file" : "Fájl címkéinek kezelése",
+ "Deselect all files" : "Összes fájl kijelölésének törlése",
+ "Select or deselect a file" : "Fájl kijelölése vagy kijelölés törlése",
+ "Select a range of files" : "Válasszon ki fájlokat",
+ "Navigate to the parent folder" : "Navigálás a szülőmappához",
+ "Navigate to the file above" : "Navigálás a fentebbi fájlhoz",
+ "Navigate to the file below" : "Navigálás a lentebbi fájlhoz",
+ "Navigate to the file on the left (in grid mode)" : "Navigálás a balra lévő fájlhoz (rács módban)",
+ "Navigate to the file on the right (in grid mode)" : "Navigálás a jobbra lévő fájlhoz (rács módban)",
+ "Toggle the grid view" : "Rácsnézet be/ki",
+ "Open the sidebar for a file" : "Oldalsáv megnyitása a fájlhoz"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js
deleted file mode 100644
index c515b73db76..00000000000
--- a/apps/files/l10n/hy.js
+++ /dev/null
@@ -1,40 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Files" : "Ֆայլեր",
- "All files" : "Բոլոր ֆայլերը",
- "Close" : "Փակել",
- "Download" : "Ներբեռնել",
- "Rename" : "Վերանվանել",
- "Delete" : "Ջնջել",
- "Select" : "Նշել",
- "Name" : "Անուն",
- "Size" : "Չափս",
- "Modified" : "Փոփոխված",
- "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"],
- "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"],
- "{dirs} and {files}" : "{dirs} և {files}",
- "New" : "Նոր",
- "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"],
- "Folder" : "Պանակ",
- "New folder" : "Նոր պանակ",
- "{newname} already exists" : "{newname} գոյություն ունի",
- "Upload" : "Բեռնել",
- "You created %1$s" : "Դու ստեղծեցիր %1$s",
- "%2$s created %1$s" : "%2$s ստեղծեց %1$s",
- "You changed %1$s" : "Դու փոխեցիր %1$s",
- "%2$s changed %1$s" : "%2$s փոխեց %1$s",
- "You deleted %1$s" : "Դու ջնջեցիր %1$s",
- "%2$s deleted %1$s" : "%2$s ջնջեց %1$s",
- "You restored %1$s" : "Դու վերականգնեցիր %1$s",
- "%2$s restored %1$s" : "%2$s վերականգնեց %1$s",
- "Changed by %2$s" : "Փոխվել է %2$sի կողմից",
- "Deleted by %2$s" : "Ջնջվել է %2$sի կողմից",
- "Restored by %2$s" : "Վերականգնվել է %2$sի կողմից",
- "Save" : "Պահպանել",
- "No files in here" : "Ֆայլեր չկան այստեղ",
- "Select all" : "Նշել բոլորը",
- "Text file" : "Տեքստ ֆայլ",
- "New text file.txt" : "Նոր տեքստ ֆայլ.txt"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json
deleted file mode 100644
index 4376072e4b6..00000000000
--- a/apps/files/l10n/hy.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{ "translations": {
- "Files" : "Ֆայլեր",
- "All files" : "Բոլոր ֆայլերը",
- "Close" : "Փակել",
- "Download" : "Ներբեռնել",
- "Rename" : "Վերանվանել",
- "Delete" : "Ջնջել",
- "Select" : "Նշել",
- "Name" : "Անուն",
- "Size" : "Չափս",
- "Modified" : "Փոփոխված",
- "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"],
- "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"],
- "{dirs} and {files}" : "{dirs} և {files}",
- "New" : "Նոր",
- "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"],
- "Folder" : "Պանակ",
- "New folder" : "Նոր պանակ",
- "{newname} already exists" : "{newname} գոյություն ունի",
- "Upload" : "Բեռնել",
- "You created %1$s" : "Դու ստեղծեցիր %1$s",
- "%2$s created %1$s" : "%2$s ստեղծեց %1$s",
- "You changed %1$s" : "Դու փոխեցիր %1$s",
- "%2$s changed %1$s" : "%2$s փոխեց %1$s",
- "You deleted %1$s" : "Դու ջնջեցիր %1$s",
- "%2$s deleted %1$s" : "%2$s ջնջեց %1$s",
- "You restored %1$s" : "Դու վերականգնեցիր %1$s",
- "%2$s restored %1$s" : "%2$s վերականգնեց %1$s",
- "Changed by %2$s" : "Փոխվել է %2$sի կողմից",
- "Deleted by %2$s" : "Ջնջվել է %2$sի կողմից",
- "Restored by %2$s" : "Վերականգնվել է %2$sի կողմից",
- "Save" : "Պահպանել",
- "No files in here" : "Ֆայլեր չկան այստեղ",
- "Select all" : "Նշել բոլորը",
- "Text file" : "Տեքստ ֆայլ",
- "New text file.txt" : "Նոր տեքստ ֆայլ.txt"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js
deleted file mode 100644
index 92b26fae1d7..00000000000
--- a/apps/files/l10n/ia.js
+++ /dev/null
@@ -1,126 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Immagazinage es provisorimente non disponibile",
- "Storage invalid" : "Immagazinage non valide",
- "Unknown error" : "Error incognite",
- "File could not be found" : "Impossibile trovar le file",
- "Download" : "Discargar",
- "Delete" : "Deler",
- "Home" : "Initio",
- "Close" : "Clauder",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Impossibile crear dossier \"{dir}\"",
- "Upload cancelled." : "Incarga cancellate.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile incargar {filename} proque illo es un directorio o ha 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Il non ha satis de spatio libere, tu incarga {size1} ma il resta a pena {size2} in total",
- "Target folder \"{dir}\" does not exist any more" : "Le dossier de destination \"{dir}\" non existe plus",
- "Not enough free space" : "Il non ha satis de spatio libere",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Actions" : "Actiones",
- "Rename" : "Renominar",
- "Copy" : "Copiar",
- "Delete folder" : "Deler dossier",
- "Disconnect storage" : "Immagazinage disconnectite ",
- "Could not load info for file \"{file}\"" : "Impossibile cargar informationes pro file \"{file}\"",
- "Files" : "Files",
- "Details" : "Detalios",
- "Select" : "Selectionar",
- "Pending" : "Pendente",
- "Unable to determine date" : "Impossibile determinar data",
- "This operation is forbidden" : "Iste operation es prohibite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Iste directorio non es disponibile, per favor verifica le registros o contacta le administrator",
- "Could not move \"{file}\", target exists" : "Impossibile displaciar \"{file}\": le destination ja existe",
- "Could not move \"{file}\"" : "Impossibile displaciar \"{file}\"",
- "{newName} already exists" : "{newName} ja existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile renominar \"{fileName}\": illo non existe plus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nomine \"{targetName}\" es ja usate in le dossier \"{dir}\". Per favor, selectiona un nomine differente.",
- "Could not rename \"{fileName}\"" : "Impossibile renominar \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossibile crear file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossibile crear file \"{file}\" proque illo ja existe",
- "Could not create folder \"{dir}\" because it already exists" : "Impossibile crear dossier \"{dir}\" proque illo ja existe",
- "Error deleting file \"{fileName}\"." : "Error durante deletion del file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nulle resultatos in altere dossiers pro le cerca {tag}{filter}{endtag}",
- "Name" : "Nomine",
- "Size" : "Dimension",
- "Modified" : "Modificate",
- "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["includente %n occultate","includente %n occultates"],
- "You don’t have permission to upload or create files here" : "Tu non ha permission pro incargar o crear files ci.",
- "_Uploading %n file_::_Uploading %n files_" : ["Incargante %n file","Incargante %n files"],
- "New" : "Nove",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nomine de file non valide.",
- "File name cannot be empty." : "Le nomine de file non pote esser vacue.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" non es un typo de file valide ",
- "View in folder" : "Vider in dossier",
- "Copied!" : "Copiate!",
- "Path" : "Sentiero",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favorite",
- "Favorite" : "Favorite",
- "New folder" : "Nove dossier",
- "Upload file" : "Upload file",
- "Recent" : "Recente",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Un error occurreva durante le actualisation del etiquettas",
- "Added to favorites" : "Addite al favoritos",
- "Removed from favorites" : "Removite del favoritos",
- "You added {file} to your favorites" : "Tu addeva {file} a tu favoritos",
- "You removed {file} from your favorites" : "Tu removeva {file} de tu favortos",
- "File changes" : "Modificationes del file",
- "Created by {user}" : "Create per {user}",
- "Changed by {user}" : "Modificate per {user}",
- "Deleted by {user}" : "Delite per {user}",
- "Restored by {user}" : "Restaurate per {user}",
- "Renamed by {user}" : "Renominate per {user}",
- "Moved by {user}" : "Displaciate per {user}",
- "\"remote user\"" : "\"usator remote\"",
- "You created {file}" : "Tu creava {file}",
- "{user} created {file}" : "{user} creava {file}",
- "{file} was created in a public folder" : "{file} esseva create in un dossier public",
- "You changed {file}" : "Tu modificava {file}",
- "{user} changed {file}" : "{user} modificava {file}",
- "You deleted {file}" : "Tu deleva {file}",
- "{user} deleted {file}" : "{user} deleva {file}",
- "You restored {file}" : "Tu restaurava {file}",
- "{user} restored {file}" : "{user} restaurava {file}",
- "You renamed {oldfile} to {newfile}" : "Tu renominava {oldfile} a {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renominava {oldfile} a {newfile}",
- "You moved {oldfile} to {newfile}" : "Tu displaciava {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} displaciava {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un file esseva addite a o removite de tu <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un file o dossier ha essite <strong>modificate</strong>",
- "All files" : "Tote files",
- "Unlimited" : "Ilimitate",
- "Upload (max. %s)" : "Incarga (maxime %s)",
- "Accept" : "Acceptar",
- "in %s" : "in %s",
- "Tags" : "Etiquettas",
- "Cancel" : "Cancellar",
- "Create" : "Crear",
- "%1$s of %2$s used" : "%1$s de %2$s usate",
- "Settings" : "Configurationes",
- "Show hidden files" : "Monstrar files occultate",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nulle files ci",
- "Upload some content or sync with your devices!" : "Incarga alcun contento o synchronisa con tu apparatos!",
- "No entries found in this folder" : "Nulle entratas trovate in iste dossier",
- "Select all" : "Selectionar toto",
- "Upload too large" : "Incarga troppo grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Le files que tu tenta incargar excede le dimension maxime pro incarga de files in iste servitor.",
- "Files and folders you mark as favorite will show up here" : "Files e dossiers que tu marca como favorito essera monstrate ci",
- "Deleted files" : "Files delite",
- "Shares" : "Compartimentos",
- "Shared with others" : "Compartite con alteres",
- "Shared with you" : "Compartite con te",
- "Shared by link" : "Compartite per ligamine",
- "Text file" : "File de texto",
- "New text file.txt" : "Nove texto file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Le immagazinage de {owner} es plen: files non pote esser actualisate o synchronisate plus!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu immagazinage es plen: files non pote esser actualisate o synchronisate plus!",
- "_matches '{filter}'_::_match '{filter}'_" : ["corresponde '{filter}'","corresponde '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json
deleted file mode 100644
index 24f606f76c0..00000000000
--- a/apps/files/l10n/ia.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Immagazinage es provisorimente non disponibile",
- "Storage invalid" : "Immagazinage non valide",
- "Unknown error" : "Error incognite",
- "File could not be found" : "Impossibile trovar le file",
- "Download" : "Discargar",
- "Delete" : "Deler",
- "Home" : "Initio",
- "Close" : "Clauder",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Impossibile crear dossier \"{dir}\"",
- "Upload cancelled." : "Incarga cancellate.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile incargar {filename} proque illo es un directorio o ha 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Il non ha satis de spatio libere, tu incarga {size1} ma il resta a pena {size2} in total",
- "Target folder \"{dir}\" does not exist any more" : "Le dossier de destination \"{dir}\" non existe plus",
- "Not enough free space" : "Il non ha satis de spatio libere",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Actions" : "Actiones",
- "Rename" : "Renominar",
- "Copy" : "Copiar",
- "Delete folder" : "Deler dossier",
- "Disconnect storage" : "Immagazinage disconnectite ",
- "Could not load info for file \"{file}\"" : "Impossibile cargar informationes pro file \"{file}\"",
- "Files" : "Files",
- "Details" : "Detalios",
- "Select" : "Selectionar",
- "Pending" : "Pendente",
- "Unable to determine date" : "Impossibile determinar data",
- "This operation is forbidden" : "Iste operation es prohibite",
- "This directory is unavailable, please check the logs or contact the administrator" : "Iste directorio non es disponibile, per favor verifica le registros o contacta le administrator",
- "Could not move \"{file}\", target exists" : "Impossibile displaciar \"{file}\": le destination ja existe",
- "Could not move \"{file}\"" : "Impossibile displaciar \"{file}\"",
- "{newName} already exists" : "{newName} ja existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile renominar \"{fileName}\": illo non existe plus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nomine \"{targetName}\" es ja usate in le dossier \"{dir}\". Per favor, selectiona un nomine differente.",
- "Could not rename \"{fileName}\"" : "Impossibile renominar \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossibile crear file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossibile crear file \"{file}\" proque illo ja existe",
- "Could not create folder \"{dir}\" because it already exists" : "Impossibile crear dossier \"{dir}\" proque illo ja existe",
- "Error deleting file \"{fileName}\"." : "Error durante deletion del file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nulle resultatos in altere dossiers pro le cerca {tag}{filter}{endtag}",
- "Name" : "Nomine",
- "Size" : "Dimension",
- "Modified" : "Modificate",
- "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"],
- "_%n file_::_%n files_" : ["%n file","%n files"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["includente %n occultate","includente %n occultates"],
- "You don’t have permission to upload or create files here" : "Tu non ha permission pro incargar o crear files ci.",
- "_Uploading %n file_::_Uploading %n files_" : ["Incargante %n file","Incargante %n files"],
- "New" : "Nove",
- "\"{name}\" is an invalid file name." : "\"{name}\" es un nomine de file non valide.",
- "File name cannot be empty." : "Le nomine de file non pote esser vacue.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" non es un typo de file valide ",
- "View in folder" : "Vider in dossier",
- "Copied!" : "Copiate!",
- "Path" : "Sentiero",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favorite",
- "Favorite" : "Favorite",
- "New folder" : "Nove dossier",
- "Upload file" : "Upload file",
- "Recent" : "Recente",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Un error occurreva durante le actualisation del etiquettas",
- "Added to favorites" : "Addite al favoritos",
- "Removed from favorites" : "Removite del favoritos",
- "You added {file} to your favorites" : "Tu addeva {file} a tu favoritos",
- "You removed {file} from your favorites" : "Tu removeva {file} de tu favortos",
- "File changes" : "Modificationes del file",
- "Created by {user}" : "Create per {user}",
- "Changed by {user}" : "Modificate per {user}",
- "Deleted by {user}" : "Delite per {user}",
- "Restored by {user}" : "Restaurate per {user}",
- "Renamed by {user}" : "Renominate per {user}",
- "Moved by {user}" : "Displaciate per {user}",
- "\"remote user\"" : "\"usator remote\"",
- "You created {file}" : "Tu creava {file}",
- "{user} created {file}" : "{user} creava {file}",
- "{file} was created in a public folder" : "{file} esseva create in un dossier public",
- "You changed {file}" : "Tu modificava {file}",
- "{user} changed {file}" : "{user} modificava {file}",
- "You deleted {file}" : "Tu deleva {file}",
- "{user} deleted {file}" : "{user} deleva {file}",
- "You restored {file}" : "Tu restaurava {file}",
- "{user} restored {file}" : "{user} restaurava {file}",
- "You renamed {oldfile} to {newfile}" : "Tu renominava {oldfile} a {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renominava {oldfile} a {newfile}",
- "You moved {oldfile} to {newfile}" : "Tu displaciava {oldfile} a {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} displaciava {oldfile} a {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un file esseva addite a o removite de tu <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un file o dossier ha essite <strong>modificate</strong>",
- "All files" : "Tote files",
- "Unlimited" : "Ilimitate",
- "Upload (max. %s)" : "Incarga (maxime %s)",
- "Accept" : "Acceptar",
- "in %s" : "in %s",
- "Tags" : "Etiquettas",
- "Cancel" : "Cancellar",
- "Create" : "Crear",
- "%1$s of %2$s used" : "%1$s de %2$s usate",
- "Settings" : "Configurationes",
- "Show hidden files" : "Monstrar files occultate",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nulle files ci",
- "Upload some content or sync with your devices!" : "Incarga alcun contento o synchronisa con tu apparatos!",
- "No entries found in this folder" : "Nulle entratas trovate in iste dossier",
- "Select all" : "Selectionar toto",
- "Upload too large" : "Incarga troppo grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Le files que tu tenta incargar excede le dimension maxime pro incarga de files in iste servitor.",
- "Files and folders you mark as favorite will show up here" : "Files e dossiers que tu marca como favorito essera monstrate ci",
- "Deleted files" : "Files delite",
- "Shares" : "Compartimentos",
- "Shared with others" : "Compartite con alteres",
- "Shared with you" : "Compartite con te",
- "Shared by link" : "Compartite per ligamine",
- "Text file" : "File de texto",
- "New text file.txt" : "Nove texto file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Le immagazinage de {owner} es plen: files non pote esser actualisate o synchronisate plus!",
- "Your storage is full, files can not be updated or synced anymore!" : "Tu immagazinage es plen: files non pote esser actualisate o synchronisate plus!",
- "_matches '{filter}'_::_match '{filter}'_" : ["corresponde '{filter}'","corresponde '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js
deleted file mode 100644
index 016d8b57e6c..00000000000
--- a/apps/files/l10n/id.js
+++ /dev/null
@@ -1,187 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Penyimpanan sementara tidak tersedia",
- "Storage invalid" : "Penyimpanan tidak sah",
- "Unknown error" : "Kesalahan tidak diketahui",
- "File could not be found" : "Berkas tidak ditemukan",
- "Move or copy" : "Pindah atau salin",
- "Download" : "Unduh",
- "Delete" : "Hapus",
- "Home" : "Rumah",
- "Close" : "Tutup",
- "Favorites" : "Favorit",
- "Could not create folder \"{dir}\"" : "Tidak dapat membuat folder \"{dir}\"",
- "This will stop your current uploads." : "Ini akan menghentikan proses pengunggahan.",
- "Upload cancelled." : "Pengunggahan dibatalkan.",
- "Processing files …" : "Memproses berkas ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa",
- "Target folder \"{dir}\" does not exist any more" : "Folder target \"{dir}\" sudah tidak ada lagi",
- "Not enough free space" : "Ruang kosong tidak cukup",
- "An unknown error has occurred" : "Terjadi galat yang tak diketahui",
- "Uploading …" : "Mengunggah …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} dari {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Pengunggahan itu tidak didukung",
- "Target folder does not exist any more" : "Folder target sudah tidak ada lagi",
- "Error when assembling chunks, status code {status}" : "Galat saat merakit potongan, kode status {status}",
- "Actions" : "Tindakan",
- "Rename" : "Ubah nama",
- "Copy" : "Salin",
- "Choose target folder" : "Pilih folder target",
- "Open" : "Buka",
- "Delete file" : "Hapus berkas",
- "Delete folder" : "Hapus folder",
- "Disconnect storage" : "Memutuskan penyimpaan",
- "Could not load info for file \"{file}\"" : "Tidak dapat menampilkan info berkas \"{file}\"",
- "Files" : "Berkas",
- "Details" : "Rincian",
- "Select" : "Pilih",
- "Pending" : "Tertunda",
- "Unable to determine date" : "Tidak dapat menentukan tanggal",
- "This operation is forbidden" : "Operasi ini dilarang",
- "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
- "Could not move \"{file}\", target exists" : "Tidak dapat memindahkan \"{file}\", sudah ada",
- "Could not move \"{file}\"" : "Tidak dapat memindahkan \"{file}\"",
- "copy" : "salin",
- "Could not copy \"{file}\", target exists" : "Tidak dapat menyalin \"{file}\", target eksis",
- "Could not copy \"{file}\"" : "Tidak dapat menyalin \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} tersalin ke {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} dan {nbfiles} berkas lainnya tersalin ke {destination}",
- "{newName} already exists" : "{newName} sudah ada",
- "Could not rename \"{fileName}\", it does not exist any more" : "Tidak dapat mengganti \"{fileName}\", tidak ada lagi",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nama \"{targetName}\" sudah digunakan di folder \"{dir}\". Gunakan nama yang lain.",
- "Could not rename \"{fileName}\"" : "Tidak dapat mengganti \"{fileName}\"",
- "Could not create file \"{file}\"" : "Tidak dapat membuat berkas \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Tidak dapat membuat berkas \"{file}\" karena sudah ada",
- "Could not create folder \"{dir}\" because it already exists" : "Tidak dapat membuat folder \"{dir}\" karena sudah ada",
- "Could not fetch file details \"{file}\"" : "Tidak dapat melihat detail \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Terjadi kesalahan saat menghapus berkas \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Hasil pencarian tidak ditemukan di folder lainnya untuk '{tag}{filter}{endtag}'",
- "Name" : "Nama",
- "Size" : "Ukuran",
- "Modified" : "Dimodifikasi",
- "_%n folder_::_%n folders_" : ["%n folder"],
- "_%n file_::_%n files_" : ["%n berkas"],
- "{dirs} and {files}" : "{dirs} dan {files}",
- "_including %n hidden_::_including %n hidden_" : ["Termasuk %n tersembunyi"],
- "You don’t have permission to upload or create files here" : "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini",
- "_Uploading %n file_::_Uploading %n files_" : ["Mengunggah %n berkas"],
- "New" : "Baru",
- "Select file range" : "Pilih rentang berkas",
- "{used} of {quota} used" : "{used} dari {quota} terpakai",
- "{used} used" : "{used} terpakai",
- "\"{name}\" is an invalid file name." : "\"{name}\" adalah nama berkas yang tidak sah.",
- "File name cannot be empty." : "Nama berkas tidak boleh kosong.",
- "\"/\" is not allowed inside a file name." : "\"/\" tidak diizinkan pada nama berkas.",
- "\"{name}\" is not an allowed filetype" : "Tipe berkas \"{name}\" tidak diizinkan",
- "View in folder" : "Lihat dalam folder",
- "Copied!" : "Tersalin!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Salin tautan langsung (hanya berlaku bagi pengguna yang telah memiliki akses ke berkas/folder ini)",
- "Path" : "Jalur",
- "_%n byte_::_%n bytes_" : ["%n byte"],
- "Favorited" : "Difavoritkan",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Anda hanya dapat memfavoritkan satu berkas atau folder dalam satu waktu",
- "New folder" : "Map baru",
- "Upload file" : "Unggah berkas",
- "Recent" : "Terbaru",
- "Not favorited" : "Tidak favorit",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Tambah ke favorit",
- "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label",
- "Added to favorites" : "Tambah ke favorit",
- "Removed from favorites" : "Terbuang dari favorit",
- "You added {file} to your favorites" : "Anda menambahkan {file} ke favorit",
- "You removed {file} from your favorites" : "Anda membuang {file} dari favorit",
- "File changes" : "Berkas berubah",
- "Created by {user}" : "Dibuat oleh {user}",
- "Changed by {user}" : "Diubah oleh {user}",
- "Deleted by {user}" : "Dihapus oleh {user}",
- "Restored by {user}" : "Dipulihkan oleh {user}",
- "Renamed by {user}" : "Diganti nama oleh {user}",
- "Moved by {user}" : "Dipindahkan oleh {user}",
- "\"remote user\"" : "\"remote user\"",
- "You created {file}" : "Anda membuat {file}",
- "You created an encrypted file in {file}" : "Anda membuat berkas terenkripsi pada {file}",
- "{user} created {file}" : "{user} membuat {file}",
- "{user} created an encrypted file in {file}" : "{user} membuat berkas terenkripsi pada {file}",
- "{file} was created in a public folder" : "{file} dibuat pada folder publik",
- "You changed {file}" : "Anda mengubah {file}",
- "You changed an encrypted file in {file}" : "Anda mengubah berkas terenkripsi pada {file}",
- "{user} changed {file}" : "{user} mengubah {file}",
- "{user} changed an encrypted file in {file}" : "{user} mengubah berkas terenkripsi pada {file}",
- "You deleted {file}" : "Anda menghapus {file}",
- "You deleted an encrypted file in {file}" : "Anda menghapus berkas terenkripsi pada {file}",
- "{user} deleted {file}" : "{user} menghapus {file}",
- "{user} deleted an encrypted file in {file}" : "{user} menghapus berkas terenkripsi pada {file}",
- "You restored {file}" : "Anda memulihkan {file}",
- "{user} restored {file}" : "{user} memulihkan {file}",
- "You renamed {oldfile} to {newfile}" : "Anda mengganti nama {oldfile} menjadi {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} mengganti nama {oldfile} menjadi {newfile}",
- "You moved {oldfile} to {newfile}" : "Anda memindahkan {oldfile} menjadi {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} memindahkan {oldfile} menjadi {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Suatu berkas telah ditambahkan atau dibuang dari <strong>favorit</strong>",
- "A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>",
- "All files" : "Semua berkas",
- "Unlimited" : "Tak terbatas",
- "Upload (max. %s)" : "Unggah (maks. %s)",
- "Accept" : "Terima",
- "Reject" : "Ditolak",
- "Incoming ownership transfer from {user}" : "Permintaan transfer kepemilikan dari {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Apakah Anda ingin menerima {path}?\n\nCatatan: Setelah diterima, proses transfer butuh kurang lebih 1 jam.",
- "Ownership transfer failed" : "Transfer kepemilikan gagal",
- "Your ownership transfer of {path} to {user} failed." : "Transfer kepemilikan Anda pada {path} ke {user} gagal.",
- "The ownership transfer of {path} from {user} failed." : "Transfer kepemilikan pada {path} dari {user} gagal.",
- "Ownership transfer done" : "Transfer kepemilikan selesai",
- "Your ownership transfer of {path} to {user} has completed." : "Transfer kepemilikan Anda pada {path} ke {user} selesai.",
- "The ownership transfer of {path} from {user} has completed." : "Transfer kepemilikan pada {path} dari {user} selesai.",
- "in %s" : "dalam %s",
- "File Management" : "Pengelolaan Berkas",
- "Transfer ownership of a file or folder" : "Transfer kepemilikan dari berkas atau folder",
- "Choose file or folder to transfer" : "Pilih berkas atau folder untuk transfer",
- "Change" : "Ubah",
- "New owner" : "Pemilik baru",
- "Search users" : "Cari pengguna",
- "Choose a file or folder to transfer" : "Pilih berkas atau folder untuk ditransfer",
- "Transfer" : "Transfer",
- "Transfer {path} to {userid}" : "Transfer {path} ke {user}",
- "Invalid path selected" : "Jalur terpilih invalid",
- "Ownership transfer request sent" : "Permintaan transfer kepemilikan terkirim",
- "Cannot transfer ownership of a file or folder you don't own" : "Tidak dapat melakukan transfer kepemilikan dari berkas dan folder yang tidak Anda miliki",
- "Tags" : "Tag",
- "Unable to change the favourite state of the file" : "Gagal mengubah status favorit berkas",
- "Error while loading the file data" : "Galat pemuatan data berkas",
- "Cancel" : "Membatalkan",
- "Create" : "Buat",
- "%s used" : "%s digunakan",
- "%s%% of %s used" : "%s%% dari %s terpakai",
- "%1$s of %2$s used" : "%1$s dari %2$s sudah digunakan",
- "Settings" : "Pengaturan",
- "Show hidden files" : "Lihat berkas tersembunyi",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Gunakan alamat ini untuk mengakses Berkas Anda via WebDAV",
- "Toggle grid view" : "Alihkan tampilan jala-jala",
- "No files in here" : "Tidak ada berkas disini",
- "Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
- "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
- "Select all" : "Pilih Semua",
- "Upload too large" : "Yang diunggah terlalu besar",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
- "No favorites yet" : "Belum memiliki favorit",
- "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.",
- "Deleted files" : "Berkas terhapus",
- "Shares" : "Dibagikan",
- "Shared with others" : "Dibagikan dengan lainnya",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Dibagikan dengan tautan",
- "Deleted shares" : "Berbagi terhapus",
- "Pending shares" : "Berbagi tertunda",
- "Text file" : "Berkas teks",
- "New text file.txt" : "Teks baru file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Penyimpanan {owner} penuh, berkas tidak dapat diperbarui atau disinkronisasikan lagi!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ruang penyimpanan Anda penuh, berkas tidak dapat diperbarui atau disinkronkan lagi!",
- "_matches '{filter}'_::_match '{filter}'_" : ["cocok dengan '{filter}'"]
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json
deleted file mode 100644
index bf20ae66aac..00000000000
--- a/apps/files/l10n/id.json
+++ /dev/null
@@ -1,185 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Penyimpanan sementara tidak tersedia",
- "Storage invalid" : "Penyimpanan tidak sah",
- "Unknown error" : "Kesalahan tidak diketahui",
- "File could not be found" : "Berkas tidak ditemukan",
- "Move or copy" : "Pindah atau salin",
- "Download" : "Unduh",
- "Delete" : "Hapus",
- "Home" : "Rumah",
- "Close" : "Tutup",
- "Favorites" : "Favorit",
- "Could not create folder \"{dir}\"" : "Tidak dapat membuat folder \"{dir}\"",
- "This will stop your current uploads." : "Ini akan menghentikan proses pengunggahan.",
- "Upload cancelled." : "Pengunggahan dibatalkan.",
- "Processing files …" : "Memproses berkas ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa",
- "Target folder \"{dir}\" does not exist any more" : "Folder target \"{dir}\" sudah tidak ada lagi",
- "Not enough free space" : "Ruang kosong tidak cukup",
- "An unknown error has occurred" : "Terjadi galat yang tak diketahui",
- "Uploading …" : "Mengunggah …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} dari {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Pengunggahan itu tidak didukung",
- "Target folder does not exist any more" : "Folder target sudah tidak ada lagi",
- "Error when assembling chunks, status code {status}" : "Galat saat merakit potongan, kode status {status}",
- "Actions" : "Tindakan",
- "Rename" : "Ubah nama",
- "Copy" : "Salin",
- "Choose target folder" : "Pilih folder target",
- "Open" : "Buka",
- "Delete file" : "Hapus berkas",
- "Delete folder" : "Hapus folder",
- "Disconnect storage" : "Memutuskan penyimpaan",
- "Could not load info for file \"{file}\"" : "Tidak dapat menampilkan info berkas \"{file}\"",
- "Files" : "Berkas",
- "Details" : "Rincian",
- "Select" : "Pilih",
- "Pending" : "Tertunda",
- "Unable to determine date" : "Tidak dapat menentukan tanggal",
- "This operation is forbidden" : "Operasi ini dilarang",
- "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak",
- "Could not move \"{file}\", target exists" : "Tidak dapat memindahkan \"{file}\", sudah ada",
- "Could not move \"{file}\"" : "Tidak dapat memindahkan \"{file}\"",
- "copy" : "salin",
- "Could not copy \"{file}\", target exists" : "Tidak dapat menyalin \"{file}\", target eksis",
- "Could not copy \"{file}\"" : "Tidak dapat menyalin \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} tersalin ke {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} dan {nbfiles} berkas lainnya tersalin ke {destination}",
- "{newName} already exists" : "{newName} sudah ada",
- "Could not rename \"{fileName}\", it does not exist any more" : "Tidak dapat mengganti \"{fileName}\", tidak ada lagi",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nama \"{targetName}\" sudah digunakan di folder \"{dir}\". Gunakan nama yang lain.",
- "Could not rename \"{fileName}\"" : "Tidak dapat mengganti \"{fileName}\"",
- "Could not create file \"{file}\"" : "Tidak dapat membuat berkas \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Tidak dapat membuat berkas \"{file}\" karena sudah ada",
- "Could not create folder \"{dir}\" because it already exists" : "Tidak dapat membuat folder \"{dir}\" karena sudah ada",
- "Could not fetch file details \"{file}\"" : "Tidak dapat melihat detail \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Terjadi kesalahan saat menghapus berkas \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Hasil pencarian tidak ditemukan di folder lainnya untuk '{tag}{filter}{endtag}'",
- "Name" : "Nama",
- "Size" : "Ukuran",
- "Modified" : "Dimodifikasi",
- "_%n folder_::_%n folders_" : ["%n folder"],
- "_%n file_::_%n files_" : ["%n berkas"],
- "{dirs} and {files}" : "{dirs} dan {files}",
- "_including %n hidden_::_including %n hidden_" : ["Termasuk %n tersembunyi"],
- "You don’t have permission to upload or create files here" : "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini",
- "_Uploading %n file_::_Uploading %n files_" : ["Mengunggah %n berkas"],
- "New" : "Baru",
- "Select file range" : "Pilih rentang berkas",
- "{used} of {quota} used" : "{used} dari {quota} terpakai",
- "{used} used" : "{used} terpakai",
- "\"{name}\" is an invalid file name." : "\"{name}\" adalah nama berkas yang tidak sah.",
- "File name cannot be empty." : "Nama berkas tidak boleh kosong.",
- "\"/\" is not allowed inside a file name." : "\"/\" tidak diizinkan pada nama berkas.",
- "\"{name}\" is not an allowed filetype" : "Tipe berkas \"{name}\" tidak diizinkan",
- "View in folder" : "Lihat dalam folder",
- "Copied!" : "Tersalin!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Salin tautan langsung (hanya berlaku bagi pengguna yang telah memiliki akses ke berkas/folder ini)",
- "Path" : "Jalur",
- "_%n byte_::_%n bytes_" : ["%n byte"],
- "Favorited" : "Difavoritkan",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Anda hanya dapat memfavoritkan satu berkas atau folder dalam satu waktu",
- "New folder" : "Map baru",
- "Upload file" : "Unggah berkas",
- "Recent" : "Terbaru",
- "Not favorited" : "Tidak favorit",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Tambah ke favorit",
- "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label",
- "Added to favorites" : "Tambah ke favorit",
- "Removed from favorites" : "Terbuang dari favorit",
- "You added {file} to your favorites" : "Anda menambahkan {file} ke favorit",
- "You removed {file} from your favorites" : "Anda membuang {file} dari favorit",
- "File changes" : "Berkas berubah",
- "Created by {user}" : "Dibuat oleh {user}",
- "Changed by {user}" : "Diubah oleh {user}",
- "Deleted by {user}" : "Dihapus oleh {user}",
- "Restored by {user}" : "Dipulihkan oleh {user}",
- "Renamed by {user}" : "Diganti nama oleh {user}",
- "Moved by {user}" : "Dipindahkan oleh {user}",
- "\"remote user\"" : "\"remote user\"",
- "You created {file}" : "Anda membuat {file}",
- "You created an encrypted file in {file}" : "Anda membuat berkas terenkripsi pada {file}",
- "{user} created {file}" : "{user} membuat {file}",
- "{user} created an encrypted file in {file}" : "{user} membuat berkas terenkripsi pada {file}",
- "{file} was created in a public folder" : "{file} dibuat pada folder publik",
- "You changed {file}" : "Anda mengubah {file}",
- "You changed an encrypted file in {file}" : "Anda mengubah berkas terenkripsi pada {file}",
- "{user} changed {file}" : "{user} mengubah {file}",
- "{user} changed an encrypted file in {file}" : "{user} mengubah berkas terenkripsi pada {file}",
- "You deleted {file}" : "Anda menghapus {file}",
- "You deleted an encrypted file in {file}" : "Anda menghapus berkas terenkripsi pada {file}",
- "{user} deleted {file}" : "{user} menghapus {file}",
- "{user} deleted an encrypted file in {file}" : "{user} menghapus berkas terenkripsi pada {file}",
- "You restored {file}" : "Anda memulihkan {file}",
- "{user} restored {file}" : "{user} memulihkan {file}",
- "You renamed {oldfile} to {newfile}" : "Anda mengganti nama {oldfile} menjadi {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} mengganti nama {oldfile} menjadi {newfile}",
- "You moved {oldfile} to {newfile}" : "Anda memindahkan {oldfile} menjadi {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} memindahkan {oldfile} menjadi {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Suatu berkas telah ditambahkan atau dibuang dari <strong>favorit</strong>",
- "A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>",
- "All files" : "Semua berkas",
- "Unlimited" : "Tak terbatas",
- "Upload (max. %s)" : "Unggah (maks. %s)",
- "Accept" : "Terima",
- "Reject" : "Ditolak",
- "Incoming ownership transfer from {user}" : "Permintaan transfer kepemilikan dari {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Apakah Anda ingin menerima {path}?\n\nCatatan: Setelah diterima, proses transfer butuh kurang lebih 1 jam.",
- "Ownership transfer failed" : "Transfer kepemilikan gagal",
- "Your ownership transfer of {path} to {user} failed." : "Transfer kepemilikan Anda pada {path} ke {user} gagal.",
- "The ownership transfer of {path} from {user} failed." : "Transfer kepemilikan pada {path} dari {user} gagal.",
- "Ownership transfer done" : "Transfer kepemilikan selesai",
- "Your ownership transfer of {path} to {user} has completed." : "Transfer kepemilikan Anda pada {path} ke {user} selesai.",
- "The ownership transfer of {path} from {user} has completed." : "Transfer kepemilikan pada {path} dari {user} selesai.",
- "in %s" : "dalam %s",
- "File Management" : "Pengelolaan Berkas",
- "Transfer ownership of a file or folder" : "Transfer kepemilikan dari berkas atau folder",
- "Choose file or folder to transfer" : "Pilih berkas atau folder untuk transfer",
- "Change" : "Ubah",
- "New owner" : "Pemilik baru",
- "Search users" : "Cari pengguna",
- "Choose a file or folder to transfer" : "Pilih berkas atau folder untuk ditransfer",
- "Transfer" : "Transfer",
- "Transfer {path} to {userid}" : "Transfer {path} ke {user}",
- "Invalid path selected" : "Jalur terpilih invalid",
- "Ownership transfer request sent" : "Permintaan transfer kepemilikan terkirim",
- "Cannot transfer ownership of a file or folder you don't own" : "Tidak dapat melakukan transfer kepemilikan dari berkas dan folder yang tidak Anda miliki",
- "Tags" : "Tag",
- "Unable to change the favourite state of the file" : "Gagal mengubah status favorit berkas",
- "Error while loading the file data" : "Galat pemuatan data berkas",
- "Cancel" : "Membatalkan",
- "Create" : "Buat",
- "%s used" : "%s digunakan",
- "%s%% of %s used" : "%s%% dari %s terpakai",
- "%1$s of %2$s used" : "%1$s dari %2$s sudah digunakan",
- "Settings" : "Pengaturan",
- "Show hidden files" : "Lihat berkas tersembunyi",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Gunakan alamat ini untuk mengakses Berkas Anda via WebDAV",
- "Toggle grid view" : "Alihkan tampilan jala-jala",
- "No files in here" : "Tidak ada berkas disini",
- "Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
- "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
- "Select all" : "Pilih Semua",
- "Upload too large" : "Yang diunggah terlalu besar",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
- "No favorites yet" : "Belum memiliki favorit",
- "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.",
- "Deleted files" : "Berkas terhapus",
- "Shares" : "Dibagikan",
- "Shared with others" : "Dibagikan dengan lainnya",
- "Shared with you" : "Shared with you",
- "Shared by link" : "Dibagikan dengan tautan",
- "Deleted shares" : "Berbagi terhapus",
- "Pending shares" : "Berbagi tertunda",
- "Text file" : "Berkas teks",
- "New text file.txt" : "Teks baru file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Penyimpanan {owner} penuh, berkas tidak dapat diperbarui atau disinkronisasikan lagi!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ruang penyimpanan Anda penuh, berkas tidak dapat diperbarui atau disinkronkan lagi!",
- "_matches '{filter}'_::_match '{filter}'_" : ["cocok dengan '{filter}'"]
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/io.js b/apps/files/l10n/io.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/io.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/io.json b/apps/files/l10n/io.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/io.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index 995dbdb1d28..cc8b51873b1 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -1,100 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Gagnageymsla ekki tiltæk í augnablikinu",
- "Storage invalid" : "Ógild geymsla",
- "Unknown error" : "Óþekkt villa",
- "File could not be found" : "Skrá finnst ekki",
- "Move or copy" : "Færa eða afrita",
- "Download" : "Niðurhal",
- "Delete" : "Eyða",
- "Home" : "Heim",
- "Close" : "Loka",
- "Favorites" : "Eftirlæti",
- "Could not create folder \"{dir}\"" : "Gat ekki búið til möppuna \"{dir}\"",
- "This will stop your current uploads." : "Þetta mun stöðva núverandi innsendingar þínar.",
- "Upload cancelled." : "Hætt við innsendingu.",
- "Processing files …" : "Vinn með skrár …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tókst ekki að hlaða inn {filename} þar sem þetta er mappa eða er 0 bæti",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ekki nægilegt laust pláss, þú ert að senda inn {size1} en einungis {size2} eru eftir",
- "Target folder \"{dir}\" does not exist any more" : "Markmappan \"{dir}\" er ekki lengur til",
- "Not enough free space" : "Ekki nægilegt pláss",
- "An unknown error has occurred" : "Óþekkt villa kom upp",
- "Uploading …" : "Sendi inn …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Innsending á þessu atriði er ekki studd",
- "Target folder does not exist any more" : "Markmappan er ekki lengur til",
- "Error when assembling chunks, status code {status}" : "Villa við að setja búta saman, stöðukóði {status}",
- "Actions" : "Aðgerðir",
- "Rename" : "Endurnefna",
- "Copy" : "Afrita",
- "Choose target folder" : "Veldu úttaksmöppu",
- "Open" : "Opna",
- "Delete file" : "Eyða skrá",
- "Delete folder" : "Eyða möppu",
- "Disconnect storage" : "Aftengja geymslu",
- "Leave this share" : "Leave this share",
- "Could not load info for file \"{file}\"" : "Gat ekki lesið upplýsingar um skrána \"{file}\"",
- "Files" : "Skrár",
- "Details" : "Nánar",
- "Select" : "Velja",
- "Pending" : "Í bið",
- "Unable to determine date" : "Tókst ekki að ákvarða dagsetningu",
- "This operation is forbidden" : "Þessi aðgerð er bönnuð",
- "This directory is unavailable, please check the logs or contact the administrator" : "Þessi mappa er ekki tiltæk, athugaðu atvikaskrár eða hafðu samband við kerfissjóra",
- "Could not move \"{file}\", target exists" : "Gat ekki fært \"{file}\", markskrá er til",
- "Could not move \"{file}\"" : "Gat ekki fært \"{file}\"",
- "copy" : "afrit",
- "Could not copy \"{file}\", target exists" : "Gat ekki afritað \"{file}\", markskrá er til",
- "Could not copy \"{file}\"" : "Gat ekki afritað \"{file}\"",
- "Copied {origin} inside {destination}" : "Afritaði {origin} inn í {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Afritaði {origin} og {nbfiles} aðrar skrár inn í {destination}",
- "{newName} already exists" : "{newName} er þegar til",
- "Could not rename \"{fileName}\", it does not exist any more" : "Gat ekki endurnefnt \"{fileName}\", það er ekki lengur til staðar",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Heitið \"{targetName}\" er nú þegar notað í \"{dir}\" möppunni. Veldu eitthvað annað nafn.",
- "Could not rename \"{fileName}\"" : "Gat ekki endurnefnt \"{fileName}\"",
- "Could not create file \"{file}\"" : "Gat ekki búið til skrána \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Gat ekki búið til skrána \"{file}\" vegna þess að hún er þegar til",
- "Could not create folder \"{dir}\" because it already exists" : "Gat ekki búið til möppuna \"{dir}\" vegna þess að hún er þegar til",
- "Error deleting file \"{fileName}\"." : "Villa við að eyða skránni \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Engar leitarniðurstöður í öðrum möppum fyrir {tag}{filter}{endtag}",
- "Name" : "Heiti",
- "Size" : "Stærð",
- "Modified" : "Breytt",
- "_%n folder_::_%n folders_" : ["%n mappa","%n möppur"],
- "_%n file_::_%n files_" : ["%n skrá","%n skrár"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"],
- "You don’t have permission to upload or create files here" : "Þú hefur ekki heimild til að hlaða inn eða búa til skjöl hér",
- "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"],
- "New" : "Nýtt",
- "Select file range" : "Veldu skráasvið",
- "{used} of {quota} used" : "{used} af {quota} notað",
- "{used} used" : "{used} notað",
- "\"{name}\" is an invalid file name." : "\"{name}\" er ógilt skráarheiti.",
- "File name cannot be empty." : "Heiti skráar má ekki vera tómt",
- "\"/\" is not allowed inside a file name." : "\"/\" er er ekki leyfilegt innan í skráarheiti.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ógild skráartegund",
- "View in folder" : "Skoða í möppu",
- "Copied!" : "Afritað!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Afrita beinan tengil (virkar bara fyrir notendur sem eiga aðgang að þessari skrá/möppu)",
- "Path" : "Slóð",
- "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"],
- "Favorited" : "Sett í eftirlæti",
- "Favorite" : "Eftirlæti",
- "You can only favorite a single file or folder at a time" : "Þú getur aðeins bætt einni skrá eða möppu í einu í eftilæti",
- "New folder" : "Ný mappa",
- "Upload file" : "Senda inn skrá",
- "Recent" : "Nýlegt",
- "Not favorited" : "Ekki í eftirlætum",
- "Remove from favorites" : "Fjarlægja úr eftirlætum",
- "Add to favorites" : "Bæta í eftirlæti",
- "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin",
"Added to favorites" : "Bætt í eftirlæti",
"Removed from favorites" : "Fjarlægt úr eftirlætum",
"You added {file} to your favorites" : "Þú bættir {file} í eftirlætin þín",
"You removed {file} from your favorites" : "Þú fjarlægðir {file} úr eftirlætunum þínum",
+ "Favorites" : "Eftirlæti",
"File changes" : "Skráarbreytingar",
"Created by {user}" : "Búið til af {user}",
"Changed by {user}" : "Breytt af {user}",
@@ -102,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Endurheimt af {user}",
"Renamed by {user}" : "Endurnefnt af {user}",
"Moved by {user}" : "Fært af {user}",
- "\"remote user\"" : "\"fjartengdur notandi\"",
+ "\"remote account\"" : "\"fjartengdur aðgangur\"",
"You created {file}" : "Þú bjóst til {file}",
"You created an encrypted file in {file}" : "Þú bjóst til dulritaða skrá í {file}",
"{user} created {file}" : "{user} bjó til {file}",
@@ -118,63 +29,410 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} eyddi dulritaðri skrá í {file}",
"You restored {file}" : "Þú endurheimtir {file}",
"{user} restored {file}" : "{user} endurheimti {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Þú endurnefndir {oldfile} (falin) sem {newfile} (falin)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Þú endurnefndir {oldfile} (falin) sem {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Þú endurnefndir {oldfile} sem {newfile} (falin)",
"You renamed {oldfile} to {newfile}" : "Þú endurnefndir {oldfile} sem {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} endurnefndi {oldfile} (falin) sem {newfile} (falin)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} endurnefndi {oldfile} (falin) sem {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} endurnefndi {oldfile}sem {newfile} (falin)",
"{user} renamed {oldfile} to {newfile}" : "{user} endurnefndi {oldfile} sem {newfile}",
"You moved {oldfile} to {newfile}" : "Þú færðir {oldfile} í {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} færði {oldfile} í {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Skrá var bætt við eða hún fjarlægð úr <strong>eftirlætum</strong>",
+ "Files" : "Skráaforrit",
"A file or folder has been <strong>changed</strong>" : "Skjali eða möppu hefur verið <strong>breytt</strong>",
- "All files" : "Allar skrár",
- "Unlimited" : "Ótakmarkað",
- "Upload (max. %s)" : "Senda inn (hám. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "Skrá eða möppu í eftirlætum hefur verið <strong>breytt</strong>",
+ "Failed to authorize" : "Tókst ekki að auðkenna",
+ "Invalid folder path" : "Ógild slóð á möppu",
+ "Folder not found" : "Mappa fannst ekki",
+ "The file cannot be found" : "Skráin finnst ekki",
+ "The destination path does not exist: %1$s" : "Móttökuslóðin er ekki til: %1$s",
+ "You do not have permission to create a file at the specified location" : "Þú hefur ekki heimild til að búa til skrá á umbeðnu staðsetningunni",
+ "The file could not be converted." : "Ekki var hægt að umbreyta skránni.",
+ "Could not get relative path to converted file" : "Ekki tókst að fá afstæða slóð að umbreyttu skránni",
+ "Favorite files" : "Eftirlætisskrár",
+ "No favorites" : "Engin eftirlæti",
+ "More favorites" : "Fleiri eftirlæti",
"Accept" : "Samþykkja",
"Reject" : "Hafna",
+ "Incoming ownership transfer from {user}" : "Innkomandi millifærsla eignarhalds frá {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Viltu taka við {path}?\n\nAthugaðu: Millifærsluferlið eftir samþykki getur tekið allt að 1 klukkustund.",
+ "Ownership transfer denied" : "Millifærslu eignarhalds hafnað",
+ "Your ownership transfer of {path} was denied by {user}." : "Millifærslu eignarhalds á {path} var hafnað af {user}.",
"Ownership transfer failed" : "Millifærsla eignarhalds mistókst",
+ "Your ownership transfer of {path} to {user} failed." : "Millifærsla eignarhalds á {path} frá þér til {user} mistókst.",
+ "The ownership transfer of {path} from {user} failed." : "Millifærsla eignarhalds á {path} frá {user} mistókst.",
"Ownership transfer done" : "Millifærslu eignarhalds er lokið",
+ "Your ownership transfer of {path} to {user} has completed." : "Millifærslu eignarhalds á {path} frá þér til {user} er lokið.",
+ "The ownership transfer of {path} from {user} has completed." : "Millifærslu eignarhalds á {path} frá {user} er lokið.",
"in %s" : "í %s",
+ "Transferred from %1$s on %2$s" : "Flutt frá %1$s á %2$s",
+ "Files compatibility" : "Samhæfni skráa",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Leyfa að takmarka skráaheiti til að tryggja að hægt sé að samstilla skrár við öll biðlaraforrit. Sjálfgefið eru leyfð öll skráaheiti sem gilda á POSIX (þ.e.a.s. Linux eða macOS).",
+ "Enforce Windows compatibility" : "Þvinga fram samhæfni við Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Þetta mun útiloka skráaheiti sem ekki gilda á Windows-kerfum, eins og þau sem innihalda frátekin heiti og sérstafi. En þetta mun hinsvegar ekki þvinga fram samhæfni í stafstöðu (há-/lágstafir).",
"File Management" : "Skráastjórnun",
- "Transfer ownership of a file or folder" : "Millifæra eignarhald skráar eða möppu",
- "Choose file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
- "Change" : "Breyta",
- "New owner" : "Nýr eigandi",
- "Search users" : "Leita að notendum",
+ "Home" : "Heim",
+ "Target folder does not exist any more" : "Markmappan er ekki lengur til",
+ "Reload current directory" : "Endurhlaða núverandi möppu",
+ "Go to the \"{dir}\" directory" : "Fara í heimamöppu",
+ "Current directory path" : "Fyrirliggjandi slóð að möppu",
+ "Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
+ "Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
+ "Favorite" : "Eftirlæti",
+ "Back" : "Til baka",
+ "Toggle selection for file \"{displayName}\"" : "Víxla vali af/á} fyrir skrána \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Víxla vali af/á} fyrir möppuna \"{displayName}\"",
+ "File is loading" : "Skrá er að hlaðast inn",
+ "Folder is loading" : "Mappan er að hlaðast inn",
+ "Filename" : "Skráarheiti",
+ "Folder name" : "Nafn möppu",
+ "This node is unavailable" : "Þessi hnútur er ekki tiltækur",
+ "Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
+ "Invalid filename." : "Ógilt skráarheiti.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Endurnefndi \"{oldName}\" sem \"{newName}\"",
+ "Rename file" : "Endurnefna skrá",
+ "Folder" : "Mappa",
+ "Pending" : "Í bið",
+ "Unknown date" : "Óþekkt dagsetning",
+ "Clear filter" : "Hreinsa síu",
+ "Modified" : "Breytt",
+ "Search everywhere" : "Leita allsstaðar",
+ "Type" : "Tegund",
+ "Active filters" : "Virkar síur",
+ "Remove filter" : "Fjarlægja síu",
+ "Total rows summary" : "Samantek á fjölda raða",
+ "Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
+ "Name" : "Heiti",
+ "Size" : "Stærð",
+ "Actions" : "Aðgerðir",
+ "(selected)" : "(valið)",
+ "List of files and folders." : "Listi yfir skrár og möppur.",
+ "You have used your space quota and cannot upload files anymore." : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár.",
+ "Column headers with buttons are sortable." : "Dálkfyrirsagnir með hnöppum eru raðanlegar",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
+ "File not found" : "Skrá finnst ekki",
+ "{usedQuotaByte} used" : "{usedQuotaByte} notað",
+ "{used} of {quota} used" : "{used} af {quota} notað",
+ "{relative}% used" : "{relative}% notað",
+ "Could not refresh storage stats" : "Gat ekki uppfært tölfræði fyrir geymslurými",
+ "Your storage is full, files can not be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Storage information" : "Upplýsingar um gagnageymslu",
+ "Storage quota" : "Geymslukvóti",
+ "New folder" : "Ný mappa",
+ "Create new folder" : "Búa til nýja möppu",
+ "This name is already in use." : "Þetta nafn er nú þegar í notkun.",
+ "Create" : "Búa til",
+ "Fill template fields" : "Fylla inn reiti sniðmáts",
+ "Submit" : "Senda inn",
"Choose a file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
"Transfer" : "Færa",
"Transfer {path} to {userid}" : "Færa {path} til {userid}",
"Invalid path selected" : "Ógild slóð valin",
+ "Unknown error" : "Óþekkt villa",
"Ownership transfer request sent" : "Beiðni um millifærslu eignarhalds send",
- "Cannot transfer ownership of a file or folder you don't own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki",
- "Tags" : "Merki",
- "Error while loading the file data" : "Villa við að hlaða inn skráagögnum",
- "Cancel" : "Hætta við",
- "Create" : "Búa til",
- "%s used" : "%s notað",
- "%s%% of %s used" : "%s%% af %s notað",
- "%1$s of %2$s used" : "%1$s af %2$s notað",
- "Settings" : "Stillingar",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki",
+ "Transfer ownership of a file or folder" : "Millifæra eignarhald skráar eða möppu",
+ "Choose file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
+ "Change" : "Breyta",
+ "New owner" : "Nýr eigandi",
+ "Remove extension" : "Fjarlægja skráarendingu",
+ "Change file extension" : "Breyta skráarendingu",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Sé skráaendingunni breytt úr \"{old}\" yfir í \"{new}\", gæti skráin orðið ólæsileg.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
+ "Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
+ "Choose {file}" : "Veldu {file}",
+ "Share" : "Deila",
+ "Shared by link" : "Deilt með tengli",
+ "Shared" : "Sameiginlegt",
+ "Switch to list view" : "Skipta yfir í listasýn",
+ "Switch to grid view" : "Skipta yfir í reitasýn",
+ "Upload was cancelled by user" : "Notandi hætti við innsendingu",
+ "Not enough free space" : "Ekki nægilegt pláss",
+ "Operation is blocked by access control" : "Aðgerðin er hindruð af aðgangsstýringu",
+ "Error during upload: {message}" : "Villa við innsendingu: {message}",
+ "Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
+ "Unknown error during upload" : "Óþekkt villa við innsendingu",
+ "Loading current folder" : "Hleð inn núverandi möppu",
+ "Retry" : "Reyna aftur",
+ "No files in here" : "Engar skrár hér",
+ "Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
+ "Go back" : "Fara til baka",
+ "Views" : "Skoðun",
+ "Files settings" : "Stillingar skráaforritsins",
+ "Your files" : "Skrárnar þínar",
+ "Open in files" : "Opna í skráaforritinu",
+ "File cannot be accessed" : "Skráin er ekki aðgengileg",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Skráin fannst ekki eða að þú hefur ekki heimildir til að skoða hana. Biddu sendandann um að deila henni.",
+ "Clipboard is not available" : "Klippispjald er ekki tiltækt",
+ "General" : "Almennt",
+ "All files" : "Allar skrár",
+ "Personal files" : "Einkaskrár",
+ "Sort favorites first" : "Raða eftirlætum fremst",
+ "Sort folders before files" : "Raða möppum á undan skrám",
+ "Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
+ "Crop image previews" : "Skera utan af forskoðun mynda",
+ "Additional settings" : "Valfrjálsar stillingar",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skrárnar þínar með WebDAV",
+ "WebDAV URL" : "WebDAV-slóð",
+ "Copy" : "Afrita",
+ "Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
+ "Rename" : "Endurnefna",
+ "Delete" : "Eyða",
+ "Manage tags" : "Sýsla með merki",
+ "Selection" : "Val",
+ "Select all files" : "Velja allar skrár",
+ "Deselect all" : "Afvelja allt",
+ "Navigation" : "Yfirsýn",
+ "View" : "Skoða",
"Toggle grid view" : "Víxla reitasýn af/á",
- "No files in here" : "Engar skrár hér",
- "Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
+ "Show those shortcuts" : "Sýna þessa flýtilykla",
+ "You" : "Þú",
+ "Shared multiple times with different people" : "Deilt mörgum sinnum með mismunandi fólki",
+ "Unable to change the favorite state of the file" : "Get ekki breytt stöðu sem eftirlæti á skránni",
+ "Error while loading the file data" : "Villa við að hlaða inn skráagögnum",
+ "Owner" : "Eigandi",
+ "Remove from favorites" : "Fjarlægja úr eftirlætum",
+ "Add to favorites" : "Bæta í eftirlæti",
+ "Tags" : "Merki",
+ "Blank" : "Tóm",
+ "Unable to create new file from template" : "Tekst ekki að búa til nýja skrá út frá sniðmáti",
+ "Pick a template for {name}" : "Veldu sniðmát fyrir {name}",
+ "Create a new file with the selected template" : "Búa til nýja skrá úr völdu sniðmáti",
+ "Creating file" : "Bý til skrá",
+ "Save as {displayName}" : "Vista sem {displayName}",
+ "Save as …" : "Vista sem …",
+ "Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
+ "All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
+ "One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
+ "Files successfully converted" : "Tókst að umbreyta skrám",
+ "Failed to convert files" : "Mistókst að umbreyta skrám",
+ "File successfully converted" : "Tókst að umbreyta skrá",
+ "Failed to convert file: {message}" : "Mistókst að umbreyta skrá: {message}",
+ "Failed to convert file" : "Mistókst að umbreyta skrá",
+ "Leave this share" : "Yfirgefa þessa sameign",
+ "Leave these shares" : "Yfirgefa þessar sameignir",
+ "Disconnect storage" : "Aftengja geymslu",
+ "Disconnect storages" : "Aftengja geymslurými",
+ "Delete permanently" : "Eyða varanlega",
+ "Delete and unshare" : "Eyða og hætta deilingu",
+ "Delete file" : "Eyða skrá",
+ "Delete files" : "Eyða skrám",
+ "Delete folder" : "Eyða möppu",
+ "Delete folders" : "Eyða möppum",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Þú ert við það að eyða endanlega {count} atriði","Þú ert við það að eyða endanlega {count} atriðum"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Þú ert við það að eyða {count} atriði","Þú ert við það að eyða {count} atriðum"],
+ "Confirm deletion" : "Staðfesta eyðingu",
+ "Cancel" : "Hætta við",
+ "Download" : "Niðurhal",
+ "Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
+ "Destination is not a folder" : "Áfangastaðurinn er ekki mappa",
+ "This file/folder is already in that directory" : "Þessi skrá/mappa er þegar í þessari möppu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Þú getur ekki flutt skrá/möppu inn í sjálfa sig eða inni í undirmöppu af sjálfri sér",
+ "(copy)" : "(afrita)",
+ "(copy %n)" : "(afrita %n)",
+ "A file or folder with that name already exists in this folder" : "Skrá eða mappa með þessu heiti er þegar til staðar í þessari möppu",
+ "The files are locked" : "Skrárnar eru læstar",
+ "The file does not exist anymore" : "Skráin er ekki lengur til",
+ "Choose destination" : "Veldu áfangastað",
+ "Copy to {target}" : "Afrita í {target}",
+ "Move to {target}" : "Færa í {target}",
+ "Move" : "Færa",
+ "Move or copy operation failed" : "Aðgerð við að færa eða afrita mistókst",
+ "Move or copy" : "Færa eða afrita",
+ "Open folder {displayName}" : "Opna möppu {displayName}",
+ "Open in Files" : "Opna í skráaforritinu",
+ "Failed to redirect to client" : "Mistókst að endurbeina til biðlara",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Skráin ætti núna að opnast á tækinu þínu. Ef það gerist ekki, ættirðu að ganga úr skugga um að þú sért með vinnutölvuforritið uppsett.",
+ "Retry and close" : "Prófa aftur og loka",
+ "Details" : "Nánar",
+ "View in folder" : "Skoða í möppu",
+ "Today" : "Í dag",
+ "Last 7 days" : "Síðustu 7 daga",
+ "Last 30 days" : "Síðustu 30 daga",
+ "This year ({year})" : "Þetta ár ({year})",
+ "Last year ({year})" : "Síðasta ár ({year})",
+ "Documents" : "Skjöl",
+ "Spreadsheets" : "Töflureiknar",
+ "Presentations" : "Kynningar",
+ "PDFs" : "PDF-skrár",
+ "Folders" : "Möppur",
+ "Audio" : "Hljóð",
+ "Images" : "Myndir",
+ "Videos" : "Myndskeið",
+ "Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
+ "Unable to initialize the templates directory" : "Tókst ekki að frumstilla sniðmátamöppuna",
+ "Create templates folder" : "Búa til sniðmátamöppu",
+ "Templates" : "Sniðmát",
+ "New template folder" : "Ný mappa fyrir sniðmát",
+ "In folder" : "Í möppunni",
+ "Search in folder: {folder}" : "Leita í möppunni: {folder}",
+ "One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vafrinn þinn styður ekki API skráakerfis. Möppur verða ekki sendar inn",
+ "No files to upload" : "Engar skrár til að senda inn",
+ "Unable to create the directory {directory}" : "Get ekki búið til möppuna {directory}",
+ "Some files could not be uploaded" : "Ekki tókst að senda inn sumar skrár",
+ "Files uploaded successfully" : "Tókst að senda inn skrár",
+ "No files to process" : "Engar skrár til að vinna úr",
+ "Some files could not be copied" : "Ekki tókst að afrita sumar skrár",
+ "Some files could not be moved" : "Ekki tókst að færa sumar skrár",
+ "Files copied successfully" : "Tókst að afrita skrár",
+ "Files moved successfully" : "Tókst að færa skrár",
+ "Conflicts resolution skipped" : "Sleppti lausn árekstra",
+ "Upload cancelled" : "Hætt við innsendingu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Gat ekki endurnefnt \"{oldName}\", það er ekki lengur til staðar",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Heitið \"{newName}\" er nú þegar notað í \"{dir}\" möppunni. Veldu eitthvað annað nafn.",
+ "Could not rename \"{oldName}\"" : "Tókst ekki að endurnefna \"{oldName}\"",
+ "This operation is forbidden" : "Þessi aðgerð er bönnuð",
+ "Storage is temporarily not available" : "Gagnageymsla ekki tiltæk í augnablikinu",
+ "Unexpected error: {error}" : "Óvænt villa: {error}",
+ "_%n file_::_%n files_" : ["%n skrá","%n skrár"],
+ "_%n folder_::_%n folders_" : ["%n mappa","%n möppur"],
+ "Filename must not be empty." : "Skráarheiti má ekki vera tómt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er er ekki leyfilegt innan í skráarheiti.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er frátekið heiti og er ekki leyft í skráaheitum.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ekki leyfileg skráartegund.",
+ "Filenames must not end with \"{extension}\"." : "Skráaheiti mega ekki enda á \"{extension}\".",
+ "List of favorite files and folders." : "Listi yfir eftirlætisskrár og möppur.",
+ "No favorites yet" : "Engin eftirlæti ennþá",
+ "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér",
+ "List of your files and folders." : "Listi yfir skrárnar þínar og möppur.",
+ "List of your files and folders that are not shared." : "Listi yfir skrárnar þínar og möppur sem ekki er deilt.",
+ "No personal files found" : "Engar einkaskrár fundust",
+ "Files that are not shared will show up here." : "Skrár sem ekki er deilt birtast hér.",
+ "Recent" : "Nýlegt",
+ "List of recently modified files and folders." : "Listi yfir nýlega breyttar skrár og möppur.",
+ "No recently modified files" : "Engar nýlega breyttar skrár",
+ "Files and folders you recently modified will show up here." : "Skrár og möppur sem þú breyttir nýlega birtast hér.",
+ "Search" : "Search",
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
- "No favorites yet" : "Engin eftirlæti ennþá",
- "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér",
- "Deleted files" : "Eyddar skrár",
- "Shares" : "Sameignir",
- "Shared with others" : "Deilt með öðrum",
- "Shared with you" : "Deilt með þér",
- "Shared by link" : "Deilt með tengli",
- "Deleted shares" : "Eyddar sameignir",
- "Pending shares" : "Sameignir í bið",
+ "File could not be found" : "Skrá finnst ekki",
+ "Show list view" : "Birta listasýn",
+ "Show grid view" : "Birta reitasýn",
+ "Close" : "Loka",
+ "Could not create folder \"{dir}\"" : "Gat ekki búið til möppuna \"{dir}\"",
+ "This will stop your current uploads." : "Þetta mun stöðva núverandi innsendingar þínar.",
+ "Upload cancelled." : "Hætt við innsendingu.",
+ "Processing files …" : "Vinn með skrár …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tókst ekki að hlaða inn {filename} þar sem þetta er mappa eða er 0 bæti",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ekki nægilegt laust pláss, þú ert að senda inn {size1} en einungis {size2} eru eftir",
+ "Target folder \"{dir}\" does not exist any more" : "Markmappan \"{dir}\" er ekki lengur til",
+ "An unknown error has occurred" : "Óþekkt villa kom upp",
+ "File could not be uploaded" : "Gat ekki sent inn skrána",
+ "Uploading …" : "Sendi inn …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Sendi inn … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Innsending á þessu atriði er ekki studd",
+ "Error when assembling chunks, status code {status}" : "Villa við að setja búta saman, stöðukóði {status}",
+ "Choose target folder" : "Veldu úttaksmöppu",
+ "Set reminder" : "Setja áminningu",
+ "Edit locally" : "Breyta staðvært",
+ "Open" : "Opna",
+ "Could not load info for file \"{file}\"" : "Gat ekki lesið upplýsingar um skrána \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Veldu merki til að bæta á valið",
+ "Apply tag(s) to selection" : "Beita merki/merkjum á valið",
+ "Select directory \"{dirName}\"" : "Veldu möppuna \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Veldu skrána \"{fileName}\"",
+ "Unable to determine date" : "Tókst ekki að ákvarða dagsetningu",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Þessi mappa er ekki tiltæk, athugaðu atvikaskrár eða hafðu samband við kerfissjóra",
+ "Could not move \"{file}\", target exists" : "Gat ekki fært \"{file}\", markskrá er til",
+ "Could not move \"{file}\"" : "Gat ekki fært \"{file}\"",
+ "copy" : "afrit",
+ "Could not copy \"{file}\", target exists" : "Gat ekki afritað \"{file}\", markskrá er til",
+ "Could not copy \"{file}\"" : "Gat ekki afritað \"{file}\"",
+ "Copied {origin} inside {destination}" : "Afritaði {origin} inn í {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Afritaði {origin} og {nbfiles} aðrar skrár inn í {destination}",
+ "{newName} already exists" : "{newName} er þegar til",
+ "Could not create file \"{file}\"" : "Gat ekki búið til skrána \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Gat ekki búið til skrána \"{file}\" vegna þess að hún er þegar til",
+ "Could not create folder \"{dir}\" because it already exists" : "Gat ekki búið til möppuna \"{dir}\" vegna þess að hún er þegar til",
+ "Could not fetch file details \"{file}\"" : "Gat ekki sótt nánari upplýsingar um skrána \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Villa við að eyða skránni \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Engar leitarniðurstöður í öðrum möppum fyrir {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Settu inn fleiri en tvo stafi til að leita í öðrum möppum",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"],
+ "You do not have permission to upload or create files here" : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér",
+ "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"],
+ "New" : "Nýtt",
+ "New file/folder menu" : "Valmynd fyrir nýja skrá/möppu",
+ "Select file range" : "Veldu skráasvið",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} notað",
+ "\"{name}\" is an invalid file name." : "\"{name}\" er ógilt skráarheiti.",
+ "File name cannot be empty." : "Heiti skráar má ekki vera tómt",
+ "\"/\" is not allowed inside a file name." : "\"/\" er er ekki leyfilegt innan í skráarheiti.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ógild skráartegund",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Geymslupláss {owner} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Hópmappa {mountPoint} er full, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ytra geymslupláss {mountPoint} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Geymslupláss {owner} er næstum fullt ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Hópmappan \"{mountPoint}\" er næstum full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ytra geymsluplássið \"{mountPoint}\" er næstum fullt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Geymsluplássið þitt er næstum fullt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["samsvarar \"{filter}\"","samsvara \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Beinn tengill var afritaður (virkar bara fyrir fólk sem hefur aðgang að þessari skrá/möppu)",
+ "Path" : "Slóð",
+ "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"],
+ "Favored" : "Eftirlæti",
+ "Favor" : "Eftirl",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Afrita beinan tengil (virkar bara fyrir fólk sem hefur aðgang að þessari skrá/möppu)",
+ "Upload file" : "Senda inn skrá",
+ "Not favored" : "Ekki eftirlæti",
+ "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin",
+ "Upload (max. %s)" : "Senda inn (hám. %s)",
+ "\"{displayName}\" action executed successfully" : "Tókst að framkvæma \"{displayName}\" aðgerð",
+ "\"{displayName}\" action failed" : "\"{displayName}\" aðgerð mistókst",
+ "\"{displayName}\" batch action executed successfully" : "Tókst að framkvæma \"{displayName}\" magnvinnsluaðgerð",
+ "Submitting fields…" : "Sendi inn gögn úr reitum…",
+ "Filter filenames…" : "Sía skráaheiti…",
+ "WebDAV URL copied to clipboard" : "WebDAV-slóð afrituð á klippispjaldið",
+ "Enable the grid view" : "Virkja reitasýnina",
+ "Enable folder tree" : "Virkja möppugreinar",
+ "Copy to clipboard" : "Afrita á klippispjald",
+ "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
+ "Deletion cancelled" : "Hætt við eyðingu",
+ "Move cancelled" : "Hætt við tilfærslu",
+ "Cancelled move or copy of \"{filename}\"." : "Hætti við aðgerð við að færa eða afrita \"{filename}\".",
+ "Cancelled move or copy operation" : "Hætti við aðgerð við að færa eða afrita",
+ "Open details" : "Opna nánari upplýsingar",
+ "Photos and images" : "Myndefni",
+ "New folder creation cancelled" : "Hætti við gerð nýrrar möppu",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} möppur"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} skrá","{fileCount} skrár"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 skrá og {folderCount} mappa","1 skrá og {folderCount} möppur"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} skrá og 1 mappa","{fileCount} skrár og 1 mappa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} skrár og {folderCount} möppur",
+ "All folders" : "Allar möppur",
+ "Personal Files" : "Einkaskrár",
"Text file" : "Textaskrá",
"New text file.txt" : "Ný textaskrá.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Geymslupláss {owner} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
- "Your storage is full, files can not be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
- "_matches '{filter}'_::_match '{filter}'_" : ["samsvarar '{filter}'","samsvara '{filter}'"]
+ "Speed up your Files experience with these quick shortcuts." : "Flýttu fyrir vinnu þinni með skrár með þessum flýtilyklum.",
+ "Open the actions menu for a file" : "Opna aðgerðavalmynd fyrir skrá",
+ "Rename a file" : "Endurnefna skrá",
+ "Delete a file" : "Eyða skrá",
+ "Favorite or remove a file from favorites" : "Setja skrá í eða fjarlægja úr eftirlætum",
+ "Manage tags for a file" : "Sýsla með merki fyrir skrá",
+ "Deselect all files" : "Afvelja allar skrár",
+ "Select or deselect a file" : "Velja eða afvelja skrá",
+ "Select a range of files" : "Velja svið skráa",
+ "Navigate to the parent folder" : "Fara í yfirmöppuna",
+ "Navigate to the file above" : "Fara á skrána fyrir ofan",
+ "Navigate to the file below" : "Fara á skrána fyrir neðan",
+ "Navigate to the file on the left (in grid mode)" : "Fara á skrána til vinstri (í reitayfirliti)",
+ "Navigate to the file on the right (in grid mode)" : "Fara á skrána til hægri (í reitayfirliti)",
+ "Toggle the grid view" : "Víxla reitayfirliti af/á",
+ "Open the sidebar for a file" : "Opna hliðarspjald fyrir skrá"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index 2d16e7f85ac..f1b782301f9 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -1,98 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Gagnageymsla ekki tiltæk í augnablikinu",
- "Storage invalid" : "Ógild geymsla",
- "Unknown error" : "Óþekkt villa",
- "File could not be found" : "Skrá finnst ekki",
- "Move or copy" : "Færa eða afrita",
- "Download" : "Niðurhal",
- "Delete" : "Eyða",
- "Home" : "Heim",
- "Close" : "Loka",
- "Favorites" : "Eftirlæti",
- "Could not create folder \"{dir}\"" : "Gat ekki búið til möppuna \"{dir}\"",
- "This will stop your current uploads." : "Þetta mun stöðva núverandi innsendingar þínar.",
- "Upload cancelled." : "Hætt við innsendingu.",
- "Processing files …" : "Vinn með skrár …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tókst ekki að hlaða inn {filename} þar sem þetta er mappa eða er 0 bæti",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ekki nægilegt laust pláss, þú ert að senda inn {size1} en einungis {size2} eru eftir",
- "Target folder \"{dir}\" does not exist any more" : "Markmappan \"{dir}\" er ekki lengur til",
- "Not enough free space" : "Ekki nægilegt pláss",
- "An unknown error has occurred" : "Óþekkt villa kom upp",
- "Uploading …" : "Sendi inn …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Innsending á þessu atriði er ekki studd",
- "Target folder does not exist any more" : "Markmappan er ekki lengur til",
- "Error when assembling chunks, status code {status}" : "Villa við að setja búta saman, stöðukóði {status}",
- "Actions" : "Aðgerðir",
- "Rename" : "Endurnefna",
- "Copy" : "Afrita",
- "Choose target folder" : "Veldu úttaksmöppu",
- "Open" : "Opna",
- "Delete file" : "Eyða skrá",
- "Delete folder" : "Eyða möppu",
- "Disconnect storage" : "Aftengja geymslu",
- "Leave this share" : "Leave this share",
- "Could not load info for file \"{file}\"" : "Gat ekki lesið upplýsingar um skrána \"{file}\"",
- "Files" : "Skrár",
- "Details" : "Nánar",
- "Select" : "Velja",
- "Pending" : "Í bið",
- "Unable to determine date" : "Tókst ekki að ákvarða dagsetningu",
- "This operation is forbidden" : "Þessi aðgerð er bönnuð",
- "This directory is unavailable, please check the logs or contact the administrator" : "Þessi mappa er ekki tiltæk, athugaðu atvikaskrár eða hafðu samband við kerfissjóra",
- "Could not move \"{file}\", target exists" : "Gat ekki fært \"{file}\", markskrá er til",
- "Could not move \"{file}\"" : "Gat ekki fært \"{file}\"",
- "copy" : "afrit",
- "Could not copy \"{file}\", target exists" : "Gat ekki afritað \"{file}\", markskrá er til",
- "Could not copy \"{file}\"" : "Gat ekki afritað \"{file}\"",
- "Copied {origin} inside {destination}" : "Afritaði {origin} inn í {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Afritaði {origin} og {nbfiles} aðrar skrár inn í {destination}",
- "{newName} already exists" : "{newName} er þegar til",
- "Could not rename \"{fileName}\", it does not exist any more" : "Gat ekki endurnefnt \"{fileName}\", það er ekki lengur til staðar",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Heitið \"{targetName}\" er nú þegar notað í \"{dir}\" möppunni. Veldu eitthvað annað nafn.",
- "Could not rename \"{fileName}\"" : "Gat ekki endurnefnt \"{fileName}\"",
- "Could not create file \"{file}\"" : "Gat ekki búið til skrána \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Gat ekki búið til skrána \"{file}\" vegna þess að hún er þegar til",
- "Could not create folder \"{dir}\" because it already exists" : "Gat ekki búið til möppuna \"{dir}\" vegna þess að hún er þegar til",
- "Error deleting file \"{fileName}\"." : "Villa við að eyða skránni \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Engar leitarniðurstöður í öðrum möppum fyrir {tag}{filter}{endtag}",
- "Name" : "Heiti",
- "Size" : "Stærð",
- "Modified" : "Breytt",
- "_%n folder_::_%n folders_" : ["%n mappa","%n möppur"],
- "_%n file_::_%n files_" : ["%n skrá","%n skrár"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"],
- "You don’t have permission to upload or create files here" : "Þú hefur ekki heimild til að hlaða inn eða búa til skjöl hér",
- "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"],
- "New" : "Nýtt",
- "Select file range" : "Veldu skráasvið",
- "{used} of {quota} used" : "{used} af {quota} notað",
- "{used} used" : "{used} notað",
- "\"{name}\" is an invalid file name." : "\"{name}\" er ógilt skráarheiti.",
- "File name cannot be empty." : "Heiti skráar má ekki vera tómt",
- "\"/\" is not allowed inside a file name." : "\"/\" er er ekki leyfilegt innan í skráarheiti.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ógild skráartegund",
- "View in folder" : "Skoða í möppu",
- "Copied!" : "Afritað!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Afrita beinan tengil (virkar bara fyrir notendur sem eiga aðgang að þessari skrá/möppu)",
- "Path" : "Slóð",
- "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"],
- "Favorited" : "Sett í eftirlæti",
- "Favorite" : "Eftirlæti",
- "You can only favorite a single file or folder at a time" : "Þú getur aðeins bætt einni skrá eða möppu í einu í eftilæti",
- "New folder" : "Ný mappa",
- "Upload file" : "Senda inn skrá",
- "Recent" : "Nýlegt",
- "Not favorited" : "Ekki í eftirlætum",
- "Remove from favorites" : "Fjarlægja úr eftirlætum",
- "Add to favorites" : "Bæta í eftirlæti",
- "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin",
"Added to favorites" : "Bætt í eftirlæti",
"Removed from favorites" : "Fjarlægt úr eftirlætum",
"You added {file} to your favorites" : "Þú bættir {file} í eftirlætin þín",
"You removed {file} from your favorites" : "Þú fjarlægðir {file} úr eftirlætunum þínum",
+ "Favorites" : "Eftirlæti",
"File changes" : "Skráarbreytingar",
"Created by {user}" : "Búið til af {user}",
"Changed by {user}" : "Breytt af {user}",
@@ -100,7 +11,7 @@
"Restored by {user}" : "Endurheimt af {user}",
"Renamed by {user}" : "Endurnefnt af {user}",
"Moved by {user}" : "Fært af {user}",
- "\"remote user\"" : "\"fjartengdur notandi\"",
+ "\"remote account\"" : "\"fjartengdur aðgangur\"",
"You created {file}" : "Þú bjóst til {file}",
"You created an encrypted file in {file}" : "Þú bjóst til dulritaða skrá í {file}",
"{user} created {file}" : "{user} bjó til {file}",
@@ -116,63 +27,410 @@
"{user} deleted an encrypted file in {file}" : "{user} eyddi dulritaðri skrá í {file}",
"You restored {file}" : "Þú endurheimtir {file}",
"{user} restored {file}" : "{user} endurheimti {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Þú endurnefndir {oldfile} (falin) sem {newfile} (falin)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Þú endurnefndir {oldfile} (falin) sem {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Þú endurnefndir {oldfile} sem {newfile} (falin)",
"You renamed {oldfile} to {newfile}" : "Þú endurnefndir {oldfile} sem {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} endurnefndi {oldfile} (falin) sem {newfile} (falin)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} endurnefndi {oldfile} (falin) sem {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} endurnefndi {oldfile}sem {newfile} (falin)",
"{user} renamed {oldfile} to {newfile}" : "{user} endurnefndi {oldfile} sem {newfile}",
"You moved {oldfile} to {newfile}" : "Þú færðir {oldfile} í {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} færði {oldfile} í {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Skrá var bætt við eða hún fjarlægð úr <strong>eftirlætum</strong>",
+ "Files" : "Skráaforrit",
"A file or folder has been <strong>changed</strong>" : "Skjali eða möppu hefur verið <strong>breytt</strong>",
- "All files" : "Allar skrár",
- "Unlimited" : "Ótakmarkað",
- "Upload (max. %s)" : "Senda inn (hám. %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "Skrá eða möppu í eftirlætum hefur verið <strong>breytt</strong>",
+ "Failed to authorize" : "Tókst ekki að auðkenna",
+ "Invalid folder path" : "Ógild slóð á möppu",
+ "Folder not found" : "Mappa fannst ekki",
+ "The file cannot be found" : "Skráin finnst ekki",
+ "The destination path does not exist: %1$s" : "Móttökuslóðin er ekki til: %1$s",
+ "You do not have permission to create a file at the specified location" : "Þú hefur ekki heimild til að búa til skrá á umbeðnu staðsetningunni",
+ "The file could not be converted." : "Ekki var hægt að umbreyta skránni.",
+ "Could not get relative path to converted file" : "Ekki tókst að fá afstæða slóð að umbreyttu skránni",
+ "Favorite files" : "Eftirlætisskrár",
+ "No favorites" : "Engin eftirlæti",
+ "More favorites" : "Fleiri eftirlæti",
"Accept" : "Samþykkja",
"Reject" : "Hafna",
+ "Incoming ownership transfer from {user}" : "Innkomandi millifærsla eignarhalds frá {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Viltu taka við {path}?\n\nAthugaðu: Millifærsluferlið eftir samþykki getur tekið allt að 1 klukkustund.",
+ "Ownership transfer denied" : "Millifærslu eignarhalds hafnað",
+ "Your ownership transfer of {path} was denied by {user}." : "Millifærslu eignarhalds á {path} var hafnað af {user}.",
"Ownership transfer failed" : "Millifærsla eignarhalds mistókst",
+ "Your ownership transfer of {path} to {user} failed." : "Millifærsla eignarhalds á {path} frá þér til {user} mistókst.",
+ "The ownership transfer of {path} from {user} failed." : "Millifærsla eignarhalds á {path} frá {user} mistókst.",
"Ownership transfer done" : "Millifærslu eignarhalds er lokið",
+ "Your ownership transfer of {path} to {user} has completed." : "Millifærslu eignarhalds á {path} frá þér til {user} er lokið.",
+ "The ownership transfer of {path} from {user} has completed." : "Millifærslu eignarhalds á {path} frá {user} er lokið.",
"in %s" : "í %s",
+ "Transferred from %1$s on %2$s" : "Flutt frá %1$s á %2$s",
+ "Files compatibility" : "Samhæfni skráa",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Leyfa að takmarka skráaheiti til að tryggja að hægt sé að samstilla skrár við öll biðlaraforrit. Sjálfgefið eru leyfð öll skráaheiti sem gilda á POSIX (þ.e.a.s. Linux eða macOS).",
+ "Enforce Windows compatibility" : "Þvinga fram samhæfni við Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Þetta mun útiloka skráaheiti sem ekki gilda á Windows-kerfum, eins og þau sem innihalda frátekin heiti og sérstafi. En þetta mun hinsvegar ekki þvinga fram samhæfni í stafstöðu (há-/lágstafir).",
"File Management" : "Skráastjórnun",
- "Transfer ownership of a file or folder" : "Millifæra eignarhald skráar eða möppu",
- "Choose file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
- "Change" : "Breyta",
- "New owner" : "Nýr eigandi",
- "Search users" : "Leita að notendum",
+ "Home" : "Heim",
+ "Target folder does not exist any more" : "Markmappan er ekki lengur til",
+ "Reload current directory" : "Endurhlaða núverandi möppu",
+ "Go to the \"{dir}\" directory" : "Fara í heimamöppu",
+ "Current directory path" : "Fyrirliggjandi slóð að möppu",
+ "Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
+ "Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
+ "Favorite" : "Eftirlæti",
+ "Back" : "Til baka",
+ "Toggle selection for file \"{displayName}\"" : "Víxla vali af/á} fyrir skrána \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Víxla vali af/á} fyrir möppuna \"{displayName}\"",
+ "File is loading" : "Skrá er að hlaðast inn",
+ "Folder is loading" : "Mappan er að hlaðast inn",
+ "Filename" : "Skráarheiti",
+ "Folder name" : "Nafn möppu",
+ "This node is unavailable" : "Þessi hnútur er ekki tiltækur",
+ "Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
+ "Invalid filename." : "Ógilt skráarheiti.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Endurnefndi \"{oldName}\" sem \"{newName}\"",
+ "Rename file" : "Endurnefna skrá",
+ "Folder" : "Mappa",
+ "Pending" : "Í bið",
+ "Unknown date" : "Óþekkt dagsetning",
+ "Clear filter" : "Hreinsa síu",
+ "Modified" : "Breytt",
+ "Search everywhere" : "Leita allsstaðar",
+ "Type" : "Tegund",
+ "Active filters" : "Virkar síur",
+ "Remove filter" : "Fjarlægja síu",
+ "Total rows summary" : "Samantek á fjölda raða",
+ "Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
+ "Name" : "Heiti",
+ "Size" : "Stærð",
+ "Actions" : "Aðgerðir",
+ "(selected)" : "(valið)",
+ "List of files and folders." : "Listi yfir skrár og möppur.",
+ "You have used your space quota and cannot upload files anymore." : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár.",
+ "Column headers with buttons are sortable." : "Dálkfyrirsagnir með hnöppum eru raðanlegar",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
+ "File not found" : "Skrá finnst ekki",
+ "{usedQuotaByte} used" : "{usedQuotaByte} notað",
+ "{used} of {quota} used" : "{used} af {quota} notað",
+ "{relative}% used" : "{relative}% notað",
+ "Could not refresh storage stats" : "Gat ekki uppfært tölfræði fyrir geymslurými",
+ "Your storage is full, files can not be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Storage information" : "Upplýsingar um gagnageymslu",
+ "Storage quota" : "Geymslukvóti",
+ "New folder" : "Ný mappa",
+ "Create new folder" : "Búa til nýja möppu",
+ "This name is already in use." : "Þetta nafn er nú þegar í notkun.",
+ "Create" : "Búa til",
+ "Fill template fields" : "Fylla inn reiti sniðmáts",
+ "Submit" : "Senda inn",
"Choose a file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
"Transfer" : "Færa",
"Transfer {path} to {userid}" : "Færa {path} til {userid}",
"Invalid path selected" : "Ógild slóð valin",
+ "Unknown error" : "Óþekkt villa",
"Ownership transfer request sent" : "Beiðni um millifærslu eignarhalds send",
- "Cannot transfer ownership of a file or folder you don't own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki",
- "Tags" : "Merki",
- "Error while loading the file data" : "Villa við að hlaða inn skráagögnum",
- "Cancel" : "Hætta við",
- "Create" : "Búa til",
- "%s used" : "%s notað",
- "%s%% of %s used" : "%s%% af %s notað",
- "%1$s of %2$s used" : "%1$s af %2$s notað",
- "Settings" : "Stillingar",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ekki er hægt að millifæra eignarhald á skrá eða möppu sem þú átt ekki",
+ "Transfer ownership of a file or folder" : "Millifæra eignarhald skráar eða möppu",
+ "Choose file or folder to transfer" : "Veldu skrá eða möppu til að millifæra",
+ "Change" : "Breyta",
+ "New owner" : "Nýr eigandi",
+ "Remove extension" : "Fjarlægja skráarendingu",
+ "Change file extension" : "Breyta skráarendingu",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Sé skráaendingunni breytt úr \"{old}\" yfir í \"{new}\", gæti skráin orðið ólæsileg.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
+ "Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
+ "Choose {file}" : "Veldu {file}",
+ "Share" : "Deila",
+ "Shared by link" : "Deilt með tengli",
+ "Shared" : "Sameiginlegt",
+ "Switch to list view" : "Skipta yfir í listasýn",
+ "Switch to grid view" : "Skipta yfir í reitasýn",
+ "Upload was cancelled by user" : "Notandi hætti við innsendingu",
+ "Not enough free space" : "Ekki nægilegt pláss",
+ "Operation is blocked by access control" : "Aðgerðin er hindruð af aðgangsstýringu",
+ "Error during upload: {message}" : "Villa við innsendingu: {message}",
+ "Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
+ "Unknown error during upload" : "Óþekkt villa við innsendingu",
+ "Loading current folder" : "Hleð inn núverandi möppu",
+ "Retry" : "Reyna aftur",
+ "No files in here" : "Engar skrár hér",
+ "Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
+ "Go back" : "Fara til baka",
+ "Views" : "Skoðun",
+ "Files settings" : "Stillingar skráaforritsins",
+ "Your files" : "Skrárnar þínar",
+ "Open in files" : "Opna í skráaforritinu",
+ "File cannot be accessed" : "Skráin er ekki aðgengileg",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Skráin fannst ekki eða að þú hefur ekki heimildir til að skoða hana. Biddu sendandann um að deila henni.",
+ "Clipboard is not available" : "Klippispjald er ekki tiltækt",
+ "General" : "Almennt",
+ "All files" : "Allar skrár",
+ "Personal files" : "Einkaskrár",
+ "Sort favorites first" : "Raða eftirlætum fremst",
+ "Sort folders before files" : "Raða möppum á undan skrám",
+ "Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
+ "Crop image previews" : "Skera utan af forskoðun mynda",
+ "Additional settings" : "Valfrjálsar stillingar",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skrárnar þínar með WebDAV",
+ "WebDAV URL" : "WebDAV-slóð",
+ "Copy" : "Afrita",
+ "Keyboard shortcuts" : "Flýtileiðir á lyklaborði",
+ "Rename" : "Endurnefna",
+ "Delete" : "Eyða",
+ "Manage tags" : "Sýsla með merki",
+ "Selection" : "Val",
+ "Select all files" : "Velja allar skrár",
+ "Deselect all" : "Afvelja allt",
+ "Navigation" : "Yfirsýn",
+ "View" : "Skoða",
"Toggle grid view" : "Víxla reitasýn af/á",
- "No files in here" : "Engar skrár hér",
- "Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
+ "Show those shortcuts" : "Sýna þessa flýtilykla",
+ "You" : "Þú",
+ "Shared multiple times with different people" : "Deilt mörgum sinnum með mismunandi fólki",
+ "Unable to change the favorite state of the file" : "Get ekki breytt stöðu sem eftirlæti á skránni",
+ "Error while loading the file data" : "Villa við að hlaða inn skráagögnum",
+ "Owner" : "Eigandi",
+ "Remove from favorites" : "Fjarlægja úr eftirlætum",
+ "Add to favorites" : "Bæta í eftirlæti",
+ "Tags" : "Merki",
+ "Blank" : "Tóm",
+ "Unable to create new file from template" : "Tekst ekki að búa til nýja skrá út frá sniðmáti",
+ "Pick a template for {name}" : "Veldu sniðmát fyrir {name}",
+ "Create a new file with the selected template" : "Búa til nýja skrá úr völdu sniðmáti",
+ "Creating file" : "Bý til skrá",
+ "Save as {displayName}" : "Vista sem {displayName}",
+ "Save as …" : "Vista sem …",
+ "Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
+ "All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
+ "One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
+ "Files successfully converted" : "Tókst að umbreyta skrám",
+ "Failed to convert files" : "Mistókst að umbreyta skrám",
+ "File successfully converted" : "Tókst að umbreyta skrá",
+ "Failed to convert file: {message}" : "Mistókst að umbreyta skrá: {message}",
+ "Failed to convert file" : "Mistókst að umbreyta skrá",
+ "Leave this share" : "Yfirgefa þessa sameign",
+ "Leave these shares" : "Yfirgefa þessar sameignir",
+ "Disconnect storage" : "Aftengja geymslu",
+ "Disconnect storages" : "Aftengja geymslurými",
+ "Delete permanently" : "Eyða varanlega",
+ "Delete and unshare" : "Eyða og hætta deilingu",
+ "Delete file" : "Eyða skrá",
+ "Delete files" : "Eyða skrám",
+ "Delete folder" : "Eyða möppu",
+ "Delete folders" : "Eyða möppum",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Þú ert við það að eyða endanlega {count} atriði","Þú ert við það að eyða endanlega {count} atriðum"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Þú ert við það að eyða {count} atriði","Þú ert við það að eyða {count} atriðum"],
+ "Confirm deletion" : "Staðfesta eyðingu",
+ "Cancel" : "Hætta við",
+ "Download" : "Niðurhal",
+ "Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
+ "Destination is not a folder" : "Áfangastaðurinn er ekki mappa",
+ "This file/folder is already in that directory" : "Þessi skrá/mappa er þegar í þessari möppu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Þú getur ekki flutt skrá/möppu inn í sjálfa sig eða inni í undirmöppu af sjálfri sér",
+ "(copy)" : "(afrita)",
+ "(copy %n)" : "(afrita %n)",
+ "A file or folder with that name already exists in this folder" : "Skrá eða mappa með þessu heiti er þegar til staðar í þessari möppu",
+ "The files are locked" : "Skrárnar eru læstar",
+ "The file does not exist anymore" : "Skráin er ekki lengur til",
+ "Choose destination" : "Veldu áfangastað",
+ "Copy to {target}" : "Afrita í {target}",
+ "Move to {target}" : "Færa í {target}",
+ "Move" : "Færa",
+ "Move or copy operation failed" : "Aðgerð við að færa eða afrita mistókst",
+ "Move or copy" : "Færa eða afrita",
+ "Open folder {displayName}" : "Opna möppu {displayName}",
+ "Open in Files" : "Opna í skráaforritinu",
+ "Failed to redirect to client" : "Mistókst að endurbeina til biðlara",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Skráin ætti núna að opnast á tækinu þínu. Ef það gerist ekki, ættirðu að ganga úr skugga um að þú sért með vinnutölvuforritið uppsett.",
+ "Retry and close" : "Prófa aftur og loka",
+ "Details" : "Nánar",
+ "View in folder" : "Skoða í möppu",
+ "Today" : "Í dag",
+ "Last 7 days" : "Síðustu 7 daga",
+ "Last 30 days" : "Síðustu 30 daga",
+ "This year ({year})" : "Þetta ár ({year})",
+ "Last year ({year})" : "Síðasta ár ({year})",
+ "Documents" : "Skjöl",
+ "Spreadsheets" : "Töflureiknar",
+ "Presentations" : "Kynningar",
+ "PDFs" : "PDF-skrár",
+ "Folders" : "Möppur",
+ "Audio" : "Hljóð",
+ "Images" : "Myndir",
+ "Videos" : "Myndskeið",
+ "Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
+ "Unable to initialize the templates directory" : "Tókst ekki að frumstilla sniðmátamöppuna",
+ "Create templates folder" : "Búa til sniðmátamöppu",
+ "Templates" : "Sniðmát",
+ "New template folder" : "Ný mappa fyrir sniðmát",
+ "In folder" : "Í möppunni",
+ "Search in folder: {folder}" : "Leita í möppunni: {folder}",
+ "One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Vafrinn þinn styður ekki API skráakerfis. Möppur verða ekki sendar inn",
+ "No files to upload" : "Engar skrár til að senda inn",
+ "Unable to create the directory {directory}" : "Get ekki búið til möppuna {directory}",
+ "Some files could not be uploaded" : "Ekki tókst að senda inn sumar skrár",
+ "Files uploaded successfully" : "Tókst að senda inn skrár",
+ "No files to process" : "Engar skrár til að vinna úr",
+ "Some files could not be copied" : "Ekki tókst að afrita sumar skrár",
+ "Some files could not be moved" : "Ekki tókst að færa sumar skrár",
+ "Files copied successfully" : "Tókst að afrita skrár",
+ "Files moved successfully" : "Tókst að færa skrár",
+ "Conflicts resolution skipped" : "Sleppti lausn árekstra",
+ "Upload cancelled" : "Hætt við innsendingu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Gat ekki endurnefnt \"{oldName}\", það er ekki lengur til staðar",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Heitið \"{newName}\" er nú þegar notað í \"{dir}\" möppunni. Veldu eitthvað annað nafn.",
+ "Could not rename \"{oldName}\"" : "Tókst ekki að endurnefna \"{oldName}\"",
+ "This operation is forbidden" : "Þessi aðgerð er bönnuð",
+ "Storage is temporarily not available" : "Gagnageymsla ekki tiltæk í augnablikinu",
+ "Unexpected error: {error}" : "Óvænt villa: {error}",
+ "_%n file_::_%n files_" : ["%n skrá","%n skrár"],
+ "_%n folder_::_%n folders_" : ["%n mappa","%n möppur"],
+ "Filename must not be empty." : "Skráarheiti má ekki vera tómt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er er ekki leyfilegt innan í skráarheiti.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er frátekið heiti og er ekki leyft í skráaheitum.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ekki leyfileg skráartegund.",
+ "Filenames must not end with \"{extension}\"." : "Skráaheiti mega ekki enda á \"{extension}\".",
+ "List of favorite files and folders." : "Listi yfir eftirlætisskrár og möppur.",
+ "No favorites yet" : "Engin eftirlæti ennþá",
+ "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér",
+ "List of your files and folders." : "Listi yfir skrárnar þínar og möppur.",
+ "List of your files and folders that are not shared." : "Listi yfir skrárnar þínar og möppur sem ekki er deilt.",
+ "No personal files found" : "Engar einkaskrár fundust",
+ "Files that are not shared will show up here." : "Skrár sem ekki er deilt birtast hér.",
+ "Recent" : "Nýlegt",
+ "List of recently modified files and folders." : "Listi yfir nýlega breyttar skrár og möppur.",
+ "No recently modified files" : "Engar nýlega breyttar skrár",
+ "Files and folders you recently modified will show up here." : "Skrár og möppur sem þú breyttir nýlega birtast hér.",
+ "Search" : "Search",
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
- "No favorites yet" : "Engin eftirlæti ennþá",
- "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér",
- "Deleted files" : "Eyddar skrár",
- "Shares" : "Sameignir",
- "Shared with others" : "Deilt með öðrum",
- "Shared with you" : "Deilt með þér",
- "Shared by link" : "Deilt með tengli",
- "Deleted shares" : "Eyddar sameignir",
- "Pending shares" : "Sameignir í bið",
+ "File could not be found" : "Skrá finnst ekki",
+ "Show list view" : "Birta listasýn",
+ "Show grid view" : "Birta reitasýn",
+ "Close" : "Loka",
+ "Could not create folder \"{dir}\"" : "Gat ekki búið til möppuna \"{dir}\"",
+ "This will stop your current uploads." : "Þetta mun stöðva núverandi innsendingar þínar.",
+ "Upload cancelled." : "Hætt við innsendingu.",
+ "Processing files …" : "Vinn með skrár …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tókst ekki að hlaða inn {filename} þar sem þetta er mappa eða er 0 bæti",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ekki nægilegt laust pláss, þú ert að senda inn {size1} en einungis {size2} eru eftir",
+ "Target folder \"{dir}\" does not exist any more" : "Markmappan \"{dir}\" er ekki lengur til",
+ "An unknown error has occurred" : "Óþekkt villa kom upp",
+ "File could not be uploaded" : "Gat ekki sent inn skrána",
+ "Uploading …" : "Sendi inn …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Sendi inn … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} af {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Innsending á þessu atriði er ekki studd",
+ "Error when assembling chunks, status code {status}" : "Villa við að setja búta saman, stöðukóði {status}",
+ "Choose target folder" : "Veldu úttaksmöppu",
+ "Set reminder" : "Setja áminningu",
+ "Edit locally" : "Breyta staðvært",
+ "Open" : "Opna",
+ "Could not load info for file \"{file}\"" : "Gat ekki lesið upplýsingar um skrána \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Veldu merki til að bæta á valið",
+ "Apply tag(s) to selection" : "Beita merki/merkjum á valið",
+ "Select directory \"{dirName}\"" : "Veldu möppuna \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Veldu skrána \"{fileName}\"",
+ "Unable to determine date" : "Tókst ekki að ákvarða dagsetningu",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Þessi mappa er ekki tiltæk, athugaðu atvikaskrár eða hafðu samband við kerfissjóra",
+ "Could not move \"{file}\", target exists" : "Gat ekki fært \"{file}\", markskrá er til",
+ "Could not move \"{file}\"" : "Gat ekki fært \"{file}\"",
+ "copy" : "afrit",
+ "Could not copy \"{file}\", target exists" : "Gat ekki afritað \"{file}\", markskrá er til",
+ "Could not copy \"{file}\"" : "Gat ekki afritað \"{file}\"",
+ "Copied {origin} inside {destination}" : "Afritaði {origin} inn í {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Afritaði {origin} og {nbfiles} aðrar skrár inn í {destination}",
+ "{newName} already exists" : "{newName} er þegar til",
+ "Could not create file \"{file}\"" : "Gat ekki búið til skrána \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Gat ekki búið til skrána \"{file}\" vegna þess að hún er þegar til",
+ "Could not create folder \"{dir}\" because it already exists" : "Gat ekki búið til möppuna \"{dir}\" vegna þess að hún er þegar til",
+ "Could not fetch file details \"{file}\"" : "Gat ekki sótt nánari upplýsingar um skrána \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Villa við að eyða skránni \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Engar leitarniðurstöður í öðrum möppum fyrir {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Settu inn fleiri en tvo stafi til að leita í öðrum möppum",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["þar á meðal %n falin","þar á meðal %n faldar"],
+ "You do not have permission to upload or create files here" : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér",
+ "_Uploading %n file_::_Uploading %n files_" : ["Sendi inn %n skrá","Sendi inn %n skrár"],
+ "New" : "Nýtt",
+ "New file/folder menu" : "Valmynd fyrir nýja skrá/möppu",
+ "Select file range" : "Veldu skráasvið",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} notað",
+ "\"{name}\" is an invalid file name." : "\"{name}\" er ógilt skráarheiti.",
+ "File name cannot be empty." : "Heiti skráar má ekki vera tómt",
+ "\"/\" is not allowed inside a file name." : "\"/\" er er ekki leyfilegt innan í skráarheiti.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ógild skráartegund",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Geymslupláss {owner} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Hópmappa {mountPoint} er full, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ytra geymslupláss {mountPoint} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Geymslupláss {owner} er næstum fullt ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Hópmappan \"{mountPoint}\" er næstum full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Ytra geymsluplássið \"{mountPoint}\" er næstum fullt ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Geymsluplássið þitt er næstum fullt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["samsvarar \"{filter}\"","samsvara \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Beinn tengill var afritaður (virkar bara fyrir fólk sem hefur aðgang að þessari skrá/möppu)",
+ "Path" : "Slóð",
+ "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"],
+ "Favored" : "Eftirlæti",
+ "Favor" : "Eftirl",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Afrita beinan tengil (virkar bara fyrir fólk sem hefur aðgang að þessari skrá/möppu)",
+ "Upload file" : "Senda inn skrá",
+ "Not favored" : "Ekki eftirlæti",
+ "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin",
+ "Upload (max. %s)" : "Senda inn (hám. %s)",
+ "\"{displayName}\" action executed successfully" : "Tókst að framkvæma \"{displayName}\" aðgerð",
+ "\"{displayName}\" action failed" : "\"{displayName}\" aðgerð mistókst",
+ "\"{displayName}\" batch action executed successfully" : "Tókst að framkvæma \"{displayName}\" magnvinnsluaðgerð",
+ "Submitting fields…" : "Sendi inn gögn úr reitum…",
+ "Filter filenames…" : "Sía skráaheiti…",
+ "WebDAV URL copied to clipboard" : "WebDAV-slóð afrituð á klippispjaldið",
+ "Enable the grid view" : "Virkja reitasýnina",
+ "Enable folder tree" : "Virkja möppugreinar",
+ "Copy to clipboard" : "Afrita á klippispjald",
+ "Use this address to access your Files via WebDAV" : "Notaðu þetta vistfang til að nálgast skráaforritið þitt með WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ef þú hefur virkjað 2FA tveggja-þrepa-auðkenningu, þarftu að útbúa nýtt lykilorð forrits og nota það með því að smella hér.",
+ "Deletion cancelled" : "Hætt við eyðingu",
+ "Move cancelled" : "Hætt við tilfærslu",
+ "Cancelled move or copy of \"{filename}\"." : "Hætti við aðgerð við að færa eða afrita \"{filename}\".",
+ "Cancelled move or copy operation" : "Hætti við aðgerð við að færa eða afrita",
+ "Open details" : "Opna nánari upplýsingar",
+ "Photos and images" : "Myndefni",
+ "New folder creation cancelled" : "Hætti við gerð nýrrar möppu",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappa","{folderCount} möppur"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} skrá","{fileCount} skrár"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 skrá og {folderCount} mappa","1 skrá og {folderCount} möppur"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} skrá og 1 mappa","{fileCount} skrár og 1 mappa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} skrár og {folderCount} möppur",
+ "All folders" : "Allar möppur",
+ "Personal Files" : "Einkaskrár",
"Text file" : "Textaskrá",
"New text file.txt" : "Ný textaskrá.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Geymslupláss {owner} er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
- "Your storage is full, files can not be updated or synced anymore!" : "Geymsluplássið þitt er fullt, ekki er lengur hægt að uppfæra eða samstilla skrár!",
- "_matches '{filter}'_::_match '{filter}'_" : ["samsvarar '{filter}'","samsvara '{filter}'"]
+ "Speed up your Files experience with these quick shortcuts." : "Flýttu fyrir vinnu þinni með skrár með þessum flýtilyklum.",
+ "Open the actions menu for a file" : "Opna aðgerðavalmynd fyrir skrá",
+ "Rename a file" : "Endurnefna skrá",
+ "Delete a file" : "Eyða skrá",
+ "Favorite or remove a file from favorites" : "Setja skrá í eða fjarlægja úr eftirlætum",
+ "Manage tags for a file" : "Sýsla með merki fyrir skrá",
+ "Deselect all files" : "Afvelja allar skrár",
+ "Select or deselect a file" : "Velja eða afvelja skrá",
+ "Select a range of files" : "Velja svið skráa",
+ "Navigate to the parent folder" : "Fara í yfirmöppuna",
+ "Navigate to the file above" : "Fara á skrána fyrir ofan",
+ "Navigate to the file below" : "Fara á skrána fyrir neðan",
+ "Navigate to the file on the left (in grid mode)" : "Fara á skrána til vinstri (í reitayfirliti)",
+ "Navigate to the file on the right (in grid mode)" : "Fara á skrána til hægri (í reitayfirliti)",
+ "Toggle the grid view" : "Víxla reitayfirliti af/á",
+ "Open the sidebar for a file" : "Opna hliðarspjald fyrir skrá"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index e4421ac9167..703cc336b2b 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
- "Storage invalid" : "Archiviazione non valida",
- "Unknown error" : "Errore sconosciuto",
- "File could not be found" : "Il file non può essere trovato",
- "Move or copy" : "Sposta o copia",
- "Download" : "Scarica",
- "Delete" : "Elimina",
- "Home" : "Home",
- "Close" : "Chiudi",
- "Favorites" : "Preferiti",
- "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
- "This will stop your current uploads." : "Questo fermerà i caricamenti attuali.",
- "Upload cancelled." : "Caricamento annullato.",
- "Processing files …" : "Elaborazione file in corso…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}",
- "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più",
- "Not enough free space" : "Spazio libero insufficiente",
- "An unknown error has occurred" : "Si è verificato un errore sconosciuto",
- "Uploading …" : "Caricamento in corso...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Il caricamento di tale elemento non è supportato",
- "Target folder does not exist any more" : "La cartella di destinazione non esiste più",
- "Operation is blocked by access control" : "L'operazione è bloccata dal controllo di accesso",
- "Error when assembling chunks, status code {status}" : "Errore durante l'assemblaggio dei blocchi, codice di stato {status}",
- "Actions" : "Azioni",
- "Rename" : "Rinomina",
- "Copy" : "Copia",
- "Choose target folder" : "Scegli la cartella di destinazione",
- "Open" : "Apri",
- "Delete file" : "Elimina file",
- "Delete folder" : "Elimina cartella",
- "Disconnect storage" : "Disconnetti archiviazione",
- "Leave this share" : "Abbandona questa condivisione",
- "Could not load info for file \"{file}\"" : "Impossibile caricare le informazioni per il file \"{file}\"",
- "Files" : "File",
- "Details" : "Dettagli",
- "Please select tag(s) to add to the selection" : "Seleziona un'etichetta(e) da aggiungere alla selezione",
- "Apply tag(s) to selection" : "Applica etichetta(e) alla selezione",
- "Select" : "Seleziona",
- "Pending" : "In corso",
- "Unable to determine date" : "Impossibile determinare la data",
- "This operation is forbidden" : "Questa operazione è vietata",
- "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
- "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
- "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
- "copy" : "copia",
- "Could not copy \"{file}\", target exists" : "Impossibile copiare \"{file}\", la destinazione esiste già",
- "Could not copy \"{file}\"" : "Impossibile copiare \"{file}\"",
- "Copied {origin} inside {destination}" : "Copiato {origin} in {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiati {origin} e {nbfiles} altri file in {destination}",
- "{newName} already exists" : "{newName} esiste già",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
- "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
- "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
- "Could not fetch file details \"{file}\"" : "Impossibile recuperare i dettagli del file \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nessun risultato di ricerca nelle altre cartelle per {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Digita più di due caratteri per cercare in altre cartelle",
- "Name" : "Nome",
- "Size" : "Dimensione",
- "Modified" : "Modificato",
- "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle"],
- "_%n file_::_%n files_" : ["%n file","%n file"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"],
- "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file",
- "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"],
- "New" : "Nuovo",
- "Select file range" : "Seleziona intervallo di file",
- "{used} of {quota} used" : "{used} di {quota} utilizzati",
- "{used} used" : "{used} utilizzati",
- "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.",
- "File name cannot be empty." : "Il nome del file non può essere vuoto.",
- "\"/\" is not allowed inside a file name." : "\"/\" non è consentito nel nome di un file.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" non è un tipo di file valido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere caricati o sincronizzati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più caricati o sincronizzati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione di {owner} è quasi pieno ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La cartella di gruppo \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'archiviazione esterna \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["verifica \"{filter}\"","verificano \"{filter}\""],
- "View in folder" : "Visualizza nella cartella",
- "Copied!" : "Copiato!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copia collegamento diretto (funziona solo per utenti che hanno accesso a questo file/cartella)",
- "Path" : "Percorso",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Preferiti",
- "Favorite" : "Preferito",
- "You can only favorite a single file or folder at a time" : "Puoi aggiungere ai preferiti un singolo file o cartella alla volta",
- "New folder" : "Nuova cartella",
- "Upload file" : "Carica file",
- "Recent" : "Recenti",
- "Not favorited" : "Non preferito",
- "Remove from favorites" : "Rimuovi dai preferiti",
- "Add to favorites" : "Aggiungi ai preferiti",
- "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
"Added to favorites" : "Aggiunto ai preferiti",
"Removed from favorites" : "Rimosso dai preferiti",
"You added {file} to your favorites" : "Hai aggiunto {file} ai tuoi preferiti",
"You removed {file} from your favorites" : "Hai rimosso {file} dai tuoi preferiti",
+ "Favorites" : "Preferiti",
"File changes" : "Modifiche dei file",
"Created by {user}" : "Creata da {user}",
"Changed by {user}" : "Modificata da {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Ripristinata da {user}",
"Renamed by {user}" : "Rinominata da {user}",
"Moved by {user}" : "Spostata da {user}",
- "\"remote user\"" : "\"utente remoto\"",
+ "\"remote account\"" : "\"account remoto\"",
"You created {file}" : "Hai creato {file}",
"You created an encrypted file in {file}" : "Hai creato un file cifrato in {file}",
"{user} created {file}" : "{user} ha creato {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Hai spostato {oldfile} in {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} ha spostato {oldfile} in {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un file stato aggiunto o rimosso dai tuoi <strong>preferiti</strong>",
+ "Files" : "File",
"A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Un file preferito o una cartella è stato <strong>modificato</strong>",
- "All files" : "Tutti i file",
- "Unlimited" : "Illimitata",
- "Upload (max. %s)" : "Carica (massimo %s)",
+ "Failed to authorize" : "Impossibile dare l'autorizzazione",
+ "Invalid folder path" : "Percorso della cartella non valido",
+ "Folder not found" : "Cartella non trovata",
+ "The file cannot be found" : "Il file non può essere trovato",
+ "The destination path does not exist: %1$s" : "Il percorso di destinazione non esiste: %1$s",
+ "You do not have permission to create a file at the specified location" : "Non hai l'autorizzazione per creare un file nella posizione specificata",
+ "The file could not be converted." : "Il file non può essere convertito.",
+ "Could not get relative path to converted file" : "Impossibile ottenere il percorso relativo al file convertito",
+ "Favorite files" : "File preferiti",
+ "No favorites" : "Nessun preferito",
+ "More favorites" : "Altri preferiti",
"Accept" : "Accetta",
"Reject" : "Rifiuta",
"Incoming ownership transfer from {user}" : "Trasferimento di proprietà in ingresso da {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vuoi accettare {path}?\n\nNota: il processo di trasferimento dopo l'accettazione potrebbe richiedere fino a un'ora.",
+ "Ownership transfer denied" : "Trasferimento di proprietà negato",
+ "Your ownership transfer of {path} was denied by {user}." : "Il tuo trasferimento di proprietà di {path} è stato negato da {user}.",
"Ownership transfer failed" : "Trasferimento di proprietà non riuscito",
"Your ownership transfer of {path} to {user} failed." : "Il tuo trasferimento di proprietà di {path} a {user} non è riuscito.",
"The ownership transfer of {path} from {user} failed." : "Il trasferimento di proprietà di {path} da {user} non è riuscito.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Il tuo trasferimento di proprietà di {path} a {user} è completato.",
"The ownership transfer of {path} from {user} has completed." : "Il trasferimento di proprietà di {path} da {user} è completato.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Trasferito da %1$s su %2$s",
+ "Files compatibility" : "Compatibilità di File",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "È anche possibile migrare i file automaticamente dopo aver abilitato questa impostazione; fare riferimento alla documentazione relativa al comando occ.",
+ "Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"File Management" : "Gestione dei file",
- "Transfer ownership of a file or folder" : " Trasferisci la proprietà di un file o di una cartella",
- "Choose file or folder to transfer" : "Scegli file o cartella da trasferire",
- "Change" : "Modifica",
- "New owner" : "Nuovo proprietario",
- "Search users" : "Cerca utenti",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "La cartella di destinazione non esiste più",
+ "Reload current directory" : "Ricarica la cartella corrente",
+ "Go to the \"{dir}\" directory" : "Vai alla cartella \"{dir}\"",
+ "Current directory path" : "Percorso della cartella corrente",
+ "Your have used your space quota and cannot upload files anymore" : "Hai esaurito la tua quota di spazio e non puoi più caricare file",
+ "You do not have permission to upload or create files here." : "Non hai l'autorizzazione per caricare o creare file qui.",
+ "Drag and drop files here to upload" : "Trascina e rilascia i file qui per caricarli",
+ "Favorite" : "Preferito",
+ "Back" : "Indietro",
+ "Toggle selection for file \"{displayName}\"" : "Attiva/disattiva la selezione per il file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Attiva/disattiva la selezione per la cartella \"{displayName}\"",
+ "File is loading" : "Il file è in caricamento",
+ "Folder is loading" : "La cartella è in caricamento",
+ "Filename" : "Nome file",
+ "Folder name" : "Nome della cartella",
+ "This node is unavailable" : "Questa nodo non è disponibile",
+ "Another entry with the same name already exists." : "Esiste già un'altra voce con lo stesso nome.",
+ "Invalid filename." : "Nome di file non valido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Rinominato \"{oldName}\" in \"{newName}\"",
+ "Rename file" : "Rinomina file",
+ "Folder" : "Cartella",
+ "Unknown file type" : "Tipo di file sconosciuto",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "In corso",
+ "Unknown date" : "Data sconosciuta",
+ "Clear filter" : "Pulisci il filtro",
+ "Modified" : "Modificato",
+ "Search everywhere" : "Cerca ovunque",
+ "Type" : "Tipo",
+ "Active filters" : "Filtri attivi",
+ "Remove filter" : "Rimuovi filtro",
+ "Total rows summary" : "Riepilogo totale delle righe",
+ "Toggle selection for all files and folders" : "Attiva/disattiva la selezione per tutti i file e le cartelle",
+ "Name" : "Nome",
+ "File type" : "Tipo di file",
+ "Size" : "Dimensione",
+ "{displayName}: failed on some elements" : "{displayName}: non riuscito su alcuni elementi",
+ "{displayName}: done" : "{displayName}: fatto",
+ "{displayName}: failed" : "{displayName}: non riuscito",
+ "Actions" : "Azioni",
+ "(selected)" : "(selezionato)",
+ "List of files and folders." : "Lista di file e cartelle.",
+ "You have used your space quota and cannot upload files anymore." : "Hai esaurito la tua quota di spazio e non puoi più caricare file.",
+ "Column headers with buttons are sortable." : "Le intestazioni di colonna con pulsanti sono ordinabili.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di prestazioni. I file verranno mostrati durante la navigazione della lista.",
+ "File not found" : "File non trovato",
+ "_{count} selected_::_{count} selected_" : ["{count} selezionato","{count} selezionati","{count} selezionati"],
+ "Search everywhere …" : "Cerca ovunque…",
+ "Search here …" : "Cerca qui…",
+ "Search scope options" : "Opzioni nell'ambito di ricerca",
+ "Search here" : "Cerca qui",
+ "{usedQuotaByte} used" : "{usedQuotaByte} usato",
+ "{used} of {quota} used" : "{used} di {quota} utilizzati",
+ "{relative}% used" : "{relative}% usato",
+ "Could not refresh storage stats" : "Impossibile aggiornare le statistiche di archiviazione",
+ "Your storage is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!",
+ "Storage information" : "Informazioni di archiviazione",
+ "Storage quota" : "Limite di archiviazione",
+ "New folder" : "Nuova cartella",
+ "Create new folder" : "Crea una nuova cartella",
+ "This name is already in use." : "Questo nome è già utilizzato.",
+ "Create" : "Crea",
+ "Files starting with a dot are hidden by default" : "I file che iniziano con un punto sono nascosti per impostazione predefinita",
+ "Fill template fields" : "Compila i campi del modello",
+ "Submitting fields …" : "Invio dei campi …",
+ "Submit" : "Invia",
"Choose a file or folder to transfer" : "Scegli file o cartella da trasferire",
"Transfer" : "Trasferisci",
"Transfer {path} to {userid}" : "Trasferisci {path} a {userid}",
"Invalid path selected" : "Percorso selezionato non valido",
+ "Unknown error" : "Errore sconosciuto",
"Ownership transfer request sent" : "Richiesta di trasferimento della proprietà inviata",
- "Cannot transfer ownership of a file or folder you don't own" : "Impossibile trasferire la proprietà di un file o di una cartella di altri",
- "Tags" : "Etichette",
- "Unable to change the favourite state of the file" : "Impossibile cambiare lo stato di preferito del file",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossibile trasferire la proprietà di un file o di una cartella di cui non sei proprietario",
+ "Transfer ownership of a file or folder" : " Trasferisci la proprietà di un file o di una cartella",
+ "Choose file or folder to transfer" : "Scegli file o cartella da trasferire",
+ "Change" : "Modifica",
+ "New owner" : "Nuovo proprietario",
+ "Keep {old}" : "Mantieni {old}",
+ "Keep without extension" : "Mantenere senza estensione",
+ "Use {new}" : "Usa {new}",
+ "Remove extension" : "Rimuovi estensione",
+ "Change file extension" : "Cambia estensione file",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Modificando l'estensione del file da \"{old}\" a\"{new}\" potrebbe rendere il file illeggibile.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Rimuovendo dell'estensione del file \"{old}\" potrebbe rendere il file illeggibile.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Aggiungere l'estensione del file \"{new}\" potrebbe rendere il file illeggibile.",
+ "Do not show this dialog again." : "Non visualizzare più questa finestra di dialogo.",
+ "Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
+ "Choose {file}" : "Scegli {file}",
+ "Share" : "Condividi",
+ "Shared by link" : "Condivisi tramite collegamento",
+ "Shared" : "Condiviso",
+ "Switch to list view" : "Passa alla vista elenco",
+ "Switch to grid view" : "Passa alla vista griglia",
+ "The file could not be found" : "Il file non è stato trovato",
+ "Upload was cancelled by user" : "Caricamento annullato dall'utente",
+ "Not enough free space" : "Spazio libero insufficiente",
+ "Operation is blocked by access control" : "L'operazione è bloccata dal controllo di accesso",
+ "Error during upload: {message}" : "Errore durante il caricamento: {message}",
+ "Error during upload, status code {status}" : "Errore durante il caricamento, codice di stato {status}",
+ "Unknown error during upload" : "Errore sconosciuto durante il caricamento",
+ "Loading current folder" : "Sto caricando la cartella corrente",
+ "Retry" : "Riprova",
+ "No files in here" : "Qui non c'è alcun file",
+ "Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
+ "Go back" : "Indietro",
+ "Views" : "Viste",
+ "Files settings" : "Impostazioni File",
+ "Your files" : "I tuoi files",
+ "Open in files" : "Apri in file",
+ "File cannot be accessed" : "Il file non possono essere acceduti",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
+ "No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
+ "Search for files" : "Cerca file",
+ "Clipboard is not available" : "Appunti non disponibili",
+ "WebDAV URL copied" : "URL WebDAV copiato",
+ "General" : "Generale",
+ "Default view" : "Vista predefinita",
+ "All files" : "Tutti i file",
+ "Personal files" : "File personali",
+ "Sort favorites first" : "Ordina prima i preferiti",
+ "Sort folders before files" : "Ordina cartelle prima dei files",
+ "Folder tree" : "Albero delle cartella",
+ "Appearance" : "Aspetto",
+ "Show hidden files" : "Mostra i file nascosti",
+ "Show file type column" : "Mostra colonna tipo di file",
+ "Show file extensions" : "Mostra estensioni di file",
+ "Crop image previews" : "Ritaglia le anteprime delle immagini",
+ "Additional settings" : "Impostazioni aggiuntive",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copia",
+ "How to access files using WebDAV" : "Come accedere ai file tramite WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Per il tuo account è abilitata l'autenticazione a due fattori, pertanto devi utilizzare una password dell'app per connetterti a un client WebDAV esterno.",
+ "Warnings" : "Avvertenze",
+ "Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
+ "Warn before deleting files" : "Avvisa prima di eliminare i file",
+ "Keyboard shortcuts" : "Scorciatoie da tastiera",
+ "File actions" : "Azioni sui file",
+ "Rename" : "Rinomina",
+ "Delete" : "Elimina",
+ "Add or remove favorite" : "Aggiungi o rimuovi preferito",
+ "Manage tags" : "Gestisci etichette",
+ "Selection" : "Selezione",
+ "Select all files" : "Seleziona tutti i file",
+ "Deselect all" : "Deseleziona tutto",
+ "Select or deselect" : "Seleziona o deseleziona",
+ "Select a range" : "Seleziona un intervallo",
+ "Navigation" : "Navigazione",
+ "Go to parent folder" : "Vai alla cartella padre",
+ "Go to file above" : "Vai al file sopra",
+ "Go to file below" : "Vai al file sotto",
+ "Go left in grid" : "Vai a sinistra nella griglia",
+ "Go right in grid" : "Vai a destra nella griglia",
+ "View" : "Visualizza",
+ "Toggle grid view" : "Commuta la vista a griglia",
+ "Open file sidebar" : "Apri la barra laterale del file",
+ "Show those shortcuts" : "Mostra quelle scorciatoie",
+ "You" : "Tu",
+ "Shared multiple times with different people" : "Condiviso più volte con diverse persone",
+ "Unable to change the favorite state of the file" : "Impossibile modificare lo stato preferito del file",
"Error while loading the file data" : "Errore durante il caricamento del file di dati",
+ "Owner" : "Proprietario",
+ "Remove from favorites" : "Rimuovi dai preferiti",
+ "Add to favorites" : "Aggiungi ai preferiti",
+ "Tags" : "Etichette",
+ "Blank" : "Vuoto",
+ "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello",
"Pick a template for {name}" : "Scegli un modello per {name}",
- "Cancel" : "Annulla",
- "Create" : "Crea",
"Create a new file with the selected template" : "Crea un nuovo file con il modello selezionato",
"Creating file" : "Creazione del file",
- "Blank" : "Vuoto",
- "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello",
- "Set up templates folder" : "Configura la cartella dei modelli",
- "Templates" : "Modelli",
+ "Save as {displayName}" : "Savlva come {displayName}",
+ "Save as …" : "Salva come …",
+ "Converting files …" : "Conversione dei file …",
+ "Failed to convert files: {message}" : "Impossibile convertire i file: {message}",
+ "All files failed to be converted" : "Non è stato possibile convertire tutti i file",
+ "One file could not be converted: {message}" : "Un file non può essere convertito: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un file non è stato convertito","%nfile non possono essere convertiti","%n file non possono essere convertiti"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un file convertito correttamente","%nfile convertiti con successo","%n file convertiti con successo"],
+ "Files successfully converted" : "File convertiti con successo",
+ "Failed to convert files" : "Impossibile convertire i file",
+ "Converting file …" : "Conversione del file …",
+ "File successfully converted" : "File convertito con successo",
+ "Failed to convert file: {message}" : "Impossibile convertire il file: {message}",
+ "Failed to convert file" : "Impossibile convertire il file",
+ "Leave this share" : "Abbandona questa condivisione",
+ "Leave these shares" : "Abbandona queste condivisioni",
+ "Disconnect storage" : "Disconnetti archiviazione",
+ "Disconnect storages" : "Disconnetti il supporto di archiviazione",
+ "Delete permanently" : "Elimina permanentemente",
+ "Delete and unshare" : "Elimina e annulla la condivisione",
+ "Delete file" : "Elimina file",
+ "Delete files" : "Elimina i file",
+ "Delete folder" : "Elimina cartella",
+ "Delete folders" : "Elimina la cartella",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Stai per eliminare permanentemente {count} elemento","Stai per eliminare permanentemente {count} elementi","Stai per eliminare permanentemente {count} elementi"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Stai per eliminare {count} elemento","Stai per eliminare {count} elementi","Stai per eliminare {count} elementi"],
+ "Confirm deletion" : "Conferma l'eliminazione",
+ "Cancel" : "Annulla",
+ "Download" : "Scarica",
+ "Moving \"{source}\" to \"{destination}\" …" : "Sposta \"{source}\" in \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copia \"{source}\" in \"{destination}\" …",
+ "Destination is not a folder" : "La destinazione non è una cartella",
+ "This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
+ "(copy)" : "(copia)",
+ "(copy %n)" : "(copia %n)",
+ "A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
+ "The files are locked" : "I files sono bloccati",
+ "The file does not exist anymore" : "Il file non esiste più",
+ "Choose destination" : "Scegli la destinazione",
+ "Copy to {target}" : "Copia in {target}",
+ "Move to {target}" : "Sposta in {target}",
+ "Move" : "Sposta",
+ "Move or copy operation failed" : "Operazione di spostamento o copia fallita",
+ "Move or copy" : "Sposta o copia",
+ "Open folder {displayName}" : "Apri la cartella {displayName}",
+ "Open in Files" : "Apri in File",
+ "Open locally" : "Aprire localmente",
+ "Failed to redirect to client" : "Reindirizzamento al client non riuscito",
+ "Open file locally" : "Apri file localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Il file dovrebbe ora aprirsi sul tuo dispositivo. In caso contrario, controlla di aver installato l'app desktop.",
+ "Retry and close" : "Riprova e chiudi",
+ "Open online" : "Apri online",
+ "Details" : "Dettagli",
+ "View in folder" : "Visualizza nella cartella",
+ "Today" : "Ogg",
+ "Last 7 days" : "Ultimi 7 giorni",
+ "Last 30 days" : "Ultimi 30 giorni",
+ "This year ({year})" : "Quest'anno ({year})",
+ "Last year ({year})" : "L'anno scorso ({year})",
+ "Documents" : "Documenti",
+ "Spreadsheets" : "Fogli elettronici",
+ "Presentations" : "Presentazioni",
+ "PDFs" : "PDF",
+ "Folders" : "Cartelle",
+ "Audio" : "Audio",
+ "Images" : "Immagini",
+ "Videos" : "Video",
+ "Created new folder \"{name}\"" : "Crea una nuova cartella \"{name}\"",
"Unable to initialize the templates directory" : "Impossibile inizializzare la cartella dei modelli",
- "%s used" : "%s utilizzato",
- "%s%% of %s used" : "%s%% di %s utilizzati",
- "%1$s of %2$s used" : "%1$s di %2$s utilizzati",
- "Settings" : "Impostazioni",
- "Show hidden files" : "Mostra i file nascosti",
- "Crop image previews" : "Ritaglia le anteprime delle immagini",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
- "Toggle %1$s sublist" : "Passa alla sottolista %1$s",
- "Toggle grid view" : "Commuta la vista a griglia",
- "No files in here" : "Qui non c'è alcun file",
- "Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
+ "Create templates folder" : "Crea cartella dei modelli",
+ "Templates" : "Modelli",
+ "New template folder" : "Nuova cartella dei modelli",
+ "In folder" : "Nella cartella",
+ "Search in all files" : "Cerca in tutti i file",
+ "Search in folder: {folder}" : "Cerca nella cartella: {folder}",
+ "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file depositati",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Il tuo browser non supporta l'API del file system. Le directory non verranno caricate",
+ "No files to upload" : "Nessun file da caricare",
+ "Unable to create the directory {directory}" : "Impossibile creare la directory {directory}",
+ "Some files could not be uploaded" : "Alcuni file non possono essere caricati",
+ "Files uploaded successfully" : "Files caricati correttamente",
+ "No files to process" : "Nessun file da elaborare",
+ "Some files could not be copied" : "Alcuni file non possono essere copiati",
+ "Some files could not be moved" : "Alcuni file non possono essere spostati",
+ "Files copied successfully" : "File copiati correttamente",
+ "Files moved successfully" : "File spostati correttamente",
+ "Conflicts resolution skipped" : "Risoluzione dei conflitti saltata",
+ "Upload cancelled" : "Caricamento annullato",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossibile rinominare \"{oldName}\", non esiste più",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{newName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
+ "Could not rename \"{oldName}\"" : "Impossibile rinominare \"{oldName}\"",
+ "This operation is forbidden" : "Questa operazione è vietata",
+ "This folder is unavailable, please try again later or contact the administration" : "Questa cartella non è disponibile, riprova più tardi o contatta l'amministrazione",
+ "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
+ "Unexpected error: {error}" : "Errore imprevisto: {error}",
+ "_%n file_::_%n files_" : ["%n file","%n file","%n file"],
+ "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle","%n cartelle"],
+ "_%n hidden_::_%n hidden_" : ["%n nascosto","%n nascosti","%n nascosti"],
+ "Filename must not be empty." : "Il nome del file non può essere vuoto.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" non è consentito in un nome di file.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" è un nome riservato e non consentito per i nomi di file.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" non è un tipo di file consentito.",
+ "Filenames must not end with \"{extension}\"." : "I nomi di file non possono terminare con \"{extension}\".",
+ "List of favorite files and folders." : "Elenco dei file e delle cartelle preferiti.",
+ "No favorites yet" : "Nessun preferito ancora",
+ "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
+ "List of your files and folders." : "Lista dei tuoi file e cartelle.",
+ "List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
+ "No personal files found" : "Nessun file personale trovato",
+ "Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+ "Recent" : "Recenti",
+ "List of recently modified files and folders." : "Lista di file e cartelle modificati di recente.",
+ "No recently modified files" : "Nessun file modificato di recente",
+ "Files and folders you recently modified will show up here." : "I file e le cartelle che hai modificato di recente saranno mostrati qui.",
+ "Search" : "Cerca",
+ "Search results within your files." : "Cerca i risultati all'interno dei tuoi file.",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
"Upload too large" : "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
- "No favorites yet" : "Nessun preferito ancora",
- "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
- "Deleted files" : "File eliminati",
- "Shares" : "Condivisioni",
- "Shared with others" : "Condivisi con altri",
- "Shared with you" : "Condivisi con te",
- "Shared by link" : "Condivisi tramite collegamento",
- "Deleted shares" : "Condivisioni eliminate",
- "Pending shares" : "Condivisioni in corso",
+ "File could not be found" : "Il file non può essere trovato",
+ "Show list view" : "Mostra la vista elenco",
+ "Show grid view" : "Mostra la visualizzazione griglia",
+ "Close" : "Chiudi",
+ "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
+ "This will stop your current uploads." : "Questo fermerà i caricamenti attuali.",
+ "Upload cancelled." : "Caricamento annullato.",
+ "Processing files …" : "Elaborazione file in corso…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più",
+ "An unknown error has occurred" : "Si è verificato un errore sconosciuto",
+ "File could not be uploaded" : "Il file non può essere caricato",
+ "Uploading …" : "Caricamento in corso...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Caricamento … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Il caricamento di tale elemento non è supportato",
+ "Error when assembling chunks, status code {status}" : "Errore durante l'assemblaggio dei blocchi, codice di stato {status}",
+ "Choose target folder" : "Scegli la cartella di destinazione",
+ "Set reminder" : "Imposta promemoria",
+ "Edit locally" : "Modifica localmente",
+ "Open" : "Apri",
+ "Could not load info for file \"{file}\"" : "Impossibile caricare le informazioni per il file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleziona un'etichetta(e) da aggiungere alla selezione",
+ "Apply tag(s) to selection" : "Applica etichetta(e) alla selezione",
+ "Select directory \"{dirName}\"" : "Seleziona cartella \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleziona file \"{fileName}\"",
+ "Unable to determine date" : "Impossibile determinare la data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
+ "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
+ "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "Impossibile copiare \"{file}\", la destinazione esiste già",
+ "Could not copy \"{file}\"" : "Impossibile copiare \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copiato {origin} in {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiati {origin} e {nbfiles} altri file in {destination}",
+ "{newName} already exists" : "{newName} esiste già",
+ "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
+ "Could not fetch file details \"{file}\"" : "Impossibile recuperare i dettagli del file \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Nessun risultato di ricerca nelle altre cartelle per {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Digita più di due caratteri per cercare in altre cartelle",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti","inclusi %n nascosti"],
+ "You do not have permission to upload or create files here" : "Non disponi dei permessi per caricare o creare file qui",
+ "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso","Caricamento di %n file in corso"],
+ "New" : "Nuovo",
+ "New file/folder menu" : "Nuovo menu file/cartella",
+ "Select file range" : "Seleziona intervallo di file",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} utilizzati",
+ "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.",
+ "File name cannot be empty." : "Il nome del file non può essere vuoto.",
+ "\"/\" is not allowed inside a file name." : "\"/\" non è consentito nel nome di un file.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" non è un tipo di file valido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere caricati o sincronizzati!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più caricati o sincronizzati!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione di {owner} è quasi pieno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La cartella di gruppo \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'archiviazione esterna \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["verifica \"{filter}\"","verificano \"{filter}\"","verificano \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Il collegamento diretto è stato copiato (funziona solo per gli utenti che hanno accesso a questo file o cartella)",
+ "Path" : "Percorso",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte","%n byte"],
+ "Favored" : "Preferito",
+ "Favor" : "Preferiti",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copia collegamento diretto (funziona solo per utenti che hanno accesso a questo file/cartella)",
+ "Upload file" : "Carica file",
+ "Not favored" : "Non preferito",
+ "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
+ "Upload (max. %s)" : "Carica (massimo %s)",
+ "\"{displayName}\" action executed successfully" : "L'azione \"{displayName}\" è stata eseguita correttamente",
+ "\"{displayName}\" action failed" : "L'azione \"{displayName}\" non è riuscita",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" non riuscito su alcuni elementi",
+ "\"{displayName}\" batch action executed successfully" : "L'azione batch \"{displayName}\" è stata eseguita correttamente",
+ "Submitting fields…" : "Invio dei campi…",
+ "Filter filenames…" : "Filtra nomi di file…",
+ "WebDAV URL copied to clipboard" : "L'URL WebDAV è stato copiato negli appunti",
+ "Enable the grid view" : "Attiva visuale a griglia",
+ "Enable folder tree" : "Abilita l'albero delle cartelle",
+ "Copy to clipboard" : "Copia negli appunti",
+ "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
+ "Deletion cancelled" : "Eliminazione annullata",
+ "Move cancelled" : "Spostamento cancellato",
+ "Cancelled move or copy of \"{filename}\"." : "Spostamento o copia di \"{filename}\" annullato.",
+ "Cancelled move or copy operation" : "Operazione di spostamento o copia annullata",
+ "Open details" : "Apri i dettagli",
+ "Photos and images" : "Foto e immagini",
+ "New folder creation cancelled" : "Creazione nuova cartella annullata",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartelle","{folderCount} cartelle"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} file","{fileCount} file"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file e {folderCount} cartella","1 file e {folderCount} cartelle","1 file e {folderCount} cartelle"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file e 1 cartella","{fileCount} file e 1 cartella","{fileCount} file e 1 cartella"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} file e {folderCount} cartelle",
+ "All folders" : "Tutte le cartelle",
+ "Personal Files" : "File personali",
"Text file" : "File di testo",
"New text file.txt" : "Nuovo file di testo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["corrispondono a '{filter}'","corrisponde a '{filter}'"]
+ "%1$s (renamed)" : "%1$s (rinominato)",
+ "renamed file" : "file rinominato",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
+ "Filter file names …" : "Filtra i nomi dei file …",
+ "Prevent warning dialogs from open or reenable them." : "Impedire l'apertura delle finestre di dialogo di avviso o riattivarle.",
+ "Show a warning dialog when changing a file extension." : "Mostra una finestra di dialogo di avviso quando si modifica l'estensione di un file.",
+ "Speed up your Files experience with these quick shortcuts." : "Velocizza la tua esperienza con i File con queste rapide scorciatoie.",
+ "Open the actions menu for a file" : "Aprire il menu delle azioni per un file",
+ "Rename a file" : "Rinominare un file",
+ "Delete a file" : "Eliminare un file",
+ "Favorite or remove a file from favorites" : "Aggiungere ai Preferiti o rimuovere un file dai preferiti",
+ "Manage tags for a file" : "Gestire i tag per un file",
+ "Deselect all files" : "Deseleziona tutti i file",
+ "Select or deselect a file" : "Seleziona o deseleziona un file",
+ "Select a range of files" : "Seleziona un intervallo di file",
+ "Navigate to the parent folder" : "Passare alla cartella padre",
+ "Navigate to the file above" : "Vai al file sopra",
+ "Navigate to the file below" : "Vai al file qui sotto",
+ "Navigate to the file on the left (in grid mode)" : "Navigare nel file a sinistra (in modalità griglia)",
+ "Navigate to the file on the right (in grid mode)" : "Navigare nel file a destra (in modalità griglia)",
+ "Toggle the grid view" : "Attiva la vista a griglia",
+ "Open the sidebar for a file" : "Aprire la barra laterale per un file"
},
-"nplurals=2; plural=(n != 1);");
+"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index bcaa6cae035..da6f6a596c7 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
- "Storage invalid" : "Archiviazione non valida",
- "Unknown error" : "Errore sconosciuto",
- "File could not be found" : "Il file non può essere trovato",
- "Move or copy" : "Sposta o copia",
- "Download" : "Scarica",
- "Delete" : "Elimina",
- "Home" : "Home",
- "Close" : "Chiudi",
- "Favorites" : "Preferiti",
- "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
- "This will stop your current uploads." : "Questo fermerà i caricamenti attuali.",
- "Upload cancelled." : "Caricamento annullato.",
- "Processing files …" : "Elaborazione file in corso…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}",
- "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più",
- "Not enough free space" : "Spazio libero insufficiente",
- "An unknown error has occurred" : "Si è verificato un errore sconosciuto",
- "Uploading …" : "Caricamento in corso...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Il caricamento di tale elemento non è supportato",
- "Target folder does not exist any more" : "La cartella di destinazione non esiste più",
- "Operation is blocked by access control" : "L'operazione è bloccata dal controllo di accesso",
- "Error when assembling chunks, status code {status}" : "Errore durante l'assemblaggio dei blocchi, codice di stato {status}",
- "Actions" : "Azioni",
- "Rename" : "Rinomina",
- "Copy" : "Copia",
- "Choose target folder" : "Scegli la cartella di destinazione",
- "Open" : "Apri",
- "Delete file" : "Elimina file",
- "Delete folder" : "Elimina cartella",
- "Disconnect storage" : "Disconnetti archiviazione",
- "Leave this share" : "Abbandona questa condivisione",
- "Could not load info for file \"{file}\"" : "Impossibile caricare le informazioni per il file \"{file}\"",
- "Files" : "File",
- "Details" : "Dettagli",
- "Please select tag(s) to add to the selection" : "Seleziona un'etichetta(e) da aggiungere alla selezione",
- "Apply tag(s) to selection" : "Applica etichetta(e) alla selezione",
- "Select" : "Seleziona",
- "Pending" : "In corso",
- "Unable to determine date" : "Impossibile determinare la data",
- "This operation is forbidden" : "Questa operazione è vietata",
- "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
- "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
- "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
- "copy" : "copia",
- "Could not copy \"{file}\", target exists" : "Impossibile copiare \"{file}\", la destinazione esiste già",
- "Could not copy \"{file}\"" : "Impossibile copiare \"{file}\"",
- "Copied {origin} inside {destination}" : "Copiato {origin} in {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiati {origin} e {nbfiles} altri file in {destination}",
- "{newName} already exists" : "{newName} esiste già",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
- "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
- "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
- "Could not fetch file details \"{file}\"" : "Impossibile recuperare i dettagli del file \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nessun risultato di ricerca nelle altre cartelle per {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Digita più di due caratteri per cercare in altre cartelle",
- "Name" : "Nome",
- "Size" : "Dimensione",
- "Modified" : "Modificato",
- "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle"],
- "_%n file_::_%n files_" : ["%n file","%n file"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"],
- "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file",
- "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"],
- "New" : "Nuovo",
- "Select file range" : "Seleziona intervallo di file",
- "{used} of {quota} used" : "{used} di {quota} utilizzati",
- "{used} used" : "{used} utilizzati",
- "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.",
- "File name cannot be empty." : "Il nome del file non può essere vuoto.",
- "\"/\" is not allowed inside a file name." : "\"/\" non è consentito nel nome di un file.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" non è un tipo di file valido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere caricati o sincronizzati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più caricati o sincronizzati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione di {owner} è quasi pieno ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La cartella di gruppo \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'archiviazione esterna \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["verifica \"{filter}\"","verificano \"{filter}\""],
- "View in folder" : "Visualizza nella cartella",
- "Copied!" : "Copiato!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copia collegamento diretto (funziona solo per utenti che hanno accesso a questo file/cartella)",
- "Path" : "Percorso",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Preferiti",
- "Favorite" : "Preferito",
- "You can only favorite a single file or folder at a time" : "Puoi aggiungere ai preferiti un singolo file o cartella alla volta",
- "New folder" : "Nuova cartella",
- "Upload file" : "Carica file",
- "Recent" : "Recenti",
- "Not favorited" : "Non preferito",
- "Remove from favorites" : "Rimuovi dai preferiti",
- "Add to favorites" : "Aggiungi ai preferiti",
- "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
"Added to favorites" : "Aggiunto ai preferiti",
"Removed from favorites" : "Rimosso dai preferiti",
"You added {file} to your favorites" : "Hai aggiunto {file} ai tuoi preferiti",
"You removed {file} from your favorites" : "Hai rimosso {file} dai tuoi preferiti",
+ "Favorites" : "Preferiti",
"File changes" : "Modifiche dei file",
"Created by {user}" : "Creata da {user}",
"Changed by {user}" : "Modificata da {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Ripristinata da {user}",
"Renamed by {user}" : "Rinominata da {user}",
"Moved by {user}" : "Spostata da {user}",
- "\"remote user\"" : "\"utente remoto\"",
+ "\"remote account\"" : "\"account remoto\"",
"You created {file}" : "Hai creato {file}",
"You created an encrypted file in {file}" : "Hai creato un file cifrato in {file}",
"{user} created {file}" : "{user} ha creato {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Hai spostato {oldfile} in {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} ha spostato {oldfile} in {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Un file stato aggiunto o rimosso dai tuoi <strong>preferiti</strong>",
+ "Files" : "File",
"A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Un file preferito o una cartella è stato <strong>modificato</strong>",
- "All files" : "Tutti i file",
- "Unlimited" : "Illimitata",
- "Upload (max. %s)" : "Carica (massimo %s)",
+ "Failed to authorize" : "Impossibile dare l'autorizzazione",
+ "Invalid folder path" : "Percorso della cartella non valido",
+ "Folder not found" : "Cartella non trovata",
+ "The file cannot be found" : "Il file non può essere trovato",
+ "The destination path does not exist: %1$s" : "Il percorso di destinazione non esiste: %1$s",
+ "You do not have permission to create a file at the specified location" : "Non hai l'autorizzazione per creare un file nella posizione specificata",
+ "The file could not be converted." : "Il file non può essere convertito.",
+ "Could not get relative path to converted file" : "Impossibile ottenere il percorso relativo al file convertito",
+ "Favorite files" : "File preferiti",
+ "No favorites" : "Nessun preferito",
+ "More favorites" : "Altri preferiti",
"Accept" : "Accetta",
"Reject" : "Rifiuta",
"Incoming ownership transfer from {user}" : "Trasferimento di proprietà in ingresso da {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vuoi accettare {path}?\n\nNota: il processo di trasferimento dopo l'accettazione potrebbe richiedere fino a un'ora.",
+ "Ownership transfer denied" : "Trasferimento di proprietà negato",
+ "Your ownership transfer of {path} was denied by {user}." : "Il tuo trasferimento di proprietà di {path} è stato negato da {user}.",
"Ownership transfer failed" : "Trasferimento di proprietà non riuscito",
"Your ownership transfer of {path} to {user} failed." : "Il tuo trasferimento di proprietà di {path} a {user} non è riuscito.",
"The ownership transfer of {path} from {user} failed." : "Il trasferimento di proprietà di {path} da {user} non è riuscito.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Il tuo trasferimento di proprietà di {path} a {user} è completato.",
"The ownership transfer of {path} from {user} has completed." : "Il trasferimento di proprietà di {path} da {user} è completato.",
"in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Trasferito da %1$s su %2$s",
+ "Files compatibility" : "Compatibilità di File",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "È anche possibile migrare i file automaticamente dopo aver abilitato questa impostazione; fare riferimento alla documentazione relativa al comando occ.",
+ "Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"File Management" : "Gestione dei file",
- "Transfer ownership of a file or folder" : " Trasferisci la proprietà di un file o di una cartella",
- "Choose file or folder to transfer" : "Scegli file o cartella da trasferire",
- "Change" : "Modifica",
- "New owner" : "Nuovo proprietario",
- "Search users" : "Cerca utenti",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "La cartella di destinazione non esiste più",
+ "Reload current directory" : "Ricarica la cartella corrente",
+ "Go to the \"{dir}\" directory" : "Vai alla cartella \"{dir}\"",
+ "Current directory path" : "Percorso della cartella corrente",
+ "Your have used your space quota and cannot upload files anymore" : "Hai esaurito la tua quota di spazio e non puoi più caricare file",
+ "You do not have permission to upload or create files here." : "Non hai l'autorizzazione per caricare o creare file qui.",
+ "Drag and drop files here to upload" : "Trascina e rilascia i file qui per caricarli",
+ "Favorite" : "Preferito",
+ "Back" : "Indietro",
+ "Toggle selection for file \"{displayName}\"" : "Attiva/disattiva la selezione per il file \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Attiva/disattiva la selezione per la cartella \"{displayName}\"",
+ "File is loading" : "Il file è in caricamento",
+ "Folder is loading" : "La cartella è in caricamento",
+ "Filename" : "Nome file",
+ "Folder name" : "Nome della cartella",
+ "This node is unavailable" : "Questa nodo non è disponibile",
+ "Another entry with the same name already exists." : "Esiste già un'altra voce con lo stesso nome.",
+ "Invalid filename." : "Nome di file non valido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Rinominato \"{oldName}\" in \"{newName}\"",
+ "Rename file" : "Rinomina file",
+ "Folder" : "Cartella",
+ "Unknown file type" : "Tipo di file sconosciuto",
+ "{ext} image" : "{ext} image",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} text",
+ "Pending" : "In corso",
+ "Unknown date" : "Data sconosciuta",
+ "Clear filter" : "Pulisci il filtro",
+ "Modified" : "Modificato",
+ "Search everywhere" : "Cerca ovunque",
+ "Type" : "Tipo",
+ "Active filters" : "Filtri attivi",
+ "Remove filter" : "Rimuovi filtro",
+ "Total rows summary" : "Riepilogo totale delle righe",
+ "Toggle selection for all files and folders" : "Attiva/disattiva la selezione per tutti i file e le cartelle",
+ "Name" : "Nome",
+ "File type" : "Tipo di file",
+ "Size" : "Dimensione",
+ "{displayName}: failed on some elements" : "{displayName}: non riuscito su alcuni elementi",
+ "{displayName}: done" : "{displayName}: fatto",
+ "{displayName}: failed" : "{displayName}: non riuscito",
+ "Actions" : "Azioni",
+ "(selected)" : "(selezionato)",
+ "List of files and folders." : "Lista di file e cartelle.",
+ "You have used your space quota and cannot upload files anymore." : "Hai esaurito la tua quota di spazio e non puoi più caricare file.",
+ "Column headers with buttons are sortable." : "Le intestazioni di colonna con pulsanti sono ordinabili.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di prestazioni. I file verranno mostrati durante la navigazione della lista.",
+ "File not found" : "File non trovato",
+ "_{count} selected_::_{count} selected_" : ["{count} selezionato","{count} selezionati","{count} selezionati"],
+ "Search everywhere …" : "Cerca ovunque…",
+ "Search here …" : "Cerca qui…",
+ "Search scope options" : "Opzioni nell'ambito di ricerca",
+ "Search here" : "Cerca qui",
+ "{usedQuotaByte} used" : "{usedQuotaByte} usato",
+ "{used} of {quota} used" : "{used} di {quota} utilizzati",
+ "{relative}% used" : "{relative}% usato",
+ "Could not refresh storage stats" : "Impossibile aggiornare le statistiche di archiviazione",
+ "Your storage is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!",
+ "Storage information" : "Informazioni di archiviazione",
+ "Storage quota" : "Limite di archiviazione",
+ "New folder" : "Nuova cartella",
+ "Create new folder" : "Crea una nuova cartella",
+ "This name is already in use." : "Questo nome è già utilizzato.",
+ "Create" : "Crea",
+ "Files starting with a dot are hidden by default" : "I file che iniziano con un punto sono nascosti per impostazione predefinita",
+ "Fill template fields" : "Compila i campi del modello",
+ "Submitting fields …" : "Invio dei campi …",
+ "Submit" : "Invia",
"Choose a file or folder to transfer" : "Scegli file o cartella da trasferire",
"Transfer" : "Trasferisci",
"Transfer {path} to {userid}" : "Trasferisci {path} a {userid}",
"Invalid path selected" : "Percorso selezionato non valido",
+ "Unknown error" : "Errore sconosciuto",
"Ownership transfer request sent" : "Richiesta di trasferimento della proprietà inviata",
- "Cannot transfer ownership of a file or folder you don't own" : "Impossibile trasferire la proprietà di un file o di una cartella di altri",
- "Tags" : "Etichette",
- "Unable to change the favourite state of the file" : "Impossibile cambiare lo stato di preferito del file",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossibile trasferire la proprietà di un file o di una cartella di cui non sei proprietario",
+ "Transfer ownership of a file or folder" : " Trasferisci la proprietà di un file o di una cartella",
+ "Choose file or folder to transfer" : "Scegli file o cartella da trasferire",
+ "Change" : "Modifica",
+ "New owner" : "Nuovo proprietario",
+ "Keep {old}" : "Mantieni {old}",
+ "Keep without extension" : "Mantenere senza estensione",
+ "Use {new}" : "Usa {new}",
+ "Remove extension" : "Rimuovi estensione",
+ "Change file extension" : "Cambia estensione file",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Modificando l'estensione del file da \"{old}\" a\"{new}\" potrebbe rendere il file illeggibile.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Rimuovendo dell'estensione del file \"{old}\" potrebbe rendere il file illeggibile.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Aggiungere l'estensione del file \"{new}\" potrebbe rendere il file illeggibile.",
+ "Do not show this dialog again." : "Non visualizzare più questa finestra di dialogo.",
+ "Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
+ "Choose {file}" : "Scegli {file}",
+ "Share" : "Condividi",
+ "Shared by link" : "Condivisi tramite collegamento",
+ "Shared" : "Condiviso",
+ "Switch to list view" : "Passa alla vista elenco",
+ "Switch to grid view" : "Passa alla vista griglia",
+ "The file could not be found" : "Il file non è stato trovato",
+ "Upload was cancelled by user" : "Caricamento annullato dall'utente",
+ "Not enough free space" : "Spazio libero insufficiente",
+ "Operation is blocked by access control" : "L'operazione è bloccata dal controllo di accesso",
+ "Error during upload: {message}" : "Errore durante il caricamento: {message}",
+ "Error during upload, status code {status}" : "Errore durante il caricamento, codice di stato {status}",
+ "Unknown error during upload" : "Errore sconosciuto durante il caricamento",
+ "Loading current folder" : "Sto caricando la cartella corrente",
+ "Retry" : "Riprova",
+ "No files in here" : "Qui non c'è alcun file",
+ "Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
+ "Go back" : "Indietro",
+ "Views" : "Viste",
+ "Files settings" : "Impostazioni File",
+ "Your files" : "I tuoi files",
+ "Open in files" : "Apri in file",
+ "File cannot be accessed" : "Il file non possono essere acceduti",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
+ "No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
+ "Search for files" : "Cerca file",
+ "Clipboard is not available" : "Appunti non disponibili",
+ "WebDAV URL copied" : "URL WebDAV copiato",
+ "General" : "Generale",
+ "Default view" : "Vista predefinita",
+ "All files" : "Tutti i file",
+ "Personal files" : "File personali",
+ "Sort favorites first" : "Ordina prima i preferiti",
+ "Sort folders before files" : "Ordina cartelle prima dei files",
+ "Folder tree" : "Albero delle cartella",
+ "Appearance" : "Aspetto",
+ "Show hidden files" : "Mostra i file nascosti",
+ "Show file type column" : "Mostra colonna tipo di file",
+ "Show file extensions" : "Mostra estensioni di file",
+ "Crop image previews" : "Ritaglia le anteprime delle immagini",
+ "Additional settings" : "Impostazioni aggiuntive",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copia",
+ "How to access files using WebDAV" : "Come accedere ai file tramite WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Per il tuo account è abilitata l'autenticazione a due fattori, pertanto devi utilizzare una password dell'app per connetterti a un client WebDAV esterno.",
+ "Warnings" : "Avvertenze",
+ "Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
+ "Warn before deleting files" : "Avvisa prima di eliminare i file",
+ "Keyboard shortcuts" : "Scorciatoie da tastiera",
+ "File actions" : "Azioni sui file",
+ "Rename" : "Rinomina",
+ "Delete" : "Elimina",
+ "Add or remove favorite" : "Aggiungi o rimuovi preferito",
+ "Manage tags" : "Gestisci etichette",
+ "Selection" : "Selezione",
+ "Select all files" : "Seleziona tutti i file",
+ "Deselect all" : "Deseleziona tutto",
+ "Select or deselect" : "Seleziona o deseleziona",
+ "Select a range" : "Seleziona un intervallo",
+ "Navigation" : "Navigazione",
+ "Go to parent folder" : "Vai alla cartella padre",
+ "Go to file above" : "Vai al file sopra",
+ "Go to file below" : "Vai al file sotto",
+ "Go left in grid" : "Vai a sinistra nella griglia",
+ "Go right in grid" : "Vai a destra nella griglia",
+ "View" : "Visualizza",
+ "Toggle grid view" : "Commuta la vista a griglia",
+ "Open file sidebar" : "Apri la barra laterale del file",
+ "Show those shortcuts" : "Mostra quelle scorciatoie",
+ "You" : "Tu",
+ "Shared multiple times with different people" : "Condiviso più volte con diverse persone",
+ "Unable to change the favorite state of the file" : "Impossibile modificare lo stato preferito del file",
"Error while loading the file data" : "Errore durante il caricamento del file di dati",
+ "Owner" : "Proprietario",
+ "Remove from favorites" : "Rimuovi dai preferiti",
+ "Add to favorites" : "Aggiungi ai preferiti",
+ "Tags" : "Etichette",
+ "Blank" : "Vuoto",
+ "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello",
"Pick a template for {name}" : "Scegli un modello per {name}",
- "Cancel" : "Annulla",
- "Create" : "Crea",
"Create a new file with the selected template" : "Crea un nuovo file con il modello selezionato",
"Creating file" : "Creazione del file",
- "Blank" : "Vuoto",
- "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello",
- "Set up templates folder" : "Configura la cartella dei modelli",
- "Templates" : "Modelli",
+ "Save as {displayName}" : "Savlva come {displayName}",
+ "Save as …" : "Salva come …",
+ "Converting files …" : "Conversione dei file …",
+ "Failed to convert files: {message}" : "Impossibile convertire i file: {message}",
+ "All files failed to be converted" : "Non è stato possibile convertire tutti i file",
+ "One file could not be converted: {message}" : "Un file non può essere convertito: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Un file non è stato convertito","%nfile non possono essere convertiti","%n file non possono essere convertiti"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Un file convertito correttamente","%nfile convertiti con successo","%n file convertiti con successo"],
+ "Files successfully converted" : "File convertiti con successo",
+ "Failed to convert files" : "Impossibile convertire i file",
+ "Converting file …" : "Conversione del file …",
+ "File successfully converted" : "File convertito con successo",
+ "Failed to convert file: {message}" : "Impossibile convertire il file: {message}",
+ "Failed to convert file" : "Impossibile convertire il file",
+ "Leave this share" : "Abbandona questa condivisione",
+ "Leave these shares" : "Abbandona queste condivisioni",
+ "Disconnect storage" : "Disconnetti archiviazione",
+ "Disconnect storages" : "Disconnetti il supporto di archiviazione",
+ "Delete permanently" : "Elimina permanentemente",
+ "Delete and unshare" : "Elimina e annulla la condivisione",
+ "Delete file" : "Elimina file",
+ "Delete files" : "Elimina i file",
+ "Delete folder" : "Elimina cartella",
+ "Delete folders" : "Elimina la cartella",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Stai per eliminare permanentemente {count} elemento","Stai per eliminare permanentemente {count} elementi","Stai per eliminare permanentemente {count} elementi"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Stai per eliminare {count} elemento","Stai per eliminare {count} elementi","Stai per eliminare {count} elementi"],
+ "Confirm deletion" : "Conferma l'eliminazione",
+ "Cancel" : "Annulla",
+ "Download" : "Scarica",
+ "Moving \"{source}\" to \"{destination}\" …" : "Sposta \"{source}\" in \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copia \"{source}\" in \"{destination}\" …",
+ "Destination is not a folder" : "La destinazione non è una cartella",
+ "This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
+ "(copy)" : "(copia)",
+ "(copy %n)" : "(copia %n)",
+ "A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
+ "The files are locked" : "I files sono bloccati",
+ "The file does not exist anymore" : "Il file non esiste più",
+ "Choose destination" : "Scegli la destinazione",
+ "Copy to {target}" : "Copia in {target}",
+ "Move to {target}" : "Sposta in {target}",
+ "Move" : "Sposta",
+ "Move or copy operation failed" : "Operazione di spostamento o copia fallita",
+ "Move or copy" : "Sposta o copia",
+ "Open folder {displayName}" : "Apri la cartella {displayName}",
+ "Open in Files" : "Apri in File",
+ "Open locally" : "Aprire localmente",
+ "Failed to redirect to client" : "Reindirizzamento al client non riuscito",
+ "Open file locally" : "Apri file localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Il file dovrebbe ora aprirsi sul tuo dispositivo. In caso contrario, controlla di aver installato l'app desktop.",
+ "Retry and close" : "Riprova e chiudi",
+ "Open online" : "Apri online",
+ "Details" : "Dettagli",
+ "View in folder" : "Visualizza nella cartella",
+ "Today" : "Ogg",
+ "Last 7 days" : "Ultimi 7 giorni",
+ "Last 30 days" : "Ultimi 30 giorni",
+ "This year ({year})" : "Quest'anno ({year})",
+ "Last year ({year})" : "L'anno scorso ({year})",
+ "Documents" : "Documenti",
+ "Spreadsheets" : "Fogli elettronici",
+ "Presentations" : "Presentazioni",
+ "PDFs" : "PDF",
+ "Folders" : "Cartelle",
+ "Audio" : "Audio",
+ "Images" : "Immagini",
+ "Videos" : "Video",
+ "Created new folder \"{name}\"" : "Crea una nuova cartella \"{name}\"",
"Unable to initialize the templates directory" : "Impossibile inizializzare la cartella dei modelli",
- "%s used" : "%s utilizzato",
- "%s%% of %s used" : "%s%% di %s utilizzati",
- "%1$s of %2$s used" : "%1$s di %2$s utilizzati",
- "Settings" : "Impostazioni",
- "Show hidden files" : "Mostra i file nascosti",
- "Crop image previews" : "Ritaglia le anteprime delle immagini",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
- "Toggle %1$s sublist" : "Passa alla sottolista %1$s",
- "Toggle grid view" : "Commuta la vista a griglia",
- "No files in here" : "Qui non c'è alcun file",
- "Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
+ "Create templates folder" : "Crea cartella dei modelli",
+ "Templates" : "Modelli",
+ "New template folder" : "Nuova cartella dei modelli",
+ "In folder" : "Nella cartella",
+ "Search in all files" : "Cerca in tutti i file",
+ "Search in folder: {folder}" : "Cerca nella cartella: {folder}",
+ "One of the dropped files could not be processed" : "Impossibile elaborare uno dei file depositati",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Il tuo browser non supporta l'API del file system. Le directory non verranno caricate",
+ "No files to upload" : "Nessun file da caricare",
+ "Unable to create the directory {directory}" : "Impossibile creare la directory {directory}",
+ "Some files could not be uploaded" : "Alcuni file non possono essere caricati",
+ "Files uploaded successfully" : "Files caricati correttamente",
+ "No files to process" : "Nessun file da elaborare",
+ "Some files could not be copied" : "Alcuni file non possono essere copiati",
+ "Some files could not be moved" : "Alcuni file non possono essere spostati",
+ "Files copied successfully" : "File copiati correttamente",
+ "Files moved successfully" : "File spostati correttamente",
+ "Conflicts resolution skipped" : "Risoluzione dei conflitti saltata",
+ "Upload cancelled" : "Caricamento annullato",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossibile rinominare \"{oldName}\", non esiste più",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{newName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.",
+ "Could not rename \"{oldName}\"" : "Impossibile rinominare \"{oldName}\"",
+ "This operation is forbidden" : "Questa operazione è vietata",
+ "This folder is unavailable, please try again later or contact the administration" : "Questa cartella non è disponibile, riprova più tardi o contatta l'amministrazione",
+ "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
+ "Unexpected error: {error}" : "Errore imprevisto: {error}",
+ "_%n file_::_%n files_" : ["%n file","%n file","%n file"],
+ "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle","%n cartelle"],
+ "_%n hidden_::_%n hidden_" : ["%n nascosto","%n nascosti","%n nascosti"],
+ "Filename must not be empty." : "Il nome del file non può essere vuoto.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" non è consentito in un nome di file.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" è un nome riservato e non consentito per i nomi di file.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" non è un tipo di file consentito.",
+ "Filenames must not end with \"{extension}\"." : "I nomi di file non possono terminare con \"{extension}\".",
+ "List of favorite files and folders." : "Elenco dei file e delle cartelle preferiti.",
+ "No favorites yet" : "Nessun preferito ancora",
+ "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
+ "List of your files and folders." : "Lista dei tuoi file e cartelle.",
+ "List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
+ "No personal files found" : "Nessun file personale trovato",
+ "Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+ "Recent" : "Recenti",
+ "List of recently modified files and folders." : "Lista di file e cartelle modificati di recente.",
+ "No recently modified files" : "Nessun file modificato di recente",
+ "Files and folders you recently modified will show up here." : "I file e le cartelle che hai modificato di recente saranno mostrati qui.",
+ "Search" : "Cerca",
+ "Search results within your files." : "Cerca i risultati all'interno dei tuoi file.",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
"Upload too large" : "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
- "No favorites yet" : "Nessun preferito ancora",
- "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
- "Deleted files" : "File eliminati",
- "Shares" : "Condivisioni",
- "Shared with others" : "Condivisi con altri",
- "Shared with you" : "Condivisi con te",
- "Shared by link" : "Condivisi tramite collegamento",
- "Deleted shares" : "Condivisioni eliminate",
- "Pending shares" : "Condivisioni in corso",
+ "File could not be found" : "Il file non può essere trovato",
+ "Show list view" : "Mostra la vista elenco",
+ "Show grid view" : "Mostra la visualizzazione griglia",
+ "Close" : "Chiudi",
+ "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"",
+ "This will stop your current uploads." : "Questo fermerà i caricamenti attuali.",
+ "Upload cancelled." : "Caricamento annullato.",
+ "Processing files …" : "Elaborazione file in corso…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più",
+ "An unknown error has occurred" : "Si è verificato un errore sconosciuto",
+ "File could not be uploaded" : "Il file non può essere caricato",
+ "Uploading …" : "Caricamento in corso...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Caricamento … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} di {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Il caricamento di tale elemento non è supportato",
+ "Error when assembling chunks, status code {status}" : "Errore durante l'assemblaggio dei blocchi, codice di stato {status}",
+ "Choose target folder" : "Scegli la cartella di destinazione",
+ "Set reminder" : "Imposta promemoria",
+ "Edit locally" : "Modifica localmente",
+ "Open" : "Apri",
+ "Could not load info for file \"{file}\"" : "Impossibile caricare le informazioni per il file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seleziona un'etichetta(e) da aggiungere alla selezione",
+ "Apply tag(s) to selection" : "Applica etichetta(e) alla selezione",
+ "Select directory \"{dirName}\"" : "Seleziona cartella \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seleziona file \"{fileName}\"",
+ "Unable to determine date" : "Impossibile determinare la data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore",
+ "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già",
+ "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"",
+ "copy" : "copia",
+ "Could not copy \"{file}\", target exists" : "Impossibile copiare \"{file}\", la destinazione esiste già",
+ "Could not copy \"{file}\"" : "Impossibile copiare \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copiato {origin} in {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiati {origin} e {nbfiles} altri file in {destination}",
+ "{newName} already exists" : "{newName} esiste già",
+ "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già",
+ "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già",
+ "Could not fetch file details \"{file}\"" : "Impossibile recuperare i dettagli del file \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Nessun risultato di ricerca nelle altre cartelle per {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Digita più di due caratteri per cercare in altre cartelle",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti","inclusi %n nascosti"],
+ "You do not have permission to upload or create files here" : "Non disponi dei permessi per caricare o creare file qui",
+ "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso","Caricamento di %n file in corso"],
+ "New" : "Nuovo",
+ "New file/folder menu" : "Nuovo menu file/cartella",
+ "Select file range" : "Seleziona intervallo di file",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} utilizzati",
+ "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.",
+ "File name cannot be empty." : "Il nome del file non può essere vuoto.",
+ "\"/\" is not allowed inside a file name." : "\"/\" non è consentito nel nome di un file.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" non è un tipo di file valido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere caricati o sincronizzati!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più caricati o sincronizzati!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione di {owner} è quasi pieno ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La cartella di gruppo \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'archiviazione esterna \"{mountPoint}\" è quasi piena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["verifica \"{filter}\"","verificano \"{filter}\"","verificano \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Il collegamento diretto è stato copiato (funziona solo per gli utenti che hanno accesso a questo file o cartella)",
+ "Path" : "Percorso",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte","%n byte"],
+ "Favored" : "Preferito",
+ "Favor" : "Preferiti",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copia collegamento diretto (funziona solo per utenti che hanno accesso a questo file/cartella)",
+ "Upload file" : "Carica file",
+ "Not favored" : "Non preferito",
+ "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette",
+ "Upload (max. %s)" : "Carica (massimo %s)",
+ "\"{displayName}\" action executed successfully" : "L'azione \"{displayName}\" è stata eseguita correttamente",
+ "\"{displayName}\" action failed" : "L'azione \"{displayName}\" non è riuscita",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" non riuscito su alcuni elementi",
+ "\"{displayName}\" batch action executed successfully" : "L'azione batch \"{displayName}\" è stata eseguita correttamente",
+ "Submitting fields…" : "Invio dei campi…",
+ "Filter filenames…" : "Filtra nomi di file…",
+ "WebDAV URL copied to clipboard" : "L'URL WebDAV è stato copiato negli appunti",
+ "Enable the grid view" : "Attiva visuale a griglia",
+ "Enable folder tree" : "Abilita l'albero delle cartelle",
+ "Copy to clipboard" : "Copia negli appunti",
+ "Use this address to access your Files via WebDAV" : "Usa questo indirizzo per accedere ai tuoi file con WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se hai abilitato il 2FA, devi creare ed usare una nuova password per l'applicazione facendo clic qui.",
+ "Deletion cancelled" : "Eliminazione annullata",
+ "Move cancelled" : "Spostamento cancellato",
+ "Cancelled move or copy of \"{filename}\"." : "Spostamento o copia di \"{filename}\" annullato.",
+ "Cancelled move or copy operation" : "Operazione di spostamento o copia annullata",
+ "Open details" : "Apri i dettagli",
+ "Photos and images" : "Foto e immagini",
+ "New folder creation cancelled" : "Creazione nuova cartella annullata",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartelle","{folderCount} cartelle"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} file","{fileCount} file"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file e {folderCount} cartella","1 file e {folderCount} cartelle","1 file e {folderCount} cartelle"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file e 1 cartella","{fileCount} file e 1 cartella","{fileCount} file e 1 cartella"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} file e {folderCount} cartelle",
+ "All folders" : "Tutte le cartelle",
+ "Personal Files" : "File personali",
"Text file" : "File di testo",
"New text file.txt" : "Nuovo file di testo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione di {owner} è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "La cartella di gruppo \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "L'archiviazione esterna \"{mountPoint}\" è piena, i file non possono più essere aggiornati o sincronizzati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["corrispondono a '{filter}'","corrisponde a '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
+ "%1$s (renamed)" : "%1$s (rinominato)",
+ "renamed file" : "file rinominato",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
+ "Filter file names …" : "Filtra i nomi dei file …",
+ "Prevent warning dialogs from open or reenable them." : "Impedire l'apertura delle finestre di dialogo di avviso o riattivarle.",
+ "Show a warning dialog when changing a file extension." : "Mostra una finestra di dialogo di avviso quando si modifica l'estensione di un file.",
+ "Speed up your Files experience with these quick shortcuts." : "Velocizza la tua esperienza con i File con queste rapide scorciatoie.",
+ "Open the actions menu for a file" : "Aprire il menu delle azioni per un file",
+ "Rename a file" : "Rinominare un file",
+ "Delete a file" : "Eliminare un file",
+ "Favorite or remove a file from favorites" : "Aggiungere ai Preferiti o rimuovere un file dai preferiti",
+ "Manage tags for a file" : "Gestire i tag per un file",
+ "Deselect all files" : "Deseleziona tutti i file",
+ "Select or deselect a file" : "Seleziona o deseleziona un file",
+ "Select a range of files" : "Seleziona un intervallo di file",
+ "Navigate to the parent folder" : "Passare alla cartella padre",
+ "Navigate to the file above" : "Vai al file sopra",
+ "Navigate to the file below" : "Vai al file qui sotto",
+ "Navigate to the file on the left (in grid mode)" : "Navigare nel file a sinistra (in modalità griglia)",
+ "Navigate to the file on the right (in grid mode)" : "Navigare nel file a destra (in modalità griglia)",
+ "Toggle the grid view" : "Attiva la vista a griglia",
+ "Open the sidebar for a file" : "Aprire la barra laterale per un file"
+},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 7fdb10c682a..37f8d5d9526 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "ストレージは一時的に利用できません",
- "Storage invalid" : "ストレージが無効です",
- "Unknown error" : "不明なエラー",
- "File could not be found" : "ファイルを見つけられませんでした",
- "Move or copy" : "移動またはコピー",
- "Download" : "ダウンロード",
- "Delete" : "削除",
- "Home" : "ホーム",
- "Close" : "閉じる",
- "Favorites" : "お気に入り",
- "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
- "This will stop your current uploads." : "現在のアップロードが停止されます。",
- "Upload cancelled." : "アップロードはキャンセルされました。",
- "Processing files …" : "ファイルの処理中...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリであるか、または0バイトのため {filename} をアップロードできません",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
- "Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
- "Not enough free space" : "十分な空き容量がありません",
- "An unknown error has occurred" : "不明なエラーが発生しました",
- "Uploading …" : "アップロード中...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
- "Uploading that item is not supported" : "そのアイテムのアップロードに対応していません",
- "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
- "Operation is blocked by access control" : "アクセス制御により操作がブロックされました",
- "Error when assembling chunks, status code {status}" : "チャンクを組み立てる際のエラー、ステータスコード{status}",
- "Actions" : "アクション",
- "Rename" : "名前の変更",
- "Copy" : "コピー",
- "Choose target folder" : "ターゲットフォルダーを選択",
- "Open" : "開く",
- "Delete file" : "ファイルを削除",
- "Delete folder" : "フォルダーを削除",
- "Disconnect storage" : "ストレージを切断する",
- "Leave this share" : "この共有から抜ける",
- "Could not load info for file \"{file}\"" : "\"{file}\" ファイルの情報を読み込めませんでした",
- "Files" : "ファイル",
- "Details" : "詳細",
- "Please select tag(s) to add to the selection" : "選択項目に付与するタグを選択してください",
- "Apply tag(s) to selection" : "選択項目にタグを適用",
- "Select" : "選択",
- "Pending" : "保留中",
- "Unable to determine date" : "更新日不明",
- "This operation is forbidden" : "この操作は禁止されています",
- "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
- "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
- "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
- "copy" : "コピー",
- "Could not copy \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"をコピーできませんでした",
- "Could not copy \"{file}\"" : "\"{file}\"をコピーできませんでした",
- "Copied {origin} inside {destination}" : "コピー先{origin} {destination}内",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "コピー先{origin}と{nbfiles}他のファイル{destination}",
- "{newName} already exists" : "{newName} はすでに存在します",
- "Could not rename \"{fileName}\", it does not exist any more" : "ファイルが存在しないため,\"{fileName}\"の名前変更ができませんでした",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" はフォルダー \"{dir}\" ですでに使われています。別の名前を選択してください。",
- "Could not rename \"{fileName}\"" : "\"{fileName}\"の名前変更ができませんでした",
- "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
- "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"はすでに存在するため作成できません",
- "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" はすでに存在するため作成できません",
- "Could not fetch file details \"{file}\"" : "\"{file}\" の詳細が取得できませんでした",
- "Error deleting file \"{fileName}\"." : "ファイル\"{fileName}\"の削除エラー。",
- "No search results in other folders for {tag}{filter}{endtag}" : "他のフォルダーに {tag}{filter}{endtag} の検索結果はありません",
- "Enter more than two characters to search in other folders" : "他のフォルダーで検索するには、3文字以上を入力してください",
- "Name" : "名前",
- "Size" : "サイズ",
- "Modified" : "更新日時",
- "_%n folder_::_%n folders_" : ["%n 個のフォルダー"],
- "_%n file_::_%n files_" : ["%n 個のファイル"],
- "{dirs} and {files}" : "{dirs} と {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"],
- "You don’t have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
- "New" : "新規作成",
- "Select file range" : "ファイルを範囲選択",
- "{used} of {quota} used" : "{used} / {quota} 使用中",
- "{used} used" : "{used} 使用中",
- "\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
- "File name cannot be empty." : "ファイル名を空にすることはできません。",
- "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "Your storage is full, files cannot be updated or synced anymore!" : "ストレージがいっぱいで、ファイルを更新または同期できなくなりました。",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} のストレージがほぼ一杯 ({usedSpacePercent}%) です",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "グループフォルダー \"{mountPoint}\" がほぼいっぱい ({usedSpacePercent}%) です。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部ストレージ \"{mountPoint}\" はほぼいっぱい ({usedSpacePercent}%) です",
- "Your storage is almost full ({usedSpacePercent}%)." : "ストレージがほぼいっぱい ({usedSpacePercent}%) です ",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : [" \"{filter}\" にマッチ"],
- "View in folder" : "フォルダー内で表示",
- "Copied!" : "コピー完了",
- "Copy direct link (only works for users who have access to this file/folder)" : "ダイレクトリンクをコピー (このファイル/フォルダーにアクセスできるユーザーのみ)",
- "Path" : "Path",
- "_%n byte_::_%n bytes_" : ["%n バイト"],
- "Favorited" : "お気に入り済",
- "Favorite" : "お気に入り",
- "You can only favorite a single file or folder at a time" : "お気に入りに追加できるファイルまたはフォルダーは一度に1つまでです",
- "New folder" : "新しいフォルダー",
- "Upload file" : "ファイルをアップロード",
- "Recent" : "最新",
- "Not favorited" : "お気に入りではありません",
- "Remove from favorites" : "お気に入りから削除",
- "Add to favorites" : "お気に入りに追加",
- "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
"You added {file} to your favorites" : "{file} をお気に入りに追加しました",
"You removed {file} from your favorites" : "{file} をお気に入りから削除しました",
+ "Favorites" : "お気に入り",
"File changes" : "ファイル更新",
"Created by {user}" : "{user} が作成しました",
"Changed by {user}" : "{user} が更新しました",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "{user} が復元しました",
"Renamed by {user}" : "{user} が作成しました",
"Moved by {user}" : "{user} が移動しました",
- "\"remote user\"" : "\"リモートユーザー\"",
+ "\"remote account\"" : "\"リモートアカウント\"",
"You created {file}" : "{file} を作成しました",
"You created an encrypted file in {file}" : "{file} で暗号化ファイルを作成しました",
"{user} created {file}" : "{user} が {file} を作成しました",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "{oldfile} を {newfile} に移動しました",
"{user} moved {oldfile} to {newfile}" : "{user} が {oldfile} を {newfile} に移動しました",
"A file has been added to or removed from your <strong>favorites</strong>" : "<strong>お気に入り</strong>にファイルが追加または削除されたとき",
+ "Files" : "ファイル",
"A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーが<strong>変更</strong>されたとき",
"A favorite file or folder has been <strong>changed</strong>" : "お気に入りのファイルまたはフォルダーが <strong>変更</strong>されたとき",
- "All files" : "すべてのファイル",
- "Unlimited" : "無制限",
- "Upload (max. %s)" : "アップロード ( 最大 %s )",
+ "Failed to authorize" : "認証に失敗しました",
+ "Invalid folder path" : "無効なフォルダーパス",
+ "Folder not found" : "フォルダーが見つかりません",
+ "The file cannot be found" : "ファイルが見つかりません",
+ "The destination path does not exist: %1$s" : "宛先のパスが存在しません: %1$s",
+ "You do not have permission to create a file at the specified location" : "指定された場所にファイルを作成する権限がありません",
+ "The file could not be converted." : "ファイルを変換できませんでした。",
+ "Could not get relative path to converted file" : "変換後のファイルへの相対パスを取得できませんでした",
+ "Favorite files" : "お気に入りファイル",
+ "No favorites" : "お気に入りなし",
+ "More favorites" : "その他のお気に入り",
"Accept" : "承諾",
"Reject" : "拒否",
"Incoming ownership transfer from {user}" : "{user} からの所有権転送を受信",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} を承諾しますか?\n\n注意:承諾後の転送処理には最大 1 時間かかる場合があります。",
+ "Ownership transfer denied" : "所有権の譲渡が拒否されました",
+ "Your ownership transfer of {path} was denied by {user}." : "{path}の所有権の譲渡が{user}によって拒否されました。",
"Ownership transfer failed" : "所有権の譲渡に失敗しました",
"Your ownership transfer of {path} to {user} failed." : "{path}の{user}への所有権転送に失敗しました。",
"The ownership transfer of {path} from {user} failed." : "{user} からの {path} の所有権転送に失敗しました。",
@@ -159,62 +67,414 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "{user} への {path} の所有権転送が完了しました。",
"The ownership transfer of {path} from {user} has completed." : "{user} からの {path} の所有権転送が完了しました。",
"in %s" : "%s で",
+ "Transferred from %1$s on %2$s" : "%1$sから%2$sに転送",
+ "Files compatibility" : "ファイルの互換性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ファイルをすべてのクライアントと同期できるようにするために、ファイル名を制限することを許可します。デフォルトではPOSIX(LinuxやmacOSなど)で有効なすべてのファイル名が許可されています。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "この設定を有効にした後、自動的にファイルを移行することも可能です。occコマンドに関するドキュメントを参照してください。",
+ "Enforce Windows compatibility" : "Windowsとの互換性を強制",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "予約名や特殊文字のような、Windowsシステムにおいて有効でないファイル名をブロックします。これは大文字、小文字の互換性を強制するものではありません。",
"File Management" : "ファイル管理",
- "Transfer ownership of a file or folder" : "ファイルまたはフォルダーの所有権を譲渡する",
- "Choose file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
- "Change" : "変更",
- "New owner" : "新しい所有者",
- "Search users" : "ユーザーを検索",
+ "Home" : "ホーム",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
+ "Reload current directory" : "カレントディレクトリの再読み込み",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" ディレクトリに移動する",
+ "Current directory path" : "現在のディレクトリパス",
+ "Your have used your space quota and cannot upload files anymore" : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
+ "You do not have permission to upload or create files here." : "ここにファイルをアップロードまたは作成する権限がありません。",
+ "Drag and drop files here to upload" : "ここにファイルをドラッグ&ドロップしてアップロードする",
+ "Favorite" : "お気に入り",
+ "Back" : "戻る",
+ "Toggle selection for file \"{displayName}\"" : "ファイル \"{displayName}\" の選択を切り替える",
+ "Toggle selection for folder \"{displayName}\"" : "フォルダ \"{displayName}\" の選択を切り替える",
+ "File is loading" : "ファイル読み込み中",
+ "Folder is loading" : "フォルダーを読み込み中",
+ "Filename" : "ファイル名",
+ "Folder name" : "フォルダー名",
+ "This node is unavailable" : "このノードは利用できません",
+ "Another entry with the same name already exists." : "同じ名前の別のエントリがすでに存在しています。",
+ "Invalid filename." : "無効なファイル名。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" から \"{newName}\" に名前を変更済み",
+ "Rename file" : "ファイル名の変更",
+ "Folder" : "フォルダー",
+ "Unknown file type" : "不明なファイルタイプ",
+ "{ext} image" : "{ext}画像",
+ "{ext} video" : "{ext}ビデオ",
+ "{ext} audio" : "{ext}音声",
+ "{ext} text" : "{ext}テキスト",
+ "Pending" : "保留中",
+ "Unknown date" : "不明な日付",
+ "Clear filter" : "フィルターをクリア",
+ "Modified" : "更新日時",
+ "Search everywhere" : "あらゆる場所を検索",
+ "Type" : "タイプ",
+ "Active filters" : "有効なフィルター",
+ "Remove filter" : "フィルターを削除",
+ "Total rows summary" : "総行数のサマリー",
+ "Toggle selection for all files and folders" : "すべてのファイルとフォルダの選択を切り替える",
+ "Name" : "名前",
+ "File type" : "ファイルの種類",
+ "Size" : "サイズ",
+ "Actions" : "アクション",
+ "(selected)" : "(選択済み)",
+ "List of files and folders." : "ファイルとフォルダの一覧。",
+ "You have used your space quota and cannot upload files anymore." : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
+ "Column headers with buttons are sortable." : "ボタン付きの列ヘッダはソート可能です。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
+ "File not found" : "ファイルが見つかりません",
+ "_{count} selected_::_{count} selected_" : ["{count}選択済み"],
+ "Search scope options" : "検索範囲オプション",
+ "{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{relative}% used" : "{relative}% 使用されています",
+ "Could not refresh storage stats" : "ストレージの状態を更新できませんでした",
+ "Your storage is full, files can not be updated or synced anymore!" : "ストレージは一杯です。ファイルの更新と同期はできません!",
+ "Storage information" : "ストレージ情報",
+ "Storage quota" : "ストレージのクォータ",
+ "New folder" : "新しいフォルダー",
+ "Create new folder" : "新しいフォルダーを作成",
+ "This name is already in use." : "この名前は既に使用されています。",
+ "Create" : "作成",
+ "Files starting with a dot are hidden by default" : "ドットで始まるファイルはデフォルトで非表示になっています",
+ "Fill template fields" : "テンプレートフィールドへの入力",
+ "Submitting fields …" : "フィールドを送信中…",
+ "Submit" : "提出する",
"Choose a file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
"Transfer" : "転送",
"Transfer {path} to {userid}" : "{path} を {userid} に転送する",
"Invalid path selected" : "無効なパスが選択されました",
+ "Unknown error" : "不明なエラー",
"Ownership transfer request sent" : "所有権転送のリクエストを送信しました",
- "Cannot transfer ownership of a file or folder you don't own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません",
- "Tags" : "タグ",
- "Unable to change the favourite state of the file" : "ファイルのお気に入りの状態を変更できません",
+ "Cannot transfer ownership of a file or folder you do not own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません",
+ "Transfer ownership of a file or folder" : "ファイルまたはフォルダーの所有権を譲渡する",
+ "Choose file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
+ "Change" : "変更",
+ "New owner" : "新しい所有者",
+ "Keep {old}" : "{old} を保持",
+ "Keep without extension" : "延長せずに保持",
+ "Use {new}" : "{new}を使用する",
+ "Remove extension" : "拡張子を削除",
+ "Change file extension" : "ファイル拡張子を変更",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "ファイル拡張子を \"{old}\" から \"{new}\" に変更すると、ファイルが読み取れなくなる可能性があります。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "ファイル拡張子 \"{old}\" を削除すると、ファイルが読み取れなくなる可能性があります。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "ファイル拡張子 \"{new}\" を追加すると、ファイルが読み取れなくなる可能性があります。",
+ "Do not show this dialog again." : "このダイアログを二度と表示しない。",
+ "Select file or folder to link to" : "リンク先のファイルまたはフォルダを選択",
+ "Choose {file}" : "{file}を選択",
+ "Share" : "共有",
+ "Shared by link" : "URLリンクで共有中",
+ "Shared" : "共有中",
+ "Switch to list view" : "リスト表示へ切り替え",
+ "Switch to grid view" : "グリッド表示へ切り替え",
+ "The file could not be found" : "ファイルが見つかりませんでした",
+ "Upload was cancelled by user" : "アップロードはユーザーによってキャンセルされました",
+ "Not enough free space" : "十分な空き容量がありません",
+ "Operation is blocked by access control" : "アクセス制御により操作がブロックされました",
+ "Error during upload: {message}" : "アップロード中にエラーが発生しました: {message}",
+ "Error during upload, status code {status}" : "アップロード中のエラー、ステータスコード {status}",
+ "Unknown error during upload" : "不明なエラーがアップロード中に発生しました",
+ "Loading current folder" : "現在のフォルダの読み込み中",
+ "Retry" : "リトライ",
+ "No files in here" : "ファイルがありません",
+ "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
+ "Go back" : "戻る",
+ "Views" : "表示",
+ "Files settings" : "ファイルの設定",
+ "Your files" : "あなたのファイル",
+ "Open in files" : "ファイルで開く",
+ "File cannot be accessed" : "ファイルにアクセスできません",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "ファイルが見つからないか、あなたがそれを表示する権限を持っていない可能性があります。送信者に共有するように依頼してください。",
+ "No search results for “{query}”" : "\"{query}\"に関する検索結果はありません",
+ "Search for files" : "ファイルを検索",
+ "Clipboard is not available" : "クリップボードは利用できません",
+ "General" : "一般",
+ "Default view" : "デフォルト表示",
+ "All files" : "すべてのファイル",
+ "Personal files" : "個人ファイル",
+ "Sort favorites first" : "お気に入りを最初に並べる",
+ "Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
+ "Folder tree" : "フォルダーツリー",
+ "Appearance" : "表示",
+ "Show hidden files" : "隠しファイルを表示",
+ "Show file type column" : "ファイルの種類のカラムを表示する",
+ "Crop image previews" : "プレビュー画像を切り抜く",
+ "Additional settings" : "追加設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "コピー",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2要素認証がアカウントに有効化されています。そのため、外部WebDAVクライアントを接続するにはアプリパスワードを使用する必要があります。",
+ "Warnings" : "警告",
+ "Keyboard shortcuts" : "キーボードショートカット",
+ "Rename" : "名前の変更",
+ "Delete" : "削除",
+ "Manage tags" : "タグを管理",
+ "Selection" : "選択",
+ "Select all files" : "全てのファイルを選択",
+ "Deselect all" : "選択を全解除",
+ "Navigation" : "ナビゲーション",
+ "View" : "表示",
+ "Toggle grid view" : "グリッド表示の切り替え",
+ "Show those shortcuts" : "これらのショートカットを表示する",
+ "You" : "自分",
+ "Shared multiple times with different people" : "異なる人と複数回共有",
+ "Unable to change the favorite state of the file" : "ファイルのお気に入りの状態を変更できません",
"Error while loading the file data" : "ファイルデータの読み込み中にエラーが発生しました",
+ "Owner" : "作成者",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
+ "Tags" : "タグ",
+ "Blank" : "ブランク",
+ "Unable to create new file from template" : "テンプレートから新しいファイルを作成できません",
"Pick a template for {name}" : "{name} のテンプレートを選択してください",
- "Cancel" : "キャンセル",
- "Create" : "作成",
"Create a new file with the selected template" : "選択したテンプレートを使用して新しいファイルを作成します",
"Creating file" : "ファイル作成",
- "Blank" : "ブランク",
- "Unable to create new file from template" : "テンプレートから新しいファイルを作成できません",
- "Set up templates folder" : "テンプレートフォルダーを設定",
- "Templates" : "テンプレート",
+ "Save as {displayName}" : "{displayName}として保存",
+ "Save as …" : "保存…",
+ "Converting files …" : "ファイルの変換…",
+ "Failed to convert files: {message}" : "ファイルの変換に失敗しました: {message}",
+ "All files failed to be converted" : "すべてのファイルの変換に失敗しました",
+ "One file could not be converted: {message}" : "1つのファイルが変換できませんでした: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n個のファイルが変換できませんでした"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n個のファイルの変換に成功しました"],
+ "Files successfully converted" : "ファイルは正常に変換されました",
+ "Failed to convert files" : "ファイルの変換に失敗しました",
+ "Converting file …" : "ファイルの変換…",
+ "File successfully converted" : "ファイルは正常に変換されました",
+ "Failed to convert file: {message}" : "ファイルの変換に失敗しました: {message}",
+ "Failed to convert file" : "ファイルの変換に失敗しました",
+ "Leave this share" : "この共有から抜ける",
+ "Leave these shares" : "これらの共有から抜ける",
+ "Disconnect storage" : "ストレージを切断する",
+ "Disconnect storages" : "ストレージを切断する",
+ "Delete permanently" : "完全に削除する",
+ "Delete and unshare" : "削除して共有を解除",
+ "Delete file" : "ファイルを削除",
+ "Delete files" : "ファイルの削除",
+ "Delete folder" : "フォルダーを削除",
+ "Delete folders" : "フォルダを削除",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count}アイテムを完全に削除しようとしています"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["あなたは {count} 個のアイテムを削除しようとしています"],
+ "Confirm deletion" : "削除の確認",
+ "Cancel" : "キャンセル",
+ "Download" : "ダウンロード",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\" を \"{destination}\"に移動",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\" を \"{destination}\"にコピー",
+ "Destination is not a folder" : "宛先がフォルダではありません",
+ "This file/folder is already in that directory" : "このファイル/フォルダはすでにそのディレクトリにあります",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "ファイル/フォルダをそれ自身の上に移動したり、それ自身のサブフォルダに移動したりすることはできません。",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "その名前のファイルまたはフォルダが、このフォルダに既に存在します",
+ "The files are locked" : "ファイルはロックされています",
+ "The file does not exist anymore" : "ファイルはもう存在しません",
+ "Choose destination" : "移動先を選択",
+ "Copy to {target}" : "{target} にコピー",
+ "Move to {target}" : "{target} に移動",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動またはコピー操作は失敗しました",
+ "Move or copy" : "移動またはコピー",
+ "Open folder {displayName}" : "フォルダ {displayName} を開く",
+ "Open in Files" : "ファイルアプリで開く",
+ "Open locally" : "ローカルで開く",
+ "Failed to redirect to client" : "クライアントへリダイレクトできませんでした",
+ "Open file locally" : "ローカルでファイルを開く",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "ファイルがデバイス上で開くはずです。開かない場合は、デスクトップアプリがインストールされているかご確認ください。",
+ "Retry and close" : "再試行して閉じる",
+ "Open online" : "オンラインで開く",
+ "Details" : "詳細",
+ "View in folder" : "フォルダー内で表示",
+ "Today" : "今日",
+ "Last 7 days" : "7日以内",
+ "Last 30 days" : "30日以内",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "ドキュメント",
+ "Spreadsheets" : "スプレッドシート",
+ "Presentations" : "プレゼンテーション",
+ "PDFs" : "PDF",
+ "Folders" : "フォルダー",
+ "Audio" : "オーディオ",
+ "Images" : "画像",
+ "Videos" : "動画",
+ "Created new folder \"{name}\"" : "新規フォルダ \"{name}\" を作成しました",
"Unable to initialize the templates directory" : "テンプレートディレクトリを初期化できませんでした",
- "%s used" : "%s 使用中",
- "%s%% of %s used" : "%s中%s%%が使われています。",
- "%1$s of %2$s used" : "%2$s 中%1$s が使われています。",
- "Settings" : "設定",
- "Show hidden files" : "隠しファイルを表示",
- "Crop image previews" : "プレビュー画像を切り抜く",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
- "Toggle %1$s sublist" : "サブリスト %1$s を切り替え",
- "Toggle grid view" : "グリッド表示の切り替え",
- "No files in here" : "ファイルがありません",
- "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
+ "Create templates folder" : "テンプレートフォルダーの作成",
+ "Templates" : "テンプレート",
+ "New template folder" : "新しいテンプレートフォルダ",
+ "In folder" : "フォルダ内",
+ "Search in all files" : "すべてのファイルを検索",
+ "Search in folder: {folder}" : "フォルダ内を検索: {folder}",
+ "One of the dropped files could not be processed" : "ドロップされたファイルの1つが処理できませんでした",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "お使いのブラウザはファイルシステムAPIをサポートしていません。ディレクトリはアップロードされません",
+ "No files to upload" : "アップロードするファイルがありません",
+ "Unable to create the directory {directory}" : "ディレクトリ {directory} を作成できません",
+ "Some files could not be uploaded" : "いくつかのファイルがアップロードできませんでした",
+ "Files uploaded successfully" : "ファイルが正常にアップロードされました",
+ "No files to process" : "処理するファイルがありません",
+ "Some files could not be copied" : "いくつかのファイルがコピーできません",
+ "Some files could not be moved" : "いくつかのファイルが移動できません",
+ "Files copied successfully" : "ファイルが正常にコピーされました",
+ "Files moved successfully" : "ファイルの移動に成功しました",
+ "Conflicts resolution skipped" : "コンフリクトの解決はスキップされました",
+ "Upload cancelled" : "アップロードはキャンセルされました",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" の名前を変更できませんでした、それは既に存在しません。",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" という名前は \"{dir}\" フォルダですでに使用されています。別の名前を選択してください。",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" の名前を変更できませんでした。",
+ "This operation is forbidden" : "この操作は禁止されています",
+ "Storage is temporarily not available" : "ストレージは一時的に利用できません",
+ "Unexpected error: {error}" : "予期せぬエラー: {error}",
+ "_%n file_::_%n files_" : ["%n 個のファイル"],
+ "_%n folder_::_%n folders_" : ["%n 個のフォルダー"],
+ "_%n hidden_::_%n hidden_" : ["%n 非公開"],
+ "Filename must not be empty." : "ファイル名は空白にできません。",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\"はファイル名には使用できません。",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\"は予約名であり、ファイル名には使用できません。",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" は許可されたファイルタイプではありません。",
+ "Filenames must not end with \"{extension}\"." : "ファイル名は \"{extension}\"で終了できません。",
+ "List of favorite files and folders." : "お気に入りのファイルやフォルダーの一覧",
+ "No favorites yet" : "まだお気に入りはありません",
+ "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
+ "List of your files and folders." : "ファイルやフォルダーの一覧",
+ "List of your files and folders that are not shared." : "共有されていないファイルやフォルダの一覧。",
+ "No personal files found" : "個人ファイルは見つかりませんでした",
+ "Files that are not shared will show up here." : "共有されていないファイルは、ここに表示されます。",
+ "Recent" : "最新",
+ "List of recently modified files and folders." : "最近変更されたファイルとフォルダーのリスト",
+ "No recently modified files" : "最近更新されたファイルはありません",
+ "Files and folders you recently modified will show up here." : "最近変更したファイルやフォルダーがここに表示されます。",
+ "Search" : "検索",
+ "Search results within your files." : "ファイル内の検索結果",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
"Upload too large" : "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、このサーバーのファイルアップロード時の最大サイズを超えています。",
- "No favorites yet" : "まだお気に入りはありません",
- "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
- "Deleted files" : "ゴミ箱",
- "Shares" : "共有",
- "Shared with others" : "他ユーザーと共有中",
- "Shared with you" : "他ユーザーがあなたと共有中",
- "Shared by link" : "URLリンクで共有中",
- "Deleted shares" : "削除された共有",
- "Pending shares" : "保留中の共有",
+ "File could not be found" : "ファイルを見つけられませんでした",
+ "Show list view" : "リストビューで表示",
+ "Show grid view" : "グリッドビューで表示",
+ "Close" : "閉じる",
+ "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
+ "This will stop your current uploads." : "現在のアップロードが停止されます。",
+ "Upload cancelled." : "アップロードはキャンセルされました。",
+ "Processing files …" : "ファイルの処理中...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリであるか、または0バイトのため {filename} をアップロードできません",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
+ "Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
+ "An unknown error has occurred" : "不明なエラーが発生しました",
+ "File could not be uploaded" : "ファイルをアップロードできませんでした",
+ "Uploading …" : "アップロード中...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "アップロード中… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Uploading that item is not supported" : "そのアイテムのアップロードに対応していません",
+ "Error when assembling chunks, status code {status}" : "チャンクを組み立てる際のエラー、ステータスコード{status}",
+ "Choose target folder" : "ターゲットフォルダーを選択",
+ "Set reminder" : "リマインダーを設定",
+ "Edit locally" : "ローカルで編集",
+ "Open" : "開く",
+ "Could not load info for file \"{file}\"" : "\"{file}\" ファイルの情報を読み込めませんでした",
+ "Please select tag(s) to add to the selection" : "選択項目に付与するタグを選択してください",
+ "Apply tag(s) to selection" : "選択項目にタグを適用",
+ "Select directory \"{dirName}\"" : "ディレクトリを選択: \"{dirName}\"",
+ "Select file \"{fileName}\"" : "ファイルを選択: \"{fileName}\"",
+ "Unable to determine date" : "更新日不明",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
+ "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
+ "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
+ "copy" : "コピー",
+ "Could not copy \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"をコピーできませんでした",
+ "Could not copy \"{file}\"" : "\"{file}\"をコピーできませんでした",
+ "Copied {origin} inside {destination}" : "コピー先{origin} {destination}内",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "コピー先{origin}と{nbfiles}他のファイル{destination}",
+ "{newName} already exists" : "{newName} はすでに存在します",
+ "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
+ "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"はすでに存在するため作成できません",
+ "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" はすでに存在するため作成できません",
+ "Could not fetch file details \"{file}\"" : "\"{file}\" の詳細が取得できませんでした",
+ "Error deleting file \"{fileName}\"." : "ファイル\"{fileName}\"の削除エラー。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "他のフォルダーに {tag}{filter}{endtag} の検索結果はありません",
+ "Enter more than two characters to search in other folders" : "他のフォルダーで検索するには、3文字以上を入力してください",
+ "{dirs} and {files}" : "{dirs} と {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"],
+ "You do not have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
+ "New" : "新規作成",
+ "New file/folder menu" : "新規ファイル/フォルダメニュー",
+ "Select file range" : "ファイルを範囲選択",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} 使用中",
+ "\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
+ "File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
+ "Your storage is full, files cannot be updated or synced anymore!" : "ストレージがいっぱいで、ファイルを更新または同期できなくなりました。",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} のストレージがほぼ一杯 ({usedSpacePercent}%) です",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "グループフォルダー \"{mountPoint}\" がほぼいっぱい ({usedSpacePercent}%) です。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部ストレージ \"{mountPoint}\" はほぼいっぱい ({usedSpacePercent}%) です",
+ "Your storage is almost full ({usedSpacePercent}%)." : "ストレージがほぼいっぱい ({usedSpacePercent}%) です ",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : [" \"{filter}\" にマッチ"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "ダイレクトリンクがコピーされました(このファイルやフォルダにアクセスできる人にのみ機能します)",
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n バイト"],
+ "Favored" : "好評",
+ "Favor" : "好意的",
+ "Copy direct link (only works for people who have access to this file/folder)" : "ダイレクトリンクをコピー (このファイル/フォルダにアクセスできる人にのみ機能します)",
+ "Upload file" : "ファイルをアップロード",
+ "Not favored" : "好ましくない",
+ "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
+ "Upload (max. %s)" : "アップロード ( 最大 %s )",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" アクションは正常に実行されました",
+ "\"{displayName}\" action failed" : "\"{displayName}\" アクションは失敗しました",
+ "\"{displayName}\" failed on some elements" : "いくつかの要素で \"{displayName}\" が失敗しました。",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" バッチアクションが正常に実行されました。",
+ "Submitting fields…" : "フィールドを送信中…",
+ "Filter filenames…" : "ファイルネームフィルター…",
+ "WebDAV URL copied to clipboard" : "WebDAVのURLがクリップボードにコピーされました",
+ "Enable the grid view" : "グリッド表示を有効にする",
+ "Enable folder tree" : "フォルダーツリーを有効にする",
+ "Copy to clipboard" : "クリップボードにコピー",
+ "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
+ "Deletion cancelled" : "削除はキャンセルされました",
+ "Move cancelled" : "移動はキャンセルされました",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\"の移動またはコピーをキャンセルしました。",
+ "Cancelled move or copy operation" : "キャンセルされた移動またはコピー操作",
+ "Open details" : "詳細を開く",
+ "Photos and images" : "写真と画像",
+ "New folder creation cancelled" : "新しいフォルダーの作成がキャンセルされました",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} フォルダ"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ファイル"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ファイルと {folderCount} フォルダ"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ファイルと 1 フォルダ"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ファイルと {folderCount} フォルダ",
+ "All folders" : "全てのフォルダー",
+ "Personal Files" : "個人ファイル",
"Text file" : "テキストファイル",
"New text file.txt" : "新規のテキストファイル作成",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "Your storage is full, files can not be updated or synced anymore!" : "ストレージは一杯です。ファイルの更新と同期はできません!",
- "_matches '{filter}'_::_match '{filter}'_" : [" '{filter}' にマッチ"]
+ "%1$s (renamed)" : "%1$s (リネーム済み)",
+ "renamed file" : "リネーム済みファイル",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。",
+ "Filter file names …" : "ファイルネームフィルター…",
+ "Prevent warning dialogs from open or reenable them." : "警告ダイアログが開かないようにするか、再度有効にする。",
+ "Show a warning dialog when changing a file extension." : "ファイルの拡張子を変更する際に、警告ダイアログを表示する。",
+ "Speed up your Files experience with these quick shortcuts." : "これらのショートカットでファイルの取り扱いを高速化します",
+ "Open the actions menu for a file" : "ファイルのアクションメニューを開く",
+ "Rename a file" : "ファイル名を変更",
+ "Delete a file" : "ファイルを削除",
+ "Favorite or remove a file from favorites" : "ファイルをお気に入りから追加または削除",
+ "Manage tags for a file" : "ファイルのタグを管理する",
+ "Deselect all files" : "全てのファイルの選択を解除",
+ "Select or deselect a file" : "ファイルを選択または選択を解除",
+ "Select a range of files" : "範囲内のファイルを選択",
+ "Navigate to the parent folder" : "親フォルダーに移動",
+ "Navigate to the file above" : "上のファイルに移動",
+ "Navigate to the file below" : "下のファイルに移動",
+ "Navigate to the file on the left (in grid mode)" : "左のファイルに移動(グリッドモード)",
+ "Navigate to the file on the right (in grid mode)" : "右のファイルに移動(グリッドモード)",
+ "Toggle the grid view" : "グリッドビューを切り替え",
+ "Open the sidebar for a file" : "ファイルのサイドバーを開く"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index c687f47b3d2..ea0d2a4aa7b 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "ストレージは一時的に利用できません",
- "Storage invalid" : "ストレージが無効です",
- "Unknown error" : "不明なエラー",
- "File could not be found" : "ファイルを見つけられませんでした",
- "Move or copy" : "移動またはコピー",
- "Download" : "ダウンロード",
- "Delete" : "削除",
- "Home" : "ホーム",
- "Close" : "閉じる",
- "Favorites" : "お気に入り",
- "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
- "This will stop your current uploads." : "現在のアップロードが停止されます。",
- "Upload cancelled." : "アップロードはキャンセルされました。",
- "Processing files …" : "ファイルの処理中...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリであるか、または0バイトのため {filename} をアップロードできません",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
- "Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
- "Not enough free space" : "十分な空き容量がありません",
- "An unknown error has occurred" : "不明なエラーが発生しました",
- "Uploading …" : "アップロード中...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
- "Uploading that item is not supported" : "そのアイテムのアップロードに対応していません",
- "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
- "Operation is blocked by access control" : "アクセス制御により操作がブロックされました",
- "Error when assembling chunks, status code {status}" : "チャンクを組み立てる際のエラー、ステータスコード{status}",
- "Actions" : "アクション",
- "Rename" : "名前の変更",
- "Copy" : "コピー",
- "Choose target folder" : "ターゲットフォルダーを選択",
- "Open" : "開く",
- "Delete file" : "ファイルを削除",
- "Delete folder" : "フォルダーを削除",
- "Disconnect storage" : "ストレージを切断する",
- "Leave this share" : "この共有から抜ける",
- "Could not load info for file \"{file}\"" : "\"{file}\" ファイルの情報を読み込めませんでした",
- "Files" : "ファイル",
- "Details" : "詳細",
- "Please select tag(s) to add to the selection" : "選択項目に付与するタグを選択してください",
- "Apply tag(s) to selection" : "選択項目にタグを適用",
- "Select" : "選択",
- "Pending" : "保留中",
- "Unable to determine date" : "更新日不明",
- "This operation is forbidden" : "この操作は禁止されています",
- "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
- "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
- "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
- "copy" : "コピー",
- "Could not copy \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"をコピーできませんでした",
- "Could not copy \"{file}\"" : "\"{file}\"をコピーできませんでした",
- "Copied {origin} inside {destination}" : "コピー先{origin} {destination}内",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "コピー先{origin}と{nbfiles}他のファイル{destination}",
- "{newName} already exists" : "{newName} はすでに存在します",
- "Could not rename \"{fileName}\", it does not exist any more" : "ファイルが存在しないため,\"{fileName}\"の名前変更ができませんでした",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" はフォルダー \"{dir}\" ですでに使われています。別の名前を選択してください。",
- "Could not rename \"{fileName}\"" : "\"{fileName}\"の名前変更ができませんでした",
- "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
- "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"はすでに存在するため作成できません",
- "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" はすでに存在するため作成できません",
- "Could not fetch file details \"{file}\"" : "\"{file}\" の詳細が取得できませんでした",
- "Error deleting file \"{fileName}\"." : "ファイル\"{fileName}\"の削除エラー。",
- "No search results in other folders for {tag}{filter}{endtag}" : "他のフォルダーに {tag}{filter}{endtag} の検索結果はありません",
- "Enter more than two characters to search in other folders" : "他のフォルダーで検索するには、3文字以上を入力してください",
- "Name" : "名前",
- "Size" : "サイズ",
- "Modified" : "更新日時",
- "_%n folder_::_%n folders_" : ["%n 個のフォルダー"],
- "_%n file_::_%n files_" : ["%n 個のファイル"],
- "{dirs} and {files}" : "{dirs} と {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"],
- "You don’t have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
- "New" : "新規作成",
- "Select file range" : "ファイルを範囲選択",
- "{used} of {quota} used" : "{used} / {quota} 使用中",
- "{used} used" : "{used} 使用中",
- "\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
- "File name cannot be empty." : "ファイル名を空にすることはできません。",
- "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "Your storage is full, files cannot be updated or synced anymore!" : "ストレージがいっぱいで、ファイルを更新または同期できなくなりました。",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} のストレージがほぼ一杯 ({usedSpacePercent}%) です",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "グループフォルダー \"{mountPoint}\" がほぼいっぱい ({usedSpacePercent}%) です。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部ストレージ \"{mountPoint}\" はほぼいっぱい ({usedSpacePercent}%) です",
- "Your storage is almost full ({usedSpacePercent}%)." : "ストレージがほぼいっぱい ({usedSpacePercent}%) です ",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : [" \"{filter}\" にマッチ"],
- "View in folder" : "フォルダー内で表示",
- "Copied!" : "コピー完了",
- "Copy direct link (only works for users who have access to this file/folder)" : "ダイレクトリンクをコピー (このファイル/フォルダーにアクセスできるユーザーのみ)",
- "Path" : "Path",
- "_%n byte_::_%n bytes_" : ["%n バイト"],
- "Favorited" : "お気に入り済",
- "Favorite" : "お気に入り",
- "You can only favorite a single file or folder at a time" : "お気に入りに追加できるファイルまたはフォルダーは一度に1つまでです",
- "New folder" : "新しいフォルダー",
- "Upload file" : "ファイルをアップロード",
- "Recent" : "最新",
- "Not favorited" : "お気に入りではありません",
- "Remove from favorites" : "お気に入りから削除",
- "Add to favorites" : "お気に入りに追加",
- "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
"You added {file} to your favorites" : "{file} をお気に入りに追加しました",
"You removed {file} from your favorites" : "{file} をお気に入りから削除しました",
+ "Favorites" : "お気に入り",
"File changes" : "ファイル更新",
"Created by {user}" : "{user} が作成しました",
"Changed by {user}" : "{user} が更新しました",
@@ -114,7 +11,7 @@
"Restored by {user}" : "{user} が復元しました",
"Renamed by {user}" : "{user} が作成しました",
"Moved by {user}" : "{user} が移動しました",
- "\"remote user\"" : "\"リモートユーザー\"",
+ "\"remote account\"" : "\"リモートアカウント\"",
"You created {file}" : "{file} を作成しました",
"You created an encrypted file in {file}" : "{file} で暗号化ファイルを作成しました",
"{user} created {file}" : "{user} が {file} を作成しました",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "{oldfile} を {newfile} に移動しました",
"{user} moved {oldfile} to {newfile}" : "{user} が {oldfile} を {newfile} に移動しました",
"A file has been added to or removed from your <strong>favorites</strong>" : "<strong>お気に入り</strong>にファイルが追加または削除されたとき",
+ "Files" : "ファイル",
"A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーが<strong>変更</strong>されたとき",
"A favorite file or folder has been <strong>changed</strong>" : "お気に入りのファイルまたはフォルダーが <strong>変更</strong>されたとき",
- "All files" : "すべてのファイル",
- "Unlimited" : "無制限",
- "Upload (max. %s)" : "アップロード ( 最大 %s )",
+ "Failed to authorize" : "認証に失敗しました",
+ "Invalid folder path" : "無効なフォルダーパス",
+ "Folder not found" : "フォルダーが見つかりません",
+ "The file cannot be found" : "ファイルが見つかりません",
+ "The destination path does not exist: %1$s" : "宛先のパスが存在しません: %1$s",
+ "You do not have permission to create a file at the specified location" : "指定された場所にファイルを作成する権限がありません",
+ "The file could not be converted." : "ファイルを変換できませんでした。",
+ "Could not get relative path to converted file" : "変換後のファイルへの相対パスを取得できませんでした",
+ "Favorite files" : "お気に入りファイル",
+ "No favorites" : "お気に入りなし",
+ "More favorites" : "その他のお気に入り",
"Accept" : "承諾",
"Reject" : "拒否",
"Incoming ownership transfer from {user}" : "{user} からの所有権転送を受信",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} を承諾しますか?\n\n注意:承諾後の転送処理には最大 1 時間かかる場合があります。",
+ "Ownership transfer denied" : "所有権の譲渡が拒否されました",
+ "Your ownership transfer of {path} was denied by {user}." : "{path}の所有権の譲渡が{user}によって拒否されました。",
"Ownership transfer failed" : "所有権の譲渡に失敗しました",
"Your ownership transfer of {path} to {user} failed." : "{path}の{user}への所有権転送に失敗しました。",
"The ownership transfer of {path} from {user} failed." : "{user} からの {path} の所有権転送に失敗しました。",
@@ -157,62 +65,414 @@
"Your ownership transfer of {path} to {user} has completed." : "{user} への {path} の所有権転送が完了しました。",
"The ownership transfer of {path} from {user} has completed." : "{user} からの {path} の所有権転送が完了しました。",
"in %s" : "%s で",
+ "Transferred from %1$s on %2$s" : "%1$sから%2$sに転送",
+ "Files compatibility" : "ファイルの互換性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ファイルをすべてのクライアントと同期できるようにするために、ファイル名を制限することを許可します。デフォルトではPOSIX(LinuxやmacOSなど)で有効なすべてのファイル名が許可されています。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "この設定を有効にした後、自動的にファイルを移行することも可能です。occコマンドに関するドキュメントを参照してください。",
+ "Enforce Windows compatibility" : "Windowsとの互換性を強制",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "予約名や特殊文字のような、Windowsシステムにおいて有効でないファイル名をブロックします。これは大文字、小文字の互換性を強制するものではありません。",
"File Management" : "ファイル管理",
- "Transfer ownership of a file or folder" : "ファイルまたはフォルダーの所有権を譲渡する",
- "Choose file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
- "Change" : "変更",
- "New owner" : "新しい所有者",
- "Search users" : "ユーザーを検索",
+ "Home" : "ホーム",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
+ "Reload current directory" : "カレントディレクトリの再読み込み",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" ディレクトリに移動する",
+ "Current directory path" : "現在のディレクトリパス",
+ "Your have used your space quota and cannot upload files anymore" : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
+ "You do not have permission to upload or create files here." : "ここにファイルをアップロードまたは作成する権限がありません。",
+ "Drag and drop files here to upload" : "ここにファイルをドラッグ&ドロップしてアップロードする",
+ "Favorite" : "お気に入り",
+ "Back" : "戻る",
+ "Toggle selection for file \"{displayName}\"" : "ファイル \"{displayName}\" の選択を切り替える",
+ "Toggle selection for folder \"{displayName}\"" : "フォルダ \"{displayName}\" の選択を切り替える",
+ "File is loading" : "ファイル読み込み中",
+ "Folder is loading" : "フォルダーを読み込み中",
+ "Filename" : "ファイル名",
+ "Folder name" : "フォルダー名",
+ "This node is unavailable" : "このノードは利用できません",
+ "Another entry with the same name already exists." : "同じ名前の別のエントリがすでに存在しています。",
+ "Invalid filename." : "無効なファイル名。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" から \"{newName}\" に名前を変更済み",
+ "Rename file" : "ファイル名の変更",
+ "Folder" : "フォルダー",
+ "Unknown file type" : "不明なファイルタイプ",
+ "{ext} image" : "{ext}画像",
+ "{ext} video" : "{ext}ビデオ",
+ "{ext} audio" : "{ext}音声",
+ "{ext} text" : "{ext}テキスト",
+ "Pending" : "保留中",
+ "Unknown date" : "不明な日付",
+ "Clear filter" : "フィルターをクリア",
+ "Modified" : "更新日時",
+ "Search everywhere" : "あらゆる場所を検索",
+ "Type" : "タイプ",
+ "Active filters" : "有効なフィルター",
+ "Remove filter" : "フィルターを削除",
+ "Total rows summary" : "総行数のサマリー",
+ "Toggle selection for all files and folders" : "すべてのファイルとフォルダの選択を切り替える",
+ "Name" : "名前",
+ "File type" : "ファイルの種類",
+ "Size" : "サイズ",
+ "Actions" : "アクション",
+ "(selected)" : "(選択済み)",
+ "List of files and folders." : "ファイルとフォルダの一覧。",
+ "You have used your space quota and cannot upload files anymore." : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
+ "Column headers with buttons are sortable." : "ボタン付きの列ヘッダはソート可能です。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
+ "File not found" : "ファイルが見つかりません",
+ "_{count} selected_::_{count} selected_" : ["{count}選択済み"],
+ "Search scope options" : "検索範囲オプション",
+ "{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{relative}% used" : "{relative}% 使用されています",
+ "Could not refresh storage stats" : "ストレージの状態を更新できませんでした",
+ "Your storage is full, files can not be updated or synced anymore!" : "ストレージは一杯です。ファイルの更新と同期はできません!",
+ "Storage information" : "ストレージ情報",
+ "Storage quota" : "ストレージのクォータ",
+ "New folder" : "新しいフォルダー",
+ "Create new folder" : "新しいフォルダーを作成",
+ "This name is already in use." : "この名前は既に使用されています。",
+ "Create" : "作成",
+ "Files starting with a dot are hidden by default" : "ドットで始まるファイルはデフォルトで非表示になっています",
+ "Fill template fields" : "テンプレートフィールドへの入力",
+ "Submitting fields …" : "フィールドを送信中…",
+ "Submit" : "提出する",
"Choose a file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
"Transfer" : "転送",
"Transfer {path} to {userid}" : "{path} を {userid} に転送する",
"Invalid path selected" : "無効なパスが選択されました",
+ "Unknown error" : "不明なエラー",
"Ownership transfer request sent" : "所有権転送のリクエストを送信しました",
- "Cannot transfer ownership of a file or folder you don't own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません",
- "Tags" : "タグ",
- "Unable to change the favourite state of the file" : "ファイルのお気に入りの状態を変更できません",
+ "Cannot transfer ownership of a file or folder you do not own" : "所有していないファイルまたはフォルダーの所有権を譲渡することはできません",
+ "Transfer ownership of a file or folder" : "ファイルまたはフォルダーの所有権を譲渡する",
+ "Choose file or folder to transfer" : "譲渡するファイルまたはフォルダーを選択してください",
+ "Change" : "変更",
+ "New owner" : "新しい所有者",
+ "Keep {old}" : "{old} を保持",
+ "Keep without extension" : "延長せずに保持",
+ "Use {new}" : "{new}を使用する",
+ "Remove extension" : "拡張子を削除",
+ "Change file extension" : "ファイル拡張子を変更",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "ファイル拡張子を \"{old}\" から \"{new}\" に変更すると、ファイルが読み取れなくなる可能性があります。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "ファイル拡張子 \"{old}\" を削除すると、ファイルが読み取れなくなる可能性があります。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "ファイル拡張子 \"{new}\" を追加すると、ファイルが読み取れなくなる可能性があります。",
+ "Do not show this dialog again." : "このダイアログを二度と表示しない。",
+ "Select file or folder to link to" : "リンク先のファイルまたはフォルダを選択",
+ "Choose {file}" : "{file}を選択",
+ "Share" : "共有",
+ "Shared by link" : "URLリンクで共有中",
+ "Shared" : "共有中",
+ "Switch to list view" : "リスト表示へ切り替え",
+ "Switch to grid view" : "グリッド表示へ切り替え",
+ "The file could not be found" : "ファイルが見つかりませんでした",
+ "Upload was cancelled by user" : "アップロードはユーザーによってキャンセルされました",
+ "Not enough free space" : "十分な空き容量がありません",
+ "Operation is blocked by access control" : "アクセス制御により操作がブロックされました",
+ "Error during upload: {message}" : "アップロード中にエラーが発生しました: {message}",
+ "Error during upload, status code {status}" : "アップロード中のエラー、ステータスコード {status}",
+ "Unknown error during upload" : "不明なエラーがアップロード中に発生しました",
+ "Loading current folder" : "現在のフォルダの読み込み中",
+ "Retry" : "リトライ",
+ "No files in here" : "ファイルがありません",
+ "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
+ "Go back" : "戻る",
+ "Views" : "表示",
+ "Files settings" : "ファイルの設定",
+ "Your files" : "あなたのファイル",
+ "Open in files" : "ファイルで開く",
+ "File cannot be accessed" : "ファイルにアクセスできません",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "ファイルが見つからないか、あなたがそれを表示する権限を持っていない可能性があります。送信者に共有するように依頼してください。",
+ "No search results for “{query}”" : "\"{query}\"に関する検索結果はありません",
+ "Search for files" : "ファイルを検索",
+ "Clipboard is not available" : "クリップボードは利用できません",
+ "General" : "一般",
+ "Default view" : "デフォルト表示",
+ "All files" : "すべてのファイル",
+ "Personal files" : "個人ファイル",
+ "Sort favorites first" : "お気に入りを最初に並べる",
+ "Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
+ "Folder tree" : "フォルダーツリー",
+ "Appearance" : "表示",
+ "Show hidden files" : "隠しファイルを表示",
+ "Show file type column" : "ファイルの種類のカラムを表示する",
+ "Crop image previews" : "プレビュー画像を切り抜く",
+ "Additional settings" : "追加設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "コピー",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2要素認証がアカウントに有効化されています。そのため、外部WebDAVクライアントを接続するにはアプリパスワードを使用する必要があります。",
+ "Warnings" : "警告",
+ "Keyboard shortcuts" : "キーボードショートカット",
+ "Rename" : "名前の変更",
+ "Delete" : "削除",
+ "Manage tags" : "タグを管理",
+ "Selection" : "選択",
+ "Select all files" : "全てのファイルを選択",
+ "Deselect all" : "選択を全解除",
+ "Navigation" : "ナビゲーション",
+ "View" : "表示",
+ "Toggle grid view" : "グリッド表示の切り替え",
+ "Show those shortcuts" : "これらのショートカットを表示する",
+ "You" : "自分",
+ "Shared multiple times with different people" : "異なる人と複数回共有",
+ "Unable to change the favorite state of the file" : "ファイルのお気に入りの状態を変更できません",
"Error while loading the file data" : "ファイルデータの読み込み中にエラーが発生しました",
+ "Owner" : "作成者",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
+ "Tags" : "タグ",
+ "Blank" : "ブランク",
+ "Unable to create new file from template" : "テンプレートから新しいファイルを作成できません",
"Pick a template for {name}" : "{name} のテンプレートを選択してください",
- "Cancel" : "キャンセル",
- "Create" : "作成",
"Create a new file with the selected template" : "選択したテンプレートを使用して新しいファイルを作成します",
"Creating file" : "ファイル作成",
- "Blank" : "ブランク",
- "Unable to create new file from template" : "テンプレートから新しいファイルを作成できません",
- "Set up templates folder" : "テンプレートフォルダーを設定",
- "Templates" : "テンプレート",
+ "Save as {displayName}" : "{displayName}として保存",
+ "Save as …" : "保存…",
+ "Converting files …" : "ファイルの変換…",
+ "Failed to convert files: {message}" : "ファイルの変換に失敗しました: {message}",
+ "All files failed to be converted" : "すべてのファイルの変換に失敗しました",
+ "One file could not be converted: {message}" : "1つのファイルが変換できませんでした: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n個のファイルが変換できませんでした"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n個のファイルの変換に成功しました"],
+ "Files successfully converted" : "ファイルは正常に変換されました",
+ "Failed to convert files" : "ファイルの変換に失敗しました",
+ "Converting file …" : "ファイルの変換…",
+ "File successfully converted" : "ファイルは正常に変換されました",
+ "Failed to convert file: {message}" : "ファイルの変換に失敗しました: {message}",
+ "Failed to convert file" : "ファイルの変換に失敗しました",
+ "Leave this share" : "この共有から抜ける",
+ "Leave these shares" : "これらの共有から抜ける",
+ "Disconnect storage" : "ストレージを切断する",
+ "Disconnect storages" : "ストレージを切断する",
+ "Delete permanently" : "完全に削除する",
+ "Delete and unshare" : "削除して共有を解除",
+ "Delete file" : "ファイルを削除",
+ "Delete files" : "ファイルの削除",
+ "Delete folder" : "フォルダーを削除",
+ "Delete folders" : "フォルダを削除",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count}アイテムを完全に削除しようとしています"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["あなたは {count} 個のアイテムを削除しようとしています"],
+ "Confirm deletion" : "削除の確認",
+ "Cancel" : "キャンセル",
+ "Download" : "ダウンロード",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\" を \"{destination}\"に移動",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\" を \"{destination}\"にコピー",
+ "Destination is not a folder" : "宛先がフォルダではありません",
+ "This file/folder is already in that directory" : "このファイル/フォルダはすでにそのディレクトリにあります",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "ファイル/フォルダをそれ自身の上に移動したり、それ自身のサブフォルダに移動したりすることはできません。",
+ "(copy)" : "(copy)",
+ "(copy %n)" : "(copy %n)",
+ "A file or folder with that name already exists in this folder" : "その名前のファイルまたはフォルダが、このフォルダに既に存在します",
+ "The files are locked" : "ファイルはロックされています",
+ "The file does not exist anymore" : "ファイルはもう存在しません",
+ "Choose destination" : "移動先を選択",
+ "Copy to {target}" : "{target} にコピー",
+ "Move to {target}" : "{target} に移動",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動またはコピー操作は失敗しました",
+ "Move or copy" : "移動またはコピー",
+ "Open folder {displayName}" : "フォルダ {displayName} を開く",
+ "Open in Files" : "ファイルアプリで開く",
+ "Open locally" : "ローカルで開く",
+ "Failed to redirect to client" : "クライアントへリダイレクトできませんでした",
+ "Open file locally" : "ローカルでファイルを開く",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "ファイルがデバイス上で開くはずです。開かない場合は、デスクトップアプリがインストールされているかご確認ください。",
+ "Retry and close" : "再試行して閉じる",
+ "Open online" : "オンラインで開く",
+ "Details" : "詳細",
+ "View in folder" : "フォルダー内で表示",
+ "Today" : "今日",
+ "Last 7 days" : "7日以内",
+ "Last 30 days" : "30日以内",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "ドキュメント",
+ "Spreadsheets" : "スプレッドシート",
+ "Presentations" : "プレゼンテーション",
+ "PDFs" : "PDF",
+ "Folders" : "フォルダー",
+ "Audio" : "オーディオ",
+ "Images" : "画像",
+ "Videos" : "動画",
+ "Created new folder \"{name}\"" : "新規フォルダ \"{name}\" を作成しました",
"Unable to initialize the templates directory" : "テンプレートディレクトリを初期化できませんでした",
- "%s used" : "%s 使用中",
- "%s%% of %s used" : "%s中%s%%が使われています。",
- "%1$s of %2$s used" : "%2$s 中%1$s が使われています。",
- "Settings" : "設定",
- "Show hidden files" : "隠しファイルを表示",
- "Crop image previews" : "プレビュー画像を切り抜く",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
- "Toggle %1$s sublist" : "サブリスト %1$s を切り替え",
- "Toggle grid view" : "グリッド表示の切り替え",
- "No files in here" : "ファイルがありません",
- "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
+ "Create templates folder" : "テンプレートフォルダーの作成",
+ "Templates" : "テンプレート",
+ "New template folder" : "新しいテンプレートフォルダ",
+ "In folder" : "フォルダ内",
+ "Search in all files" : "すべてのファイルを検索",
+ "Search in folder: {folder}" : "フォルダ内を検索: {folder}",
+ "One of the dropped files could not be processed" : "ドロップされたファイルの1つが処理できませんでした",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "お使いのブラウザはファイルシステムAPIをサポートしていません。ディレクトリはアップロードされません",
+ "No files to upload" : "アップロードするファイルがありません",
+ "Unable to create the directory {directory}" : "ディレクトリ {directory} を作成できません",
+ "Some files could not be uploaded" : "いくつかのファイルがアップロードできませんでした",
+ "Files uploaded successfully" : "ファイルが正常にアップロードされました",
+ "No files to process" : "処理するファイルがありません",
+ "Some files could not be copied" : "いくつかのファイルがコピーできません",
+ "Some files could not be moved" : "いくつかのファイルが移動できません",
+ "Files copied successfully" : "ファイルが正常にコピーされました",
+ "Files moved successfully" : "ファイルの移動に成功しました",
+ "Conflicts resolution skipped" : "コンフリクトの解決はスキップされました",
+ "Upload cancelled" : "アップロードはキャンセルされました",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" の名前を変更できませんでした、それは既に存在しません。",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" という名前は \"{dir}\" フォルダですでに使用されています。別の名前を選択してください。",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" の名前を変更できませんでした。",
+ "This operation is forbidden" : "この操作は禁止されています",
+ "Storage is temporarily not available" : "ストレージは一時的に利用できません",
+ "Unexpected error: {error}" : "予期せぬエラー: {error}",
+ "_%n file_::_%n files_" : ["%n 個のファイル"],
+ "_%n folder_::_%n folders_" : ["%n 個のフォルダー"],
+ "_%n hidden_::_%n hidden_" : ["%n 非公開"],
+ "Filename must not be empty." : "ファイル名は空白にできません。",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\"はファイル名には使用できません。",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\"は予約名であり、ファイル名には使用できません。",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" は許可されたファイルタイプではありません。",
+ "Filenames must not end with \"{extension}\"." : "ファイル名は \"{extension}\"で終了できません。",
+ "List of favorite files and folders." : "お気に入りのファイルやフォルダーの一覧",
+ "No favorites yet" : "まだお気に入りはありません",
+ "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
+ "List of your files and folders." : "ファイルやフォルダーの一覧",
+ "List of your files and folders that are not shared." : "共有されていないファイルやフォルダの一覧。",
+ "No personal files found" : "個人ファイルは見つかりませんでした",
+ "Files that are not shared will show up here." : "共有されていないファイルは、ここに表示されます。",
+ "Recent" : "最新",
+ "List of recently modified files and folders." : "最近変更されたファイルとフォルダーのリスト",
+ "No recently modified files" : "最近更新されたファイルはありません",
+ "Files and folders you recently modified will show up here." : "最近変更したファイルやフォルダーがここに表示されます。",
+ "Search" : "検索",
+ "Search results within your files." : "ファイル内の検索結果",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
"Upload too large" : "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、このサーバーのファイルアップロード時の最大サイズを超えています。",
- "No favorites yet" : "まだお気に入りはありません",
- "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。",
- "Deleted files" : "ゴミ箱",
- "Shares" : "共有",
- "Shared with others" : "他ユーザーと共有中",
- "Shared with you" : "他ユーザーがあなたと共有中",
- "Shared by link" : "URLリンクで共有中",
- "Deleted shares" : "削除された共有",
- "Pending shares" : "保留中の共有",
+ "File could not be found" : "ファイルを見つけられませんでした",
+ "Show list view" : "リストビューで表示",
+ "Show grid view" : "グリッドビューで表示",
+ "Close" : "閉じる",
+ "Could not create folder \"{dir}\"" : "フォルダー \"{dir}\" を作成できませんでした",
+ "This will stop your current uploads." : "現在のアップロードが停止されます。",
+ "Upload cancelled." : "アップロードはキャンセルされました。",
+ "Processing files …" : "ファイルの処理中...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリであるか、または0バイトのため {filename} をアップロードできません",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
+ "Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
+ "An unknown error has occurred" : "不明なエラーが発生しました",
+ "File could not be uploaded" : "ファイルをアップロードできませんでした",
+ "Uploading …" : "アップロード中...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "アップロード中… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Uploading that item is not supported" : "そのアイテムのアップロードに対応していません",
+ "Error when assembling chunks, status code {status}" : "チャンクを組み立てる際のエラー、ステータスコード{status}",
+ "Choose target folder" : "ターゲットフォルダーを選択",
+ "Set reminder" : "リマインダーを設定",
+ "Edit locally" : "ローカルで編集",
+ "Open" : "開く",
+ "Could not load info for file \"{file}\"" : "\"{file}\" ファイルの情報を読み込めませんでした",
+ "Please select tag(s) to add to the selection" : "選択項目に付与するタグを選択してください",
+ "Apply tag(s) to selection" : "選択項目にタグを適用",
+ "Select directory \"{dirName}\"" : "ディレクトリを選択: \"{dirName}\"",
+ "Select file \"{fileName}\"" : "ファイルを選択: \"{fileName}\"",
+ "Unable to determine date" : "更新日不明",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
+ "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした",
+ "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした",
+ "copy" : "コピー",
+ "Could not copy \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"をコピーできませんでした",
+ "Could not copy \"{file}\"" : "\"{file}\"をコピーできませんでした",
+ "Copied {origin} inside {destination}" : "コピー先{origin} {destination}内",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "コピー先{origin}と{nbfiles}他のファイル{destination}",
+ "{newName} already exists" : "{newName} はすでに存在します",
+ "Could not create file \"{file}\"" : "ファイル \"{file}\" を作成できませんでした",
+ "Could not create file \"{file}\" because it already exists" : "ファイル \"{file}\"はすでに存在するため作成できません",
+ "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" はすでに存在するため作成できません",
+ "Could not fetch file details \"{file}\"" : "\"{file}\" の詳細が取得できませんでした",
+ "Error deleting file \"{fileName}\"." : "ファイル\"{fileName}\"の削除エラー。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "他のフォルダーに {tag}{filter}{endtag} の検索結果はありません",
+ "Enter more than two characters to search in other folders" : "他のフォルダーで検索するには、3文字以上を入力してください",
+ "{dirs} and {files}" : "{dirs} と {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n 個の隠しファイルが含まれています"],
+ "You do not have permission to upload or create files here" : "ここにファイルをアップロードまたは作成する権限がありません",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
+ "New" : "新規作成",
+ "New file/folder menu" : "新規ファイル/フォルダメニュー",
+ "Select file range" : "ファイルを範囲選択",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} 使用中",
+ "\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
+ "File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
+ "Your storage is full, files cannot be updated or synced anymore!" : "ストレージがいっぱいで、ファイルを更新または同期できなくなりました。",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} のストレージがほぼ一杯 ({usedSpacePercent}%) です",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "グループフォルダー \"{mountPoint}\" がほぼいっぱい ({usedSpacePercent}%) です。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部ストレージ \"{mountPoint}\" はほぼいっぱい ({usedSpacePercent}%) です",
+ "Your storage is almost full ({usedSpacePercent}%)." : "ストレージがほぼいっぱい ({usedSpacePercent}%) です ",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : [" \"{filter}\" にマッチ"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "ダイレクトリンクがコピーされました(このファイルやフォルダにアクセスできる人にのみ機能します)",
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n バイト"],
+ "Favored" : "好評",
+ "Favor" : "好意的",
+ "Copy direct link (only works for people who have access to this file/folder)" : "ダイレクトリンクをコピー (このファイル/フォルダにアクセスできる人にのみ機能します)",
+ "Upload file" : "ファイルをアップロード",
+ "Not favored" : "好ましくない",
+ "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
+ "Upload (max. %s)" : "アップロード ( 最大 %s )",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" アクションは正常に実行されました",
+ "\"{displayName}\" action failed" : "\"{displayName}\" アクションは失敗しました",
+ "\"{displayName}\" failed on some elements" : "いくつかの要素で \"{displayName}\" が失敗しました。",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" バッチアクションが正常に実行されました。",
+ "Submitting fields…" : "フィールドを送信中…",
+ "Filter filenames…" : "ファイルネームフィルター…",
+ "WebDAV URL copied to clipboard" : "WebDAVのURLがクリップボードにコピーされました",
+ "Enable the grid view" : "グリッド表示を有効にする",
+ "Enable folder tree" : "フォルダーツリーを有効にする",
+ "Copy to clipboard" : "クリップボードにコピー",
+ "Use this address to access your Files via WebDAV" : "このアドレスを使用すれば、WebDAV経由でファイルにアクセスできます",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2FAを有効にしている場合は、ここをクリックして新しいアプリのパスワードを作成し、使用する必要があります。",
+ "Deletion cancelled" : "削除はキャンセルされました",
+ "Move cancelled" : "移動はキャンセルされました",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\"の移動またはコピーをキャンセルしました。",
+ "Cancelled move or copy operation" : "キャンセルされた移動またはコピー操作",
+ "Open details" : "詳細を開く",
+ "Photos and images" : "写真と画像",
+ "New folder creation cancelled" : "新しいフォルダーの作成がキャンセルされました",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} フォルダ"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ファイル"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ファイルと {folderCount} フォルダ"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ファイルと 1 フォルダ"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ファイルと {folderCount} フォルダ",
+ "All folders" : "全てのフォルダー",
+ "Personal Files" : "個人ファイル",
"Text file" : "テキストファイル",
"New text file.txt" : "新規のテキストファイル作成",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はできません!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "グループフォルダー ”{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部ストレージ \"{mountPoint}\" がいっぱいになり、ファイルを更新または同期できなくなりました。",
- "Your storage is full, files can not be updated or synced anymore!" : "ストレージは一杯です。ファイルの更新と同期はできません!",
- "_matches '{filter}'_::_match '{filter}'_" : [" '{filter}' にマッチ"]
+ "%1$s (renamed)" : "%1$s (リネーム済み)",
+ "renamed file" : "リネーム済みファイル",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。",
+ "Filter file names …" : "ファイルネームフィルター…",
+ "Prevent warning dialogs from open or reenable them." : "警告ダイアログが開かないようにするか、再度有効にする。",
+ "Show a warning dialog when changing a file extension." : "ファイルの拡張子を変更する際に、警告ダイアログを表示する。",
+ "Speed up your Files experience with these quick shortcuts." : "これらのショートカットでファイルの取り扱いを高速化します",
+ "Open the actions menu for a file" : "ファイルのアクションメニューを開く",
+ "Rename a file" : "ファイル名を変更",
+ "Delete a file" : "ファイルを削除",
+ "Favorite or remove a file from favorites" : "ファイルをお気に入りから追加または削除",
+ "Manage tags for a file" : "ファイルのタグを管理する",
+ "Deselect all files" : "全てのファイルの選択を解除",
+ "Select or deselect a file" : "ファイルを選択または選択を解除",
+ "Select a range of files" : "範囲内のファイルを選択",
+ "Navigate to the parent folder" : "親フォルダーに移動",
+ "Navigate to the file above" : "上のファイルに移動",
+ "Navigate to the file below" : "下のファイルに移動",
+ "Navigate to the file on the left (in grid mode)" : "左のファイルに移動(グリッドモード)",
+ "Navigate to the file on the right (in grid mode)" : "右のファイルに移動(グリッドモード)",
+ "Toggle the grid view" : "グリッドビューを切り替え",
+ "Open the sidebar for a file" : "ファイルのサイドバーを開く"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ka.js b/apps/files/l10n/ka.js
new file mode 100644
index 00000000000..ce9740684f6
--- /dev/null
+++ b/apps/files/l10n/ka.js
@@ -0,0 +1,301 @@
+OC.L10N.register(
+ "files",
+ {
+ "Added to favorites" : "Added to favorites",
+ "Removed from favorites" : "Removed from favorites",
+ "You added {file} to your favorites" : "You added {file} to your favorites",
+ "You removed {file} from your favorites" : "You removed {file} from your favorites",
+ "Favorites" : "Favorites",
+ "File changes" : "File changes",
+ "Created by {user}" : "Created by {user}",
+ "Changed by {user}" : "Changed by {user}",
+ "Deleted by {user}" : "Deleted by {user}",
+ "Restored by {user}" : "Restored by {user}",
+ "Renamed by {user}" : "Renamed by {user}",
+ "Moved by {user}" : "Moved by {user}",
+ "You created {file}" : "You created {file}",
+ "You created an encrypted file in {file}" : "You created an encrypted file in {file}",
+ "{user} created {file}" : "{user} created {file}",
+ "{user} created an encrypted file in {file}" : "{user} created an encrypted file in {file}",
+ "{file} was created in a public folder" : "{file} was created in a public folder",
+ "You changed {file}" : "You changed {file}",
+ "You changed an encrypted file in {file}" : "You changed an encrypted file in {file}",
+ "{user} changed {file}" : "{user} changed {file}",
+ "{user} changed an encrypted file in {file}" : "{user} changed an encrypted file in {file}",
+ "You deleted {file}" : "You deleted {file}",
+ "You deleted an encrypted file in {file}" : "You deleted an encrypted file in {file}",
+ "{user} deleted {file}" : "{user} deleted {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} deleted an encrypted file in {file}",
+ "You restored {file}" : "You restored {file}",
+ "{user} restored {file}" : "{user} restored {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "You renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "You renamed {oldfile} (hidden) to {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "You renamed {oldfile} to {newfile} (hidden)",
+ "You renamed {oldfile} to {newfile}" : "You renamed {oldfile} to {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renamed {oldfile} (hidden) to {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renamed {oldfile} to {newfile} (hidden)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renamed {oldfile} to {newfile}",
+ "You moved {oldfile} to {newfile}" : "You moved {oldfile} to {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moved {oldfile} to {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "A file has been added to or removed from your <strong>favorites</strong>",
+ "Files" : "ფაილები",
+ "A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "A favorite file or folder has been <strong>changed</strong>",
+ "Accept" : "Accept",
+ "Reject" : "Reject",
+ "Incoming ownership transfer from {user}" : "Incoming ownership transfer from {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour.",
+ "Ownership transfer failed" : "Ownership transfer failed",
+ "Your ownership transfer of {path} to {user} failed." : "Your ownership transfer of {path} to {user} failed.",
+ "The ownership transfer of {path} from {user} failed." : "The ownership transfer of {path} from {user} failed.",
+ "Ownership transfer done" : "Ownership transfer done",
+ "Your ownership transfer of {path} to {user} has completed." : "Your ownership transfer of {path} to {user} has completed.",
+ "The ownership transfer of {path} from {user} has completed." : "The ownership transfer of {path} from {user} has completed.",
+ "in %s" : "in %s",
+ "File Management" : "File Management",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Target folder does not exist any more",
+ "Reload current directory" : "Reload current directory",
+ "Go to the \"{dir}\" directory" : "Go to the \"{dir}\" directory",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "Drag and drop files here to upload" : "Drag and drop files here to upload",
+ "Favorite" : "Favorite",
+ "Back" : "Back",
+ "Filename" : "Filename",
+ "Folder name" : "Folder name",
+ "This node is unavailable" : "This node is unavailable",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"",
+ "Rename file" : "Rename file",
+ "Folder" : "Folder",
+ "Pending" : "Pending",
+ "Clear filter" : "Clear filter",
+ "Modified" : "Modified",
+ "Search everywhere" : "მოძებნე ყველგან",
+ "Type" : "Type",
+ "Active filters" : "Active filters",
+ "Remove filter" : "Remove filter",
+ "Total rows summary" : "Total rows summary",
+ "Name" : "Name",
+ "Size" : "Size",
+ "Actions" : "Actions",
+ "List of files and folders." : "List of files and folders.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
+ "File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} used",
+ "{used} of {quota} used" : "{used} of {quota} used",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "Could not refresh storage stats",
+ "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
+ "New folder" : "New folder",
+ "Create new folder" : "Create new folder",
+ "Create" : "Create",
+ "Submit" : "Submit",
+ "Choose a file or folder to transfer" : "Choose a file or folder to transfer",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transfer {path} to {userid}",
+ "Invalid path selected" : "Invalid path selected",
+ "Unknown error" : "Unknown error",
+ "Ownership transfer request sent" : "Ownership transfer request sent",
+ "Cannot transfer ownership of a file or folder you do not own" : "Cannot transfer ownership of a file or folder you do not own",
+ "Transfer ownership of a file or folder" : "Transfer ownership of a file or folder",
+ "Choose file or folder to transfer" : "Choose file or folder to transfer",
+ "Change" : "Change",
+ "New owner" : "New owner",
+ "Select file or folder to link to" : "Select file or folder to link to",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Share",
+ "Shared by link" : "Shared by link",
+ "Shared" : "Shared",
+ "Switch to list view" : "Switch to list view",
+ "Switch to grid view" : "Switch to grid view",
+ "Not enough free space" : "Not enough free space",
+ "Operation is blocked by access control" : "Operation is blocked by access control",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "Loading current folder",
+ "Retry" : "Retry",
+ "No files in here" : "No files in here",
+ "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
+ "Go back" : "Go back",
+ "Views" : "Views",
+ "Files settings" : "Files settings",
+ "File cannot be accessed" : "File cannot be accessed",
+ "Clipboard is not available" : "Clipboard is not available",
+ "General" : "General",
+ "All files" : "All files",
+ "Sort favorites first" : "Sort favorites first",
+ "Show hidden files" : "Show hidden files",
+ "Crop image previews" : "Crop image previews",
+ "Additional settings" : "Additional settings",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copy",
+ "Keyboard shortcuts" : "Keyboard shortcuts",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Deselect all" : "Deselect all",
+ "Navigation" : "Navigation",
+ "View" : "View",
+ "Toggle grid view" : "Toggle grid view",
+ "You" : "You",
+ "Error while loading the file data" : "Error while loading the file data",
+ "Owner" : "Owner",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Tags" : "Tags",
+ "Blank" : "Blank",
+ "Unable to create new file from template" : "Unable to create new file from template",
+ "Pick a template for {name}" : "Pick a template for {name}",
+ "Create a new file with the selected template" : "Create a new file with the selected template",
+ "Creating file" : "Creating file",
+ "Leave this share" : "Leave this share",
+ "Disconnect storage" : "Disconnect storage",
+ "Delete permanently" : "Delete permanently",
+ "Delete file" : "Delete file",
+ "Delete folder" : "Delete folder",
+ "Cancel" : "Cancel",
+ "Download" : "Download",
+ "Destination is not a folder" : "Destination is not a folder",
+ "This file/folder is already in that directory" : "This file/folder is already in that directory",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Move",
+ "Move or copy" : "Move or copy",
+ "Open folder {displayName}" : "Open folder {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Open locally",
+ "Failed to redirect to client" : "Failed to redirect to client",
+ "Open file locally" : "Open file locally",
+ "Details" : "Details",
+ "View in folder" : "View in folder",
+ "Today" : "დღეს",
+ "Last 7 days" : "Last 7 days",
+ "Last 30 days" : "Last 30 days",
+ "Documents" : "Documents",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "Unable to initialize the templates directory",
+ "Templates" : "Templates",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Some files could not be moved" : "Some files could not be moved",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Could not rename \"{oldName}\", it does not exist any more",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name.",
+ "Could not rename \"{oldName}\"" : "Could not rename \"{oldName}\"",
+ "This operation is forbidden" : "This operation is forbidden",
+ "Storage is temporarily not available" : "Storage is temporarily not available",
+ "_%n file_::_%n files_" : ["%n file","%n files"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
+ "No favorites yet" : "No favorites yet",
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favorite will show up here",
+ "List of your files and folders." : "List of your files and folders.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "List of recently modified files and folders.",
+ "No recently modified files" : "No recently modified files",
+ "Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
+ "Search" : "ძიება",
+ "No entries found in this folder" : "No entries found in this folder",
+ "Select all" : "Select all",
+ "Upload too large" : "Upload too large",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
+ "File could not be found" : "File could not be found",
+ "Show list view" : "Show list view",
+ "Show grid view" : "Show grid view",
+ "Close" : "Close",
+ "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
+ "This will stop your current uploads." : "This will stop your current uploads.",
+ "Upload cancelled." : "Upload cancelled.",
+ "Processing files …" : "Processing files …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
+ "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
+ "An unknown error has occurred" : "An unknown error has occurred",
+ "File could not be uploaded" : "File could not be uploaded",
+ "Uploading …" : "Uploading …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploading … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uploading that item is not supported",
+ "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
+ "Choose target folder" : "Choose target folder",
+ "Set reminder" : "Set reminder",
+ "Edit locally" : "Edit locally",
+ "Open" : "Open",
+ "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Please select tag(s) to add to the selection",
+ "Apply tag(s) to selection" : "Apply tag(s) to selection",
+ "Select directory \"{dirName}\"" : "Select directory \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Select file \"{fileName}\"",
+ "Unable to determine date" : "Unable to determine date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
+ "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
+ "Could not move \"{file}\"" : "Could not move \"{file}\"",
+ "copy" : "copy",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
+ "{newName} already exists" : "{newName} already exists",
+ "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
+ "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
+ "Could not fetch file details \"{file}\"" : "Could not fetch file details \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Enter more than two characters to search in other folders",
+ "{dirs} and {files}" : "{dirs} and {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
+ "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
+ "New" : "New",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Select file range",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} used",
+ "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
+ "File name cannot be empty." : "File name cannot be empty.",
+ "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Storage of {owner} is full, files cannot be updated or synced anymore!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Your storage is full, files cannot be updated or synced anymore!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Storage of {owner} is almost full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Your storage is almost full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Upload file" : "Upload file",
+ "An error occurred while trying to update the tags" : "An error occurred while trying to update the tags",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" action executed successfully",
+ "\"{displayName}\" action failed" : "\"{displayName}\" action failed",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copied to clipboard",
+ "Enable the grid view" : "Enable the grid view",
+ "Copy to clipboard" : "Copy to clipboard",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "Open details",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "Text file" : "Text file",
+ "New text file.txt" : "New text file.txt"
+},
+"nplurals=2; plural=(n!=1);");
diff --git a/apps/files/l10n/ka.json b/apps/files/l10n/ka.json
new file mode 100644
index 00000000000..5761e99bfbe
--- /dev/null
+++ b/apps/files/l10n/ka.json
@@ -0,0 +1,299 @@
+{ "translations": {
+ "Added to favorites" : "Added to favorites",
+ "Removed from favorites" : "Removed from favorites",
+ "You added {file} to your favorites" : "You added {file} to your favorites",
+ "You removed {file} from your favorites" : "You removed {file} from your favorites",
+ "Favorites" : "Favorites",
+ "File changes" : "File changes",
+ "Created by {user}" : "Created by {user}",
+ "Changed by {user}" : "Changed by {user}",
+ "Deleted by {user}" : "Deleted by {user}",
+ "Restored by {user}" : "Restored by {user}",
+ "Renamed by {user}" : "Renamed by {user}",
+ "Moved by {user}" : "Moved by {user}",
+ "You created {file}" : "You created {file}",
+ "You created an encrypted file in {file}" : "You created an encrypted file in {file}",
+ "{user} created {file}" : "{user} created {file}",
+ "{user} created an encrypted file in {file}" : "{user} created an encrypted file in {file}",
+ "{file} was created in a public folder" : "{file} was created in a public folder",
+ "You changed {file}" : "You changed {file}",
+ "You changed an encrypted file in {file}" : "You changed an encrypted file in {file}",
+ "{user} changed {file}" : "{user} changed {file}",
+ "{user} changed an encrypted file in {file}" : "{user} changed an encrypted file in {file}",
+ "You deleted {file}" : "You deleted {file}",
+ "You deleted an encrypted file in {file}" : "You deleted an encrypted file in {file}",
+ "{user} deleted {file}" : "{user} deleted {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} deleted an encrypted file in {file}",
+ "You restored {file}" : "You restored {file}",
+ "{user} restored {file}" : "{user} restored {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "You renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "You renamed {oldfile} (hidden) to {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "You renamed {oldfile} to {newfile} (hidden)",
+ "You renamed {oldfile} to {newfile}" : "You renamed {oldfile} to {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renamed {oldfile} (hidden) to {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renamed {oldfile} (hidden) to {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renamed {oldfile} to {newfile} (hidden)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renamed {oldfile} to {newfile}",
+ "You moved {oldfile} to {newfile}" : "You moved {oldfile} to {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moved {oldfile} to {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "A file has been added to or removed from your <strong>favorites</strong>",
+ "Files" : "ფაილები",
+ "A file or folder has been <strong>changed</strong>" : "A file or folder has been <strong>changed</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "A favorite file or folder has been <strong>changed</strong>",
+ "Accept" : "Accept",
+ "Reject" : "Reject",
+ "Incoming ownership transfer from {user}" : "Incoming ownership transfer from {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour.",
+ "Ownership transfer failed" : "Ownership transfer failed",
+ "Your ownership transfer of {path} to {user} failed." : "Your ownership transfer of {path} to {user} failed.",
+ "The ownership transfer of {path} from {user} failed." : "The ownership transfer of {path} from {user} failed.",
+ "Ownership transfer done" : "Ownership transfer done",
+ "Your ownership transfer of {path} to {user} has completed." : "Your ownership transfer of {path} to {user} has completed.",
+ "The ownership transfer of {path} from {user} has completed." : "The ownership transfer of {path} from {user} has completed.",
+ "in %s" : "in %s",
+ "File Management" : "File Management",
+ "Home" : "Home",
+ "Target folder does not exist any more" : "Target folder does not exist any more",
+ "Reload current directory" : "Reload current directory",
+ "Go to the \"{dir}\" directory" : "Go to the \"{dir}\" directory",
+ "Current directory path" : "Current directory path",
+ "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore",
+ "Drag and drop files here to upload" : "Drag and drop files here to upload",
+ "Favorite" : "Favorite",
+ "Back" : "Back",
+ "Filename" : "Filename",
+ "Folder name" : "Folder name",
+ "This node is unavailable" : "This node is unavailable",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"",
+ "Rename file" : "Rename file",
+ "Folder" : "Folder",
+ "Pending" : "Pending",
+ "Clear filter" : "Clear filter",
+ "Modified" : "Modified",
+ "Search everywhere" : "მოძებნე ყველგან",
+ "Type" : "Type",
+ "Active filters" : "Active filters",
+ "Remove filter" : "Remove filter",
+ "Total rows summary" : "Total rows summary",
+ "Name" : "Name",
+ "Size" : "Size",
+ "Actions" : "Actions",
+ "List of files and folders." : "List of files and folders.",
+ "Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
+ "File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} used",
+ "{used} of {quota} used" : "{used} of {quota} used",
+ "{relative}% used" : "{relative}% used",
+ "Could not refresh storage stats" : "Could not refresh storage stats",
+ "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
+ "New folder" : "New folder",
+ "Create new folder" : "Create new folder",
+ "Create" : "Create",
+ "Submit" : "Submit",
+ "Choose a file or folder to transfer" : "Choose a file or folder to transfer",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transfer {path} to {userid}",
+ "Invalid path selected" : "Invalid path selected",
+ "Unknown error" : "Unknown error",
+ "Ownership transfer request sent" : "Ownership transfer request sent",
+ "Cannot transfer ownership of a file or folder you do not own" : "Cannot transfer ownership of a file or folder you do not own",
+ "Transfer ownership of a file or folder" : "Transfer ownership of a file or folder",
+ "Choose file or folder to transfer" : "Choose file or folder to transfer",
+ "Change" : "Change",
+ "New owner" : "New owner",
+ "Select file or folder to link to" : "Select file or folder to link to",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Share",
+ "Shared by link" : "Shared by link",
+ "Shared" : "Shared",
+ "Switch to list view" : "Switch to list view",
+ "Switch to grid view" : "Switch to grid view",
+ "Not enough free space" : "Not enough free space",
+ "Operation is blocked by access control" : "Operation is blocked by access control",
+ "Error during upload: {message}" : "Error during upload: {message}",
+ "Unknown error during upload" : "Unknown error during upload",
+ "Loading current folder" : "Loading current folder",
+ "Retry" : "Retry",
+ "No files in here" : "No files in here",
+ "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
+ "Go back" : "Go back",
+ "Views" : "Views",
+ "Files settings" : "Files settings",
+ "File cannot be accessed" : "File cannot be accessed",
+ "Clipboard is not available" : "Clipboard is not available",
+ "General" : "General",
+ "All files" : "All files",
+ "Sort favorites first" : "Sort favorites first",
+ "Show hidden files" : "Show hidden files",
+ "Crop image previews" : "Crop image previews",
+ "Additional settings" : "Additional settings",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Copy",
+ "Keyboard shortcuts" : "Keyboard shortcuts",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Deselect all" : "Deselect all",
+ "Navigation" : "Navigation",
+ "View" : "View",
+ "Toggle grid view" : "Toggle grid view",
+ "You" : "You",
+ "Error while loading the file data" : "Error while loading the file data",
+ "Owner" : "Owner",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Tags" : "Tags",
+ "Blank" : "Blank",
+ "Unable to create new file from template" : "Unable to create new file from template",
+ "Pick a template for {name}" : "Pick a template for {name}",
+ "Create a new file with the selected template" : "Create a new file with the selected template",
+ "Creating file" : "Creating file",
+ "Leave this share" : "Leave this share",
+ "Disconnect storage" : "Disconnect storage",
+ "Delete permanently" : "Delete permanently",
+ "Delete file" : "Delete file",
+ "Delete folder" : "Delete folder",
+ "Cancel" : "Cancel",
+ "Download" : "Download",
+ "Destination is not a folder" : "Destination is not a folder",
+ "This file/folder is already in that directory" : "This file/folder is already in that directory",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
+ "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder",
+ "The file does not exist anymore" : "The file does not exist anymore",
+ "Choose destination" : "Choose destination",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Move",
+ "Move or copy" : "Move or copy",
+ "Open folder {displayName}" : "Open folder {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Open locally",
+ "Failed to redirect to client" : "Failed to redirect to client",
+ "Open file locally" : "Open file locally",
+ "Details" : "Details",
+ "View in folder" : "View in folder",
+ "Today" : "დღეს",
+ "Last 7 days" : "Last 7 days",
+ "Last 30 days" : "Last 30 days",
+ "Documents" : "Documents",
+ "Audio" : "Audio",
+ "Images" : "Images",
+ "Videos" : "Videos",
+ "Created new folder \"{name}\"" : "Created new folder \"{name}\"",
+ "Unable to initialize the templates directory" : "Unable to initialize the templates directory",
+ "Templates" : "Templates",
+ "One of the dropped files could not be processed" : "One of the dropped files could not be processed",
+ "Some files could not be moved" : "Some files could not be moved",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Could not rename \"{oldName}\", it does not exist any more",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name.",
+ "Could not rename \"{oldName}\"" : "Could not rename \"{oldName}\"",
+ "This operation is forbidden" : "This operation is forbidden",
+ "Storage is temporarily not available" : "Storage is temporarily not available",
+ "_%n file_::_%n files_" : ["%n file","%n files"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n folders"],
+ "No favorites yet" : "No favorites yet",
+ "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favorite will show up here",
+ "List of your files and folders." : "List of your files and folders.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "List of recently modified files and folders.",
+ "No recently modified files" : "No recently modified files",
+ "Files and folders you recently modified will show up here." : "Files and folders you recently modified will show up here.",
+ "Search" : "ძიება",
+ "No entries found in this folder" : "No entries found in this folder",
+ "Select all" : "Select all",
+ "Upload too large" : "Upload too large",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
+ "File could not be found" : "File could not be found",
+ "Show list view" : "Show list view",
+ "Show grid view" : "Show grid view",
+ "Close" : "Close",
+ "Could not create folder \"{dir}\"" : "Could not create folder \"{dir}\"",
+ "This will stop your current uploads." : "This will stop your current uploads.",
+ "Upload cancelled." : "Upload cancelled.",
+ "Processing files …" : "Processing files …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left",
+ "Target folder \"{dir}\" does not exist any more" : "Target folder \"{dir}\" does not exist any more",
+ "An unknown error has occurred" : "An unknown error has occurred",
+ "File could not be uploaded" : "File could not be uploaded",
+ "Uploading …" : "Uploading …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploading … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} of {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uploading that item is not supported",
+ "Error when assembling chunks, status code {status}" : "Error when assembling chunks, status code {status}",
+ "Choose target folder" : "Choose target folder",
+ "Set reminder" : "Set reminder",
+ "Edit locally" : "Edit locally",
+ "Open" : "Open",
+ "Could not load info for file \"{file}\"" : "Could not load info for file \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Please select tag(s) to add to the selection",
+ "Apply tag(s) to selection" : "Apply tag(s) to selection",
+ "Select directory \"{dirName}\"" : "Select directory \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Select file \"{fileName}\"",
+ "Unable to determine date" : "Unable to determine date",
+ "This directory is unavailable, please check the logs or contact the administrator" : "This directory is unavailable, please check the logs or contact the administrator",
+ "Could not move \"{file}\", target exists" : "Could not move \"{file}\", target exists",
+ "Could not move \"{file}\"" : "Could not move \"{file}\"",
+ "copy" : "copy",
+ "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists",
+ "Could not copy \"{file}\"" : "Could not copy \"{file}\"",
+ "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copied {origin} and {nbfiles} other files inside {destination}",
+ "{newName} already exists" : "{newName} already exists",
+ "Could not create file \"{file}\"" : "Could not create file \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Could not create file \"{file}\" because it already exists",
+ "Could not create folder \"{dir}\" because it already exists" : "Could not create folder \"{dir}\" because it already exists",
+ "Could not fetch file details \"{file}\"" : "Could not fetch file details \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Error deleting file \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "No search results in other folders for {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Enter more than two characters to search in other folders",
+ "{dirs} and {files}" : "{dirs} and {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","including %n hidden"],
+ "You do not have permission to upload or create files here" : "You do not have permission to upload or create files here",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Uploading %n files"],
+ "New" : "New",
+ "New file/folder menu" : "New file/folder menu",
+ "Select file range" : "Select file range",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} used",
+ "\"{name}\" is an invalid file name." : "\"{name}\" is an invalid file name.",
+ "File name cannot be empty." : "File name cannot be empty.",
+ "\"/\" is not allowed inside a file name." : "\"/\" is not allowed inside a file name.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" is not an allowed filetype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Storage of {owner} is full, files cannot be updated or synced anymore!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Your storage is full, files cannot be updated or synced anymore!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Storage of {owner} is almost full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Your storage is almost full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","match \"{filter}\""],
+ "Path" : "Path",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Upload file" : "Upload file",
+ "An error occurred while trying to update the tags" : "An error occurred while trying to update the tags",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" action executed successfully",
+ "\"{displayName}\" action failed" : "\"{displayName}\" action failed",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully",
+ "WebDAV URL copied to clipboard" : "WebDAV URL copied to clipboard",
+ "Enable the grid view" : "Enable the grid view",
+ "Copy to clipboard" : "Copy to clipboard",
+ "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "If you have enabled 2FA, you must create and use a new app password by clicking here.",
+ "Cancelled move or copy operation" : "Cancelled move or copy operation",
+ "Open details" : "Open details",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} folders"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","{fileCount} files"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders",
+ "Text file" : "Text file",
+ "New text file.txt" : "New text file.txt"
+},"pluralForm" :"nplurals=2; plural=(n!=1);"
+} \ No newline at end of file
diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js
deleted file mode 100644
index 53c8d4b67a5..00000000000
--- a/apps/files/l10n/ka_GE.js
+++ /dev/null
@@ -1,149 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "საცავი დროებით ხელმიუწვდომელია",
- "Storage invalid" : "საცავი არასწორია",
- "Unknown error" : "უცნობი შეცდომა",
- "File could not be found" : "ფაილი ვერ იქნა ნაპოვნი",
- "Move or copy" : "გადაიტანეთ ან დააკოპირეთ",
- "Download" : "ჩამოტვირთვა",
- "Delete" : "წაშლა",
- "Home" : "სახლი",
- "Close" : "დახურვა",
- "Favorites" : "რჩეულები",
- "Could not create folder \"{dir}\"" : "დირექტორია \"{dir}\" ვერ შეიქმნა",
- "Upload cancelled." : "ატვირთვა შეჩერებულ იქნა.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "შეუძლებელია {filename}-ის ატვირთვა, რადგანაც ის დირექტორიაა ან გააჩნია 0 ბაიტი",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "არასაკმარისი თავისუფალი სივრცე, თქვენ ტვირთავთ {size1}-ს, მაგრამ მხოლოდ {size2}-ია დარჩენილი",
- "Target folder \"{dir}\" does not exist any more" : "დანიშნულების დირექტორია \"{dir}\" აღარ არსებობს",
- "Not enough free space" : "არასაკმარისი თავისუფალი სივრცე",
- "Uploading …" : "იტვირთება ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} სულ {totalSize}-დან ({bitrate})",
- "Target folder does not exist any more" : "დანიშნულების დირექტორია აღარ არსებობს",
- "Error when assembling chunks, status code {status}" : "ნაჭრების შეგროვებისას წარმოიშვა შეცდომა, სტატუსის კოდი {status}",
- "Actions" : "მოქმედებები",
- "Rename" : "გადარქმევა",
- "Copy" : "კოპირება",
- "Delete file" : "გაუქმდეს ფაილი",
- "Delete folder" : "დირექტორიის გაუქმება",
- "Disconnect storage" : "საცავის გათიშვა",
- "Could not load info for file \"{file}\"" : "ფაილზე \"{file}\" ინფორმაცია ვერ ჩაიტვირთა",
- "Files" : "ფაილები",
- "Details" : "დეტალები",
- "Select" : "არჩევა",
- "Pending" : "მოცდის რეჟიმში",
- "Unable to determine date" : "თარიღის დადგენა შეუძლებელია",
- "This operation is forbidden" : "ეს ოპერაცია აკრძალულია",
- "This directory is unavailable, please check the logs or contact the administrator" : "დირექტორია ხელმიუწვდომელია, გთოხვთ შეამოწმოთ ლოგები ან დაუკავშირდეთ ადმინისტრატორს",
- "Could not move \"{file}\", target exists" : "\"{file}\"-ის გადატანა ვერ მოხერხდა, დანიშნულება არსებობს",
- "Could not move \"{file}\"" : "\"{file}\"-ის გადატანა ვერ მოხერხდა",
- "Could not copy \"{file}\", target exists" : "\"{file}\"-ის კოპირება ვერ მოხერხდა, დანიშნულება არსებობს",
- "Could not copy \"{file}\"" : "\"{file}\"-ის კოპირება ვერ მოხერხდა",
- "Copied {origin} inside {destination}" : "დაკოპირდა {origin} {destionation}-ში",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "დაკოპირდა {origin} და {nbfiles} სხვა ფაილი {destionation}-ში",
- "{newName} already exists" : "{newName} უკვე არსებობს",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" სახელი ვერ შეეცვალა, ის აღარ არსებობს",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "სახელი \"{targetName}\" დირექტორია \"{dir}\"-ში უკვე გამოყენებულია. გთხოვთ აირჩიოთ სხვა სახელი.",
- "Could not rename \"{fileName}\"" : "ფაილს \"{fileName}\" სახელი ვერ შეეცვალა",
- "Could not create file \"{file}\"" : "ფაილი \"{file}\" ვერ შეიქმნა",
- "Could not create file \"{file}\" because it already exists" : "ფაილი \"{file}\" ვერ შეიქმნა, ის უკვე არსებობს",
- "Could not create folder \"{dir}\" because it already exists" : "დირექტორია \"{dir}\" ვერ შეიქმნა, ის უკვე არსებობს",
- "Error deleting file \"{fileName}\"." : "ფიალის \"{fileName}\" წაშლისას წარმოიქმნა შეცდომა.",
- "No search results in other folders for {tag}{filter}{endtag}" : "ძიების შედეგები სხვა დირექტორიებში {tag}{filter}{endtag} არაა",
- "Name" : "სახელი",
- "Size" : "ზომა",
- "Modified" : "შეცვლილია",
- "_%n folder_::_%n folders_" : ["%n დირექტორია","%n დირექტორია"],
- "_%n file_::_%n files_" : ["%n ფაილი","%n ფაილი"],
- "{dirs} and {files}" : "{dirs} და {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n დამალულის ჩათვლით","%n დამალულის ჩათვლით"],
- "You don’t have permission to upload or create files here" : "აქ ფაილების შექმნის ან ატვირთვის უფლება არ გაქვთ",
- "_Uploading %n file_::_Uploading %n files_" : ["ვტვირთავთ %n ფაილს","ვტვირთავთ %n ფაილს"],
- "New" : "ახალი",
- "{used} of {quota} used" : "გამოყენებულია {used} სულ {quota}-დან",
- "{used} used" : "გამოყენებულია {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" არასწორი ფაილის სახელია.",
- "File name cannot be empty." : "ფაილის სახელი არ შეიძლება იყოს ცარიელი.",
- "\"/\" is not allowed inside a file name." : "\"/\" ფაილის სახელში არაა ნებადართული.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" არაა დაშვებული ფაილის ტიპი",
- "View in folder" : "ჩვენება დირექტორიაში",
- "Copied!" : "დაკოპირდა!",
- "Copy direct link (only works for users who have access to this file/folder)" : "დააკოპირეთ პირდაპირი ბმული (მუშაობს მომხმარებლებისთვის, რომელთაც გააჩნიათ წვდომა ამ ფაილის/დირექტორიის მიმართ)",
- "Path" : "მისამართი",
- "_%n byte_::_%n bytes_" : ["%n ბაიტი","%n ბაიტი"],
- "Favorited" : "დამატებულია რჩეულებში",
- "Favorite" : "რჩეული",
- "New folder" : "ახალი დირექტორია",
- "Upload file" : "ფაილის ატვირთვა",
- "Recent" : "ახალი",
- "Not favorited" : "არაა დამატებული რჩეულებში",
- "Remove from favorites" : "რჩეულებიდან მოშორება",
- "Add to favorites" : "რჩეულებში დამატება",
- "An error occurred while trying to update the tags" : "ტეგების განახლების მცდელობისას წარმოიშვა შეცდომა",
- "Added to favorites" : "დაემატა რჩეულებში",
- "Removed from favorites" : "ამოიშალა რჩეულებიდან",
- "You added {file} to your favorites" : "თქვენ დაამატეთ {file}-ი რჩეულებში",
- "You removed {file} from your favorites" : "თქვენ ამოშალეთ {file}-ი თქვენი რჩეული ფაილებიდან",
- "File changes" : "ფაილის ცვლილებები",
- "Created by {user}" : "შექმნა მომხმარებელმა {user}",
- "Changed by {user}" : "შეცვალა მომხმარებელმა {user}",
- "Deleted by {user}" : "წაშალა მომხმარებელმა {user}",
- "Restored by {user}" : "აღადგინა მომხმარებელმა {user}",
- "Renamed by {user}" : "სახელი გადაარქვა მომხმარებელმა {user}",
- "Moved by {user}" : "გადაიტანა მომხმარებელმა {user}",
- "\"remote user\"" : "\"დისტანციური მომხმარებელი\"",
- "You created {file}" : "თქვენ შექმენით {file}",
- "You created an encrypted file in {file}" : "შექმენით დაშიფრული ფაილი {file}-ში",
- "{user} created {file}" : "{user} მომხმარებელმა შექმნა {file}",
- "{user} created an encrypted file in {file}" : "{user} მომხმარებელმა შექმნა დაშიფრული ფაილი {file}-ში",
- "{file} was created in a public folder" : "{file} შეიქმნა საზოგადო დირექტორიაში",
- "You changed {file}" : "თქვენ შეცვალეთ {file}",
- "You changed an encrypted file in {file}" : "შეცვალეთ დაშიფრული ფაილი {file}-ში",
- "{user} changed {file}" : "{user} მომხმარებელმა შეცვალა {file}",
- "{user} changed an encrypted file in {file}" : "{user} მომხმარებელმა შეცვალა დაშიფრული ფაილი {file}-ში",
- "You deleted {file}" : "თქვენ წაშალეთ {file}",
- "You deleted an encrypted file in {file}" : "გააუქმეთ დაშიფრული ფაილი {file}-ში",
- "{user} deleted {file}" : "{user} მომხმარებელმა წაშალა {file}",
- "{user} deleted an encrypted file in {file}" : "{user} მომხმარებელმა გააუქმა დაშიფრული ფაილი {file}-ში",
- "You restored {file}" : "თქვენ აღადგინეთ {file}",
- "{user} restored {file}" : "{user} მომხმარებელმა განაახლა {file}",
- "You renamed {oldfile} to {newfile}" : "თქვენ გადაარქვით სახელი {oldfile}-ს {newfile}-ზე",
- "{user} renamed {oldfile} to {newfile}" : "{user}-მა გადაარქვა სახელი {oldfile}-ს {newfile}-ზე",
- "You moved {oldfile} to {newfile}" : "თქვენ გადაიტანეთ {oldfile} {newfile}-ად",
- "{user} moved {oldfile} to {newfile}" : "{user}-მა გადაიტანა {oldfile} {newfile}-ად",
- "A file has been added to or removed from your <strong>favorites</strong>" : "ყველა ფაილი დაემატა ან ამოიშალა<strong>რჩეულებიდან</strong>",
- "All files" : "ყველა ფაილი",
- "Unlimited" : "ულიმიტო",
- "Upload (max. %s)" : "ატვირთვა (მაქს. %s)",
- "Accept" : "მიღება",
- "in %s" : "%s-ში",
- "Change" : "შეცვლა",
- "Tags" : "ტეგები",
- "Cancel" : "უარყოფა",
- "Create" : "შექმნა",
- "%s used" : "%s მოხმარებულია",
- "%1$s of %2$s used" : "გამოყენებულია %1$s სულ %2$s-იდან ",
- "Settings" : "პარამეტრები",
- "Show hidden files" : "დამალული ფაილების ჩვენება",
- "WebDAV" : "WebDAV",
- "No files in here" : "აქ ფაილები არაა",
- "Upload some content or sync with your devices!" : "ატვირთეთ რამე ან მოახდინეთ სინქრონიზაცია თქვენს მოწყობილობებთან!",
- "No entries found in this folder" : "ამ დირექტორიაში შენატანები ვერ იქნა ნაპოვნი",
- "Select all" : "ყველას არჩევა",
- "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
- "No favorites yet" : "ჯერ რჩეულები არაა",
- "Files and folders you mark as favorite will show up here" : "აქ გამოჩნდებიან ფაილები და დირექტორიები, რომლებსაც მონიშნავთ რჩეულებად",
- "Deleted files" : "გაუქმებული ფაილები",
- "Shares" : "გაზიარებები",
- "Shared with others" : "გაზიარდა სხვებთან",
- "Shared with you" : "გაზიარდა თქვენთან",
- "Shared by link" : "გაზიარდა ბმულით",
- "Text file" : "ტექსტური ფაილი",
- "New text file.txt" : "ახალი ტექსტი file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}-ის საცავი სავსეა, ფაილები მეტი ვეღარ განახლდება/სინქრონიზირდება!",
- "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ემთხვევა '{filter}'-ს","ემთხვევა '{filter}'-ს"]
-},
-"nplurals=2; plural=(n!=1);");
diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json
deleted file mode 100644
index c9302e68bad..00000000000
--- a/apps/files/l10n/ka_GE.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "საცავი დროებით ხელმიუწვდომელია",
- "Storage invalid" : "საცავი არასწორია",
- "Unknown error" : "უცნობი შეცდომა",
- "File could not be found" : "ფაილი ვერ იქნა ნაპოვნი",
- "Move or copy" : "გადაიტანეთ ან დააკოპირეთ",
- "Download" : "ჩამოტვირთვა",
- "Delete" : "წაშლა",
- "Home" : "სახლი",
- "Close" : "დახურვა",
- "Favorites" : "რჩეულები",
- "Could not create folder \"{dir}\"" : "დირექტორია \"{dir}\" ვერ შეიქმნა",
- "Upload cancelled." : "ატვირთვა შეჩერებულ იქნა.",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "შეუძლებელია {filename}-ის ატვირთვა, რადგანაც ის დირექტორიაა ან გააჩნია 0 ბაიტი",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "არასაკმარისი თავისუფალი სივრცე, თქვენ ტვირთავთ {size1}-ს, მაგრამ მხოლოდ {size2}-ია დარჩენილი",
- "Target folder \"{dir}\" does not exist any more" : "დანიშნულების დირექტორია \"{dir}\" აღარ არსებობს",
- "Not enough free space" : "არასაკმარისი თავისუფალი სივრცე",
- "Uploading …" : "იტვირთება ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} სულ {totalSize}-დან ({bitrate})",
- "Target folder does not exist any more" : "დანიშნულების დირექტორია აღარ არსებობს",
- "Error when assembling chunks, status code {status}" : "ნაჭრების შეგროვებისას წარმოიშვა შეცდომა, სტატუსის კოდი {status}",
- "Actions" : "მოქმედებები",
- "Rename" : "გადარქმევა",
- "Copy" : "კოპირება",
- "Delete file" : "გაუქმდეს ფაილი",
- "Delete folder" : "დირექტორიის გაუქმება",
- "Disconnect storage" : "საცავის გათიშვა",
- "Could not load info for file \"{file}\"" : "ფაილზე \"{file}\" ინფორმაცია ვერ ჩაიტვირთა",
- "Files" : "ფაილები",
- "Details" : "დეტალები",
- "Select" : "არჩევა",
- "Pending" : "მოცდის რეჟიმში",
- "Unable to determine date" : "თარიღის დადგენა შეუძლებელია",
- "This operation is forbidden" : "ეს ოპერაცია აკრძალულია",
- "This directory is unavailable, please check the logs or contact the administrator" : "დირექტორია ხელმიუწვდომელია, გთოხვთ შეამოწმოთ ლოგები ან დაუკავშირდეთ ადმინისტრატორს",
- "Could not move \"{file}\", target exists" : "\"{file}\"-ის გადატანა ვერ მოხერხდა, დანიშნულება არსებობს",
- "Could not move \"{file}\"" : "\"{file}\"-ის გადატანა ვერ მოხერხდა",
- "Could not copy \"{file}\", target exists" : "\"{file}\"-ის კოპირება ვერ მოხერხდა, დანიშნულება არსებობს",
- "Could not copy \"{file}\"" : "\"{file}\"-ის კოპირება ვერ მოხერხდა",
- "Copied {origin} inside {destination}" : "დაკოპირდა {origin} {destionation}-ში",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "დაკოპირდა {origin} და {nbfiles} სხვა ფაილი {destionation}-ში",
- "{newName} already exists" : "{newName} უკვე არსებობს",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" სახელი ვერ შეეცვალა, ის აღარ არსებობს",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "სახელი \"{targetName}\" დირექტორია \"{dir}\"-ში უკვე გამოყენებულია. გთხოვთ აირჩიოთ სხვა სახელი.",
- "Could not rename \"{fileName}\"" : "ფაილს \"{fileName}\" სახელი ვერ შეეცვალა",
- "Could not create file \"{file}\"" : "ფაილი \"{file}\" ვერ შეიქმნა",
- "Could not create file \"{file}\" because it already exists" : "ფაილი \"{file}\" ვერ შეიქმნა, ის უკვე არსებობს",
- "Could not create folder \"{dir}\" because it already exists" : "დირექტორია \"{dir}\" ვერ შეიქმნა, ის უკვე არსებობს",
- "Error deleting file \"{fileName}\"." : "ფიალის \"{fileName}\" წაშლისას წარმოიქმნა შეცდომა.",
- "No search results in other folders for {tag}{filter}{endtag}" : "ძიების შედეგები სხვა დირექტორიებში {tag}{filter}{endtag} არაა",
- "Name" : "სახელი",
- "Size" : "ზომა",
- "Modified" : "შეცვლილია",
- "_%n folder_::_%n folders_" : ["%n დირექტორია","%n დირექტორია"],
- "_%n file_::_%n files_" : ["%n ფაილი","%n ფაილი"],
- "{dirs} and {files}" : "{dirs} და {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n დამალულის ჩათვლით","%n დამალულის ჩათვლით"],
- "You don’t have permission to upload or create files here" : "აქ ფაილების შექმნის ან ატვირთვის უფლება არ გაქვთ",
- "_Uploading %n file_::_Uploading %n files_" : ["ვტვირთავთ %n ფაილს","ვტვირთავთ %n ფაილს"],
- "New" : "ახალი",
- "{used} of {quota} used" : "გამოყენებულია {used} სულ {quota}-დან",
- "{used} used" : "გამოყენებულია {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" არასწორი ფაილის სახელია.",
- "File name cannot be empty." : "ფაილის სახელი არ შეიძლება იყოს ცარიელი.",
- "\"/\" is not allowed inside a file name." : "\"/\" ფაილის სახელში არაა ნებადართული.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" არაა დაშვებული ფაილის ტიპი",
- "View in folder" : "ჩვენება დირექტორიაში",
- "Copied!" : "დაკოპირდა!",
- "Copy direct link (only works for users who have access to this file/folder)" : "დააკოპირეთ პირდაპირი ბმული (მუშაობს მომხმარებლებისთვის, რომელთაც გააჩნიათ წვდომა ამ ფაილის/დირექტორიის მიმართ)",
- "Path" : "მისამართი",
- "_%n byte_::_%n bytes_" : ["%n ბაიტი","%n ბაიტი"],
- "Favorited" : "დამატებულია რჩეულებში",
- "Favorite" : "რჩეული",
- "New folder" : "ახალი დირექტორია",
- "Upload file" : "ფაილის ატვირთვა",
- "Recent" : "ახალი",
- "Not favorited" : "არაა დამატებული რჩეულებში",
- "Remove from favorites" : "რჩეულებიდან მოშორება",
- "Add to favorites" : "რჩეულებში დამატება",
- "An error occurred while trying to update the tags" : "ტეგების განახლების მცდელობისას წარმოიშვა შეცდომა",
- "Added to favorites" : "დაემატა რჩეულებში",
- "Removed from favorites" : "ამოიშალა რჩეულებიდან",
- "You added {file} to your favorites" : "თქვენ დაამატეთ {file}-ი რჩეულებში",
- "You removed {file} from your favorites" : "თქვენ ამოშალეთ {file}-ი თქვენი რჩეული ფაილებიდან",
- "File changes" : "ფაილის ცვლილებები",
- "Created by {user}" : "შექმნა მომხმარებელმა {user}",
- "Changed by {user}" : "შეცვალა მომხმარებელმა {user}",
- "Deleted by {user}" : "წაშალა მომხმარებელმა {user}",
- "Restored by {user}" : "აღადგინა მომხმარებელმა {user}",
- "Renamed by {user}" : "სახელი გადაარქვა მომხმარებელმა {user}",
- "Moved by {user}" : "გადაიტანა მომხმარებელმა {user}",
- "\"remote user\"" : "\"დისტანციური მომხმარებელი\"",
- "You created {file}" : "თქვენ შექმენით {file}",
- "You created an encrypted file in {file}" : "შექმენით დაშიფრული ფაილი {file}-ში",
- "{user} created {file}" : "{user} მომხმარებელმა შექმნა {file}",
- "{user} created an encrypted file in {file}" : "{user} მომხმარებელმა შექმნა დაშიფრული ფაილი {file}-ში",
- "{file} was created in a public folder" : "{file} შეიქმნა საზოგადო დირექტორიაში",
- "You changed {file}" : "თქვენ შეცვალეთ {file}",
- "You changed an encrypted file in {file}" : "შეცვალეთ დაშიფრული ფაილი {file}-ში",
- "{user} changed {file}" : "{user} მომხმარებელმა შეცვალა {file}",
- "{user} changed an encrypted file in {file}" : "{user} მომხმარებელმა შეცვალა დაშიფრული ფაილი {file}-ში",
- "You deleted {file}" : "თქვენ წაშალეთ {file}",
- "You deleted an encrypted file in {file}" : "გააუქმეთ დაშიფრული ფაილი {file}-ში",
- "{user} deleted {file}" : "{user} მომხმარებელმა წაშალა {file}",
- "{user} deleted an encrypted file in {file}" : "{user} მომხმარებელმა გააუქმა დაშიფრული ფაილი {file}-ში",
- "You restored {file}" : "თქვენ აღადგინეთ {file}",
- "{user} restored {file}" : "{user} მომხმარებელმა განაახლა {file}",
- "You renamed {oldfile} to {newfile}" : "თქვენ გადაარქვით სახელი {oldfile}-ს {newfile}-ზე",
- "{user} renamed {oldfile} to {newfile}" : "{user}-მა გადაარქვა სახელი {oldfile}-ს {newfile}-ზე",
- "You moved {oldfile} to {newfile}" : "თქვენ გადაიტანეთ {oldfile} {newfile}-ად",
- "{user} moved {oldfile} to {newfile}" : "{user}-მა გადაიტანა {oldfile} {newfile}-ად",
- "A file has been added to or removed from your <strong>favorites</strong>" : "ყველა ფაილი დაემატა ან ამოიშალა<strong>რჩეულებიდან</strong>",
- "All files" : "ყველა ფაილი",
- "Unlimited" : "ულიმიტო",
- "Upload (max. %s)" : "ატვირთვა (მაქს. %s)",
- "Accept" : "მიღება",
- "in %s" : "%s-ში",
- "Change" : "შეცვლა",
- "Tags" : "ტეგები",
- "Cancel" : "უარყოფა",
- "Create" : "შექმნა",
- "%s used" : "%s მოხმარებულია",
- "%1$s of %2$s used" : "გამოყენებულია %1$s სულ %2$s-იდან ",
- "Settings" : "პარამეტრები",
- "Show hidden files" : "დამალული ფაილების ჩვენება",
- "WebDAV" : "WebDAV",
- "No files in here" : "აქ ფაილები არაა",
- "Upload some content or sync with your devices!" : "ატვირთეთ რამე ან მოახდინეთ სინქრონიზაცია თქვენს მოწყობილობებთან!",
- "No entries found in this folder" : "ამ დირექტორიაში შენატანები ვერ იქნა ნაპოვნი",
- "Select all" : "ყველას არჩევა",
- "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
- "No favorites yet" : "ჯერ რჩეულები არაა",
- "Files and folders you mark as favorite will show up here" : "აქ გამოჩნდებიან ფაილები და დირექტორიები, რომლებსაც მონიშნავთ რჩეულებად",
- "Deleted files" : "გაუქმებული ფაილები",
- "Shares" : "გაზიარებები",
- "Shared with others" : "გაზიარდა სხვებთან",
- "Shared with you" : "გაზიარდა თქვენთან",
- "Shared by link" : "გაზიარდა ბმულით",
- "Text file" : "ტექსტური ფაილი",
- "New text file.txt" : "ახალი ტექსტი file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}-ის საცავი სავსეა, ფაილები მეტი ვეღარ განახლდება/სინქრონიზირდება!",
- "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ემთხვევა '{filter}'-ს","ემთხვევა '{filter}'-ს"]
-},"pluralForm" :"nplurals=2; plural=(n!=1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js
deleted file mode 100644
index 0202944bc42..00000000000
--- a/apps/files/l10n/km.js
+++ /dev/null
@@ -1,38 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Unknown error" : "មិន​ស្គាល់​កំហុស",
- "No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស",
- "There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ",
- "Files" : "ឯកសារ",
- "Close" : "បិទ",
- "Upload cancelled." : "បាន​បោះបង់​ការ​ផ្ទុក​ឡើង។",
- "Uploading..." : "កំពុងដាក់បញ្ចូល...",
- "Download" : "ទាញយក",
- "Rename" : "ប្ដូរ​ឈ្មោះ",
- "Delete" : "លុប",
- "Unshare" : "លែង​ចែក​រំលែក",
- "Details" : "ព័ត៌មាន​លម្អិត",
- "Pending" : "កំពុង​រង់ចាំ",
- "Name" : "ឈ្មោះ",
- "Size" : "ទំហំ",
- "Modified" : "បាន​កែ​ប្រែ",
- "New" : "ថ្មី",
- "File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។",
- "Folder" : "ថត",
- "New folder" : "ថត​ថ្មី",
- "Upload" : "ផ្ទុក​ឡើង",
- "You created %1$s" : "អ្នក​បាន​បង្កើត %1$s",
- "%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s",
- "You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s",
- "%2$s changed %1$s" : "%2$s បាន​ផ្លាស់​ប្ដូរ %1$s",
- "You deleted %1$s" : "អ្នក​បាន​លុប %1$s",
- "%2$s deleted %1$s" : "%2$s បាន​លុប %1$s",
- "Maximum upload size" : "ទំហំ​ផ្ទុកឡើង​ជា​អតិបរមា",
- "Save" : "រក្សាទុក",
- "Settings" : "ការកំណត់",
- "WebDAV" : "WebDAV",
- "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក",
- "Text file" : "ឯកសារ​អក្សរ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json
deleted file mode 100644
index 8f4b54f10bc..00000000000
--- a/apps/files/l10n/km.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{ "translations": {
- "Unknown error" : "មិន​ស្គាល់​កំហុស",
- "No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស",
- "There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ",
- "Files" : "ឯកសារ",
- "Close" : "បិទ",
- "Upload cancelled." : "បាន​បោះបង់​ការ​ផ្ទុក​ឡើង។",
- "Uploading..." : "កំពុងដាក់បញ្ចូល...",
- "Download" : "ទាញយក",
- "Rename" : "ប្ដូរ​ឈ្មោះ",
- "Delete" : "លុប",
- "Unshare" : "លែង​ចែក​រំលែក",
- "Details" : "ព័ត៌មាន​លម្អិត",
- "Pending" : "កំពុង​រង់ចាំ",
- "Name" : "ឈ្មោះ",
- "Size" : "ទំហំ",
- "Modified" : "បាន​កែ​ប្រែ",
- "New" : "ថ្មី",
- "File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។",
- "Folder" : "ថត",
- "New folder" : "ថត​ថ្មី",
- "Upload" : "ផ្ទុក​ឡើង",
- "You created %1$s" : "អ្នក​បាន​បង្កើត %1$s",
- "%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s",
- "You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s",
- "%2$s changed %1$s" : "%2$s បាន​ផ្លាស់​ប្ដូរ %1$s",
- "You deleted %1$s" : "អ្នក​បាន​លុប %1$s",
- "%2$s deleted %1$s" : "%2$s បាន​លុប %1$s",
- "Maximum upload size" : "ទំហំ​ផ្ទុកឡើង​ជា​អតិបរមា",
- "Save" : "រក្សាទុក",
- "Settings" : "ការកំណត់",
- "WebDAV" : "WebDAV",
- "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក",
- "Text file" : "ឯកសារ​អក្សរ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js
deleted file mode 100644
index 6ad65bf9806..00000000000
--- a/apps/files/l10n/kn.js
+++ /dev/null
@@ -1,61 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ",
- "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ",
- "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.",
- "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ",
- "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ",
- "There is no error, the file uploaded with success" : "ವರ್ಗಾವಣೆ ಯಾವುದೇ ದೋಷ ಕಂಡುಬರದೆ ಯಶಸ್ವಿಯಾಗಿದೆ",
- "The uploaded file was only partially uploaded" : "ವರ್ಗಾವಣೆ ಮಾಡಲಾಗುತ್ತಿದ್ದ ಕಡತವನ್ನು ಭಾಗಶಃ ಮಾತ್ರ ಪೇರಿಸಲು ಸಾದ್ಯವಾಗಿದೆ",
- "No file was uploaded" : "ವರ್ಗಾವಣೆಗೆ ಯಾವುದೇ ಕಡತಗಳು ಕಂಡುಬಂದಿಲ್ಲ",
- "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ",
- "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ",
- "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ",
- "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.",
- "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.",
- "Files" : "ಕಡತಗಳು",
- "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು",
- "Home" : "ಮುಖಪುಟ",
- "Close" : "ಮುಚ್ಚು",
- "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.",
- "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.",
- "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ",
- "Rename" : "ಮರುಹೆಸರಿಸು",
- "Delete" : "ಅಳಿಸಿ",
- "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ",
- "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ",
- "Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
- "Pending" : "ಬಾಕಿ ಇದೆ",
- "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
- "Name" : "ಹೆಸರು",
- "Size" : " ಪ್ರಮಾಣ",
- "Modified" : "ಬದಲಾಯಿಸಿದ",
- "_%n folder_::_%n folders_" : ["%n ಕೋಶ(ಗಳು)"],
- "_%n file_::_%n files_" : ["%n ಕಡತ"],
- "You don’t have permission to upload or create files here" : "ನಿಮಗೆ ಇಲ್ಲಿ ಅಪ್ಲೋಡ್ ಅಥವಾ ಕಡತಗಳನ್ನು ರಚಿಸವ ಅನುಮತಿ ಇಲ್ಲ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 'ನೆ ಕಡತವನ್ನು ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ"],
- "New" : "ಹೊಸ",
- "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.",
- "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು",
- "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Folder" : "ಕಡತಕೋಶ",
- "New folder" : "ಹೊಸ ಕಡತಕೋಶ",
- "Upload" : "ವರ್ಗಾಯಿಸಿ",
- "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)",
- "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ",
- "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ",
- "max. possible: " : "ಗರಿಷ್ಠ. ಸಾಧ್ಯ:",
- "Save" : "ಉಳಿಸಿ",
- "Settings" : "ಆಯ್ಕೆ",
- "WebDAV" : "WebDAV",
- "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.",
- "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ",
- "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ",
- "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json
deleted file mode 100644
index 5fda4e75989..00000000000
--- a/apps/files/l10n/kn.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{ "translations": {
- "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ",
- "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ",
- "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.",
- "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ",
- "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ",
- "There is no error, the file uploaded with success" : "ವರ್ಗಾವಣೆ ಯಾವುದೇ ದೋಷ ಕಂಡುಬರದೆ ಯಶಸ್ವಿಯಾಗಿದೆ",
- "The uploaded file was only partially uploaded" : "ವರ್ಗಾವಣೆ ಮಾಡಲಾಗುತ್ತಿದ್ದ ಕಡತವನ್ನು ಭಾಗಶಃ ಮಾತ್ರ ಪೇರಿಸಲು ಸಾದ್ಯವಾಗಿದೆ",
- "No file was uploaded" : "ವರ್ಗಾವಣೆಗೆ ಯಾವುದೇ ಕಡತಗಳು ಕಂಡುಬಂದಿಲ್ಲ",
- "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ",
- "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ",
- "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ",
- "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.",
- "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.",
- "Files" : "ಕಡತಗಳು",
- "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು",
- "Home" : "ಮುಖಪುಟ",
- "Close" : "ಮುಚ್ಚು",
- "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.",
- "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.",
- "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ",
- "Rename" : "ಮರುಹೆಸರಿಸು",
- "Delete" : "ಅಳಿಸಿ",
- "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ",
- "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ",
- "Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
- "Pending" : "ಬಾಕಿ ಇದೆ",
- "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
- "Name" : "ಹೆಸರು",
- "Size" : " ಪ್ರಮಾಣ",
- "Modified" : "ಬದಲಾಯಿಸಿದ",
- "_%n folder_::_%n folders_" : ["%n ಕೋಶ(ಗಳು)"],
- "_%n file_::_%n files_" : ["%n ಕಡತ"],
- "You don’t have permission to upload or create files here" : "ನಿಮಗೆ ಇಲ್ಲಿ ಅಪ್ಲೋಡ್ ಅಥವಾ ಕಡತಗಳನ್ನು ರಚಿಸವ ಅನುಮತಿ ಇಲ್ಲ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n 'ನೆ ಕಡತವನ್ನು ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ"],
- "New" : "ಹೊಸ",
- "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.",
- "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು",
- "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ",
- "Folder" : "ಕಡತಕೋಶ",
- "New folder" : "ಹೊಸ ಕಡತಕೋಶ",
- "Upload" : "ವರ್ಗಾಯಿಸಿ",
- "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)",
- "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ",
- "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ",
- "max. possible: " : "ಗರಿಷ್ಠ. ಸಾಧ್ಯ:",
- "Save" : "ಉಳಿಸಿ",
- "Settings" : "ಆಯ್ಕೆ",
- "WebDAV" : "WebDAV",
- "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.",
- "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ",
- "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ",
- "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 2d988100924..dfb6f4e29df 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -1,113 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음",
- "Storage invalid" : "저장소가 잘못됨",
- "Unknown error" : "알 수 없는 오류",
- "File could not be found" : "파일을 찾을 수 없음",
- "Move or copy" : "이동이나 복사",
- "Download" : "다운로드",
- "Delete" : "삭제",
- "Home" : "홈",
- "Close" : "닫기",
- "Favorites" : "즐겨찾기",
- "Could not create folder \"{dir}\"" : "폴더 \"{dir}\"을(를) 만들 수 없음",
- "This will stop your current uploads." : "이것은 현재 업로드를 중단시킬 것입니다.",
- "Upload cancelled." : "업로드가 취소되었습니다.",
- "Processing files …" : "파일 처리중 ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "남은 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 남아 있습니다",
- "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다",
- "Not enough free space" : "남은 공간이 부족함",
- "An unknown error has occurred" : "알 수 없는 에러 발생",
- "Uploading …" : "업로드 중…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
- "Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다",
- "Target folder does not exist any more" : "대상 폴더가 더 이상 존재하지 않습니다",
- "Operation is blocked by access control" : "접근 설정에 의해 동작이 차단됨",
- "Error when assembling chunks, status code {status}" : "조각을 모으는 중 오류 발생, 상태 코드 {status}",
- "Actions" : "작업",
- "Rename" : "이름 바꾸기",
- "Copy" : "복사",
- "Choose target folder" : "폴더 선택",
- "Open" : "열기",
- "Delete file" : "파일 삭제",
- "Delete folder" : "폴더 삭제",
- "Disconnect storage" : "저장소 연결 해제",
- "Leave this share" : "이 공유에서 떠나기",
- "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음",
- "Files" : "파일",
- "Details" : "자세한 정보",
- "Please select tag(s) to add to the selection" : "선택한 항목에 추가할 태그를 고르세요",
- "Apply tag(s) to selection" : "선택한 항목에 태그 적용하기",
- "Select" : "선택",
- "Pending" : "대기 중",
- "Unable to determine date" : "날짜를 결정할 수 없음",
- "This operation is forbidden" : "이 작업이 금지됨",
- "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
- "Could not move \"{file}\", target exists" : "\"{file}\"을(를) 이동할 수 없음, 대상이 존재함",
- "Could not move \"{file}\"" : "\"{file}\"을(를) 이동할 수 없음",
- "copy" : "복사",
- "Could not copy \"{file}\", target exists" : "\"{file}\"을(를) 복사할 수 없음, 대상이 존재함",
- "Could not copy \"{file}\"" : "\"{file}\"을(를) 복사할 수 없음",
- "Copied {origin} inside {destination}" : "{origin}을(를) {destination}(으)로 복사함",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} 및 다른 파일 {nbfiles}개를 {destination}(으)로 복사함",
- "{newName} already exists" : "{newName}이(가) 이미 존재함",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\"의 이름을 변경할 수 없음, 더 이상 존재하지 않음",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "폴더 \"{dir}\" 내에 파일 \"{targetName}\"이(가) 이미 있습니다. 다른 이름을 사용하십시오.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\"의 이름을 바꿀 수 없음",
- "Could not create file \"{file}\"" : "\"{file}\"을(를) 만들 수 없음",
- "Could not create file \"{file}\" because it already exists" : "파일이 이미 존재하므로 \"{file}\"을(를) 만들 수 없음",
- "Could not create folder \"{dir}\" because it already exists" : "폴더가 이미 존재하므로 폴더 \"{dir}\"을(를) 만들 수 없음",
- "Could not fetch file details \"{file}\"" : "\"{file}\"의 세부사항을 불러올 수 없음",
- "Error deleting file \"{fileName}\"." : "파일 \"{fileName}\"을(를) 삭제할 수 없습니다.",
- "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음",
- "Enter more than two characters to search in other folders" : "여러 폴더에서 검색하기 위해 2글자 이상 입력하십시오",
- "Name" : "이름",
- "Size" : "크기",
- "Modified" : "수정됨",
- "_%n folder_::_%n folders_" : ["폴더 %n개"],
- "_%n file_::_%n files_" : ["파일 %n개"],
- "{dirs} and {files}" : "{dirs} 그리고 {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"],
- "You don’t have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다",
- "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
- "New" : "새로 만들기",
- "{used} of {quota} used" : "{quota} 중 {used} 사용함",
- "{used} used" : "{used} 사용함",
- "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
- "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
- "\"/\" is not allowed inside a file name." : "파일 이름에 \"/\"를 사용할 수 없습니다.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is full, files cannot be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "그룹 폴더 \"{mountPoint}\"이(가) 거의 가득 찼습니다({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "외부 저장소 \"{mountPoint}\"이(가) 거의 가득 찼습니다({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["'{filter}'와(과) 일치"],
- "View in folder" : "폴더에서 보기",
- "Copied!" : "복사 성공!",
- "Copy direct link (only works for users who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)",
- "Path" : "경로",
- "_%n byte_::_%n bytes_" : ["%n 바이트"],
- "Favorited" : "즐겨찾기에 추가됨",
- "Favorite" : "즐겨찾기",
- "You can only favorite a single file or folder at a time" : "한번에 한 파일 혹은 한 폴더만 즐겨찾기로 지정할 수 있습니다",
- "New folder" : "새 폴더",
- "Upload file" : "파일 업로드",
- "Recent" : "최근",
- "Not favorited" : "즐겨찾기에 없음",
- "Remove from favorites" : "즐겨찾기에서 삭제",
- "Add to favorites" : "즐겨찾기에 추가",
- "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
"Added to favorites" : "즐겨찾기에 추가됨",
"Removed from favorites" : "즐겨찾기에서 삭제됨",
"You added {file} to your favorites" : "내가 {file}을(를) 즐겨찾기에 추가함",
"You removed {file} from your favorites" : "내가 {file}을(를) 즐겨찾기에서 삭제함",
+ "Favorites" : "즐겨찾기",
"File changes" : "파일 변경",
"Created by {user}" : "{user} 님이 만듦",
"Changed by {user}" : "{user} 님이 변경함",
@@ -115,42 +13,53 @@ OC.L10N.register(
"Restored by {user}" : "{user} 님이 복원함",
"Renamed by {user}" : "{user} 님이 이름을 변경함",
"Moved by {user}" : "{user} 님이 이동함",
- "\"remote user\"" : "\"원격 사용자\"",
+ "\"remote account\"" : "\"원격 계정\"",
"You created {file}" : "{file}을(를) 만듦",
- "You created an encrypted file in {file}" : "{file}에 암호화된 파일을 생성했습니다",
+ "You created an encrypted file in {file}" : "{file}에 암호화된 파일을 생성했습니다.",
"{user} created {file}" : "{user} 님이 {file}을(를) 만듦",
- "{user} created an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 생성했습니다",
+ "{user} created an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 생성",
"{file} was created in a public folder" : "공유 폴더에 {file}이(가) 생성됨",
"You changed {file}" : "{file}을(를) 변경함",
- "You changed an encrypted file in {file}" : "{file}에 암호화된 파일을 변경했습니다",
+ "You changed an encrypted file in {file}" : "{file}에 암호화된 파일을 변경했습니다.",
"{user} changed {file}" : "{user} 님이 {file}을(를) 변경함",
- "{user} changed an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 변경했습니다",
+ "{user} changed an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 변경",
"You deleted {file}" : "{file}을(를) 삭제함",
- "You deleted an encrypted file in {file}" : "{file}에 암호화된 파일을 제거했습니다",
+ "You deleted an encrypted file in {file}" : "{file}에 암호화된 파일을 제거했습니다.",
"{user} deleted {file}" : "{user} 님이 {file}을(를) 삭제함",
- "{user} deleted an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 제거했습니다",
+ "{user} deleted an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 제거",
"You restored {file}" : "내가 {file}을(를) 복원함",
"{user} restored {file}" : "{user} 님이 {file}을(를) 복원함",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "{oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"You renamed {oldfile} (hidden) to {newfile}" : "{oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
"You renamed {oldfile} to {newfile} (hidden)" : "{oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"You renamed {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이름을 바꿈",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}이(가) {oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}이(가) {oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}이(가) {oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}님이 {oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}님이 {oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}님이 {oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이름을 바꿈",
"You moved {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이동함",
"{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이동함",
"A file has been added to or removed from your <strong>favorites</strong>" : "파일이 <strong>즐겨찾기</strong>에서 추가 또는 삭제됨",
+ "Files" : "파일",
"A file or folder has been <strong>changed</strong>" : "파일이나 폴더가 <strong>변경됨</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "즐겨찾기된 파일이나 폴더가 <strong>변경됨</strong>",
- "All files" : "모든 파일",
- "Unlimited" : "무제한",
- "Upload (max. %s)" : "업로드(최대 %s)",
+ "Failed to authorize" : "인증 실패하였습니다",
+ "Invalid folder path" : "잘못된 폴더 경로",
+ "Folder not found" : "폴더를 찾을 수 없음",
+ "The file cannot be found" : "파일을 찾을 수 없습니다",
+ "The destination path does not exist: %1$s" : "목표한 경로가 존재하지 않습니다: %1$s",
+ "You do not have permission to create a file at the specified location" : "지정한 위치에 파일을 생성할 권한이 없습니다.",
+ "The file could not be converted." : "파일이 변환될 수 없습니다.",
+ "Could not get relative path to converted file" : "변환될 파일의 상대 경로를 알 수 없습니다",
+ "Favorite files" : "즐겨찾는 파일",
+ "No favorites" : "즐겨찾는 항목 없음",
+ "More favorites" : "즐겨찾기 더 불러오기",
"Accept" : "수락",
"Reject" : "거절",
- "Incoming ownership transfer from {user}" : "{user}(으)로부터 들어오는 중인 소유권 이전",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path}을(를) 받아들이시겠습니까?\n\n참고: 전송 과정은 동의한 시점으로부터 최대 1시간 소요됩니다.",
+ "Incoming ownership transfer from {user}" : "{user}의 소유권 이전 요청",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path}의 소유권을 받으시겠습니까?\n\n참고: 이전 과정은 동의한 시점으로부터 최대 1시간 소요됩니다.",
+ "Ownership transfer denied" : "소유권 이전 거절",
+ "Your ownership transfer of {path} was denied by {user}." : "{user}을(를) 향한 {path}의 소유권 이전이 거절되었습니다.",
"Ownership transfer failed" : "소유권 이전 실패",
"Your ownership transfer of {path} to {user} failed." : "{user}을(를) 향한 {path}의 소유권 이전에 실패했습니다.",
"The ownership transfer of {path} from {user} failed." : "{user}(으)로부터 {path}의 소유권을 받는 것에 실패했습니다.",
@@ -158,58 +67,377 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "{user}을(를) 향한 {path}의 소유권 이전을 완료했습니다.",
"The ownership transfer of {path} from {user} has completed." : "{user}(으)로부터 {path}의 소유권을 받았습니다.",
"in %s" : "%s",
+ "Transferred from %1$s on %2$s" : "%2$s의 %1$s에서 전송됨",
+ "Files compatibility" : "파일 호환성",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "모든 클라이언트와 동기화 될 수 있게 제한된 파일이름을 허용하세요. 기본적으로 POSIX (예를 들어 Linux 혹은 macOS) 에서 유효한 모든 파일이름은 허용됩니다.",
+ "Enforce Windows compatibility" : "윈도우 호환성 준수",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "예약어나 특수 문자 사용 등 Windows 시스템에서 유효하지 않은 파일 이름이 차단됩니다. 그러나 대소문자 구분의 호환성을 강제하지는 않습니다.",
"File Management" : "파일 관리",
- "Transfer ownership of a file or folder" : "파일이나 폴더의 소유권 이전",
- "Choose file or folder to transfer" : "이전할 파일이나 폴더 고르기",
- "Change" : "변경",
- "New owner" : "새 소유자",
- "Search users" : "사용자 검색",
+ "Home" : "홈",
+ "Target folder does not exist any more" : "대상 폴더가 더 이상 존재하지 않습니다",
+ "Reload current directory" : "이 경로를 새로고침",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" 경로로 이동",
+ "Current directory path" : "현재 디렉토리 경로",
+ "Your have used your space quota and cannot upload files anymore" : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다",
+ "You do not have permission to upload or create files here." : "여기에 업로드하거나 파일을 생성할 권한이 없습니다.",
+ "Drag and drop files here to upload" : "이곳에 파일을 드래그 앤 드롭해 업로드",
+ "Favorite" : "즐겨찾기",
+ "Back" : "뒤로",
+ "Toggle selection for file \"{displayName}\"" : "파일 \"{displayName}\" 선택/선택해제",
+ "Toggle selection for folder \"{displayName}\"" : "폴더 \"{displayName}\" 선택/선택해제",
+ "File is loading" : "파일 불러오는 중",
+ "Folder is loading" : "폴더 불러오는 중",
+ "Filename" : "파일 이름",
+ "Folder name" : "폴더 이름",
+ "This node is unavailable" : "이 노드를 사용할 수 없습니다",
+ "Another entry with the same name already exists." : "같은 이름의 항목이 이미 있습니다.",
+ "Invalid filename." : "잘못된 파일 이름",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" 에서 \"{newName}\"(으)로 이름 변경함",
+ "Rename file" : "파일 이름 바꾸기",
+ "Folder" : "폴더",
+ "Pending" : "대기 중",
+ "Unknown date" : "알 수 없는 날짜",
+ "Clear filter" : "필터 지우기",
+ "Modified" : "수정됨",
+ "Search everywhere" : "모든 곳에서 찾기",
+ "Type" : "종류",
+ "Active filters" : "활성 필터",
+ "Remove filter" : "필터 삭제",
+ "Total rows summary" : "총 행 요약",
+ "Toggle selection for all files and folders" : "모든 파일 선택/선택해제",
+ "Name" : "이름",
+ "Size" : "크기",
+ "Actions" : "작업",
+ "(selected)" : "(선택됨)",
+ "List of files and folders." : "파일과 폴더의 목록",
+ "You have used your space quota and cannot upload files anymore." : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다.",
+ "Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
+ "File not found" : "파일을 찾을 수 없음",
+ "{usedQuotaByte} used" : "{usedQuotaByte} 사용",
+ "{used} of {quota} used" : "{quota} 중 {used} 사용함",
+ "{relative}% used" : "{relative}% 사용",
+ "Could not refresh storage stats" : "저장소 정보를 새로고칠 수 없음",
+ "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
+ "Storage information" : "저장소 정보",
+ "Storage quota" : "저장소 할당량",
+ "New folder" : "새 폴더",
+ "Create new folder" : "새 폴더 생성",
+ "This name is already in use." : "이 이름은 이미 사용 중입니다.",
+ "Create" : "생성",
+ "Fill template fields" : "양식 입력란 채우기",
+ "Submitting fields …" : "항목 제출 중 ...",
+ "Submit" : "제출",
"Choose a file or folder to transfer" : "이전할 파일이나 폴더 고르기",
"Transfer" : "이전",
"Transfer {path} to {userid}" : "{path}을(를) {userid}에게 이전하기",
"Invalid path selected" : "잘못된 경로가 선택됨",
+ "Unknown error" : "알 수 없는 오류",
"Ownership transfer request sent" : "소유권 이전 요청이 전송됨",
- "Cannot transfer ownership of a file or folder you don't own" : "내가 소유하지 않은 파일이나 폴더의 소유권을 이전할 수 없음",
- "Tags" : "태그",
- "Unable to change the favourite state of the file" : "파일의 즐겨찾기 상태를 변경할 수 없음",
+ "Cannot transfer ownership of a file or folder you do not own" : "내가 소유하지 않은 파일이나 폴더의 소유권을 이전할 수 없음",
+ "Transfer ownership of a file or folder" : "파일이나 폴더의 소유권 이전",
+ "Choose file or folder to transfer" : "이전할 파일이나 폴더 고르기",
+ "Change" : "변경",
+ "New owner" : "새 소유자",
+ "Keep {old}" : "{old} 보관",
+ "Keep without extension" : "연장하지 않고 보관",
+ "Use {new}" : "{new}사용",
+ "Remove extension" : "확장자 제거",
+ "Change file extension" : "파일 확장자 변경",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "\"{old}\" 파일 확장자를 \"{new}\"(으)로 바꾸면 파일을 읽지 못할 수 있습니다.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "\"{old}\" 파일 확장자를 제거하면 파일을 읽지 못할 수 있습니다.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "\"{new}\" 파일 확장자를 추가하면 파일을 읽지 못할 수 있습니다.",
+ "Do not show this dialog again." : "이 알림을 다시 보여주지 마세요.",
+ "Select file or folder to link to" : "링크할 파일이나 폴더 선택",
+ "Choose {file}" : "{file} 선택",
+ "Share" : "공유하기",
+ "Shared by link" : "링크로 공유됨",
+ "Shared" : "공유됨",
+ "Switch to list view" : "목록 보기로 전환",
+ "Switch to grid view" : "바둑판식 보기로 전환",
+ "The file could not be found" : "파일을 찾을 수 없음",
+ "Upload was cancelled by user" : "사용자에 의해 업로드가 취소됨",
+ "Not enough free space" : "남은 공간이 부족함",
+ "Operation is blocked by access control" : "접근 설정에 의해 동작이 차단됨",
+ "Error during upload: {message}" : "업로드 오류: {message}",
+ "Error during upload, status code {status}" : "업로드 중 오류 발생, 상태 코드 {status}",
+ "Unknown error during upload" : "업로드 중 알 수 없는 오류 발생",
+ "Loading current folder" : "현재 폴더를 불러오는 중",
+ "Retry" : "다시 시도",
+ "No files in here" : "여기에 파일 없음",
+ "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
+ "Go back" : "뒤로 가기",
+ "Views" : "보기",
+ "Files settings" : "파일 설정",
+ "Your files" : "내 파일",
+ "Open in files" : "파일에서 열기",
+ "File cannot be accessed" : "파일에 접근할 수 없음",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "파일을 찾을 수 없거나 볼 권한이 없습니다. 보낸 이에게 공유를 요청하세요.",
+ "Clipboard is not available" : "클립보드를 사용할 수 없습니다.",
+ "General" : "일반",
+ "All files" : "모든 파일",
+ "Personal files" : "개인 파일",
+ "Sort favorites first" : "즐겨찾기를 처음에 나열",
+ "Sort folders before files" : "폴더를 파일보다 먼저 정렬",
+ "Appearance" : "외형",
+ "Show hidden files" : "숨김 파일 보이기",
+ "Crop image previews" : "이미지 미리보기 확대",
+ "Additional settings" : "고급 설정",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "복사",
+ "Keyboard shortcuts" : "키보드 단축키",
+ "Rename" : "이름 바꾸기",
+ "Delete" : "삭제",
+ "Manage tags" : "태그 관리하기",
+ "Selection" : "선택",
+ "Select all files" : "모든 파일 선택",
+ "Deselect all" : "모두 선택 해제",
+ "Navigation" : "탐색",
+ "View" : "보기",
+ "Toggle grid view" : "그리드뷰 전환",
+ "Show those shortcuts" : "다음 단축키 표시",
+ "You" : "당신",
+ "Shared multiple times with different people" : "여러 사용자와 공유됨",
"Error while loading the file data" : "파일 데이터를 불러오는 중 오류 발생",
+ "Owner" : "소유자",
+ "Remove from favorites" : "즐겨찾기에서 삭제",
+ "Add to favorites" : "즐겨찾기에 추가",
+ "Tags" : "태그",
+ "Blank" : "여백",
+ "Unable to create new file from template" : "템플릿으로 새 파일을 만들 수 없음",
"Pick a template for {name}" : "{name}을(를) 위한 템플릿 선택",
- "Cancel" : "취소",
- "Create" : "생성",
"Create a new file with the selected template" : "선택한 템플릿으로 새 파일 만들기",
"Creating file" : "파일 만들기",
- "Blank" : "여백",
- "Unable to create new file from template" : "템플릿으로 새 파일을 만들 수 없음",
- "Set up templates folder" : "템플릿 폴더 설정",
+ "Save as {displayName}" : "{displayName}으로 저장하기",
+ "Save as …" : "... 으로 저장하기",
+ "Converting files …" : "파일 변환하기 ...",
+ "Failed to convert files: {message}" : "파일 변환에 실패함:{message}",
+ "All files failed to be converted" : "모든 파일이 변환에 실패했습니다.",
+ "Failed to convert files" : "파일 변환에 실패했습니다",
+ "Leave this share" : "이 공유에서 떠나기",
+ "Leave these shares" : "이 공유에서 떠나기",
+ "Disconnect storage" : "저장소 연결 해제",
+ "Disconnect storages" : "저장소 연결 끊기",
+ "Delete permanently" : "영구히 삭제",
+ "Delete and unshare" : "삭제 및 공유 해제",
+ "Delete file" : "파일 삭제",
+ "Delete files" : "파일 삭제",
+ "Delete folder" : "폴더 삭제",
+ "Delete folders" : "폴더 삭제",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count}개 항목을 영구적으로 삭제하려 합니다."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count}개 항목을 삭제하려 합니다."],
+ "Confirm deletion" : "삭제 확인",
+ "Cancel" : "취소",
+ "Download" : "다운로드",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\"을(를) \"{destination}\"(으)로 이동...",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\"을(를) \"{destination}\"(으)로 복사...",
+ "Destination is not a folder" : "대상이 폴더가 아닙니다.",
+ "This file/folder is already in that directory" : "이 파일/폴더가 이미 그 경로에 있습니다.",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "파일/폴더를 그 안이나 그 안의 폴더로 이동할 수 없습니다.",
+ "(copy)" : "(복사)",
+ "(copy %n)" : "(%n 복사)",
+ "A file or folder with that name already exists in this folder" : "같은 이름을 사용하는 파일 또는 폴더가 이미 이 폴더에 있습니다.",
+ "The files are locked" : "이 파일은 잠겼습니다",
+ "The file does not exist anymore" : "파일이 더이상 존재하지 않습니다.",
+ "Choose destination" : "목적지 선택",
+ "Copy to {target}" : "{target}에 복사",
+ "Move to {target}" : "{target}에 이동",
+ "Move" : "이동",
+ "Move or copy operation failed" : "이동 또는 복사 작업에 실패함",
+ "Move or copy" : "이동이나 복사",
+ "Open folder {displayName}" : "{displayName} 폴더 열기",
+ "Open in Files" : "파일에서 열기",
+ "Open locally" : "로컬에서 열기",
+ "Failed to redirect to client" : "클라이언트로 리디렉션 하는데 실패함",
+ "Open file locally" : "로컬에서 파일 열기",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "이제 이 파일이 당신의 기기에서 열려야 합니다. 그렇지 않다면, 데스크톱 앱이 설치되어 있는지 확인하세요.",
+ "Retry and close" : "재시도 후 닫기",
+ "Details" : "자세한 정보",
+ "View in folder" : "폴더에서 보기",
+ "Today" : "오늘",
+ "Last 7 days" : "지난 7일",
+ "Last 30 days" : "지난 30일",
+ "This year ({year})" : "올해 ({year})",
+ "Last year ({year})" : "작년 ({year})",
+ "Documents" : "문서",
+ "Spreadsheets" : "스프레드시트",
+ "Presentations" : "프레젠테이션",
+ "PDFs" : "PDF",
+ "Folders" : "폴더",
+ "Audio" : "오디오",
+ "Images" : "이미지",
+ "Videos" : "동영상",
+ "Created new folder \"{name}\"" : "\"{name}\" 폴더를 새로 만듦",
+ "Unable to initialize the templates directory" : "템플릿 디렉터리를 설정할 수 없음",
+ "Create templates folder" : "템플릿 폴더 만들기",
"Templates" : "템플릿",
- "%s used" : "%s 사용함",
- "%1$s of %2$s used" : "%2$s 중 %1$s 사용됨",
- "Settings" : "설정",
- "Show hidden files" : "숨김 파일 보이기",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하십시오",
- "Toggle grid view" : "모눈 보기 전환",
- "No files in here" : "여기에 파일 없음",
- "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
+ "New template folder" : "새 템플릿 폴더",
+ "In folder" : "폴더에서",
+ "Search in folder: {folder}" : "폴더에서 검색: {folder}",
+ "One of the dropped files could not be processed" : "드롭한 파일 중 하나를 처리할 수 없습니다",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "이 브라우저는 Filesystem API를 지원하지 않습니다. 디렉토리가 업로드 되지 않을 것입니다.",
+ "No files to upload" : "업로드할 파일이 없음",
+ "Unable to create the directory {directory}" : "디렉토리 {directory}을(를) 생성할 수 없음",
+ "Some files could not be uploaded" : "일부 파일을 업로드할 수 없었습니다.",
+ "Files uploaded successfully" : "파일을 성공적으로 업로드했습니다.",
+ "No files to process" : "처리할 파일이 없음",
+ "Some files could not be copied" : "일부 파일을 복사할 수 없음",
+ "Some files could not be moved" : "일부 파일을 이동할 수 없음",
+ "Files copied successfully" : "파일을 성공적으로 복사함",
+ "Files moved successfully" : "파일을 성공적으로 이동함",
+ "Conflicts resolution skipped" : "충돌 해결 건너뜀",
+ "Upload cancelled" : "업로드가 취소됨",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\"(이)가 더이상 존재하지 않아 이름을 바꿀 수 없습니다.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" 이름이 \"{dir}\" 폴더에서 이미 사용 중입니다. 다른 이름을 고르세요.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\"의 이름을 바꿀 수 없음",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음",
+ "Unexpected error: {error}" : "예상치 못한 오류: {error}",
+ "_%n file_::_%n files_" : ["파일 %n개"],
+ "_%n folder_::_%n folders_" : ["폴더 %n개"],
+ "Filename must not be empty." : "파일 이름을 비울 수 없습니다.",
+ "\"{char}\" is not allowed inside a filename." : "파일 이름에 \"{char}\"(을)를 사용할 수 없습니다.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\"(은)는 예약된 이름이므로 파일 이름에 사용할 수 없습니다.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\"(은)는 허용된 파일 형식이 아닙니다.",
+ "Filenames must not end with \"{extension}\"." : "파일 이름은 \"{extension}\"(으)로 끝나야 합니다.",
+ "List of favorite files and folders." : "즐겨찾는 파일과 폴더의 목록",
+ "No favorites yet" : "즐겨찾는 항목 없음",
+ "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다",
+ "List of your files and folders." : "내 폴더와 파일의 목록",
+ "List of your files and folders that are not shared." : "공유되지 않는 파일과 폴더의 목록",
+ "No personal files found" : "개인 파일을 찾을 수 없음",
+ "Files that are not shared will show up here." : "공유되지 않는 파일이 이곳에 나타납니다.",
+ "Recent" : "최근",
+ "List of recently modified files and folders." : "최근에 수정된 파일과 폴더의 목록",
+ "No recently modified files" : "최근에 수정된 파일 없음",
+ "Files and folders you recently modified will show up here." : "최근에 수정한 파일과 폴더가 이곳에 표시됩니다.",
+ "Search" : "검색",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
"Upload too large" : "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
- "No favorites yet" : "즐겨찾는 항목 없음",
- "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다",
- "Deleted files" : "삭제된 파일",
- "Shares" : "공유",
- "Shared with others" : "다른 사람과 공유됨",
- "Shared with you" : "나와 공유됨",
- "Shared by link" : "링크로 공유됨",
- "Deleted shares" : "삭제된 공유",
- "Pending shares" : "진행중인 공유",
+ "File could not be found" : "파일을 찾을 수 없음",
+ "Show list view" : "리스트 보기",
+ "Show grid view" : "바둑판식 보기",
+ "Close" : "닫기",
+ "Could not create folder \"{dir}\"" : "폴더 \"{dir}\"을(를) 만들 수 없음",
+ "This will stop your current uploads." : "이것은 현재 업로드를 중단시킬 것입니다.",
+ "Upload cancelled." : "업로드가 취소되었습니다.",
+ "Processing files …" : "파일 처리중 ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "남은 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 남아 있습니다",
+ "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다",
+ "An unknown error has occurred" : "알 수 없는 오류 발생",
+ "File could not be uploaded" : "파일을 업로드할 수 없음",
+ "Uploading …" : "업로드 중…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "업로드 중… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
+ "Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다.",
+ "Error when assembling chunks, status code {status}" : "조각을 모으는 중 오류 발생, 상태 코드 {status}",
+ "Choose target folder" : "폴더 선택",
+ "Set reminder" : "알림 설정",
+ "Edit locally" : "로컬에서 편집",
+ "Open" : "열기",
+ "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음",
+ "Please select tag(s) to add to the selection" : "선택한 항목에 추가할 태그를 고르세요.",
+ "Apply tag(s) to selection" : "선택한 항목에 태그 적용하기",
+ "Select directory \"{dirName}\"" : "디렉터리 \"{dirName}\" 선택",
+ "Select file \"{fileName}\"" : "파일 \"{fileName}\" 선택",
+ "Unable to determine date" : "날짜를 결정할 수 없음",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
+ "Could not move \"{file}\", target exists" : "\"{file}\"을(를) 이동할 수 없음, 대상이 존재함",
+ "Could not move \"{file}\"" : "\"{file}\"을(를) 이동할 수 없음",
+ "copy" : "복사",
+ "Could not copy \"{file}\", target exists" : "\"{file}\"을(를) 복사할 수 없음, 대상이 존재함",
+ "Could not copy \"{file}\"" : "\"{file}\"을(를) 복사할 수 없음",
+ "Copied {origin} inside {destination}" : "{origin}을(를) {destination}(으)로 복사함",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} 및 다른 파일 {nbfiles}개를 {destination}(으)로 복사함",
+ "{newName} already exists" : "{newName}이(가) 이미 존재함",
+ "Could not create file \"{file}\"" : "\"{file}\"을(를) 만들 수 없음",
+ "Could not create file \"{file}\" because it already exists" : "파일이 이미 존재하므로 \"{file}\"을(를) 만들 수 없음",
+ "Could not create folder \"{dir}\" because it already exists" : "폴더가 이미 존재하므로 폴더 \"{dir}\"을(를) 만들 수 없음",
+ "Could not fetch file details \"{file}\"" : "\"{file}\"의 세부사항을 불러올 수 없음",
+ "Error deleting file \"{fileName}\"." : "파일 \"{fileName}\"을(를) 삭제할 수 없습니다.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음",
+ "Enter more than two characters to search in other folders" : "다른 폴더에서 검색하기 위해 2글자 이상 입력하세요.",
+ "{dirs} and {files}" : "{dirs} 그리고 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"],
+ "You do not have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다.",
+ "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
+ "New" : "새 파일",
+ "New file/folder menu" : "새 파일/폴더 메뉴",
+ "Select file range" : "파일 범위 선택",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} 사용함",
+ "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
+ "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
+ "\"/\" is not allowed inside a file name." : "파일 이름에 \"/\"를 사용할 수 없습니다.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}의 저장 공간이 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "그룹 폴더 \"{mountPoint}\"이(가) 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "외부 저장소 \"{mountPoint}\"이(가) 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "저장 공간이 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["'{filter}'와(과) 일치"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "직접 링크를 복사했습니다. (이 파일 및 폴더에 접근할 수 있는 사람에게만 작동)",
+ "Path" : "경로",
+ "_%n byte_::_%n bytes_" : ["%n 바이트"],
+ "Favored" : "선호함",
+ "Favor" : "선호",
+ "Copy direct link (only works for people who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)",
+ "Upload file" : "파일 업로드",
+ "Not favored" : "선호하지 않음",
+ "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
+ "Upload (max. %s)" : "업로드(최대 %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" 작업을 성공적으로 실행함",
+ "\"{displayName}\" action failed" : "\"{displayName}\" 작업을 실패함",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" 일부 요소로 실패",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" 일괄 작업을 성공적으로 실행함",
+ "Submitting fields…" : "입력란 제출중...",
+ "Filter filenames…" : "파일 이름 필터...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL이 클립보드에 복사됨",
+ "Enable the grid view" : "바둑판식 보기 활성화",
+ "Enable folder tree" : "폴더 트리 활성화",
+ "Copy to clipboard" : "클립보드로 복사",
+ "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
+ "Deletion cancelled" : "삭제가 취소됨",
+ "Move cancelled" : "이동이 취소됨",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\"의 이동 또는 복사를 취소했습니다.",
+ "Cancelled move or copy operation" : "이동 또는 복사 작업을 취소함",
+ "Open details" : "자세한 정보 열기",
+ "Photos and images" : "사진과 이미지",
+ "New folder creation cancelled" : "새 폴더 생성 취소됨",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1개 파일과 {folderCount}개 폴더"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount}개 파일과 1개 폴더"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount}개 파일과 {folderCount}개 폴더",
+ "All folders" : "모든 폴더",
+ "Personal Files" : "개인 파일",
"Text file" : "텍스트 파일",
"New text file.txt" : "새 텍스트 파일.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"]
+ "Speed up your Files experience with these quick shortcuts." : "이 빠른 단축키를 사용하여 파일 사용 속도를 높이세요.",
+ "Open the actions menu for a file" : "파일 작업 메뉴 열기",
+ "Rename a file" : "파일 이름 바꾸기",
+ "Delete a file" : "파일 삭제",
+ "Favorite or remove a file from favorites" : "즐겨찾기에 파일 등록 또는 제거",
+ "Manage tags for a file" : "파일 태그 관리",
+ "Deselect all files" : "모든 파일 선택 해제",
+ "Select or deselect a file" : "파일 선택 또는 선택 해제",
+ "Select a range of files" : "파일 범위 선택",
+ "Navigate to the parent folder" : "상위 폴더로 이동",
+ "Navigate to the file above" : "위 파일로 이동",
+ "Navigate to the file below" : "아래 파일로 이동",
+ "Navigate to the file on the left (in grid mode)" : "왼쪽 파일로 이동 (그리드 모드에서)",
+ "Navigate to the file on the right (in grid mode)" : "오른쪽 파일로 이동 (그리드 모드에서)",
+ "Toggle the grid view" : "바둑판식 보기 전환",
+ "Open the sidebar for a file" : "파일 사이드바 열기"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index 3d5eab73cca..8245febabab 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -1,111 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음",
- "Storage invalid" : "저장소가 잘못됨",
- "Unknown error" : "알 수 없는 오류",
- "File could not be found" : "파일을 찾을 수 없음",
- "Move or copy" : "이동이나 복사",
- "Download" : "다운로드",
- "Delete" : "삭제",
- "Home" : "홈",
- "Close" : "닫기",
- "Favorites" : "즐겨찾기",
- "Could not create folder \"{dir}\"" : "폴더 \"{dir}\"을(를) 만들 수 없음",
- "This will stop your current uploads." : "이것은 현재 업로드를 중단시킬 것입니다.",
- "Upload cancelled." : "업로드가 취소되었습니다.",
- "Processing files …" : "파일 처리중 ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "남은 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 남아 있습니다",
- "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다",
- "Not enough free space" : "남은 공간이 부족함",
- "An unknown error has occurred" : "알 수 없는 에러 발생",
- "Uploading …" : "업로드 중…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
- "Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다",
- "Target folder does not exist any more" : "대상 폴더가 더 이상 존재하지 않습니다",
- "Operation is blocked by access control" : "접근 설정에 의해 동작이 차단됨",
- "Error when assembling chunks, status code {status}" : "조각을 모으는 중 오류 발생, 상태 코드 {status}",
- "Actions" : "작업",
- "Rename" : "이름 바꾸기",
- "Copy" : "복사",
- "Choose target folder" : "폴더 선택",
- "Open" : "열기",
- "Delete file" : "파일 삭제",
- "Delete folder" : "폴더 삭제",
- "Disconnect storage" : "저장소 연결 해제",
- "Leave this share" : "이 공유에서 떠나기",
- "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음",
- "Files" : "파일",
- "Details" : "자세한 정보",
- "Please select tag(s) to add to the selection" : "선택한 항목에 추가할 태그를 고르세요",
- "Apply tag(s) to selection" : "선택한 항목에 태그 적용하기",
- "Select" : "선택",
- "Pending" : "대기 중",
- "Unable to determine date" : "날짜를 결정할 수 없음",
- "This operation is forbidden" : "이 작업이 금지됨",
- "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
- "Could not move \"{file}\", target exists" : "\"{file}\"을(를) 이동할 수 없음, 대상이 존재함",
- "Could not move \"{file}\"" : "\"{file}\"을(를) 이동할 수 없음",
- "copy" : "복사",
- "Could not copy \"{file}\", target exists" : "\"{file}\"을(를) 복사할 수 없음, 대상이 존재함",
- "Could not copy \"{file}\"" : "\"{file}\"을(를) 복사할 수 없음",
- "Copied {origin} inside {destination}" : "{origin}을(를) {destination}(으)로 복사함",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} 및 다른 파일 {nbfiles}개를 {destination}(으)로 복사함",
- "{newName} already exists" : "{newName}이(가) 이미 존재함",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\"의 이름을 변경할 수 없음, 더 이상 존재하지 않음",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "폴더 \"{dir}\" 내에 파일 \"{targetName}\"이(가) 이미 있습니다. 다른 이름을 사용하십시오.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\"의 이름을 바꿀 수 없음",
- "Could not create file \"{file}\"" : "\"{file}\"을(를) 만들 수 없음",
- "Could not create file \"{file}\" because it already exists" : "파일이 이미 존재하므로 \"{file}\"을(를) 만들 수 없음",
- "Could not create folder \"{dir}\" because it already exists" : "폴더가 이미 존재하므로 폴더 \"{dir}\"을(를) 만들 수 없음",
- "Could not fetch file details \"{file}\"" : "\"{file}\"의 세부사항을 불러올 수 없음",
- "Error deleting file \"{fileName}\"." : "파일 \"{fileName}\"을(를) 삭제할 수 없습니다.",
- "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음",
- "Enter more than two characters to search in other folders" : "여러 폴더에서 검색하기 위해 2글자 이상 입력하십시오",
- "Name" : "이름",
- "Size" : "크기",
- "Modified" : "수정됨",
- "_%n folder_::_%n folders_" : ["폴더 %n개"],
- "_%n file_::_%n files_" : ["파일 %n개"],
- "{dirs} and {files}" : "{dirs} 그리고 {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"],
- "You don’t have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다",
- "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
- "New" : "새로 만들기",
- "{used} of {quota} used" : "{quota} 중 {used} 사용함",
- "{used} used" : "{used} 사용함",
- "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
- "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
- "\"/\" is not allowed inside a file name." : "파일 이름에 \"/\"를 사용할 수 없습니다.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is full, files cannot be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "그룹 폴더 \"{mountPoint}\"이(가) 거의 가득 찼습니다({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "외부 저장소 \"{mountPoint}\"이(가) 거의 가득 찼습니다({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["'{filter}'와(과) 일치"],
- "View in folder" : "폴더에서 보기",
- "Copied!" : "복사 성공!",
- "Copy direct link (only works for users who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)",
- "Path" : "경로",
- "_%n byte_::_%n bytes_" : ["%n 바이트"],
- "Favorited" : "즐겨찾기에 추가됨",
- "Favorite" : "즐겨찾기",
- "You can only favorite a single file or folder at a time" : "한번에 한 파일 혹은 한 폴더만 즐겨찾기로 지정할 수 있습니다",
- "New folder" : "새 폴더",
- "Upload file" : "파일 업로드",
- "Recent" : "최근",
- "Not favorited" : "즐겨찾기에 없음",
- "Remove from favorites" : "즐겨찾기에서 삭제",
- "Add to favorites" : "즐겨찾기에 추가",
- "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
"Added to favorites" : "즐겨찾기에 추가됨",
"Removed from favorites" : "즐겨찾기에서 삭제됨",
"You added {file} to your favorites" : "내가 {file}을(를) 즐겨찾기에 추가함",
"You removed {file} from your favorites" : "내가 {file}을(를) 즐겨찾기에서 삭제함",
+ "Favorites" : "즐겨찾기",
"File changes" : "파일 변경",
"Created by {user}" : "{user} 님이 만듦",
"Changed by {user}" : "{user} 님이 변경함",
@@ -113,42 +11,53 @@
"Restored by {user}" : "{user} 님이 복원함",
"Renamed by {user}" : "{user} 님이 이름을 변경함",
"Moved by {user}" : "{user} 님이 이동함",
- "\"remote user\"" : "\"원격 사용자\"",
+ "\"remote account\"" : "\"원격 계정\"",
"You created {file}" : "{file}을(를) 만듦",
- "You created an encrypted file in {file}" : "{file}에 암호화된 파일을 생성했습니다",
+ "You created an encrypted file in {file}" : "{file}에 암호화된 파일을 생성했습니다.",
"{user} created {file}" : "{user} 님이 {file}을(를) 만듦",
- "{user} created an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 생성했습니다",
+ "{user} created an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 생성",
"{file} was created in a public folder" : "공유 폴더에 {file}이(가) 생성됨",
"You changed {file}" : "{file}을(를) 변경함",
- "You changed an encrypted file in {file}" : "{file}에 암호화된 파일을 변경했습니다",
+ "You changed an encrypted file in {file}" : "{file}에 암호화된 파일을 변경했습니다.",
"{user} changed {file}" : "{user} 님이 {file}을(를) 변경함",
- "{user} changed an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 변경했습니다",
+ "{user} changed an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 변경",
"You deleted {file}" : "{file}을(를) 삭제함",
- "You deleted an encrypted file in {file}" : "{file}에 암호화된 파일을 제거했습니다",
+ "You deleted an encrypted file in {file}" : "{file}에 암호화된 파일을 제거했습니다.",
"{user} deleted {file}" : "{user} 님이 {file}을(를) 삭제함",
- "{user} deleted an encrypted file in {file}" : "{user}이(가) {file}에 암호화된 파일을 제거했습니다",
+ "{user} deleted an encrypted file in {file}" : "{user}님이 {file}에 암호화된 파일을 제거",
"You restored {file}" : "내가 {file}을(를) 복원함",
"{user} restored {file}" : "{user} 님이 {file}을(를) 복원함",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "{oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"You renamed {oldfile} (hidden) to {newfile}" : "{oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
"You renamed {oldfile} to {newfile} (hidden)" : "{oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"You renamed {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이름을 바꿈",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}이(가) {oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}이(가) {oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}이(가) {oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}님이 {oldfile} (숨겨짐)을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}님이 {oldfile} (숨겨짐)을(를) {newfile}(으)로 이름을 바꿈",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}님이 {oldfile}을(를) {newfile} (숨겨짐)(으)로 이름을 바꿈",
"{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이름을 바꿈",
"You moved {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이동함",
"{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이동함",
"A file has been added to or removed from your <strong>favorites</strong>" : "파일이 <strong>즐겨찾기</strong>에서 추가 또는 삭제됨",
+ "Files" : "파일",
"A file or folder has been <strong>changed</strong>" : "파일이나 폴더가 <strong>변경됨</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "즐겨찾기된 파일이나 폴더가 <strong>변경됨</strong>",
- "All files" : "모든 파일",
- "Unlimited" : "무제한",
- "Upload (max. %s)" : "업로드(최대 %s)",
+ "Failed to authorize" : "인증 실패하였습니다",
+ "Invalid folder path" : "잘못된 폴더 경로",
+ "Folder not found" : "폴더를 찾을 수 없음",
+ "The file cannot be found" : "파일을 찾을 수 없습니다",
+ "The destination path does not exist: %1$s" : "목표한 경로가 존재하지 않습니다: %1$s",
+ "You do not have permission to create a file at the specified location" : "지정한 위치에 파일을 생성할 권한이 없습니다.",
+ "The file could not be converted." : "파일이 변환될 수 없습니다.",
+ "Could not get relative path to converted file" : "변환될 파일의 상대 경로를 알 수 없습니다",
+ "Favorite files" : "즐겨찾는 파일",
+ "No favorites" : "즐겨찾는 항목 없음",
+ "More favorites" : "즐겨찾기 더 불러오기",
"Accept" : "수락",
"Reject" : "거절",
- "Incoming ownership transfer from {user}" : "{user}(으)로부터 들어오는 중인 소유권 이전",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path}을(를) 받아들이시겠습니까?\n\n참고: 전송 과정은 동의한 시점으로부터 최대 1시간 소요됩니다.",
+ "Incoming ownership transfer from {user}" : "{user}의 소유권 이전 요청",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path}의 소유권을 받으시겠습니까?\n\n참고: 이전 과정은 동의한 시점으로부터 최대 1시간 소요됩니다.",
+ "Ownership transfer denied" : "소유권 이전 거절",
+ "Your ownership transfer of {path} was denied by {user}." : "{user}을(를) 향한 {path}의 소유권 이전이 거절되었습니다.",
"Ownership transfer failed" : "소유권 이전 실패",
"Your ownership transfer of {path} to {user} failed." : "{user}을(를) 향한 {path}의 소유권 이전에 실패했습니다.",
"The ownership transfer of {path} from {user} failed." : "{user}(으)로부터 {path}의 소유권을 받는 것에 실패했습니다.",
@@ -156,58 +65,377 @@
"Your ownership transfer of {path} to {user} has completed." : "{user}을(를) 향한 {path}의 소유권 이전을 완료했습니다.",
"The ownership transfer of {path} from {user} has completed." : "{user}(으)로부터 {path}의 소유권을 받았습니다.",
"in %s" : "%s",
+ "Transferred from %1$s on %2$s" : "%2$s의 %1$s에서 전송됨",
+ "Files compatibility" : "파일 호환성",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "모든 클라이언트와 동기화 될 수 있게 제한된 파일이름을 허용하세요. 기본적으로 POSIX (예를 들어 Linux 혹은 macOS) 에서 유효한 모든 파일이름은 허용됩니다.",
+ "Enforce Windows compatibility" : "윈도우 호환성 준수",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "예약어나 특수 문자 사용 등 Windows 시스템에서 유효하지 않은 파일 이름이 차단됩니다. 그러나 대소문자 구분의 호환성을 강제하지는 않습니다.",
"File Management" : "파일 관리",
- "Transfer ownership of a file or folder" : "파일이나 폴더의 소유권 이전",
- "Choose file or folder to transfer" : "이전할 파일이나 폴더 고르기",
- "Change" : "변경",
- "New owner" : "새 소유자",
- "Search users" : "사용자 검색",
+ "Home" : "홈",
+ "Target folder does not exist any more" : "대상 폴더가 더 이상 존재하지 않습니다",
+ "Reload current directory" : "이 경로를 새로고침",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" 경로로 이동",
+ "Current directory path" : "현재 디렉토리 경로",
+ "Your have used your space quota and cannot upload files anymore" : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다",
+ "You do not have permission to upload or create files here." : "여기에 업로드하거나 파일을 생성할 권한이 없습니다.",
+ "Drag and drop files here to upload" : "이곳에 파일을 드래그 앤 드롭해 업로드",
+ "Favorite" : "즐겨찾기",
+ "Back" : "뒤로",
+ "Toggle selection for file \"{displayName}\"" : "파일 \"{displayName}\" 선택/선택해제",
+ "Toggle selection for folder \"{displayName}\"" : "폴더 \"{displayName}\" 선택/선택해제",
+ "File is loading" : "파일 불러오는 중",
+ "Folder is loading" : "폴더 불러오는 중",
+ "Filename" : "파일 이름",
+ "Folder name" : "폴더 이름",
+ "This node is unavailable" : "이 노드를 사용할 수 없습니다",
+ "Another entry with the same name already exists." : "같은 이름의 항목이 이미 있습니다.",
+ "Invalid filename." : "잘못된 파일 이름",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" 에서 \"{newName}\"(으)로 이름 변경함",
+ "Rename file" : "파일 이름 바꾸기",
+ "Folder" : "폴더",
+ "Pending" : "대기 중",
+ "Unknown date" : "알 수 없는 날짜",
+ "Clear filter" : "필터 지우기",
+ "Modified" : "수정됨",
+ "Search everywhere" : "모든 곳에서 찾기",
+ "Type" : "종류",
+ "Active filters" : "활성 필터",
+ "Remove filter" : "필터 삭제",
+ "Total rows summary" : "총 행 요약",
+ "Toggle selection for all files and folders" : "모든 파일 선택/선택해제",
+ "Name" : "이름",
+ "Size" : "크기",
+ "Actions" : "작업",
+ "(selected)" : "(선택됨)",
+ "List of files and folders." : "파일과 폴더의 목록",
+ "You have used your space quota and cannot upload files anymore." : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다.",
+ "Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
+ "File not found" : "파일을 찾을 수 없음",
+ "{usedQuotaByte} used" : "{usedQuotaByte} 사용",
+ "{used} of {quota} used" : "{quota} 중 {used} 사용함",
+ "{relative}% used" : "{relative}% 사용",
+ "Could not refresh storage stats" : "저장소 정보를 새로고칠 수 없음",
+ "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
+ "Storage information" : "저장소 정보",
+ "Storage quota" : "저장소 할당량",
+ "New folder" : "새 폴더",
+ "Create new folder" : "새 폴더 생성",
+ "This name is already in use." : "이 이름은 이미 사용 중입니다.",
+ "Create" : "생성",
+ "Fill template fields" : "양식 입력란 채우기",
+ "Submitting fields …" : "항목 제출 중 ...",
+ "Submit" : "제출",
"Choose a file or folder to transfer" : "이전할 파일이나 폴더 고르기",
"Transfer" : "이전",
"Transfer {path} to {userid}" : "{path}을(를) {userid}에게 이전하기",
"Invalid path selected" : "잘못된 경로가 선택됨",
+ "Unknown error" : "알 수 없는 오류",
"Ownership transfer request sent" : "소유권 이전 요청이 전송됨",
- "Cannot transfer ownership of a file or folder you don't own" : "내가 소유하지 않은 파일이나 폴더의 소유권을 이전할 수 없음",
- "Tags" : "태그",
- "Unable to change the favourite state of the file" : "파일의 즐겨찾기 상태를 변경할 수 없음",
+ "Cannot transfer ownership of a file or folder you do not own" : "내가 소유하지 않은 파일이나 폴더의 소유권을 이전할 수 없음",
+ "Transfer ownership of a file or folder" : "파일이나 폴더의 소유권 이전",
+ "Choose file or folder to transfer" : "이전할 파일이나 폴더 고르기",
+ "Change" : "변경",
+ "New owner" : "새 소유자",
+ "Keep {old}" : "{old} 보관",
+ "Keep without extension" : "연장하지 않고 보관",
+ "Use {new}" : "{new}사용",
+ "Remove extension" : "확장자 제거",
+ "Change file extension" : "파일 확장자 변경",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "\"{old}\" 파일 확장자를 \"{new}\"(으)로 바꾸면 파일을 읽지 못할 수 있습니다.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "\"{old}\" 파일 확장자를 제거하면 파일을 읽지 못할 수 있습니다.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "\"{new}\" 파일 확장자를 추가하면 파일을 읽지 못할 수 있습니다.",
+ "Do not show this dialog again." : "이 알림을 다시 보여주지 마세요.",
+ "Select file or folder to link to" : "링크할 파일이나 폴더 선택",
+ "Choose {file}" : "{file} 선택",
+ "Share" : "공유하기",
+ "Shared by link" : "링크로 공유됨",
+ "Shared" : "공유됨",
+ "Switch to list view" : "목록 보기로 전환",
+ "Switch to grid view" : "바둑판식 보기로 전환",
+ "The file could not be found" : "파일을 찾을 수 없음",
+ "Upload was cancelled by user" : "사용자에 의해 업로드가 취소됨",
+ "Not enough free space" : "남은 공간이 부족함",
+ "Operation is blocked by access control" : "접근 설정에 의해 동작이 차단됨",
+ "Error during upload: {message}" : "업로드 오류: {message}",
+ "Error during upload, status code {status}" : "업로드 중 오류 발생, 상태 코드 {status}",
+ "Unknown error during upload" : "업로드 중 알 수 없는 오류 발생",
+ "Loading current folder" : "현재 폴더를 불러오는 중",
+ "Retry" : "다시 시도",
+ "No files in here" : "여기에 파일 없음",
+ "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
+ "Go back" : "뒤로 가기",
+ "Views" : "보기",
+ "Files settings" : "파일 설정",
+ "Your files" : "내 파일",
+ "Open in files" : "파일에서 열기",
+ "File cannot be accessed" : "파일에 접근할 수 없음",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "파일을 찾을 수 없거나 볼 권한이 없습니다. 보낸 이에게 공유를 요청하세요.",
+ "Clipboard is not available" : "클립보드를 사용할 수 없습니다.",
+ "General" : "일반",
+ "All files" : "모든 파일",
+ "Personal files" : "개인 파일",
+ "Sort favorites first" : "즐겨찾기를 처음에 나열",
+ "Sort folders before files" : "폴더를 파일보다 먼저 정렬",
+ "Appearance" : "외형",
+ "Show hidden files" : "숨김 파일 보이기",
+ "Crop image previews" : "이미지 미리보기 확대",
+ "Additional settings" : "고급 설정",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "복사",
+ "Keyboard shortcuts" : "키보드 단축키",
+ "Rename" : "이름 바꾸기",
+ "Delete" : "삭제",
+ "Manage tags" : "태그 관리하기",
+ "Selection" : "선택",
+ "Select all files" : "모든 파일 선택",
+ "Deselect all" : "모두 선택 해제",
+ "Navigation" : "탐색",
+ "View" : "보기",
+ "Toggle grid view" : "그리드뷰 전환",
+ "Show those shortcuts" : "다음 단축키 표시",
+ "You" : "당신",
+ "Shared multiple times with different people" : "여러 사용자와 공유됨",
"Error while loading the file data" : "파일 데이터를 불러오는 중 오류 발생",
+ "Owner" : "소유자",
+ "Remove from favorites" : "즐겨찾기에서 삭제",
+ "Add to favorites" : "즐겨찾기에 추가",
+ "Tags" : "태그",
+ "Blank" : "여백",
+ "Unable to create new file from template" : "템플릿으로 새 파일을 만들 수 없음",
"Pick a template for {name}" : "{name}을(를) 위한 템플릿 선택",
- "Cancel" : "취소",
- "Create" : "생성",
"Create a new file with the selected template" : "선택한 템플릿으로 새 파일 만들기",
"Creating file" : "파일 만들기",
- "Blank" : "여백",
- "Unable to create new file from template" : "템플릿으로 새 파일을 만들 수 없음",
- "Set up templates folder" : "템플릿 폴더 설정",
+ "Save as {displayName}" : "{displayName}으로 저장하기",
+ "Save as …" : "... 으로 저장하기",
+ "Converting files …" : "파일 변환하기 ...",
+ "Failed to convert files: {message}" : "파일 변환에 실패함:{message}",
+ "All files failed to be converted" : "모든 파일이 변환에 실패했습니다.",
+ "Failed to convert files" : "파일 변환에 실패했습니다",
+ "Leave this share" : "이 공유에서 떠나기",
+ "Leave these shares" : "이 공유에서 떠나기",
+ "Disconnect storage" : "저장소 연결 해제",
+ "Disconnect storages" : "저장소 연결 끊기",
+ "Delete permanently" : "영구히 삭제",
+ "Delete and unshare" : "삭제 및 공유 해제",
+ "Delete file" : "파일 삭제",
+ "Delete files" : "파일 삭제",
+ "Delete folder" : "폴더 삭제",
+ "Delete folders" : "폴더 삭제",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count}개 항목을 영구적으로 삭제하려 합니다."],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count}개 항목을 삭제하려 합니다."],
+ "Confirm deletion" : "삭제 확인",
+ "Cancel" : "취소",
+ "Download" : "다운로드",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\"을(를) \"{destination}\"(으)로 이동...",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\"을(를) \"{destination}\"(으)로 복사...",
+ "Destination is not a folder" : "대상이 폴더가 아닙니다.",
+ "This file/folder is already in that directory" : "이 파일/폴더가 이미 그 경로에 있습니다.",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "파일/폴더를 그 안이나 그 안의 폴더로 이동할 수 없습니다.",
+ "(copy)" : "(복사)",
+ "(copy %n)" : "(%n 복사)",
+ "A file or folder with that name already exists in this folder" : "같은 이름을 사용하는 파일 또는 폴더가 이미 이 폴더에 있습니다.",
+ "The files are locked" : "이 파일은 잠겼습니다",
+ "The file does not exist anymore" : "파일이 더이상 존재하지 않습니다.",
+ "Choose destination" : "목적지 선택",
+ "Copy to {target}" : "{target}에 복사",
+ "Move to {target}" : "{target}에 이동",
+ "Move" : "이동",
+ "Move or copy operation failed" : "이동 또는 복사 작업에 실패함",
+ "Move or copy" : "이동이나 복사",
+ "Open folder {displayName}" : "{displayName} 폴더 열기",
+ "Open in Files" : "파일에서 열기",
+ "Open locally" : "로컬에서 열기",
+ "Failed to redirect to client" : "클라이언트로 리디렉션 하는데 실패함",
+ "Open file locally" : "로컬에서 파일 열기",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "이제 이 파일이 당신의 기기에서 열려야 합니다. 그렇지 않다면, 데스크톱 앱이 설치되어 있는지 확인하세요.",
+ "Retry and close" : "재시도 후 닫기",
+ "Details" : "자세한 정보",
+ "View in folder" : "폴더에서 보기",
+ "Today" : "오늘",
+ "Last 7 days" : "지난 7일",
+ "Last 30 days" : "지난 30일",
+ "This year ({year})" : "올해 ({year})",
+ "Last year ({year})" : "작년 ({year})",
+ "Documents" : "문서",
+ "Spreadsheets" : "스프레드시트",
+ "Presentations" : "프레젠테이션",
+ "PDFs" : "PDF",
+ "Folders" : "폴더",
+ "Audio" : "오디오",
+ "Images" : "이미지",
+ "Videos" : "동영상",
+ "Created new folder \"{name}\"" : "\"{name}\" 폴더를 새로 만듦",
+ "Unable to initialize the templates directory" : "템플릿 디렉터리를 설정할 수 없음",
+ "Create templates folder" : "템플릿 폴더 만들기",
"Templates" : "템플릿",
- "%s used" : "%s 사용함",
- "%1$s of %2$s used" : "%2$s 중 %1$s 사용됨",
- "Settings" : "설정",
- "Show hidden files" : "숨김 파일 보이기",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하십시오",
- "Toggle grid view" : "모눈 보기 전환",
- "No files in here" : "여기에 파일 없음",
- "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
+ "New template folder" : "새 템플릿 폴더",
+ "In folder" : "폴더에서",
+ "Search in folder: {folder}" : "폴더에서 검색: {folder}",
+ "One of the dropped files could not be processed" : "드롭한 파일 중 하나를 처리할 수 없습니다",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "이 브라우저는 Filesystem API를 지원하지 않습니다. 디렉토리가 업로드 되지 않을 것입니다.",
+ "No files to upload" : "업로드할 파일이 없음",
+ "Unable to create the directory {directory}" : "디렉토리 {directory}을(를) 생성할 수 없음",
+ "Some files could not be uploaded" : "일부 파일을 업로드할 수 없었습니다.",
+ "Files uploaded successfully" : "파일을 성공적으로 업로드했습니다.",
+ "No files to process" : "처리할 파일이 없음",
+ "Some files could not be copied" : "일부 파일을 복사할 수 없음",
+ "Some files could not be moved" : "일부 파일을 이동할 수 없음",
+ "Files copied successfully" : "파일을 성공적으로 복사함",
+ "Files moved successfully" : "파일을 성공적으로 이동함",
+ "Conflicts resolution skipped" : "충돌 해결 건너뜀",
+ "Upload cancelled" : "업로드가 취소됨",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\"(이)가 더이상 존재하지 않아 이름을 바꿀 수 없습니다.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" 이름이 \"{dir}\" 폴더에서 이미 사용 중입니다. 다른 이름을 고르세요.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\"의 이름을 바꿀 수 없음",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음",
+ "Unexpected error: {error}" : "예상치 못한 오류: {error}",
+ "_%n file_::_%n files_" : ["파일 %n개"],
+ "_%n folder_::_%n folders_" : ["폴더 %n개"],
+ "Filename must not be empty." : "파일 이름을 비울 수 없습니다.",
+ "\"{char}\" is not allowed inside a filename." : "파일 이름에 \"{char}\"(을)를 사용할 수 없습니다.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\"(은)는 예약된 이름이므로 파일 이름에 사용할 수 없습니다.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\"(은)는 허용된 파일 형식이 아닙니다.",
+ "Filenames must not end with \"{extension}\"." : "파일 이름은 \"{extension}\"(으)로 끝나야 합니다.",
+ "List of favorite files and folders." : "즐겨찾는 파일과 폴더의 목록",
+ "No favorites yet" : "즐겨찾는 항목 없음",
+ "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다",
+ "List of your files and folders." : "내 폴더와 파일의 목록",
+ "List of your files and folders that are not shared." : "공유되지 않는 파일과 폴더의 목록",
+ "No personal files found" : "개인 파일을 찾을 수 없음",
+ "Files that are not shared will show up here." : "공유되지 않는 파일이 이곳에 나타납니다.",
+ "Recent" : "최근",
+ "List of recently modified files and folders." : "최근에 수정된 파일과 폴더의 목록",
+ "No recently modified files" : "최근에 수정된 파일 없음",
+ "Files and folders you recently modified will show up here." : "최근에 수정한 파일과 폴더가 이곳에 표시됩니다.",
+ "Search" : "검색",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
"Upload too large" : "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
- "No favorites yet" : "즐겨찾는 항목 없음",
- "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다",
- "Deleted files" : "삭제된 파일",
- "Shares" : "공유",
- "Shared with others" : "다른 사람과 공유됨",
- "Shared with you" : "나와 공유됨",
- "Shared by link" : "링크로 공유됨",
- "Deleted shares" : "삭제된 공유",
- "Pending shares" : "진행중인 공유",
+ "File could not be found" : "파일을 찾을 수 없음",
+ "Show list view" : "리스트 보기",
+ "Show grid view" : "바둑판식 보기",
+ "Close" : "닫기",
+ "Could not create folder \"{dir}\"" : "폴더 \"{dir}\"을(를) 만들 수 없음",
+ "This will stop your current uploads." : "이것은 현재 업로드를 중단시킬 것입니다.",
+ "Upload cancelled." : "업로드가 취소되었습니다.",
+ "Processing files …" : "파일 처리중 ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "남은 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 남아 있습니다",
+ "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다",
+ "An unknown error has occurred" : "알 수 없는 오류 발생",
+ "File could not be uploaded" : "파일을 업로드할 수 없음",
+ "Uploading …" : "업로드 중…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "업로드 중… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
+ "Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다.",
+ "Error when assembling chunks, status code {status}" : "조각을 모으는 중 오류 발생, 상태 코드 {status}",
+ "Choose target folder" : "폴더 선택",
+ "Set reminder" : "알림 설정",
+ "Edit locally" : "로컬에서 편집",
+ "Open" : "열기",
+ "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음",
+ "Please select tag(s) to add to the selection" : "선택한 항목에 추가할 태그를 고르세요.",
+ "Apply tag(s) to selection" : "선택한 항목에 태그 적용하기",
+ "Select directory \"{dirName}\"" : "디렉터리 \"{dirName}\" 선택",
+ "Select file \"{fileName}\"" : "파일 \"{fileName}\" 선택",
+ "Unable to determine date" : "날짜를 결정할 수 없음",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
+ "Could not move \"{file}\", target exists" : "\"{file}\"을(를) 이동할 수 없음, 대상이 존재함",
+ "Could not move \"{file}\"" : "\"{file}\"을(를) 이동할 수 없음",
+ "copy" : "복사",
+ "Could not copy \"{file}\", target exists" : "\"{file}\"을(를) 복사할 수 없음, 대상이 존재함",
+ "Could not copy \"{file}\"" : "\"{file}\"을(를) 복사할 수 없음",
+ "Copied {origin} inside {destination}" : "{origin}을(를) {destination}(으)로 복사함",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} 및 다른 파일 {nbfiles}개를 {destination}(으)로 복사함",
+ "{newName} already exists" : "{newName}이(가) 이미 존재함",
+ "Could not create file \"{file}\"" : "\"{file}\"을(를) 만들 수 없음",
+ "Could not create file \"{file}\" because it already exists" : "파일이 이미 존재하므로 \"{file}\"을(를) 만들 수 없음",
+ "Could not create folder \"{dir}\" because it already exists" : "폴더가 이미 존재하므로 폴더 \"{dir}\"을(를) 만들 수 없음",
+ "Could not fetch file details \"{file}\"" : "\"{file}\"의 세부사항을 불러올 수 없음",
+ "Error deleting file \"{fileName}\"." : "파일 \"{fileName}\"을(를) 삭제할 수 없습니다.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음",
+ "Enter more than two characters to search in other folders" : "다른 폴더에서 검색하기 위해 2글자 이상 입력하세요.",
+ "{dirs} and {files}" : "{dirs} 그리고 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n개의 숨겨진 파일 포함"],
+ "You do not have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다.",
+ "_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
+ "New" : "새 파일",
+ "New file/folder menu" : "새 파일/폴더 메뉴",
+ "Select file range" : "파일 범위 선택",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} 사용함",
+ "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
+ "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
+ "\"/\" is not allowed inside a file name." : "파일 이름에 \"/\"를 사용할 수 없습니다.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}의 저장 공간이 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "그룹 폴더 \"{mountPoint}\"이(가) 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "외부 저장소 \"{mountPoint}\"이(가) 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "저장 공간이 거의 가득 찼습니다. ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["'{filter}'와(과) 일치"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "직접 링크를 복사했습니다. (이 파일 및 폴더에 접근할 수 있는 사람에게만 작동)",
+ "Path" : "경로",
+ "_%n byte_::_%n bytes_" : ["%n 바이트"],
+ "Favored" : "선호함",
+ "Favor" : "선호",
+ "Copy direct link (only works for people who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)",
+ "Upload file" : "파일 업로드",
+ "Not favored" : "선호하지 않음",
+ "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생",
+ "Upload (max. %s)" : "업로드(최대 %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" 작업을 성공적으로 실행함",
+ "\"{displayName}\" action failed" : "\"{displayName}\" 작업을 실패함",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" 일부 요소로 실패",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" 일괄 작업을 성공적으로 실행함",
+ "Submitting fields…" : "입력란 제출중...",
+ "Filter filenames…" : "파일 이름 필터...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL이 클립보드에 복사됨",
+ "Enable the grid view" : "바둑판식 보기 활성화",
+ "Enable folder tree" : "폴더 트리 활성화",
+ "Copy to clipboard" : "클립보드로 복사",
+ "Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
+ "Deletion cancelled" : "삭제가 취소됨",
+ "Move cancelled" : "이동이 취소됨",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\"의 이동 또는 복사를 취소했습니다.",
+ "Cancelled move or copy operation" : "이동 또는 복사 작업을 취소함",
+ "Open details" : "자세한 정보 열기",
+ "Photos and images" : "사진과 이미지",
+ "New folder creation cancelled" : "새 폴더 생성 취소됨",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1개 파일과 {folderCount}개 폴더"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount}개 파일과 1개 폴더"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount}개 파일과 {folderCount}개 폴더",
+ "All folders" : "모든 폴더",
+ "Personal Files" : "개인 파일",
"Text file" : "텍스트 파일",
"New text file.txt" : "새 텍스트 파일.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "그룹 폴더 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "외부 저장소 \"{mountPoint}\"이(가) 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"]
+ "Speed up your Files experience with these quick shortcuts." : "이 빠른 단축키를 사용하여 파일 사용 속도를 높이세요.",
+ "Open the actions menu for a file" : "파일 작업 메뉴 열기",
+ "Rename a file" : "파일 이름 바꾸기",
+ "Delete a file" : "파일 삭제",
+ "Favorite or remove a file from favorites" : "즐겨찾기에 파일 등록 또는 제거",
+ "Manage tags for a file" : "파일 태그 관리",
+ "Deselect all files" : "모든 파일 선택 해제",
+ "Select or deselect a file" : "파일 선택 또는 선택 해제",
+ "Select a range of files" : "파일 범위 선택",
+ "Navigate to the parent folder" : "상위 폴더로 이동",
+ "Navigate to the file above" : "위 파일로 이동",
+ "Navigate to the file below" : "아래 파일로 이동",
+ "Navigate to the file on the left (in grid mode)" : "왼쪽 파일로 이동 (그리드 모드에서)",
+ "Navigate to the file on the right (in grid mode)" : "오른쪽 파일로 이동 (그리드 모드에서)",
+ "Toggle the grid view" : "바둑판식 보기 전환",
+ "Open the sidebar for a file" : "파일 사이드바 열기"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js
deleted file mode 100644
index 98149f7c47f..00000000000
--- a/apps/files/l10n/lb.js
+++ /dev/null
@@ -1,120 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Späicherplaatz temporär net erreeschbar",
- "Storage invalid" : "Späicherplatz net gülteg",
- "Unknown error" : "Et ass en onbekannte Fehler opgetrueden",
- "File could not be found" : "Datei konnt net fonnt ginn",
- "Download" : "Download",
- "Delete" : "Läschen",
- "Home" : "Doheem",
- "Close" : "Zoumaachen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Dossier \"{dir}\" konnt net erstallt ginn",
- "Upload cancelled." : "Upload ofgebrach.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} konnt eropgelueden ginn, well et een Dossier ass oder d'Datei 0 Bytes huet",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Net genuch Späicher, du probéiers {size1} eropzelueden, et ass awer nëmmen méi {size2} fräi",
- "Target folder \"{dir}\" does not exist any more" : "Den Dossier \"{dir}\" existéiert net méi",
- "Not enough free space" : "Nët genuch Späicherplaatz",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} vun {totalSize} ({bitrate})",
- "Actions" : "Aktiounen",
- "Rename" : "Ëmbenennen",
- "Delete folder" : "Dossier läschen",
- "Disconnect storage" : "Net connectéierten Späicher",
- "Could not load info for file \"{file}\"" : "Et konnten keng Informatiounen zu {file} gelueden ginn",
- "Files" : "Dateien",
- "Details" : "Detailer",
- "Select" : "Auswielen",
- "Pending" : "Ausstoend",
- "Unable to determine date" : "Datum kann net festgestallt ginn",
- "This operation is forbidden" : "Dës Operatioun ass verbueden.",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnt beweegt ginn. Et existéiert do schonn.",
- "Could not move \"{file}\"" : "\"{file}\" konnt verreckelt ginn",
- "{newName} already exists" : "{newName} gett et schon",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnt embenannt ginn, well et net méi existéiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" konnt net gesat ginn, well dësen schon am Dossier \"{dir}\" existéiert. Wiel weg. een aaneren",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" konnt net embenannt ginn",
- "Could not create file \"{file}\"" : "\"{file}\" konnt net erstallt ginn",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" konnt net erstallt ginn, well des schon existéiert",
- "Could not create folder \"{dir}\" because it already exists" : "Den Dossier \"{dir}\" konnt net erstallt ginn, well desen schon existéiert",
- "Error deleting file \"{fileName}\"." : "Fehler beim läschen vun \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keng Resultater an aneren Dossieren fir {tag}{filter}{endtag} fonnt",
- "Name" : "Numm",
- "Size" : "Gréisst",
- "Modified" : "Geännert",
- "_%n folder_::_%n folders_" : ["¦%n Dossier","¦%n Dossieren"],
- "_%n file_::_%n files_" : ["¦%n Datei","¦%n Dateien"],
- "{dirs} and {files}" : "{dirs} an {files}",
- "_including %n hidden_::_including %n hidden_" : ["Beinhaltet ¦%n verstoppte Saach","Beinhaltet ¦%n verstoppte Saachen"],
- "You don’t have permission to upload or create files here" : "Du hues net genuch Rechter hei Dokumenter eropzelueden oder ze erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["Am Gaangen ¦%n Datei eropzelueden","Am Gaangen ¦%n Dateien eropzelueden"],
- "New" : "Nei",
- "\"{name}\" is an invalid file name." : "\"{name}\" ass een ongültegen Numm",
- "File name cannot be empty." : "D'Datei kann net eidel sinn",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" ass een ongültegen Typ vun Datei",
- "View in folder" : "Kuk am Dossier ",
- "Copied!" : "Kopéiert!",
- "Path" : "Pad",
- "_%n byte_::_%n bytes_" : ["¦%n Byte","¦%n Byte"],
- "Favorited" : "Favoriséiert",
- "Favorite" : "Favorit",
- "New folder" : "Neien Dossier",
- "Upload file" : "Upload file",
- "Recent" : "Rezent",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Beim Updaten vun den Tags ass e Fehler entstaanen",
- "Added to favorites" : "Zu den Favoriten dobaigesat",
- "Removed from favorites" : "Vun den Favoriten eweggeholl",
- "You added {file} to your favorites" : "Du hues {file} zu denger Favortiten dobäigesat",
- "You removed {file} from your favorites" : "Du hues {file} aus dengen Favortiten geläscht",
- "File changes" : "Datei Ännerungen",
- "Created by {user}" : "Erstallt vum {user}",
- "Changed by {user}" : "Geännert vum {user}",
- "Deleted by {user}" : "Geläscht vum {user}",
- "Restored by {user}" : "Erem hier gestallt vum {user}",
- "Renamed by {user}" : "Embenannt vum {user}",
- "Moved by {user}" : "Beweegt vum {user}",
- "\"remote user\"" : "\"Remote-Benotzer\"",
- "You created {file}" : "Du hues {file} erstallt",
- "{user} created {file}" : "Den {user} huet {file} erstallt",
- "{file} was created in a public folder" : "{file} ass an engem ëffentlechen Dossier erstallt ginn",
- "You changed {file}" : "Du hues {file} verännert",
- "{user} changed {file}" : "Den {user} huet {file} verännert",
- "You deleted {file}" : "Du hues {file} geläscht",
- "{user} deleted {file}" : "Den {user} huet {file} geläscht",
- "You restored {file}" : "Du hues {file} erem hier gestallt",
- "{user} restored {file}" : "Den {user} huet {file} erem hier gestallt",
- "You renamed {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} embenannt",
- "{user} renamed {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} embenannt",
- "You moved {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} verreckelt",
- "{user} moved {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} verreckelt",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Eng Datei gouf zu dengen Favoriten <strong> dobäigesat </strong> oder aus dengen Favortien <strong> geläscht </strong>",
- "All files" : "All d'Fichieren",
- "Upload (max. %s)" : "Upload (maximal ¦%s)",
- "in %s" : "an %s",
- "Tags" : "Tags",
- "Cancel" : "Ofbriechen",
- "Create" : "Erstellen",
- "Settings" : "Astellungen",
- "Show hidden files" : "Weis déi verstoppten Dateien",
- "WebDAV" : "WebDAV",
- "No files in here" : "Keng Dokumenter hei",
- "Upload some content or sync with your devices!" : "Lued Dateien erop oder synchroniséier se mat dengen Appartaten",
- "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
- "Select all" : "All auswielen",
- "Upload too large" : "Upload ze grouss",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
- "Files and folders you mark as favorite will show up here" : "Hei gesais du deng Favoriten",
- "Deleted files" : "Geläschten Dateien",
- "Shared with others" : "Mat aaneren gedeelt",
- "Shared with you" : "Mat dir gedeelt",
- "Shared by link" : "Mat engem Link gedeelt",
- "Text file" : "Text Fichier",
- "New text file.txt" : "Neien Text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Späicher vum {owener} ass voll, et kennen keng Dokumenter méi eropgelueden oder synchroniséiert ginn!",
- "Your storage is full, files can not be updated or synced anymore!" : "Däin Späicher ass voll, et kennen keng Dateien méi eropgeluden oder synchrosniséiert ginn",
- "_matches '{filter}'_::_match '{filter}'_" : ["entsprecht","entspriechen"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json
deleted file mode 100644
index d1e0cac2e8d..00000000000
--- a/apps/files/l10n/lb.json
+++ /dev/null
@@ -1,118 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Späicherplaatz temporär net erreeschbar",
- "Storage invalid" : "Späicherplatz net gülteg",
- "Unknown error" : "Et ass en onbekannte Fehler opgetrueden",
- "File could not be found" : "Datei konnt net fonnt ginn",
- "Download" : "Download",
- "Delete" : "Läschen",
- "Home" : "Doheem",
- "Close" : "Zoumaachen",
- "Favorites" : "Favoriten",
- "Could not create folder \"{dir}\"" : "Dossier \"{dir}\" konnt net erstallt ginn",
- "Upload cancelled." : "Upload ofgebrach.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} konnt eropgelueden ginn, well et een Dossier ass oder d'Datei 0 Bytes huet",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Net genuch Späicher, du probéiers {size1} eropzelueden, et ass awer nëmmen méi {size2} fräi",
- "Target folder \"{dir}\" does not exist any more" : "Den Dossier \"{dir}\" existéiert net méi",
- "Not enough free space" : "Nët genuch Späicherplaatz",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} vun {totalSize} ({bitrate})",
- "Actions" : "Aktiounen",
- "Rename" : "Ëmbenennen",
- "Delete folder" : "Dossier läschen",
- "Disconnect storage" : "Net connectéierten Späicher",
- "Could not load info for file \"{file}\"" : "Et konnten keng Informatiounen zu {file} gelueden ginn",
- "Files" : "Dateien",
- "Details" : "Detailer",
- "Select" : "Auswielen",
- "Pending" : "Ausstoend",
- "Unable to determine date" : "Datum kann net festgestallt ginn",
- "This operation is forbidden" : "Dës Operatioun ass verbueden.",
- "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur",
- "Could not move \"{file}\", target exists" : "\"{file}\" konnt beweegt ginn. Et existéiert do schonn.",
- "Could not move \"{file}\"" : "\"{file}\" konnt verreckelt ginn",
- "{newName} already exists" : "{newName} gett et schon",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnt embenannt ginn, well et net méi existéiert",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" konnt net gesat ginn, well dësen schon am Dossier \"{dir}\" existéiert. Wiel weg. een aaneren",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" konnt net embenannt ginn",
- "Could not create file \"{file}\"" : "\"{file}\" konnt net erstallt ginn",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" konnt net erstallt ginn, well des schon existéiert",
- "Could not create folder \"{dir}\" because it already exists" : "Den Dossier \"{dir}\" konnt net erstallt ginn, well desen schon existéiert",
- "Error deleting file \"{fileName}\"." : "Fehler beim läschen vun \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Keng Resultater an aneren Dossieren fir {tag}{filter}{endtag} fonnt",
- "Name" : "Numm",
- "Size" : "Gréisst",
- "Modified" : "Geännert",
- "_%n folder_::_%n folders_" : ["¦%n Dossier","¦%n Dossieren"],
- "_%n file_::_%n files_" : ["¦%n Datei","¦%n Dateien"],
- "{dirs} and {files}" : "{dirs} an {files}",
- "_including %n hidden_::_including %n hidden_" : ["Beinhaltet ¦%n verstoppte Saach","Beinhaltet ¦%n verstoppte Saachen"],
- "You don’t have permission to upload or create files here" : "Du hues net genuch Rechter hei Dokumenter eropzelueden oder ze erstellen",
- "_Uploading %n file_::_Uploading %n files_" : ["Am Gaangen ¦%n Datei eropzelueden","Am Gaangen ¦%n Dateien eropzelueden"],
- "New" : "Nei",
- "\"{name}\" is an invalid file name." : "\"{name}\" ass een ongültegen Numm",
- "File name cannot be empty." : "D'Datei kann net eidel sinn",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" ass een ongültegen Typ vun Datei",
- "View in folder" : "Kuk am Dossier ",
- "Copied!" : "Kopéiert!",
- "Path" : "Pad",
- "_%n byte_::_%n bytes_" : ["¦%n Byte","¦%n Byte"],
- "Favorited" : "Favoriséiert",
- "Favorite" : "Favorit",
- "New folder" : "Neien Dossier",
- "Upload file" : "Upload file",
- "Recent" : "Rezent",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Beim Updaten vun den Tags ass e Fehler entstaanen",
- "Added to favorites" : "Zu den Favoriten dobaigesat",
- "Removed from favorites" : "Vun den Favoriten eweggeholl",
- "You added {file} to your favorites" : "Du hues {file} zu denger Favortiten dobäigesat",
- "You removed {file} from your favorites" : "Du hues {file} aus dengen Favortiten geläscht",
- "File changes" : "Datei Ännerungen",
- "Created by {user}" : "Erstallt vum {user}",
- "Changed by {user}" : "Geännert vum {user}",
- "Deleted by {user}" : "Geläscht vum {user}",
- "Restored by {user}" : "Erem hier gestallt vum {user}",
- "Renamed by {user}" : "Embenannt vum {user}",
- "Moved by {user}" : "Beweegt vum {user}",
- "\"remote user\"" : "\"Remote-Benotzer\"",
- "You created {file}" : "Du hues {file} erstallt",
- "{user} created {file}" : "Den {user} huet {file} erstallt",
- "{file} was created in a public folder" : "{file} ass an engem ëffentlechen Dossier erstallt ginn",
- "You changed {file}" : "Du hues {file} verännert",
- "{user} changed {file}" : "Den {user} huet {file} verännert",
- "You deleted {file}" : "Du hues {file} geläscht",
- "{user} deleted {file}" : "Den {user} huet {file} geläscht",
- "You restored {file}" : "Du hues {file} erem hier gestallt",
- "{user} restored {file}" : "Den {user} huet {file} erem hier gestallt",
- "You renamed {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} embenannt",
- "{user} renamed {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} embenannt",
- "You moved {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} verreckelt",
- "{user} moved {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} verreckelt",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Eng Datei gouf zu dengen Favoriten <strong> dobäigesat </strong> oder aus dengen Favortien <strong> geläscht </strong>",
- "All files" : "All d'Fichieren",
- "Upload (max. %s)" : "Upload (maximal ¦%s)",
- "in %s" : "an %s",
- "Tags" : "Tags",
- "Cancel" : "Ofbriechen",
- "Create" : "Erstellen",
- "Settings" : "Astellungen",
- "Show hidden files" : "Weis déi verstoppten Dateien",
- "WebDAV" : "WebDAV",
- "No files in here" : "Keng Dokumenter hei",
- "Upload some content or sync with your devices!" : "Lued Dateien erop oder synchroniséier se mat dengen Appartaten",
- "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
- "Select all" : "All auswielen",
- "Upload too large" : "Upload ze grouss",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
- "Files and folders you mark as favorite will show up here" : "Hei gesais du deng Favoriten",
- "Deleted files" : "Geläschten Dateien",
- "Shared with others" : "Mat aaneren gedeelt",
- "Shared with you" : "Mat dir gedeelt",
- "Shared by link" : "Mat engem Link gedeelt",
- "Text file" : "Text Fichier",
- "New text file.txt" : "Neien Text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Späicher vum {owener} ass voll, et kennen keng Dokumenter méi eropgelueden oder synchroniséiert ginn!",
- "Your storage is full, files can not be updated or synced anymore!" : "Däin Späicher ass voll, et kennen keng Dateien méi eropgeluden oder synchrosniséiert ginn",
- "_matches '{filter}'_::_match '{filter}'_" : ["entsprecht","entspriechen"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/lo.js b/apps/files/l10n/lo.js
deleted file mode 100644
index 2d01379b83d..00000000000
--- a/apps/files/l10n/lo.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ",
- "Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ",
- "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ",
- "The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/lo.json b/apps/files/l10n/lo.json
deleted file mode 100644
index 12eea86a936..00000000000
--- a/apps/files/l10n/lo.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ",
- "Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ",
- "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ",
- "The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index c7539d4c6c4..916b645cef2 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -1,105 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
- "Storage invalid" : "Saugykla netinkama naudoti",
- "Unknown error" : "Nežinoma klaida",
- "File could not be found" : "Nepavyko rasti failo",
- "Move or copy" : "Perkelti ar kopijuoti",
- "Download" : "Atsisiųsti",
- "Delete" : "Ištrinti",
- "Home" : "Pagrindinis",
- "Close" : "Užverti",
- "Favorites" : "Mėgstami",
- "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko „{dir}“",
- "This will stop your current uploads." : "Tai sustabdys dabartinius įkėlimus.",
- "Upload cancelled." : "Įkėlimo atsisakyta.",
- "Processing files …" : "Apdorojami failai…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai yra katalogas arba šio failo dydis yra 0 baitų",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Jūs bandote įkelti {size1} dydžio bylą, bet liko tik {size2} vietos",
- "Target folder \"{dir}\" does not exist any more" : "Paskirties aplanko „{dir}“ daugiau nebėra",
- "Not enough free space" : "Trūksta laisvos vietos",
- "An unknown error has occurred" : "Įvyko nežinoma klaida",
- "Uploading …" : "Įkeliama…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} iš {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "To elemento įkėlimas nėra palaikomas",
- "Target folder does not exist any more" : "Paskirties aplanko daugiau nebėra",
- "Operation is blocked by access control" : "Operacija yra užblokuota prieigos valdymo",
- "Error when assembling chunks, status code {status}" : "Klaida surenkant dalis, klaidos kodas {status}",
- "Actions" : "Veiksmai",
- "Rename" : "Pervadinti",
- "Copy" : "Kopijuoti",
- "Choose target folder" : "Pasirinkite paskirties aplanką",
- "Open" : "Atverti",
- "Delete file" : "Ištrinti failą",
- "Delete folder" : "Ištrinti aplanką",
- "Disconnect storage" : "Atjungti saugyklą",
- "Could not load info for file \"{file}\"" : "Nepavyko įkelti informacijos failui „{file}“",
- "Files" : "Failai",
- "Details" : "Duomenys",
- "Select" : "Pasirinkti",
- "Pending" : "Laukiantis",
- "Unable to determine date" : "Nepavyksta nustatyti datos",
- "This operation is forbidden" : "Ši operacija yra uždrausta",
- "This directory is unavailable, please check the logs or contact the administrator" : "Šis katalogas neprieinamas, peržiūrėkite žurnalo įrašus arba susisiekite su administratoriumi",
- "Could not move \"{file}\", target exists" : "Nepavyko perkelti „{file}“, toks failas jau yra",
- "Could not move \"{file}\"" : "Nepavyko perkelti „{file}“",
- "copy" : "kopija",
- "Could not copy \"{file}\", target exists" : "Nepavyko nukopijuoti \"{file}\", toks jau yra",
- "Could not copy \"{file}\"" : "Nepavyko nukopijuoti \"{file}\"",
- "Copied {origin} inside {destination}" : "Nukopijuota {origin} aplanke {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Nukopijuota {origin} ir dar {nbfiles} failus aplanke {destination}",
- "{newName} already exists" : "{newName} jau yra",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo „{fileName}“, jo daugiau nebėra",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas „{targetName}“ jau naudojamas aplanke „{dir}“. Pasirinkite kitokį pavadinimą.",
- "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo „{fileName}“",
- "Could not create file \"{file}\"" : "Nepavyko sukurti failo „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo „{file}“, nes jis jau yra",
- "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko „{dir}“, nes jis jau yra",
- "Could not fetch file details \"{file}\"" : "Nepavyko gauti išsamesnės failo \"{file}\" informacijos",
- "Error deleting file \"{fileName}\"." : "Klaida ištrinant failą „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Kituose aplankuose nėra paieškos rezultatų, skirtų {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Įveskite daugiau nei du simbolius, jei norite ieškoti kituose aplankuose",
- "Name" : "Pavadinimas",
- "Size" : "Dydis",
- "Modified" : "Pakeistas",
- "_%n folder_::_%n folders_" : ["%n aplankas","%n aplankai","%n aplankų","%n aplankas"],
- "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų","%n failas"],
- "{dirs} and {files}" : "{dirs} ir {files}",
- "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"],
- "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
- "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"],
- "New" : "Naujas",
- "Select file range" : "Žymėti failų rėžį",
- "{used} of {quota} used" : "panaudota {used} iš {quota}",
- "{used} used" : "{used} naudojama",
- "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
- "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
- "\"/\" is not allowed inside a file name." : "Failo pavadinime simbolis „/“ draudžiamas.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ nėra leidžiamas failo tipas",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Grupės aplankas \"{mountPoint}\" yra beveik pilnas ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Išorinė saugykla \"{mountPoint}\" yra beveik pilna ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Jūsų saugykla yra beveik pilna ({usedSpacePercent}%).",
- "View in folder" : "Rodyti aplanke",
- "Copied!" : "Nukopijuota!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopijuoti tiesioginę nuorodą (veiks tik naudotojams, turintiems prieigą prie šio failo/aplanko)",
- "Path" : "Kelias",
- "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų","%n baitų"],
- "Favorited" : "Pažymėtas mėgstamu",
- "Favorite" : "Mėgstamas",
- "You can only favorite a single file or folder at a time" : "Vienu metu galite pažymėti mėgstamu tik vieną failą ar aplanką",
- "New folder" : "Naujas aplankas",
- "Upload file" : "Įkelti failą",
- "Recent" : "Paskiausiai naudoti",
- "Not favorited" : "Nepažymėtas mėgstamu",
- "Remove from favorites" : "Šalinti iš mėgstamų",
- "Add to favorites" : "Pridėti į mėgstamus",
- "An error occurred while trying to update the tags" : "Bandant atnaujinti žymes įvyko klaida",
"Added to favorites" : "Pridėta į mėgstamus",
"Removed from favorites" : "Pašalintas iš mėgstamų",
"You added {file} to your favorites" : "Pridėjote {file} į savo mėgstamus",
"You removed {file} from your favorites" : "Pašalinote {file} iš mėgstamų",
+ "Favorites" : "Mėgstami",
"File changes" : "Failo pakeitimai",
"Created by {user}" : "Sukūrė {user}",
"Changed by {user}" : "Pakeitė {user}",
@@ -107,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Atkūrė {user}",
"Renamed by {user}" : "Pervadino {user}",
"Moved by {user}" : "Perkėlė {user}",
- "\"remote user\"" : "„nuotolinis naudotojas“",
+ "\"remote account\"" : "„nuotolinė paskyra“",
"You created {file}" : "Jūs sukūrėte {file}",
"You created an encrypted file in {file}" : "Sukūrėte užšifruotą failą {file}",
"{user} created {file}" : "{user} sukūrė {file}",
@@ -134,11 +40,15 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "{oldfile} perkeltas į {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} perkėlė {oldfile} į {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Failas buvo pridėtas arba pašalintas iš <strong>mėgstamų</strong>",
+ "Files" : "Failai",
"A file or folder has been <strong>changed</strong>" : "Buvo <strong>pakeistas</strong> failas ar aplankas",
"A favorite file or folder has been <strong>changed</strong>" : "Buvo <strong>pakeistas</strong> mėgstamas failas ar aplankas",
- "All files" : "Visi failai",
- "Unlimited" : "Neribotai",
- "Upload (max. %s)" : "Įkelti (maks. %s)",
+ "Invalid folder path" : "Neteisingas aplanko kelias",
+ "Folder not found" : "Aplankas nerastas",
+ "The file cannot be found" : "Failas negali būti surastas",
+ "The destination path does not exist: %1$s" : "Paskirties kelio nėra: %1$s",
+ "You do not have permission to create a file at the specified location" : "Jūs neturite leidimo sukurti failą nurodytoje vietoje",
+ "No favorites" : "Nėra mėgstamiausių",
"Accept" : "Priimti",
"Reject" : "Atmesti",
"Incoming ownership transfer from {user}" : "Gaunamasis nuosavybės perdavimas nuo {user}",
@@ -150,57 +60,266 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Jūsų {path} nuosavybės perdavimas naudotojui {user} užbaigtas.",
"The ownership transfer of {path} from {user} has completed." : "{path} nuosavybės perdavimas iš naudotojo {user} užbaigtas.",
"in %s" : "per %s",
+ "Files compatibility" : "Failų suderinamumas",
"File Management" : "Failų tvarkymas",
- "Transfer ownership of a file or folder" : "Perduoti failo ar aplanko nuosavybę",
- "Choose file or folder to transfer" : "Pasirinkti norimą perduoti failą ar aplanką",
- "Change" : "Keisti",
- "New owner" : "Naujasis savininkas",
- "Search users" : "Ieškoti naudotojų",
+ "Home" : "Pagrindinis",
+ "Target folder does not exist any more" : "Paskirties aplanko daugiau nebėra",
+ "Reload current directory" : "Įkelti dabartinį katalogą iš naujo",
+ "Drag and drop files here to upload" : "Tempkite failus čia norėdami išsiųsti",
+ "Favorite" : "Mėgstamas",
+ "Back" : "Atgal",
+ "File is loading" : "Failas yra įkeliamas",
+ "Folder is loading" : "Aplankas yra įkeliamas",
+ "Filename" : "Failo pavadinimas",
+ "Folder name" : "Aplanko pavadinimas",
+ "Invalid filename." : "Neteisingas failo pavadinimas.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "„{oldName}“ pervadintas į „{newName}“",
+ "Rename file" : "Pervadinti failą",
+ "Folder" : "Aplankas",
+ "Pending" : "Laukiantis",
+ "Unknown date" : "Nežinoma data",
+ "Clear filter" : "Išvalyti filtrą",
+ "Modified" : "Pakeistas",
+ "Type" : "Tipas",
+ "Active filters" : "Aktyvūs filtrai",
+ "Remove filter" : "Šalinti filtrą",
+ "Name" : "Pavadinimas",
+ "Size" : "Dydis",
+ "Actions" : "Veiksmai",
+ "List of files and folders." : "Failų ir aplankų sąrašas.",
+ "File not found" : "Failas nerastas",
+ "{usedQuotaByte} used" : "Naudojama {usedQuotaByte}",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
+ "{relative}% used" : "Naudojama {relative}",
+ "Could not refresh storage stats" : "Nepavyko iš naujo įkelti saugyklos statistikos",
+ "Your storage is full, files can not be updated or synced anymore!" : "Jūsų saugykla pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
+ "Storage information" : "Informacija apie saugyklą",
+ "New folder" : "Naujas aplankas",
+ "Create new folder" : "Sukurti naują aplanką",
+ "This name is already in use." : "Šis pavadinimas jau yra naudojamas.",
+ "Create" : "Sukurti",
+ "Submit" : "Pateikti",
"Choose a file or folder to transfer" : "Pasirinkite norimą perduoti failą ar aplanką",
"Transfer" : "Perduoti",
"Transfer {path} to {userid}" : "Perduoti {path} naudotojui {userid}",
"Invalid path selected" : "Pasirinktas neteisingas kelias",
+ "Unknown error" : "Nežinoma klaida",
"Ownership transfer request sent" : "Nuosavybės perdavimo užklausa išsiųsta",
- "Cannot transfer ownership of a file or folder you don't own" : "Negalima perduoti, failo aplanko, kuris jums nepriklauso, nuosavybės",
- "Tags" : "Žymės",
- "Unable to change the favourite state of the file" : "Nepavyksta pakeisti failo Lankomiausiųjų būsenos",
+ "Transfer ownership of a file or folder" : "Perduoti failo ar aplanko nuosavybę",
+ "Choose file or folder to transfer" : "Pasirinkti norimą perduoti failą ar aplanką",
+ "Change" : "Keisti",
+ "New owner" : "Naujasis savininkas",
+ "Choose {file}" : "Pasirinkti{file}",
+ "Share" : "Bendrinti",
+ "Shared by link" : "Bendrinama pagal nuorodą",
+ "Shared" : "Bendrinama",
+ "Switch to list view" : "Perjungti į sąrašo rodinį",
+ "Switch to grid view" : "Perjungti į tinklelio rodinį",
+ "The file could not be found" : "Failas nerastas",
+ "Upload was cancelled by user" : "Įkelimas buvo atšauktas vartotojo",
+ "Not enough free space" : "Trūksta laisvos vietos",
+ "Operation is blocked by access control" : "Operacija yra užblokuota prieigos valdymo",
+ "Error during upload: {message}" : "Įkėlimo klaida: {message}",
+ "Loading current folder" : "Įkeliamas dabartinis aplankas",
+ "Retry" : "Bandyti dar kartą",
+ "No files in here" : "Čia failų nėra",
+ "Upload some content or sync with your devices!" : "Įkelkite failus arba sinchronizuokite su savo įrenginiais!",
+ "Go back" : "Grįžti",
+ "Views" : "Rodiniai",
+ "Files settings" : "Failų nustatymai",
+ "Your files" : "Jūsų failai",
+ "File cannot be accessed" : "Nepavyksta gauti prieigos prie failo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nepavyko surasti failo arba jūs neturite leidimo jo peržiūrėti. Paprašykite siuntėjo, kad pradėtų jį su jumis bendrinti.",
+ "Clipboard is not available" : "Iškarpinė neprieinama",
+ "General" : "Bendra",
+ "All files" : "Visi failai",
+ "Personal files" : "Asmeniniai failai",
+ "Appearance" : "Išvaizda",
+ "Show hidden files" : "Rodyti paslėptus failus",
+ "Crop image previews" : "Apkirpti paveikslėlių peržiūras",
+ "Additional settings" : "Papildomi nustatymai",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Kopijuoti",
+ "Warnings" : "Įspėjimai",
+ "Keyboard shortcuts" : "Spartieji klavišai",
+ "Rename" : "Pervadinti",
+ "Delete" : "Ištrinti",
+ "Manage tags" : "Tvarkyti žymas",
+ "Selection" : "Pasirinkimas",
+ "Deselect all" : "Panaikinti pasirinkimą",
+ "Navigation" : "Navigacija",
+ "View" : "Rodyti",
+ "Toggle grid view" : "Rodyti tinkleliu",
+ "You" : "Jūs",
"Error while loading the file data" : "Klaida įkeliant failo duomenis",
+ "Owner" : "Savivinkas",
+ "Remove from favorites" : "Šalinti iš mėgstamų",
+ "Add to favorites" : "Pridėti į mėgstamus",
+ "Tags" : "Žymos",
+ "Unable to create new file from template" : "Nepavyko sukurti naujo failo iš šablono",
"Pick a template for {name}" : "Pasirinkite šabloną, skirtą {name}",
- "Cancel" : "Atsisakyti",
- "Create" : "Sukurti",
"Create a new file with the selected template" : "Sukurti naują failą naudojant pasirinktą šabloną",
"Creating file" : "Sukuriamas failas",
- "Unable to create new file from template" : "Nepavyko sukurti naujo failo iš šablono",
- "Templates" : "Šablonai",
+ "Save as {displayName}" : "Įrašyti kaip {displayName}",
+ "Save as …" : "Įrašyti kaip…",
+ "Leave this share" : "Palikti bendrinimą",
+ "Disconnect storage" : "Atjungti saugyklą",
+ "Delete permanently" : "Ištrinti negrįžtamai",
+ "Delete and unshare" : "Ištrinti ir nebebendrinti",
+ "Delete file" : "Ištrinti failą",
+ "Delete files" : "Ištrinti failus",
+ "Delete folder" : "Ištrinti aplanką",
+ "Delete folders" : "Ištrinti aplankus",
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Jūs ketinate ištrinti {count} elementą","Jūs ketinate ištrinti {count} elementus","Jūs ketinate ištrinti {count} elementų","Jūs ketinate ištrinti {count} elementą"],
+ "Cancel" : "Atsisakyti",
+ "Download" : "Atsisiųsti",
+ "Moving \"{source}\" to \"{destination}\" …" : "Perkeliama „{source}“ į „{destination}“…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopijuojama „{source}“ į „{destination}“…",
+ "(copy)" : "(kopija)",
+ "(copy %n)" : "(kopija %n)",
+ "The files are locked" : "Failai yra užrakinti",
+ "The file does not exist anymore" : "Failo daugiau nebėra",
+ "Copy to {target}" : "Kopijuoti į {target}",
+ "Move to {target}" : "Perkelti į {target}",
+ "Move" : "Perkelti",
+ "Move or copy operation failed" : "Perkėlimo ar kopijavimo operacija patyrė nesėkmę",
+ "Move or copy" : "Perkelti ar kopijuoti",
+ "Open folder {displayName}" : "Atverti aplanką {displayName}",
+ "Failed to redirect to client" : "Nepavyko peradresuoti į klientą",
+ "Retry and close" : "Bandyti dar kartą ir užverti",
+ "Details" : "Išsamiau",
+ "View in folder" : "Rodyti aplanke",
+ "Today" : "Šiandien",
+ "Last 7 days" : "Paskutinės 7 dienos",
+ "Last 30 days" : "Paskutinės 30 dienų",
+ "Documents" : "Dokumentai",
+ "Spreadsheets" : "Skaičiuoklės",
+ "Presentations" : "Pateiktys",
+ "PDFs" : "PDF dokumentai",
+ "Folders" : "Aplankai",
+ "Audio" : "Garso įrašai",
+ "Images" : "Paveikslai",
+ "Videos" : "Vaizdo įrašai",
+ "Created new folder \"{name}\"" : "Sukurtas naujas aplankas „{name}“",
"Unable to initialize the templates directory" : "Nepavyko inicijuoti šablonų katalogo",
- "%s used" : "%s panaudota",
- "%s%% of %s used" : "naudojama %s%% iš %s",
- "%1$s of %2$s used" : "naudojama %1$s iš %2$s",
- "Settings" : "Nustatymai",
- "Show hidden files" : "Rodyti paslėptus failus",
- "Crop image previews" : "Apkirpti paveikslų peržiūras",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
- "Toggle grid view" : "Rodyti tinkleliu",
- "No files in here" : "Čia failų nėra",
- "Upload some content or sync with your devices!" : "Įkelkite failus arba sinchronizuokite su savo įrenginiais!",
+ "Create templates folder" : "Sukurti šablonų aplanką",
+ "Templates" : "Šablonai",
+ "Search in folder: {folder}" : "Ieškoti aplanke: {folder}",
+ "Unable to create the directory {directory}" : "Nepavyko sukurti katalogo {directory}",
+ "Some files could not be copied" : "Kai kurių failų nepavyko nukopijuoti",
+ "Some files could not be moved" : "Kai kurių failų nepavyko perkelti",
+ "Files copied successfully" : "Failai sėkmingai nukopijuoti",
+ "Files moved successfully" : "Failai sėkmingai perkelti",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nepavyko pervadinti failo „{oldName}“, jo daugiau nebėra",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas „{newName}“ jau naudojamas aplanke „{dir}“. Pasirinkite kitokį pavadinimą.",
+ "Could not rename \"{oldName}\"" : "Nepavyko pervadinti „{oldName}“",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
+ "Unexpected error: {error}" : "Netikėta klaida: {error}",
+ "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų","%n failas"],
+ "_%n folder_::_%n folders_" : ["%n aplankas","%n aplankai","%n aplankų","%n aplankas"],
+ "Filename must not be empty." : "Failo pavadinimas negali būti tuščias.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ yra rezervuotas pavadinimas ir neleidžiamas naudoti failo pavadinimuose.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ nėra leidžiamas failo tipas.",
+ "No favorites yet" : "Kol kas nėra mėgstamų",
+ "Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
+ "List of your files and folders." : "Jūsų failų ir aplankų sąrašas.",
+ "No personal files found" : "Nerasta jokių asmeninių failų",
+ "Recent" : "Paskiausiai naudoti",
+ "List of recently modified files and folders." : "Paskiausiai modifikuotų failų ir aplankų sąrašas.",
+ "No recently modified files" : "Nėra jokių paskiausiai modifikuotų failų",
+ "Search" : "Paieška",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, šiame serveryje leidžiamų įkelti failų dydį.",
- "No favorites yet" : "Kol kas nėra mėgstamų",
- "Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
- "Deleted files" : "Ištrinti failai",
- "Shares" : "Viešiniai",
- "Shared with others" : "Bendrinama su kitais",
- "Shared with you" : "Bendrinama su jumis",
- "Shared by link" : "Bendrinama pagal nuorodą",
- "Deleted shares" : "Ištrinti viešiniai",
- "Pending shares" : "Laukiantys viešiniai",
+ "File could not be found" : "Nepavyko rasti failo",
+ "Show list view" : "Rodyti sąrašo rodinį",
+ "Show grid view" : "Rodyti tinklelio rodinį",
+ "Close" : "Užverti",
+ "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko „{dir}“",
+ "This will stop your current uploads." : "Tai sustabdys dabartinius įkėlimus.",
+ "Upload cancelled." : "Įkėlimo atsisakyta.",
+ "Processing files …" : "Apdorojami failai…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai yra katalogas arba šio failo dydis yra 0 baitų",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Jūs bandote įkelti {size1} dydžio bylą, bet liko tik {size2} vietos",
+ "Target folder \"{dir}\" does not exist any more" : "Paskirties aplanko „{dir}“ daugiau nebėra",
+ "An unknown error has occurred" : "Įvyko nežinoma klaida",
+ "File could not be uploaded" : "Nepavyko įkelti failo",
+ "Uploading …" : "Įkeliama…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} iš {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "To elemento įkėlimas nėra palaikomas",
+ "Error when assembling chunks, status code {status}" : "Klaida surenkant dalis, klaidos kodas {status}",
+ "Choose target folder" : "Pasirinkite paskirties aplanką",
+ "Set reminder" : "Nustatyti priminimą",
+ "Edit locally" : "Redaguoti lokaliai",
+ "Open" : "Atverti",
+ "Could not load info for file \"{file}\"" : "Nepavyko įkelti informacijos failui „{file}“",
+ "Please select tag(s) to add to the selection" : "Pasirinkite žymas, kurias pridėsite prie pažymėtų",
+ "Apply tag(s) to selection" : "Pritaikyti žymą(-as) pažymėtiems",
+ "Select directory \"{dirName}\"" : "Pasirinkite direktoriją \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Pasirinkite failą \"{fileName}\"",
+ "Unable to determine date" : "Nepavyksta nustatyti datos",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Šis katalogas neprieinamas, peržiūrėkite žurnalo įrašus arba susisiekite su administratoriumi",
+ "Could not move \"{file}\", target exists" : "Nepavyko perkelti „{file}“, toks failas jau yra",
+ "Could not move \"{file}\"" : "Nepavyko perkelti „{file}“",
+ "copy" : "kopija",
+ "Could not copy \"{file}\", target exists" : "Nepavyko nukopijuoti \"{file}\", toks jau yra",
+ "Could not copy \"{file}\"" : "Nepavyko nukopijuoti \"{file}\"",
+ "Copied {origin} inside {destination}" : "Nukopijuota {origin} aplanke {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Nukopijuota {origin} ir dar {nbfiles} failus aplanke {destination}",
+ "{newName} already exists" : "{newName} jau yra",
+ "Could not create file \"{file}\"" : "Nepavyko sukurti failo „{file}“",
+ "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo „{file}“, nes jis jau yra",
+ "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko „{dir}“, nes jis jau yra",
+ "Could not fetch file details \"{file}\"" : "Nepavyko gauti išsamesnės failo \"{file}\" informacijos",
+ "Error deleting file \"{fileName}\"." : "Klaida ištrinant failą „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Kituose aplankuose nėra paieškos rezultatų, skirtų {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Įveskite daugiau nei du simbolius, jei norite ieškoti kituose aplankuose",
+ "{dirs} and {files}" : "{dirs} ir {files}",
+ "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"],
+ "You do not have permission to upload or create files here" : "Neturite teisės įkalti ar kurti failus šioje vietoje",
+ "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"],
+ "New" : "Nauja",
+ "Select file range" : "Žymėti failų rėžį",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} naudojama",
+ "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
+ "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
+ "\"/\" is not allowed inside a file name." : "Failo pavadinime simbolis „/“ draudžiamas.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ nėra leidžiamas failo tipas",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Jūsų saugykla yra pilna, failai daugiau nebegalės būti atnaujinti ar sinchronizuoti!",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Grupės aplankas \"{mountPoint}\" yra beveik pilnas ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Išorinė saugykla \"{mountPoint}\" yra beveik pilna ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Jūsų saugykla yra beveik pilna ({usedSpacePercent}%).",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Tiesioginė nuoroda buvo nukopijuota (veiks tik žmonėms, turintiems prieigą prie šio failo/aplanko)",
+ "Path" : "Kelias",
+ "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų","%n baitų"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopijuoti tiesioginę nuorodą (veiks tik žmonėms, turintiems prieigą prie šio failo/aplanko)",
+ "Upload file" : "Įkelti failą",
+ "An error occurred while trying to update the tags" : "Įvyko klaida bandant atnaujinti žymas",
+ "Upload (max. %s)" : "Įkelti (maks. %s)",
+ "Filter filenames…" : "Filtruoti failų pavadinimus…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL nukopijuotas į iškarpinę",
+ "Enable the grid view" : "Įjungti grid peržiūrą",
+ "Enable folder tree" : "Įjungti direktorijų medį",
+ "Copy to clipboard" : "Kopijuoti į iškarpinę",
+ "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
+ "Deletion cancelled" : "Ištrynimo atsisakyta",
+ "Open details" : "Atverti išsamesnę informaciją",
+ "Photos and images" : "Nuotraukos ir paveikslai",
+ "New folder creation cancelled" : "Naujo aplanko sukūrimo atsisakyta",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} aplankas","{folderCount} aplankai","{folderCount} aplankų","{folderCount} aplankas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} failas","{fileCount} failai","{fileCount} failų","{fileCount} failas"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 failas ir {folderCount} aplankas","1 failas ir {folderCount} aplankai","1 failas ir {folderCount} aplankų","1 failas ir {folderCount} aplankas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} failas ir 1 aplankas","{fileCount} failai ir 1 aplankas","{fileCount} failų ir 1 aplankas","{fileCount} failas ir 1 aplankas"],
+ "All folders" : "Visi aplankai",
+ "Personal Files" : "Asmeniniai failai",
"Text file" : "Tekstinis failas",
"New text file.txt" : "Naujas tekstinis failas.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} saugykla yra pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
- "Your storage is full, files can not be updated or synced anymore!" : "Jūsų saugykla pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
- "_matches '{filter}'_::_match '{filter}'_" : ["atitinka „{filter}“","atitinka „{filter}“","atitinka „{filter}“","atitinka „{filter}“"]
+ "Rename a file" : "Pervadinti failą",
+ "Delete a file" : "Ištrinti failą"
},
"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);");
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index 53b41fb7b1c..5342b6bf37b 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -1,103 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
- "Storage invalid" : "Saugykla netinkama naudoti",
- "Unknown error" : "Nežinoma klaida",
- "File could not be found" : "Nepavyko rasti failo",
- "Move or copy" : "Perkelti ar kopijuoti",
- "Download" : "Atsisiųsti",
- "Delete" : "Ištrinti",
- "Home" : "Pagrindinis",
- "Close" : "Užverti",
- "Favorites" : "Mėgstami",
- "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko „{dir}“",
- "This will stop your current uploads." : "Tai sustabdys dabartinius įkėlimus.",
- "Upload cancelled." : "Įkėlimo atsisakyta.",
- "Processing files …" : "Apdorojami failai…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai yra katalogas arba šio failo dydis yra 0 baitų",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Jūs bandote įkelti {size1} dydžio bylą, bet liko tik {size2} vietos",
- "Target folder \"{dir}\" does not exist any more" : "Paskirties aplanko „{dir}“ daugiau nebėra",
- "Not enough free space" : "Trūksta laisvos vietos",
- "An unknown error has occurred" : "Įvyko nežinoma klaida",
- "Uploading …" : "Įkeliama…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} iš {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "To elemento įkėlimas nėra palaikomas",
- "Target folder does not exist any more" : "Paskirties aplanko daugiau nebėra",
- "Operation is blocked by access control" : "Operacija yra užblokuota prieigos valdymo",
- "Error when assembling chunks, status code {status}" : "Klaida surenkant dalis, klaidos kodas {status}",
- "Actions" : "Veiksmai",
- "Rename" : "Pervadinti",
- "Copy" : "Kopijuoti",
- "Choose target folder" : "Pasirinkite paskirties aplanką",
- "Open" : "Atverti",
- "Delete file" : "Ištrinti failą",
- "Delete folder" : "Ištrinti aplanką",
- "Disconnect storage" : "Atjungti saugyklą",
- "Could not load info for file \"{file}\"" : "Nepavyko įkelti informacijos failui „{file}“",
- "Files" : "Failai",
- "Details" : "Duomenys",
- "Select" : "Pasirinkti",
- "Pending" : "Laukiantis",
- "Unable to determine date" : "Nepavyksta nustatyti datos",
- "This operation is forbidden" : "Ši operacija yra uždrausta",
- "This directory is unavailable, please check the logs or contact the administrator" : "Šis katalogas neprieinamas, peržiūrėkite žurnalo įrašus arba susisiekite su administratoriumi",
- "Could not move \"{file}\", target exists" : "Nepavyko perkelti „{file}“, toks failas jau yra",
- "Could not move \"{file}\"" : "Nepavyko perkelti „{file}“",
- "copy" : "kopija",
- "Could not copy \"{file}\", target exists" : "Nepavyko nukopijuoti \"{file}\", toks jau yra",
- "Could not copy \"{file}\"" : "Nepavyko nukopijuoti \"{file}\"",
- "Copied {origin} inside {destination}" : "Nukopijuota {origin} aplanke {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Nukopijuota {origin} ir dar {nbfiles} failus aplanke {destination}",
- "{newName} already exists" : "{newName} jau yra",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo „{fileName}“, jo daugiau nebėra",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas „{targetName}“ jau naudojamas aplanke „{dir}“. Pasirinkite kitokį pavadinimą.",
- "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo „{fileName}“",
- "Could not create file \"{file}\"" : "Nepavyko sukurti failo „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo „{file}“, nes jis jau yra",
- "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko „{dir}“, nes jis jau yra",
- "Could not fetch file details \"{file}\"" : "Nepavyko gauti išsamesnės failo \"{file}\" informacijos",
- "Error deleting file \"{fileName}\"." : "Klaida ištrinant failą „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Kituose aplankuose nėra paieškos rezultatų, skirtų {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Įveskite daugiau nei du simbolius, jei norite ieškoti kituose aplankuose",
- "Name" : "Pavadinimas",
- "Size" : "Dydis",
- "Modified" : "Pakeistas",
- "_%n folder_::_%n folders_" : ["%n aplankas","%n aplankai","%n aplankų","%n aplankas"],
- "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų","%n failas"],
- "{dirs} and {files}" : "{dirs} ir {files}",
- "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"],
- "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
- "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"],
- "New" : "Naujas",
- "Select file range" : "Žymėti failų rėžį",
- "{used} of {quota} used" : "panaudota {used} iš {quota}",
- "{used} used" : "{used} naudojama",
- "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
- "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
- "\"/\" is not allowed inside a file name." : "Failo pavadinime simbolis „/“ draudžiamas.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ nėra leidžiamas failo tipas",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Grupės aplankas \"{mountPoint}\" yra beveik pilnas ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Išorinė saugykla \"{mountPoint}\" yra beveik pilna ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Jūsų saugykla yra beveik pilna ({usedSpacePercent}%).",
- "View in folder" : "Rodyti aplanke",
- "Copied!" : "Nukopijuota!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopijuoti tiesioginę nuorodą (veiks tik naudotojams, turintiems prieigą prie šio failo/aplanko)",
- "Path" : "Kelias",
- "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų","%n baitų"],
- "Favorited" : "Pažymėtas mėgstamu",
- "Favorite" : "Mėgstamas",
- "You can only favorite a single file or folder at a time" : "Vienu metu galite pažymėti mėgstamu tik vieną failą ar aplanką",
- "New folder" : "Naujas aplankas",
- "Upload file" : "Įkelti failą",
- "Recent" : "Paskiausiai naudoti",
- "Not favorited" : "Nepažymėtas mėgstamu",
- "Remove from favorites" : "Šalinti iš mėgstamų",
- "Add to favorites" : "Pridėti į mėgstamus",
- "An error occurred while trying to update the tags" : "Bandant atnaujinti žymes įvyko klaida",
"Added to favorites" : "Pridėta į mėgstamus",
"Removed from favorites" : "Pašalintas iš mėgstamų",
"You added {file} to your favorites" : "Pridėjote {file} į savo mėgstamus",
"You removed {file} from your favorites" : "Pašalinote {file} iš mėgstamų",
+ "Favorites" : "Mėgstami",
"File changes" : "Failo pakeitimai",
"Created by {user}" : "Sukūrė {user}",
"Changed by {user}" : "Pakeitė {user}",
@@ -105,7 +11,7 @@
"Restored by {user}" : "Atkūrė {user}",
"Renamed by {user}" : "Pervadino {user}",
"Moved by {user}" : "Perkėlė {user}",
- "\"remote user\"" : "„nuotolinis naudotojas“",
+ "\"remote account\"" : "„nuotolinė paskyra“",
"You created {file}" : "Jūs sukūrėte {file}",
"You created an encrypted file in {file}" : "Sukūrėte užšifruotą failą {file}",
"{user} created {file}" : "{user} sukūrė {file}",
@@ -132,11 +38,15 @@
"You moved {oldfile} to {newfile}" : "{oldfile} perkeltas į {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} perkėlė {oldfile} į {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Failas buvo pridėtas arba pašalintas iš <strong>mėgstamų</strong>",
+ "Files" : "Failai",
"A file or folder has been <strong>changed</strong>" : "Buvo <strong>pakeistas</strong> failas ar aplankas",
"A favorite file or folder has been <strong>changed</strong>" : "Buvo <strong>pakeistas</strong> mėgstamas failas ar aplankas",
- "All files" : "Visi failai",
- "Unlimited" : "Neribotai",
- "Upload (max. %s)" : "Įkelti (maks. %s)",
+ "Invalid folder path" : "Neteisingas aplanko kelias",
+ "Folder not found" : "Aplankas nerastas",
+ "The file cannot be found" : "Failas negali būti surastas",
+ "The destination path does not exist: %1$s" : "Paskirties kelio nėra: %1$s",
+ "You do not have permission to create a file at the specified location" : "Jūs neturite leidimo sukurti failą nurodytoje vietoje",
+ "No favorites" : "Nėra mėgstamiausių",
"Accept" : "Priimti",
"Reject" : "Atmesti",
"Incoming ownership transfer from {user}" : "Gaunamasis nuosavybės perdavimas nuo {user}",
@@ -148,57 +58,266 @@
"Your ownership transfer of {path} to {user} has completed." : "Jūsų {path} nuosavybės perdavimas naudotojui {user} užbaigtas.",
"The ownership transfer of {path} from {user} has completed." : "{path} nuosavybės perdavimas iš naudotojo {user} užbaigtas.",
"in %s" : "per %s",
+ "Files compatibility" : "Failų suderinamumas",
"File Management" : "Failų tvarkymas",
- "Transfer ownership of a file or folder" : "Perduoti failo ar aplanko nuosavybę",
- "Choose file or folder to transfer" : "Pasirinkti norimą perduoti failą ar aplanką",
- "Change" : "Keisti",
- "New owner" : "Naujasis savininkas",
- "Search users" : "Ieškoti naudotojų",
+ "Home" : "Pagrindinis",
+ "Target folder does not exist any more" : "Paskirties aplanko daugiau nebėra",
+ "Reload current directory" : "Įkelti dabartinį katalogą iš naujo",
+ "Drag and drop files here to upload" : "Tempkite failus čia norėdami išsiųsti",
+ "Favorite" : "Mėgstamas",
+ "Back" : "Atgal",
+ "File is loading" : "Failas yra įkeliamas",
+ "Folder is loading" : "Aplankas yra įkeliamas",
+ "Filename" : "Failo pavadinimas",
+ "Folder name" : "Aplanko pavadinimas",
+ "Invalid filename." : "Neteisingas failo pavadinimas.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "„{oldName}“ pervadintas į „{newName}“",
+ "Rename file" : "Pervadinti failą",
+ "Folder" : "Aplankas",
+ "Pending" : "Laukiantis",
+ "Unknown date" : "Nežinoma data",
+ "Clear filter" : "Išvalyti filtrą",
+ "Modified" : "Pakeistas",
+ "Type" : "Tipas",
+ "Active filters" : "Aktyvūs filtrai",
+ "Remove filter" : "Šalinti filtrą",
+ "Name" : "Pavadinimas",
+ "Size" : "Dydis",
+ "Actions" : "Veiksmai",
+ "List of files and folders." : "Failų ir aplankų sąrašas.",
+ "File not found" : "Failas nerastas",
+ "{usedQuotaByte} used" : "Naudojama {usedQuotaByte}",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
+ "{relative}% used" : "Naudojama {relative}",
+ "Could not refresh storage stats" : "Nepavyko iš naujo įkelti saugyklos statistikos",
+ "Your storage is full, files can not be updated or synced anymore!" : "Jūsų saugykla pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
+ "Storage information" : "Informacija apie saugyklą",
+ "New folder" : "Naujas aplankas",
+ "Create new folder" : "Sukurti naują aplanką",
+ "This name is already in use." : "Šis pavadinimas jau yra naudojamas.",
+ "Create" : "Sukurti",
+ "Submit" : "Pateikti",
"Choose a file or folder to transfer" : "Pasirinkite norimą perduoti failą ar aplanką",
"Transfer" : "Perduoti",
"Transfer {path} to {userid}" : "Perduoti {path} naudotojui {userid}",
"Invalid path selected" : "Pasirinktas neteisingas kelias",
+ "Unknown error" : "Nežinoma klaida",
"Ownership transfer request sent" : "Nuosavybės perdavimo užklausa išsiųsta",
- "Cannot transfer ownership of a file or folder you don't own" : "Negalima perduoti, failo aplanko, kuris jums nepriklauso, nuosavybės",
- "Tags" : "Žymės",
- "Unable to change the favourite state of the file" : "Nepavyksta pakeisti failo Lankomiausiųjų būsenos",
+ "Transfer ownership of a file or folder" : "Perduoti failo ar aplanko nuosavybę",
+ "Choose file or folder to transfer" : "Pasirinkti norimą perduoti failą ar aplanką",
+ "Change" : "Keisti",
+ "New owner" : "Naujasis savininkas",
+ "Choose {file}" : "Pasirinkti{file}",
+ "Share" : "Bendrinti",
+ "Shared by link" : "Bendrinama pagal nuorodą",
+ "Shared" : "Bendrinama",
+ "Switch to list view" : "Perjungti į sąrašo rodinį",
+ "Switch to grid view" : "Perjungti į tinklelio rodinį",
+ "The file could not be found" : "Failas nerastas",
+ "Upload was cancelled by user" : "Įkelimas buvo atšauktas vartotojo",
+ "Not enough free space" : "Trūksta laisvos vietos",
+ "Operation is blocked by access control" : "Operacija yra užblokuota prieigos valdymo",
+ "Error during upload: {message}" : "Įkėlimo klaida: {message}",
+ "Loading current folder" : "Įkeliamas dabartinis aplankas",
+ "Retry" : "Bandyti dar kartą",
+ "No files in here" : "Čia failų nėra",
+ "Upload some content or sync with your devices!" : "Įkelkite failus arba sinchronizuokite su savo įrenginiais!",
+ "Go back" : "Grįžti",
+ "Views" : "Rodiniai",
+ "Files settings" : "Failų nustatymai",
+ "Your files" : "Jūsų failai",
+ "File cannot be accessed" : "Nepavyksta gauti prieigos prie failo",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nepavyko surasti failo arba jūs neturite leidimo jo peržiūrėti. Paprašykite siuntėjo, kad pradėtų jį su jumis bendrinti.",
+ "Clipboard is not available" : "Iškarpinė neprieinama",
+ "General" : "Bendra",
+ "All files" : "Visi failai",
+ "Personal files" : "Asmeniniai failai",
+ "Appearance" : "Išvaizda",
+ "Show hidden files" : "Rodyti paslėptus failus",
+ "Crop image previews" : "Apkirpti paveikslėlių peržiūras",
+ "Additional settings" : "Papildomi nustatymai",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Kopijuoti",
+ "Warnings" : "Įspėjimai",
+ "Keyboard shortcuts" : "Spartieji klavišai",
+ "Rename" : "Pervadinti",
+ "Delete" : "Ištrinti",
+ "Manage tags" : "Tvarkyti žymas",
+ "Selection" : "Pasirinkimas",
+ "Deselect all" : "Panaikinti pasirinkimą",
+ "Navigation" : "Navigacija",
+ "View" : "Rodyti",
+ "Toggle grid view" : "Rodyti tinkleliu",
+ "You" : "Jūs",
"Error while loading the file data" : "Klaida įkeliant failo duomenis",
+ "Owner" : "Savivinkas",
+ "Remove from favorites" : "Šalinti iš mėgstamų",
+ "Add to favorites" : "Pridėti į mėgstamus",
+ "Tags" : "Žymos",
+ "Unable to create new file from template" : "Nepavyko sukurti naujo failo iš šablono",
"Pick a template for {name}" : "Pasirinkite šabloną, skirtą {name}",
- "Cancel" : "Atsisakyti",
- "Create" : "Sukurti",
"Create a new file with the selected template" : "Sukurti naują failą naudojant pasirinktą šabloną",
"Creating file" : "Sukuriamas failas",
- "Unable to create new file from template" : "Nepavyko sukurti naujo failo iš šablono",
- "Templates" : "Šablonai",
+ "Save as {displayName}" : "Įrašyti kaip {displayName}",
+ "Save as …" : "Įrašyti kaip…",
+ "Leave this share" : "Palikti bendrinimą",
+ "Disconnect storage" : "Atjungti saugyklą",
+ "Delete permanently" : "Ištrinti negrįžtamai",
+ "Delete and unshare" : "Ištrinti ir nebebendrinti",
+ "Delete file" : "Ištrinti failą",
+ "Delete files" : "Ištrinti failus",
+ "Delete folder" : "Ištrinti aplanką",
+ "Delete folders" : "Ištrinti aplankus",
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Jūs ketinate ištrinti {count} elementą","Jūs ketinate ištrinti {count} elementus","Jūs ketinate ištrinti {count} elementų","Jūs ketinate ištrinti {count} elementą"],
+ "Cancel" : "Atsisakyti",
+ "Download" : "Atsisiųsti",
+ "Moving \"{source}\" to \"{destination}\" …" : "Perkeliama „{source}“ į „{destination}“…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopijuojama „{source}“ į „{destination}“…",
+ "(copy)" : "(kopija)",
+ "(copy %n)" : "(kopija %n)",
+ "The files are locked" : "Failai yra užrakinti",
+ "The file does not exist anymore" : "Failo daugiau nebėra",
+ "Copy to {target}" : "Kopijuoti į {target}",
+ "Move to {target}" : "Perkelti į {target}",
+ "Move" : "Perkelti",
+ "Move or copy operation failed" : "Perkėlimo ar kopijavimo operacija patyrė nesėkmę",
+ "Move or copy" : "Perkelti ar kopijuoti",
+ "Open folder {displayName}" : "Atverti aplanką {displayName}",
+ "Failed to redirect to client" : "Nepavyko peradresuoti į klientą",
+ "Retry and close" : "Bandyti dar kartą ir užverti",
+ "Details" : "Išsamiau",
+ "View in folder" : "Rodyti aplanke",
+ "Today" : "Šiandien",
+ "Last 7 days" : "Paskutinės 7 dienos",
+ "Last 30 days" : "Paskutinės 30 dienų",
+ "Documents" : "Dokumentai",
+ "Spreadsheets" : "Skaičiuoklės",
+ "Presentations" : "Pateiktys",
+ "PDFs" : "PDF dokumentai",
+ "Folders" : "Aplankai",
+ "Audio" : "Garso įrašai",
+ "Images" : "Paveikslai",
+ "Videos" : "Vaizdo įrašai",
+ "Created new folder \"{name}\"" : "Sukurtas naujas aplankas „{name}“",
"Unable to initialize the templates directory" : "Nepavyko inicijuoti šablonų katalogo",
- "%s used" : "%s panaudota",
- "%s%% of %s used" : "naudojama %s%% iš %s",
- "%1$s of %2$s used" : "naudojama %1$s iš %2$s",
- "Settings" : "Nustatymai",
- "Show hidden files" : "Rodyti paslėptus failus",
- "Crop image previews" : "Apkirpti paveikslų peržiūras",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
- "Toggle grid view" : "Rodyti tinkleliu",
- "No files in here" : "Čia failų nėra",
- "Upload some content or sync with your devices!" : "Įkelkite failus arba sinchronizuokite su savo įrenginiais!",
+ "Create templates folder" : "Sukurti šablonų aplanką",
+ "Templates" : "Šablonai",
+ "Search in folder: {folder}" : "Ieškoti aplanke: {folder}",
+ "Unable to create the directory {directory}" : "Nepavyko sukurti katalogo {directory}",
+ "Some files could not be copied" : "Kai kurių failų nepavyko nukopijuoti",
+ "Some files could not be moved" : "Kai kurių failų nepavyko perkelti",
+ "Files copied successfully" : "Failai sėkmingai nukopijuoti",
+ "Files moved successfully" : "Failai sėkmingai perkelti",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nepavyko pervadinti failo „{oldName}“, jo daugiau nebėra",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas „{newName}“ jau naudojamas aplanke „{dir}“. Pasirinkite kitokį pavadinimą.",
+ "Could not rename \"{oldName}\"" : "Nepavyko pervadinti „{oldName}“",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "Storage is temporarily not available" : "Saugykla yra laikinai neprieinama",
+ "Unexpected error: {error}" : "Netikėta klaida: {error}",
+ "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų","%n failas"],
+ "_%n folder_::_%n folders_" : ["%n aplankas","%n aplankai","%n aplankų","%n aplankas"],
+ "Filename must not be empty." : "Failo pavadinimas negali būti tuščias.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}“ yra rezervuotas pavadinimas ir neleidžiamas naudoti failo pavadinimuose.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}“ nėra leidžiamas failo tipas.",
+ "No favorites yet" : "Kol kas nėra mėgstamų",
+ "Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
+ "List of your files and folders." : "Jūsų failų ir aplankų sąrašas.",
+ "No personal files found" : "Nerasta jokių asmeninių failų",
+ "Recent" : "Paskiausiai naudoti",
+ "List of recently modified files and folders." : "Paskiausiai modifikuotų failų ir aplankų sąrašas.",
+ "No recently modified files" : "Nėra jokių paskiausiai modifikuotų failų",
+ "Search" : "Paieška",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, šiame serveryje leidžiamų įkelti failų dydį.",
- "No favorites yet" : "Kol kas nėra mėgstamų",
- "Files and folders you mark as favorite will show up here" : "Čia bus rodomi failai ir aplankai, kuriuos pažymėsite kaip mėgstamus",
- "Deleted files" : "Ištrinti failai",
- "Shares" : "Viešiniai",
- "Shared with others" : "Bendrinama su kitais",
- "Shared with you" : "Bendrinama su jumis",
- "Shared by link" : "Bendrinama pagal nuorodą",
- "Deleted shares" : "Ištrinti viešiniai",
- "Pending shares" : "Laukiantys viešiniai",
+ "File could not be found" : "Nepavyko rasti failo",
+ "Show list view" : "Rodyti sąrašo rodinį",
+ "Show grid view" : "Rodyti tinklelio rodinį",
+ "Close" : "Užverti",
+ "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko „{dir}“",
+ "This will stop your current uploads." : "Tai sustabdys dabartinius įkėlimus.",
+ "Upload cancelled." : "Įkėlimo atsisakyta.",
+ "Processing files …" : "Apdorojami failai…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai yra katalogas arba šio failo dydis yra 0 baitų",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Jūs bandote įkelti {size1} dydžio bylą, bet liko tik {size2} vietos",
+ "Target folder \"{dir}\" does not exist any more" : "Paskirties aplanko „{dir}“ daugiau nebėra",
+ "An unknown error has occurred" : "Įvyko nežinoma klaida",
+ "File could not be uploaded" : "Nepavyko įkelti failo",
+ "Uploading …" : "Įkeliama…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} iš {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "To elemento įkėlimas nėra palaikomas",
+ "Error when assembling chunks, status code {status}" : "Klaida surenkant dalis, klaidos kodas {status}",
+ "Choose target folder" : "Pasirinkite paskirties aplanką",
+ "Set reminder" : "Nustatyti priminimą",
+ "Edit locally" : "Redaguoti lokaliai",
+ "Open" : "Atverti",
+ "Could not load info for file \"{file}\"" : "Nepavyko įkelti informacijos failui „{file}“",
+ "Please select tag(s) to add to the selection" : "Pasirinkite žymas, kurias pridėsite prie pažymėtų",
+ "Apply tag(s) to selection" : "Pritaikyti žymą(-as) pažymėtiems",
+ "Select directory \"{dirName}\"" : "Pasirinkite direktoriją \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Pasirinkite failą \"{fileName}\"",
+ "Unable to determine date" : "Nepavyksta nustatyti datos",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Šis katalogas neprieinamas, peržiūrėkite žurnalo įrašus arba susisiekite su administratoriumi",
+ "Could not move \"{file}\", target exists" : "Nepavyko perkelti „{file}“, toks failas jau yra",
+ "Could not move \"{file}\"" : "Nepavyko perkelti „{file}“",
+ "copy" : "kopija",
+ "Could not copy \"{file}\", target exists" : "Nepavyko nukopijuoti \"{file}\", toks jau yra",
+ "Could not copy \"{file}\"" : "Nepavyko nukopijuoti \"{file}\"",
+ "Copied {origin} inside {destination}" : "Nukopijuota {origin} aplanke {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Nukopijuota {origin} ir dar {nbfiles} failus aplanke {destination}",
+ "{newName} already exists" : "{newName} jau yra",
+ "Could not create file \"{file}\"" : "Nepavyko sukurti failo „{file}“",
+ "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo „{file}“, nes jis jau yra",
+ "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko „{dir}“, nes jis jau yra",
+ "Could not fetch file details \"{file}\"" : "Nepavyko gauti išsamesnės failo \"{file}\" informacijos",
+ "Error deleting file \"{fileName}\"." : "Klaida ištrinant failą „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Kituose aplankuose nėra paieškos rezultatų, skirtų {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Įveskite daugiau nei du simbolius, jei norite ieškoti kituose aplankuose",
+ "{dirs} and {files}" : "{dirs} ir {files}",
+ "_including %n hidden_::_including %n hidden_" : ["įskaitant %n paslėptą","įskaitant %n paslėptus","įskaitant %n paslėptų","įskaitant %n paslėptą"],
+ "You do not have permission to upload or create files here" : "Neturite teisės įkalti ar kurti failus šioje vietoje",
+ "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų","Įkeliamas %n failas"],
+ "New" : "Nauja",
+ "Select file range" : "Žymėti failų rėžį",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} naudojama",
+ "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
+ "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
+ "\"/\" is not allowed inside a file name." : "Failo pavadinime simbolis „/“ draudžiamas.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ nėra leidžiamas failo tipas",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Jūsų saugykla yra pilna, failai daugiau nebegalės būti atnaujinti ar sinchronizuoti!",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Grupės aplankas \"{mountPoint}\" yra beveik pilnas ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Išorinė saugykla \"{mountPoint}\" yra beveik pilna ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Jūsų saugykla yra beveik pilna ({usedSpacePercent}%).",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Tiesioginė nuoroda buvo nukopijuota (veiks tik žmonėms, turintiems prieigą prie šio failo/aplanko)",
+ "Path" : "Kelias",
+ "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų","%n baitų"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopijuoti tiesioginę nuorodą (veiks tik žmonėms, turintiems prieigą prie šio failo/aplanko)",
+ "Upload file" : "Įkelti failą",
+ "An error occurred while trying to update the tags" : "Įvyko klaida bandant atnaujinti žymas",
+ "Upload (max. %s)" : "Įkelti (maks. %s)",
+ "Filter filenames…" : "Filtruoti failų pavadinimus…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL nukopijuotas į iškarpinę",
+ "Enable the grid view" : "Įjungti grid peržiūrą",
+ "Enable folder tree" : "Įjungti direktorijų medį",
+ "Copy to clipboard" : "Kopijuoti į iškarpinę",
+ "Use this address to access your Files via WebDAV" : "Naudokite šį adresą norėdami pasiekti failus per WebDAV",
+ "Deletion cancelled" : "Ištrynimo atsisakyta",
+ "Open details" : "Atverti išsamesnę informaciją",
+ "Photos and images" : "Nuotraukos ir paveikslai",
+ "New folder creation cancelled" : "Naujo aplanko sukūrimo atsisakyta",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} aplankas","{folderCount} aplankai","{folderCount} aplankų","{folderCount} aplankas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} failas","{fileCount} failai","{fileCount} failų","{fileCount} failas"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 failas ir {folderCount} aplankas","1 failas ir {folderCount} aplankai","1 failas ir {folderCount} aplankų","1 failas ir {folderCount} aplankas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} failas ir 1 aplankas","{fileCount} failai ir 1 aplankas","{fileCount} failų ir 1 aplankas","{fileCount} failas ir 1 aplankas"],
+ "All folders" : "Visi aplankai",
+ "Personal Files" : "Asmeniniai failai",
"Text file" : "Tekstinis failas",
"New text file.txt" : "Naujas tekstinis failas.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} saugykla yra pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
- "Your storage is full, files can not be updated or synced anymore!" : "Jūsų saugykla pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
- "_matches '{filter}'_::_match '{filter}'_" : ["atitinka „{filter}“","atitinka „{filter}“","atitinka „{filter}“","atitinka „{filter}“"]
+ "Rename a file" : "Pervadinti failą",
+ "Delete a file" : "Ištrinti failą"
},"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
deleted file mode 100644
index e79372d7629..00000000000
--- a/apps/files/l10n/lv.js
+++ /dev/null
@@ -1,144 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Glabātuve īslaicīgi nav pieejama",
- "Storage invalid" : "Nepareiza glabātuve",
- "Unknown error" : "Nezināma kļūda",
- "File could not be found" : "Datni nevar atrast",
- "Move or copy" : "Pārvietot vai kopēt",
- "Download" : "Lejupielādēt",
- "Delete" : "Dzēst",
- "Home" : "Mājas",
- "Close" : "Aizvērt",
- "Favorites" : "Iecienītie",
- "Could not create folder \"{dir}\"" : "Nevarēja izveidot mapi \"{dir}\"",
- "This will stop your current uploads." : "Tādējādi tiks pārtraukta jūsu pašreizējā augšupielāde.",
- "Upload cancelled." : "Augšupielāde ir atcelta.",
- "Processing files …" : "Notiek datņu apstrāde …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturoša datne.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Mape \"{dir}\" vairs neeksistē",
- "Not enough free space" : "Nav pietiekami daudz brīvas vietas",
- "An unknown error has occurred" : "Radusies nezināma kļūda",
- "Uploading …" : "Augšupielādē…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} no {totalSize} ({bitrate})",
- "Actions" : "Darbības",
- "Rename" : "Pārsaukt",
- "Copy" : "Kopēt",
- "Open" : "Atvērt",
- "Delete file" : "Dzēst datni",
- "Delete folder" : "Dzēst mapi",
- "Disconnect storage" : "Atvienot glabātuvi",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
- "Files" : "Datnes",
- "Details" : "Detaļas",
- "Select" : "Norādīt",
- "Pending" : "Gaida savu kārtu",
- "Unable to determine date" : "Neizdevās noteikt datumu",
- "This operation is forbidden" : "Šī darbība ir aizliegta",
- "This directory is unavailable, please check the logs or contact the administrator" : "Šis direktorijs nav pieejams, lūdzu pārbaudiet žurnālus vai sazinieties ar administratoru",
- "Could not move \"{file}\", target exists" : "Nevarēja pārvietot \"{file}\", mērķis eksistē",
- "Could not move \"{file}\"" : "Nevarēja pārvietot \"{file}\"",
- "copy" : "kopēt",
- "{newName} already exists" : "{newName} jau eksistē",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nevarēja pārsaukt \"{fileName}\", tā vairs neeksistē",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nosaukums \"{targetName}\" jau tiek izmantots mapē \"{dir}\". Lūdzu izvēlies citu nosaukumu.",
- "Could not rename \"{fileName}\"" : "Nevarēja pārsaukt \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nevarēja izveidot datni \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nevarēja izveidot datni \"{file}\", jo tā jau eksistē",
- "Could not create folder \"{dir}\" because it already exists" : "Nevarēja izveidot mapi \"{dir}\", jo tā jau eksistē",
- "Error deleting file \"{fileName}\"." : "Kļūda dzēšot datni \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nav nekas atrasts citā mapēs {tag}{filter}{endtag}",
- "Name" : "Nosaukums",
- "Size" : "Izmērs",
- "Modified" : "Mainīts",
- "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"],
- "_%n file_::_%n files_" : ["%n datnes","%n datne","%n datnes"],
- "{dirs} and {files}" : "{dirs} un {files}",
- "_including %n hidden_::_including %n hidden_" : ["ieskaitot %n paslēptos","ieskaitot %n paslēptos","ieskaitot %n paslēptos"],
- "You don’t have permission to upload or create files here" : "Jums nav tiesību šeit augšupielādēt vai veidot datnes",
- "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"],
- "New" : "Jauna",
- "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.",
- "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.",
- "\"/\" is not allowed inside a file name." : "\"/\" nav atļauts faila nosaukumā.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nav atļauts faila tips",
- "View in folder" : "Skatīt mapē",
- "Copied!" : "Nokopēts!",
- "Path" : "Ceļš",
- "_%n byte_::_%n bytes_" : ["%n baiti","%n baits","%n baiti"],
- "Favorited" : "Favorīti",
- "Favorite" : "Iecienītais",
- "New folder" : "Jauna mape",
- "Upload file" : "Augšupielādēt datni",
- "Recent" : "Nesenās",
- "Remove from favorites" : "Noņemt no favorītiem",
- "Add to favorites" : "Pievienot izlasei",
- "An error occurred while trying to update the tags" : "Notika kļūda mēģinot atjaunot birkas",
- "Added to favorites" : "Pievienot favorītiem",
- "Removed from favorites" : "Noņemt no favorītiem",
- "You added {file} to your favorites" : "Pievienoji {file} saviem favorītiem",
- "You removed {file} from your favorites" : "Noņēmi {file} no saviem favorītiem",
- "File changes" : "Datnes izmaiņas",
- "Created by {user}" : "Izveidoja {user}",
- "Changed by {user}" : "Izmainīja {user}",
- "Deleted by {user}" : "Dzēsa {user}",
- "Restored by {user}" : "Atjaunoja {user}",
- "Renamed by {user}" : "Pārdēvēja {user}",
- "Moved by {user}" : "Pārvietoja {user}",
- "\"remote user\"" : "\"attālināts lietotājs\"",
- "You created {file}" : "Jūs izveidojāt {file}",
- "{user} created {file}" : "{user} izveidoja {file}",
- "{file} was created in a public folder" : "{file} tika izveidots publiskajā mapē",
- "You changed {file}" : "Jūs izmainījāt {file}",
- "{user} changed {file}" : "{user} mainīts {file}",
- "You deleted {file}" : "Jūs izdzēsāt {file}",
- "{user} deleted {file}" : "{user} izdzēsa {file}",
- "You restored {file}" : "Tu atjaunoji {file}",
- "{user} restored {file}" : "{user} atjaunoja {file}",
- "You renamed {oldfile} to {newfile}" : "Pārdēvēji {oldfile} uz {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} pārdēvēja {oldfile} uz {newfile}",
- "You moved {oldfile} to {newfile}" : "Pārvietoji {oldfile} uz {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} pārvietoja {oldfile} uz {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Datne ir pievienota vai noņemta no jūsu <strong>favorītiem</strong>",
- "A file or folder has been <strong>changed</strong>" : "<strong>Izmainīta</strong> datne vai mape",
- "All files" : "Visas datnes",
- "Unlimited" : "Neierobežota",
- "Upload (max. %s)" : "Augšupielādēt (maks. %s)",
- "Accept" : "Akceptēt",
- "Reject" : "Noraidīt",
- "in %s" : "iekš %s",
- "Change" : "Mainīt",
- "Tags" : "Birkas",
- "Cancel" : "Atcelt",
- "Create" : "Izveidot",
- "%s used" : "%s izmantoti",
- "%1$s of %2$s used" : "%1$s no %2$s lietoti",
- "Settings" : "Iestatījumi",
- "Show hidden files" : "Rādīt slēptās datnes",
- "Crop image previews" : "Apgriezt attēlu priekšskatījumus",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Izmantojiet šo adresi, lai piekļūtu savām datnēm, izmantojot WebDAV",
- "Toggle grid view" : "Pārslēgt režģa skatu",
- "No files in here" : "Šeit nav datņu",
- "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
- "No entries found in this folder" : "Šajā mapē nekas nav atrasts",
- "Select all" : "Atzīmēt visu",
- "Upload too large" : "Datne ir par lielu, lai to augšupielādētu",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
- "Files and folders you mark as favorite will show up here" : "Datnes un mapes, ko atzīmēsiet kā favorītus, tiks rādīti šeit",
- "Deleted files" : "Dzēstās datnes",
- "Shares" : "Koplietots",
- "Shared with others" : "Koplietots ar citiem",
- "Shared with you" : "Koplietots ar tevi",
- "Shared by link" : "Koplietots ar saiti",
- "Deleted shares" : "Dzēstās koplietotnes",
- "Pending shares" : "Gaidošie koplietojumi",
- "Text file" : "Teksta datne",
- "New text file.txt" : "Jauna teksta datne.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} glabātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!",
- "Your storage is full, files can not be updated or synced anymore!" : "Jūsu glabātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!",
- "_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"]
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
deleted file mode 100644
index 943e499b549..00000000000
--- a/apps/files/l10n/lv.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Glabātuve īslaicīgi nav pieejama",
- "Storage invalid" : "Nepareiza glabātuve",
- "Unknown error" : "Nezināma kļūda",
- "File could not be found" : "Datni nevar atrast",
- "Move or copy" : "Pārvietot vai kopēt",
- "Download" : "Lejupielādēt",
- "Delete" : "Dzēst",
- "Home" : "Mājas",
- "Close" : "Aizvērt",
- "Favorites" : "Iecienītie",
- "Could not create folder \"{dir}\"" : "Nevarēja izveidot mapi \"{dir}\"",
- "This will stop your current uploads." : "Tādējādi tiks pārtraukta jūsu pašreizējā augšupielāde.",
- "Upload cancelled." : "Augšupielāde ir atcelta.",
- "Processing files …" : "Notiek datņu apstrāde …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturoša datne.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Mape \"{dir}\" vairs neeksistē",
- "Not enough free space" : "Nav pietiekami daudz brīvas vietas",
- "An unknown error has occurred" : "Radusies nezināma kļūda",
- "Uploading …" : "Augšupielādē…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} no {totalSize} ({bitrate})",
- "Actions" : "Darbības",
- "Rename" : "Pārsaukt",
- "Copy" : "Kopēt",
- "Open" : "Atvērt",
- "Delete file" : "Dzēst datni",
- "Delete folder" : "Dzēst mapi",
- "Disconnect storage" : "Atvienot glabātuvi",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
- "Files" : "Datnes",
- "Details" : "Detaļas",
- "Select" : "Norādīt",
- "Pending" : "Gaida savu kārtu",
- "Unable to determine date" : "Neizdevās noteikt datumu",
- "This operation is forbidden" : "Šī darbība ir aizliegta",
- "This directory is unavailable, please check the logs or contact the administrator" : "Šis direktorijs nav pieejams, lūdzu pārbaudiet žurnālus vai sazinieties ar administratoru",
- "Could not move \"{file}\", target exists" : "Nevarēja pārvietot \"{file}\", mērķis eksistē",
- "Could not move \"{file}\"" : "Nevarēja pārvietot \"{file}\"",
- "copy" : "kopēt",
- "{newName} already exists" : "{newName} jau eksistē",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nevarēja pārsaukt \"{fileName}\", tā vairs neeksistē",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nosaukums \"{targetName}\" jau tiek izmantots mapē \"{dir}\". Lūdzu izvēlies citu nosaukumu.",
- "Could not rename \"{fileName}\"" : "Nevarēja pārsaukt \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nevarēja izveidot datni \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nevarēja izveidot datni \"{file}\", jo tā jau eksistē",
- "Could not create folder \"{dir}\" because it already exists" : "Nevarēja izveidot mapi \"{dir}\", jo tā jau eksistē",
- "Error deleting file \"{fileName}\"." : "Kļūda dzēšot datni \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Nav nekas atrasts citā mapēs {tag}{filter}{endtag}",
- "Name" : "Nosaukums",
- "Size" : "Izmērs",
- "Modified" : "Mainīts",
- "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"],
- "_%n file_::_%n files_" : ["%n datnes","%n datne","%n datnes"],
- "{dirs} and {files}" : "{dirs} un {files}",
- "_including %n hidden_::_including %n hidden_" : ["ieskaitot %n paslēptos","ieskaitot %n paslēptos","ieskaitot %n paslēptos"],
- "You don’t have permission to upload or create files here" : "Jums nav tiesību šeit augšupielādēt vai veidot datnes",
- "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"],
- "New" : "Jauna",
- "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.",
- "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.",
- "\"/\" is not allowed inside a file name." : "\"/\" nav atļauts faila nosaukumā.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nav atļauts faila tips",
- "View in folder" : "Skatīt mapē",
- "Copied!" : "Nokopēts!",
- "Path" : "Ceļš",
- "_%n byte_::_%n bytes_" : ["%n baiti","%n baits","%n baiti"],
- "Favorited" : "Favorīti",
- "Favorite" : "Iecienītais",
- "New folder" : "Jauna mape",
- "Upload file" : "Augšupielādēt datni",
- "Recent" : "Nesenās",
- "Remove from favorites" : "Noņemt no favorītiem",
- "Add to favorites" : "Pievienot izlasei",
- "An error occurred while trying to update the tags" : "Notika kļūda mēģinot atjaunot birkas",
- "Added to favorites" : "Pievienot favorītiem",
- "Removed from favorites" : "Noņemt no favorītiem",
- "You added {file} to your favorites" : "Pievienoji {file} saviem favorītiem",
- "You removed {file} from your favorites" : "Noņēmi {file} no saviem favorītiem",
- "File changes" : "Datnes izmaiņas",
- "Created by {user}" : "Izveidoja {user}",
- "Changed by {user}" : "Izmainīja {user}",
- "Deleted by {user}" : "Dzēsa {user}",
- "Restored by {user}" : "Atjaunoja {user}",
- "Renamed by {user}" : "Pārdēvēja {user}",
- "Moved by {user}" : "Pārvietoja {user}",
- "\"remote user\"" : "\"attālināts lietotājs\"",
- "You created {file}" : "Jūs izveidojāt {file}",
- "{user} created {file}" : "{user} izveidoja {file}",
- "{file} was created in a public folder" : "{file} tika izveidots publiskajā mapē",
- "You changed {file}" : "Jūs izmainījāt {file}",
- "{user} changed {file}" : "{user} mainīts {file}",
- "You deleted {file}" : "Jūs izdzēsāt {file}",
- "{user} deleted {file}" : "{user} izdzēsa {file}",
- "You restored {file}" : "Tu atjaunoji {file}",
- "{user} restored {file}" : "{user} atjaunoja {file}",
- "You renamed {oldfile} to {newfile}" : "Pārdēvēji {oldfile} uz {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} pārdēvēja {oldfile} uz {newfile}",
- "You moved {oldfile} to {newfile}" : "Pārvietoji {oldfile} uz {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} pārvietoja {oldfile} uz {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Datne ir pievienota vai noņemta no jūsu <strong>favorītiem</strong>",
- "A file or folder has been <strong>changed</strong>" : "<strong>Izmainīta</strong> datne vai mape",
- "All files" : "Visas datnes",
- "Unlimited" : "Neierobežota",
- "Upload (max. %s)" : "Augšupielādēt (maks. %s)",
- "Accept" : "Akceptēt",
- "Reject" : "Noraidīt",
- "in %s" : "iekš %s",
- "Change" : "Mainīt",
- "Tags" : "Birkas",
- "Cancel" : "Atcelt",
- "Create" : "Izveidot",
- "%s used" : "%s izmantoti",
- "%1$s of %2$s used" : "%1$s no %2$s lietoti",
- "Settings" : "Iestatījumi",
- "Show hidden files" : "Rādīt slēptās datnes",
- "Crop image previews" : "Apgriezt attēlu priekšskatījumus",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Izmantojiet šo adresi, lai piekļūtu savām datnēm, izmantojot WebDAV",
- "Toggle grid view" : "Pārslēgt režģa skatu",
- "No files in here" : "Šeit nav datņu",
- "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
- "No entries found in this folder" : "Šajā mapē nekas nav atrasts",
- "Select all" : "Atzīmēt visu",
- "Upload too large" : "Datne ir par lielu, lai to augšupielādētu",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
- "Files and folders you mark as favorite will show up here" : "Datnes un mapes, ko atzīmēsiet kā favorītus, tiks rādīti šeit",
- "Deleted files" : "Dzēstās datnes",
- "Shares" : "Koplietots",
- "Shared with others" : "Koplietots ar citiem",
- "Shared with you" : "Koplietots ar tevi",
- "Shared by link" : "Koplietots ar saiti",
- "Deleted shares" : "Dzēstās koplietotnes",
- "Pending shares" : "Gaidošie koplietojumi",
- "Text file" : "Teksta datne",
- "New text file.txt" : "Jauna teksta datne.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} glabātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!",
- "Your storage is full, files can not be updated or synced anymore!" : "Jūsu glabātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!",
- "_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"]
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/mg.js b/apps/files/l10n/mg.js
deleted file mode 100644
index c50be1aa479..00000000000
--- a/apps/files/l10n/mg.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/mg.json b/apps/files/l10n/mg.json
deleted file mode 100644
index 210ac153bab..00000000000
--- a/apps/files/l10n/mg.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js
index a7209e30baa..1a380f84d8d 100644
--- a/apps/files/l10n/mk.js
+++ b/apps/files/l10n/mk.js
@@ -1,112 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Складиштето моментално не е достапно",
- "Storage invalid" : "Невалидно складиште",
- "Unknown error" : "Непозната грешка",
- "File could not be found" : "Неможе да се пронајде датотеката",
- "Move or copy" : "Премести или копирај",
- "Download" : "Преземи",
- "Delete" : "Избриши",
- "Home" : "Дома",
- "Close" : "Затвори",
- "Favorites" : "Омилени",
- "Could not create folder \"{dir}\"" : "Неможе да се креира папка \"{dir}\"",
- "This will stop your current uploads." : "Ова ќе го прекине вашето моментално прикачување.",
- "Upload cancelled." : "Преземањето е прекинато.",
- "Processing files …" : "Обработка на датотеки ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможе да се прикачи {filename} бидејќи е директориум или е 0 бајти",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема доволно слободен простор, прикачувате {size1} а слободен простор има {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Папката \"{dir}\" не постои повеќе",
- "Not enough free space" : "Нема доволно слободен простор",
- "An unknown error has occurred" : "Се појави непозната грешка",
- "Uploading …" : "Прикачување …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Прикачување на таа датотека не е дозволено",
- "Target folder does not exist any more" : "Папката не постои повеќе",
- "Operation is blocked by access control" : "Операцијата е блокирана од контролата на пристап",
- "Error when assembling chunks, status code {status}" : "Грешка при составување на парчиња, статусен код {status}",
- "Actions" : "Акции",
- "Rename" : "Преименувај",
- "Copy" : "Копирај",
- "Choose target folder" : "Избери папка",
- "Open" : "Отвори",
- "Delete file" : "Избриши датотека",
- "Delete folder" : "Избриши папка",
- "Disconnect storage" : "Исклучи складиште",
- "Leave this share" : "Оставете го ова споделување",
- "Could not load info for file \"{file}\"" : "Неможе да се вчитаат информации за датотеката \"{file}\"",
- "Files" : "Датотеки",
- "Details" : "Детали:",
- "Select" : "Избери",
- "Pending" : "Чека",
- "Unable to determine date" : "Неможе да се одреди датумот",
- "This operation is forbidden" : "Операцијата не е дозволена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Овој директориум е недостапен, ве молиме проверете ги логовите или контактирајте со администраторот",
- "Could not move \"{file}\", target exists" : "Не може да се премести \"{file}\", веќе постои",
- "Could not move \"{file}\"" : "Не може да се премести \"{file}\"",
- "copy" : "копирај",
- "Could not copy \"{file}\", target exists" : "Не може да се копира \"{file}\", веќе постои",
- "Could not copy \"{file}\"" : "Не може да се копира \"{file}\"",
- "Copied {origin} inside {destination}" : "Копирана {origin} во {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирана {origin} и {nbfiles} други датотеки во {destination}",
- "{newName} already exists" : "{newName} веќе постои",
- "Could not rename \"{fileName}\", it does not exist any more" : "Неможе да се преименува \"{fileName}\", датотеката не постои",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" веќе се користи во папката \"{dir}\". Ве молиме изберете друго име.",
- "Could not rename \"{fileName}\"" : "Неможе да се преименува \"{fileName}\"",
- "Could not create file \"{file}\"" : "Неможе да се креира датотека \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Неможе да се креира датотека \"{file}\" бидејќи веќе постои",
- "Could not create folder \"{dir}\" because it already exists" : "Неможе да се креира папка \"{dir}\" бидејќи веќе постои",
- "Could not fetch file details \"{file}\"" : "Неможе да се вчитаат деталите за датотеката \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Грешка при бришење на датотека \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултати од пребарувањето на други места за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Внесете повеќе од два карактери за да пребарувате во другите папки",
- "Name" : "Име",
- "Size" : "Големина",
- "Modified" : "Променето",
- "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
- "_%n file_::_%n files_" : ["%n датотека","%n датотеки"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"],
- "You don’t have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки",
- "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"],
- "New" : "Ново",
- "Select file range" : "Избери опсег на датотеки",
- "{used} of {quota} used" : "Искористени {used} од {quota}",
- "{used} used" : "Искористени {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" е невалидно име за датотека.",
- "File name cannot be empty." : "Името на датотеката не може да биде празно.",
- "\"/\" is not allowed inside a file name." : "\"/\" не е дозволено во името.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" не е дозволен вид на датотека",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Скалдиштето на {owner} е скоро исполнето ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групната папка \"{mountPoint}\" е скоро исполнета ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Надворешното складиште \"{mountPoint}\" е скоро исполнето ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Вашето складиште е скоро исполнето ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["содржи '{filter}'","содржи '{filter}'"],
- "View in folder" : "Погледни во папката",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирај директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
- "Path" : "Патека",
- "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"],
- "Favorited" : "Омилени",
- "Favorite" : "Омилен",
- "You can only favorite a single file or folder at a time" : "Можете да додавате само по една датотека или папка во фаворити одеднаш",
- "New folder" : "Нова папка",
- "Upload file" : "Прикачи датотека",
- "Recent" : "Неодамнешни",
- "Not favorited" : "Нема фаворити",
- "Remove from favorites" : "Отстрани од фаворити",
- "Add to favorites" : "Додади во фаворити",
- "An error occurred while trying to update the tags" : "Се случи грешка додека се обидувавте да ги освежите таговите",
"Added to favorites" : "Додадени во фаворити",
"Removed from favorites" : "Отстранети од фаворити",
"You added {file} to your favorites" : "Додадовте {file} во фаворити",
"You removed {file} from your favorites" : "Отстранивте {file} од фаворити",
+ "Favorites" : "Омилени",
"File changes" : "Промени на датотеки",
"Created by {user}" : "Копирано од {user}",
"Changed by {user}" : "Променето од {user}",
@@ -114,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Вратено од {user}",
"Renamed by {user}" : "Преименувано од {user}",
"Moved by {user}" : "Преместено од {user}",
- "\"remote user\"" : "\"далечен корисник\"",
+ "\"remote account\"" : "\"оддалечен корисник\"",
"You created {file}" : "Креиравте {file}",
"You created an encrypted file in {file}" : "Креиравте шифрирана датотека во {file}",
"{user} created {file}" : "{user} креираше {file}",
@@ -141,15 +40,25 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Го премести {oldfile} во {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} го премести {oldfile} во {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Датотека беше додадена или избришана од <strong>фаворити</strong>",
+ "Files" : "Датотеки",
"A file or folder has been <strong>changed</strong>" : "Датотека или папка беше <strong>променета</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Датотека или папка која е означена како омилена беше <strong>променета</strong>",
- "All files" : "Сите датотеки",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Префрлање (макс. %s)",
+ "Failed to authorize" : "Неуспешна авторизација",
+ "Invalid folder path" : "Невалидна патека до папка",
+ "Folder not found" : "Папката не е пронајдена",
+ "The file cannot be found" : "Датотеката неможе да биде пројандена",
+ "The destination path does not exist: %1$s" : "Патеката не постои: %1$s",
+ "You do not have permission to create a file at the specified location" : "Немате дозвола да креирате датотека на специфираната локација",
+ "The file could not be converted." : "Датотеката неможе да се конвертира.",
+ "Favorite files" : "Омилени датотеки",
+ "No favorites" : "Нема омилени",
+ "More favorites" : "Повеќе омилени",
"Accept" : "Прифати",
"Reject" : "Одбиј",
"Incoming ownership transfer from {user}" : "Барање за трансфер на сопственост од {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Дали прифаќате {path}?\n\nЗабелешка: Процесот на трансфер откога ќе прифатите може да трае и повеќе од 1 час.",
+ "Ownership transfer denied" : "Одбиен трансфер на сопственост",
+ "Your ownership transfer of {path} was denied by {user}." : "Барањето за трансфер на сопственост на {path} е одбиен од {user}.",
"Ownership transfer failed" : "Неуспешен трансфер на сопственост",
"Your ownership transfer of {path} to {user} failed." : "Неуспешен трансфер на сопственост на {path} до {user}.",
"The ownership transfer of {path} from {user} failed." : "Неуспешен трансфер на сопственост на {path} од {user}.",
@@ -157,61 +66,356 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Вашиот транфер на сопственост на {path} до {user} е комплетиран.",
"The ownership transfer of {path} from {user} has completed." : "Трансферот на сопственост на {path} од {user} е комплетиран.",
"in %s" : "во %s",
+ "Transferred from %1$s on %2$s" : "Трансфер од %1$s на %2$s",
+ "Files compatibility" : "Компатибилност со датотеки",
"File Management" : "Датотеки",
- "Transfer ownership of a file or folder" : "Трансфер на сопственост на датотека или папка",
- "Choose file or folder to transfer" : "Избери датотека или папка за трансфер",
- "Change" : "Измени",
- "New owner" : "Нов сопственик",
- "Search users" : "Пребарувај корисници",
+ "Home" : "Дома",
+ "Target folder does not exist any more" : "Папката не постои повеќе",
+ "Reload current directory" : "Превчитај ја повторно моменталната папка",
+ "Go to the \"{dir}\" directory" : "Оди до \"{dir}\" папката",
+ "Current directory path" : "Патека до оваа папка",
+ "Your have used your space quota and cannot upload files anymore" : "Го имате искористено лимитот на просторот за прикачување и повеќе неможете да прикачувате датотеки",
+ "You do not have permission to upload or create files here." : "Немате дозвола да прикачувате или да креирате датотеки овде",
+ "Drag and drop files here to upload" : "Повлечи и испушти датотеки за прикачување",
+ "Favorite" : "Омилени",
+ "Back" : "Назад",
+ "File is loading" : "Датотеката се вчитува",
+ "Folder is loading" : "Папката се вчитува",
+ "Filename" : "Име на датотека",
+ "Folder name" : "Име на папка",
+ "This node is unavailable" : "Нодот е недостапен",
+ "Another entry with the same name already exists." : "Друг запис со исто име веќе постои.",
+ "Invalid filename." : "Невалидно име.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Преименувано \"{oldName}\" во \"{newName}\"",
+ "Rename file" : "Преименувај датотека",
+ "Folder" : "Папка",
+ "Unknown file type" : "Непознат тип на датотека",
+ "Pending" : "Чека",
+ "Unknown date" : "Непознат датум",
+ "Clear filter" : "Исчисти филтри",
+ "Modified" : "Променето",
+ "Search everywhere" : "Барај насекаде",
+ "Type" : "Вид",
+ "Active filters" : "Активни филтри",
+ "Remove filter" : "Острани филтер",
+ "Total rows summary" : "Резиме на вкупно редови",
+ "Name" : "Име",
+ "File type" : "Вид на датотека",
+ "Size" : "Големина",
+ "Actions" : "Акции",
+ "(selected)" : "(означени)",
+ "List of files and folders." : "Листа на датотеки и папки.",
+ "You have used your space quota and cannot upload files anymore." : "Го имате искористено лимитот на просторот за прикачување и повеќе неможете да прикачувате датотеки.",
+ "Column headers with buttons are sortable." : "Насловите на колоните со копчиња се сортираат.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
+ "File not found" : "Датотеката не е пронајдена",
+ "_{count} selected_::_{count} selected_" : ["{count} означена","{count} означени"],
+ "Search scope options" : "Параметри за опсег на пребарување",
+ "{usedQuotaByte} used" : "искористено {usedQuotaByte}",
+ "{used} of {quota} used" : "Искористени {used} од {quota}",
+ "{relative}% used" : "искористено {relative}% ",
+ "Could not refresh storage stats" : "Неможе да се ажурира статистиката за складиштата",
+ "Your storage is full, files can not be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Storage information" : "Информации за складиште",
+ "New folder" : "Нова папка",
+ "Create new folder" : "Креирај нова папка",
+ "This name is already in use." : "Името е веќе во употреба.",
+ "Create" : "Креирај",
+ "Fill template fields" : "Пополни ги полињата за шаблон",
+ "Submitting fields …" : "Испраќање полиња ...",
+ "Submit" : "Испрати",
"Choose a file or folder to transfer" : "Избери датотека или папка за трансфер",
"Transfer" : "Трансфер",
"Transfer {path} to {userid}" : "Трансфер {path} до {userid}",
"Invalid path selected" : "Избрана невалидна патека",
+ "Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Испратено барање за трансфер на сопственост",
- "Cannot transfer ownership of a file or folder you don't own" : "Неможете да направите трансвер на сопственот на папка која не е ваша",
- "Tags" : "Ознаки",
- "Unable to change the favourite state of the file" : "Неможе да се промени статусот на омимени на датотеката",
+ "Cannot transfer ownership of a file or folder you do not own" : "Неможете да направите трансвер на сопственот на папка која не е ваша",
+ "Transfer ownership of a file or folder" : "Трансфер на сопственост на датотека или папка",
+ "Choose file or folder to transfer" : "Избери датотека или папка за трансфер",
+ "Change" : "Измени",
+ "New owner" : "Нов сопственик",
+ "Use {new}" : "Користи {new}",
+ "Remove extension" : "Отстрани екстензија",
+ "Change file extension" : "Промени екстензија",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Промена на екстензијата од \"{old}\" во \"{new}\" може да ја јаправи датотеката нечитлива.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Остранување на екстензијата \"{old}\" може да ја направи датотеката нечитлива.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Додавање на екстензијата \"{new}\" може да ја направи датотеката нечитлива.",
+ "Do not show this dialog again." : "Не го прикажувај овој дијалог повторно.",
+ "Select file or folder to link to" : "Изберете датотека или папка за линк до",
+ "Choose {file}" : "Избери {file}",
+ "Share" : "Сподели",
+ "Shared by link" : "Споделено со линк",
+ "Shared" : "Споделено",
+ "Switch to list view" : "Прикажи поглед во листа",
+ "Switch to grid view" : "Прикажи поглед во мрежа",
+ "The file could not be found" : "Датотеката неможе да биде пројандена",
+ "Upload was cancelled by user" : "Прикачувањето беше откажано од корисникот",
+ "Not enough free space" : "Нема доволно слободен простор",
+ "Operation is blocked by access control" : "Операцијата е блокирана од контролата на пристап",
+ "Error during upload: {message}" : "Грешка при прикачување: {message}",
+ "Error during upload, status code {status}" : "Грешка при прикачување, статус код {status}",
+ "Unknown error during upload" : "Непозната грешка при прикачување",
+ "Loading current folder" : "Вчитување на моменталната папка",
+ "Retry" : "Обидете се повторно",
+ "No files in here" : "Тука нема датотеки",
+ "Upload some content or sync with your devices!" : "Прикачете некоја содржина или синхронизирајте со вашите уреди!",
+ "Go back" : "Назад",
+ "Views" : "Прегледи",
+ "Files settings" : "Параметри за датотеки",
+ "Your files" : "Ваши датотеки",
+ "Open in files" : "Отвори во датотеките",
+ "File cannot be accessed" : "Неможе да се пристапи до датотеката",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Датотеката не може да се пронајде или немате дозволи за да ја видите. Побарајте од испраќачот да ја сподели.",
+ "No search results for “{query}”" : "Нема резултати од пребарувањето за \"{query}\"",
+ "Search for files" : "Пребарај датотеки",
+ "Clipboard is not available" : "Клипбордот не е достапен",
+ "General" : "Општо",
+ "Default view" : "Стандарден поглед",
+ "All files" : "Сите датотеки",
+ "Personal files" : "Лични датотеки",
+ "Sort favorites first" : "Прво омилените",
+ "Sort folders before files" : "Подреди ги папките пред датотеките",
+ "Appearance" : "Изглед",
+ "Show hidden files" : "Прикажи сокриени датотеки",
+ "Show file type column" : "Прикажи колона за тип на датотека",
+ "Crop image previews" : "Исечи ја сликата за преглед",
+ "Additional settings" : "Дополнителни параметри",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV адреса",
+ "Copy" : "Копирај",
+ "Warnings" : "Предупредувања",
+ "Keyboard shortcuts" : "Кратенки преку тастатура",
+ "File actions" : "Акции со датотеки",
+ "Rename" : "Преименувај",
+ "Delete" : "Избриши",
+ "Manage tags" : "Уреди ги ознаките",
+ "Selection" : "Селектирање",
+ "Select all files" : "Селектирај ги сите датотеки",
+ "Deselect all" : "Одселектирај се",
+ "Navigation" : "Навигација",
+ "View" : "Поглед",
+ "Toggle grid view" : "Промена во мрежа",
+ "Show those shortcuts" : "Покажи ги овие кратенки",
+ "You" : "Вас",
+ "Shared multiple times with different people" : "Споделено повеќе пати со различни луѓе",
+ "Unable to change the favorite state of the file" : "Неможе да се промени статусот на омимени на датотеката",
"Error while loading the file data" : "Грешка при вчитување на податоците од датотеката",
+ "Owner" : "Сопственик",
+ "Remove from favorites" : "Отстрани од фаворити",
+ "Add to favorites" : "Додади во фаворити",
+ "Tags" : "Ознаки",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Неможе да се креира датотека од шаблон",
"Pick a template for {name}" : "Избери шаблон за {name}",
- "Cancel" : "Откажи",
- "Create" : "Креирај",
"Create a new file with the selected template" : "Креирај нова датотека со избраниот шаблон",
"Creating file" : "Креирање на датотека",
- "Blank" : "Празно",
- "Unable to create new file from template" : "Неможе да се креира датотека од шаблон",
- "Set up templates folder" : "Поставете папка за шаблони",
- "Templates" : "Шаблони",
+ "Save as {displayName}" : "Зачувај како {displayName}",
+ "Save as …" : "Зачувај како ...",
+ "Converting files …" : "Конвертирање датотеки …",
+ "Leave this share" : "Напушти го ова споделување",
+ "Leave these shares" : "Напушти ги овие споделувања",
+ "Disconnect storage" : "Исклучи складиште",
+ "Delete permanently" : "Избриши",
+ "Delete file" : "Избриши датотека",
+ "Delete files" : "Избриши датотеки",
+ "Delete folder" : "Избриши папка",
+ "Delete folders" : "Избриши папки",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Сакате да избришете {count} датотека","Сакате да избришете {count} датотеки"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Сакате да избришете {count} датотека","Сакате да избришете {count} датотеки"],
+ "Confirm deletion" : "Потврди бришење",
+ "Cancel" : "Откажи",
+ "Download" : "Преземи",
+ "Destination is not a folder" : "Дестинацијата не е папка",
+ "This file/folder is already in that directory" : "Оваа папка/датотека се наоѓа веќе во таа папка",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Неможете да преместите датотека/папка во себеси или во подпапка во себеси",
+ "(copy)" : "(копирај)",
+ "(copy %n)" : "(копирај %n)",
+ "A file or folder with that name already exists in this folder" : "Датотека или папка со тоа име веќе постои во оваа папка",
+ "The files are locked" : "Датотекатите се заклучени",
+ "The file does not exist anymore" : "Датотеката не постои",
+ "Choose destination" : "Избери дестинација",
+ "Copy to {target}" : "Копирај во {target}",
+ "Move to {target}" : "Премести во {target}",
+ "Move" : "Премести",
+ "Move or copy" : "Премести или копирај",
+ "Open folder {displayName}" : "Отвори папка {displayName}",
+ "Open in Files" : "Отвори во датотеките",
+ "Open locally" : "Отвори локално",
+ "Failed to redirect to client" : "Неуспешно пренасочување кон клиентот",
+ "Open file locally" : "Отвори ја датотеката локално",
+ "Details" : "Детали:",
+ "View in folder" : "Погледни во папката",
+ "Today" : "Денес",
+ "Last 7 days" : "Предходни 7 дена",
+ "Last 30 days" : "Предходни 30 дена",
+ "This year ({year})" : "Оваа година ({year})",
+ "Last year ({year})" : "Минатата година ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Табели",
+ "Presentations" : "Презентации",
+ "PDFs" : "PDF-и",
+ "Folders" : "Папки",
+ "Audio" : "Аудио",
+ "Images" : "Слики",
+ "Videos" : "Видеа",
+ "Created new folder \"{name}\"" : "Креирана нова папка \"{name}\"",
"Unable to initialize the templates directory" : "Не може да се иницијализира папка за шаблони",
- "%s used" : "Искористено %s",
- "%s%% of %s used" : "Искорестено%s%% од %s ",
- "%1$s of %2$s used" : "Искористено %1$s од %2$s",
- "Settings" : "Параметри",
- "Show hidden files" : "Прикажи сокриени датотеки",
- "Crop image previews" : "Исечи ја сликата за преглед",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
- "Toggle grid view" : "Промена во мрежа",
- "No files in here" : "Тука нема датотеки",
- "Upload some content or sync with your devices!" : "Прикачете некоја содржина или синхронизирајте со вашите уреди!",
+ "Create templates folder" : "Креирај папка за шаблони",
+ "Templates" : "Шаблони",
+ "New template folder" : "Нова папка за шаблони",
+ "In folder" : "Во папка",
+ "Search in folder: {folder}" : "Барај во папка: {folder}",
+ "One of the dropped files could not be processed" : "Една од испуштените датотеки неможе да се процесоира",
+ "Unable to create the directory {directory}" : "Неможе да се креира папка {directory}",
+ "Some files could not be uploaded" : "Некој датотеки неможат да се прикачат",
+ "Files uploaded successfully" : "Успешно прикачени датотеки",
+ "Some files could not be moved" : "Некои датотеки не можат да се преместат",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Неможе да се преименува \"{oldName}\", не постои повеќе",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{newName}\" веќе се користи во папката \"{dir}\". Ве молиме изберете друго име.",
+ "Could not rename \"{oldName}\"" : "Неможе да се преименува \"{oldName}\"",
+ "This operation is forbidden" : "Операцијата не е дозволена",
+ "Storage is temporarily not available" : "Складиштето моментално не е достапно",
+ "Unexpected error: {error}" : "Неочекувана грешка: {error}",
+ "_%n file_::_%n files_" : ["%n датотека","%n датотеки"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
+ "Filename must not be empty." : "Името на датотеката не може да биде празно.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" не е дозволен во името на датотеката.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" е резервирано име и не е дозволено во името на датотеката.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" не е дозволен вид на датотека.",
+ "Filenames must not end with \"{extension}\"." : "Името неможе да завршува со \"{extension}\".",
+ "List of favorite files and folders." : "Листа на омилени датотеки и папки.",
+ "No favorites yet" : "Сеуште нема фаворити",
+ "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука",
+ "List of your files and folders." : "Листа на вашите датотеки и папки.",
+ "No personal files found" : "Не се пронајдени лични датотеки ",
+ "Recent" : "Неодамнешни",
+ "List of recently modified files and folders." : "Листа на скоро изменети датотеки и папки.",
+ "No recently modified files" : "Нема скоро изменети датотеки",
+ "Files and folders you recently modified will show up here." : "Датотеките и папките кои скоро ќе ги измените ќе се појават тука.",
+ "Search" : "Барај",
"No entries found in this folder" : "Нема ништо во оваа папка",
"Select all" : "Избери се",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
- "No favorites yet" : "Сеуште нема фаворити",
- "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука",
- "Deleted files" : "Избришани датотеки",
- "Shares" : "Споделувања",
- "Shared with others" : "Споделно со други",
- "Shared with you" : "Споделено со тебе",
- "Shared by link" : "Споделено со линк",
- "Deleted shares" : "Избришани споделувања",
- "Pending shares" : "Споделувања на чекање",
+ "File could not be found" : "Неможе да се пронајде датотеката",
+ "Show list view" : "Прикажи поглед во листа",
+ "Show grid view" : "Прикажи поглед во мрежа",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Неможе да се креира папка \"{dir}\"",
+ "This will stop your current uploads." : "Ова ќе го прекине вашето моментално прикачување.",
+ "Upload cancelled." : "Преземањето е прекинато.",
+ "Processing files …" : "Обработка на датотеки ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможе да се прикачи {filename} бидејќи е директориум или е 0 бајти",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема доволно слободен простор, прикачувате {size1} а слободен простор има {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Папката \"{dir}\" не постои повеќе",
+ "An unknown error has occurred" : "Се појави непозната грешка",
+ "File could not be uploaded" : "Датотеката неможе да се прикачи",
+ "Uploading …" : "Прикачување …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Прикачување … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Прикачување на таа датотека не е дозволено",
+ "Error when assembling chunks, status code {status}" : "Грешка при составување на парчиња, статусен код {status}",
+ "Choose target folder" : "Избери папка",
+ "Set reminder" : "Постави потсетник",
+ "Edit locally" : "Уреди локално",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Неможе да се вчитаат информации за датотеката \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Избери ознаки за одбележаното",
+ "Apply tag(s) to selection" : "Примени ознаки на обележаните",
+ "Select directory \"{dirName}\"" : "Избери папка \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Избери датотека \"{fileName}\"",
+ "Unable to determine date" : "Неможе да се одреди датумот",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овој директориум е недостапен, ве молиме проверете ги логовите или контактирајте со администраторот",
+ "Could not move \"{file}\", target exists" : "Не може да се премести \"{file}\", веќе постои",
+ "Could not move \"{file}\"" : "Не може да се премести \"{file}\"",
+ "copy" : "копирај",
+ "Could not copy \"{file}\", target exists" : "Не може да се копира \"{file}\", веќе постои",
+ "Could not copy \"{file}\"" : "Не може да се копира \"{file}\"",
+ "Copied {origin} inside {destination}" : "Копирана {origin} во {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирана {origin} и {nbfiles} други датотеки во {destination}",
+ "{newName} already exists" : "{newName} веќе постои",
+ "Could not create file \"{file}\"" : "Неможе да се креира датотека \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Неможе да се креира датотека \"{file}\" бидејќи веќе постои",
+ "Could not create folder \"{dir}\" because it already exists" : "Неможе да се креира папка \"{dir}\" бидејќи веќе постои",
+ "Could not fetch file details \"{file}\"" : "Неможе да се вчитаат деталите за датотеката \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Грешка при бришење на датотека \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултати од пребарувањето на други места за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Внесете повеќе од два карактери за да пребарувате во другите папки",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"],
+ "You do not have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки овде",
+ "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"],
+ "New" : "Нов/a",
+ "New file/folder menu" : "Мени Нова датотека/папка",
+ "Select file range" : "Избери опсег на датотеки",
+ "{used}%" : "{used}%",
+ "{used} used" : "Искористени {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" е невалидно име за датотека.",
+ "File name cannot be empty." : "Името на датотеката не може да биде празно.",
+ "\"/\" is not allowed inside a file name." : "\"/\" не е дозволено во името.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" не е дозволен вид на датотека",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Скалдиштето на {owner} е скоро исполнето ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групната папка \"{mountPoint}\" е скоро исполнета ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Надворешното складиште \"{mountPoint}\" е скоро исполнето ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Вашето складиште е скоро исполнето ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["содржи '{filter}'","содржи '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Копиран е директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
+ "Path" : "Патека",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирај директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
+ "Upload file" : "Прикачи датотека",
+ "An error occurred while trying to update the tags" : "Се случи грешка додека се обидувавте да ги освежите таговите",
+ "Upload (max. %s)" : "Префрлање (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" акцијата е успешно извршена",
+ "\"{displayName}\" action failed" : "\"{displayName}\" акцијата не успеа",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" сериската акција е успешно извршена",
+ "Filter filenames…" : "Филтрирај имиња на датотеки ...",
+ "WebDAV URL copied to clipboard" : "CalDAV линкот е копиран",
+ "Enable the grid view" : "Овозможи поглед во мрежа",
+ "Enable folder tree" : "Овозможи поглед на дрво",
+ "Copy to clipboard" : "Копирај во клипборд",
+ "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
+ "Deletion cancelled" : "Бришењето е откажано",
+ "Cancelled move or copy operation" : "Откажана операција на копирање или преместување",
+ "Open details" : "Отвори детали",
+ "Photos and images" : "Фотографии и слики",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} датотека","{fileCount} датотеки"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 датотека и {folderCount} папки","1 датотека и {folderCount} папки"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} датотека и 1 папка","{fileCount} датотеки и 1 папка"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} датотеки и {folderCount} папки",
+ "All folders" : "Сите папки",
+ "Personal Files" : "Лични датотеки",
"Text file" : "Текстуална датотека",
"New text file.txt" : "Нова текстуална датотека file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Your storage is full, files can not be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "_matches '{filter}'_::_match '{filter}'_" : ["содржи '{filter}'","содржи '{filter}'"]
+ "%1$s (renamed)" : "%1$s (преименувано)",
+ "renamed file" : "преименувана датотека",
+ "Filter file names …" : "Филтрирај имиња на датотеки ...",
+ "Prevent warning dialogs from open or reenable them." : "Спречете ги дијалозите за предупредување да се отвораат или повторно овозможете ги.",
+ "Show a warning dialog when changing a file extension." : "Прикажи дијалог за предупредување при промена на екстензија на датотека.",
+ "Speed up your Files experience with these quick shortcuts." : "Забрзајте го вашето искуство со овие брзи кратенки.",
+ "Open the actions menu for a file" : "Отвори Мени со акции за датотека",
+ "Rename a file" : "Преименувај датотека",
+ "Delete a file" : "Избриши датотека",
+ "Favorite or remove a file from favorites" : "Додади или острани од омилени",
+ "Manage tags for a file" : "Управувај со ознаки за датотека",
+ "Deselect all files" : "Деселектирај ги сите датотеки",
+ "Select or deselect a file" : "Селектирај или деселектирај датотека",
+ "Select a range of files" : "Селектирај опсег на датотеки",
+ "Navigate to the parent folder" : "Врати се до предходната папка",
+ "Navigate to the file above" : "Оди до датотека горе",
+ "Navigate to the file below" : "Оди до датотека доле",
+ "Navigate to the file on the left (in grid mode)" : "Оди до датотека лево (само во мрежен приказ)",
+ "Navigate to the file on the right (in grid mode)" : "Оди до датотека десно (само во мрежен приказ)",
+ "Toggle the grid view" : "Вклучи/исклучи мрежен приказ",
+ "Open the sidebar for a file" : "Отвори странична лента за датотека"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json
index 1c307c437b7..9009063e042 100644
--- a/apps/files/l10n/mk.json
+++ b/apps/files/l10n/mk.json
@@ -1,110 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Складиштето моментално не е достапно",
- "Storage invalid" : "Невалидно складиште",
- "Unknown error" : "Непозната грешка",
- "File could not be found" : "Неможе да се пронајде датотеката",
- "Move or copy" : "Премести или копирај",
- "Download" : "Преземи",
- "Delete" : "Избриши",
- "Home" : "Дома",
- "Close" : "Затвори",
- "Favorites" : "Омилени",
- "Could not create folder \"{dir}\"" : "Неможе да се креира папка \"{dir}\"",
- "This will stop your current uploads." : "Ова ќе го прекине вашето моментално прикачување.",
- "Upload cancelled." : "Преземањето е прекинато.",
- "Processing files …" : "Обработка на датотеки ...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможе да се прикачи {filename} бидејќи е директориум или е 0 бајти",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема доволно слободен простор, прикачувате {size1} а слободен простор има {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Папката \"{dir}\" не постои повеќе",
- "Not enough free space" : "Нема доволно слободен простор",
- "An unknown error has occurred" : "Се појави непозната грешка",
- "Uploading …" : "Прикачување …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Прикачување на таа датотека не е дозволено",
- "Target folder does not exist any more" : "Папката не постои повеќе",
- "Operation is blocked by access control" : "Операцијата е блокирана од контролата на пристап",
- "Error when assembling chunks, status code {status}" : "Грешка при составување на парчиња, статусен код {status}",
- "Actions" : "Акции",
- "Rename" : "Преименувај",
- "Copy" : "Копирај",
- "Choose target folder" : "Избери папка",
- "Open" : "Отвори",
- "Delete file" : "Избриши датотека",
- "Delete folder" : "Избриши папка",
- "Disconnect storage" : "Исклучи складиште",
- "Leave this share" : "Оставете го ова споделување",
- "Could not load info for file \"{file}\"" : "Неможе да се вчитаат информации за датотеката \"{file}\"",
- "Files" : "Датотеки",
- "Details" : "Детали:",
- "Select" : "Избери",
- "Pending" : "Чека",
- "Unable to determine date" : "Неможе да се одреди датумот",
- "This operation is forbidden" : "Операцијата не е дозволена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Овој директориум е недостапен, ве молиме проверете ги логовите или контактирајте со администраторот",
- "Could not move \"{file}\", target exists" : "Не може да се премести \"{file}\", веќе постои",
- "Could not move \"{file}\"" : "Не може да се премести \"{file}\"",
- "copy" : "копирај",
- "Could not copy \"{file}\", target exists" : "Не може да се копира \"{file}\", веќе постои",
- "Could not copy \"{file}\"" : "Не може да се копира \"{file}\"",
- "Copied {origin} inside {destination}" : "Копирана {origin} во {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирана {origin} и {nbfiles} други датотеки во {destination}",
- "{newName} already exists" : "{newName} веќе постои",
- "Could not rename \"{fileName}\", it does not exist any more" : "Неможе да се преименува \"{fileName}\", датотеката не постои",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" веќе се користи во папката \"{dir}\". Ве молиме изберете друго име.",
- "Could not rename \"{fileName}\"" : "Неможе да се преименува \"{fileName}\"",
- "Could not create file \"{file}\"" : "Неможе да се креира датотека \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Неможе да се креира датотека \"{file}\" бидејќи веќе постои",
- "Could not create folder \"{dir}\" because it already exists" : "Неможе да се креира папка \"{dir}\" бидејќи веќе постои",
- "Could not fetch file details \"{file}\"" : "Неможе да се вчитаат деталите за датотеката \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Грешка при бришење на датотека \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултати од пребарувањето на други места за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Внесете повеќе од два карактери за да пребарувате во другите папки",
- "Name" : "Име",
- "Size" : "Големина",
- "Modified" : "Променето",
- "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
- "_%n file_::_%n files_" : ["%n датотека","%n датотеки"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"],
- "You don’t have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки",
- "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"],
- "New" : "Ново",
- "Select file range" : "Избери опсег на датотеки",
- "{used} of {quota} used" : "Искористени {used} од {quota}",
- "{used} used" : "Искористени {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" е невалидно име за датотека.",
- "File name cannot be empty." : "Името на датотеката не може да биде празно.",
- "\"/\" is not allowed inside a file name." : "\"/\" не е дозволено во името.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" не е дозволен вид на датотека",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Скалдиштето на {owner} е скоро исполнето ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групната папка \"{mountPoint}\" е скоро исполнета ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Надворешното складиште \"{mountPoint}\" е скоро исполнето ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Вашето складиште е скоро исполнето ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["содржи '{filter}'","содржи '{filter}'"],
- "View in folder" : "Погледни во папката",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирај директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
- "Path" : "Патека",
- "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"],
- "Favorited" : "Омилени",
- "Favorite" : "Омилен",
- "You can only favorite a single file or folder at a time" : "Можете да додавате само по една датотека или папка во фаворити одеднаш",
- "New folder" : "Нова папка",
- "Upload file" : "Прикачи датотека",
- "Recent" : "Неодамнешни",
- "Not favorited" : "Нема фаворити",
- "Remove from favorites" : "Отстрани од фаворити",
- "Add to favorites" : "Додади во фаворити",
- "An error occurred while trying to update the tags" : "Се случи грешка додека се обидувавте да ги освежите таговите",
"Added to favorites" : "Додадени во фаворити",
"Removed from favorites" : "Отстранети од фаворити",
"You added {file} to your favorites" : "Додадовте {file} во фаворити",
"You removed {file} from your favorites" : "Отстранивте {file} од фаворити",
+ "Favorites" : "Омилени",
"File changes" : "Промени на датотеки",
"Created by {user}" : "Копирано од {user}",
"Changed by {user}" : "Променето од {user}",
@@ -112,7 +11,7 @@
"Restored by {user}" : "Вратено од {user}",
"Renamed by {user}" : "Преименувано од {user}",
"Moved by {user}" : "Преместено од {user}",
- "\"remote user\"" : "\"далечен корисник\"",
+ "\"remote account\"" : "\"оддалечен корисник\"",
"You created {file}" : "Креиравте {file}",
"You created an encrypted file in {file}" : "Креиравте шифрирана датотека во {file}",
"{user} created {file}" : "{user} креираше {file}",
@@ -139,15 +38,25 @@
"You moved {oldfile} to {newfile}" : "Го премести {oldfile} во {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} го премести {oldfile} во {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Датотека беше додадена или избришана од <strong>фаворити</strong>",
+ "Files" : "Датотеки",
"A file or folder has been <strong>changed</strong>" : "Датотека или папка беше <strong>променета</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Датотека или папка која е означена како омилена беше <strong>променета</strong>",
- "All files" : "Сите датотеки",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Префрлање (макс. %s)",
+ "Failed to authorize" : "Неуспешна авторизација",
+ "Invalid folder path" : "Невалидна патека до папка",
+ "Folder not found" : "Папката не е пронајдена",
+ "The file cannot be found" : "Датотеката неможе да биде пројандена",
+ "The destination path does not exist: %1$s" : "Патеката не постои: %1$s",
+ "You do not have permission to create a file at the specified location" : "Немате дозвола да креирате датотека на специфираната локација",
+ "The file could not be converted." : "Датотеката неможе да се конвертира.",
+ "Favorite files" : "Омилени датотеки",
+ "No favorites" : "Нема омилени",
+ "More favorites" : "Повеќе омилени",
"Accept" : "Прифати",
"Reject" : "Одбиј",
"Incoming ownership transfer from {user}" : "Барање за трансфер на сопственост од {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Дали прифаќате {path}?\n\nЗабелешка: Процесот на трансфер откога ќе прифатите може да трае и повеќе од 1 час.",
+ "Ownership transfer denied" : "Одбиен трансфер на сопственост",
+ "Your ownership transfer of {path} was denied by {user}." : "Барањето за трансфер на сопственост на {path} е одбиен од {user}.",
"Ownership transfer failed" : "Неуспешен трансфер на сопственост",
"Your ownership transfer of {path} to {user} failed." : "Неуспешен трансфер на сопственост на {path} до {user}.",
"The ownership transfer of {path} from {user} failed." : "Неуспешен трансфер на сопственост на {path} од {user}.",
@@ -155,61 +64,356 @@
"Your ownership transfer of {path} to {user} has completed." : "Вашиот транфер на сопственост на {path} до {user} е комплетиран.",
"The ownership transfer of {path} from {user} has completed." : "Трансферот на сопственост на {path} од {user} е комплетиран.",
"in %s" : "во %s",
+ "Transferred from %1$s on %2$s" : "Трансфер од %1$s на %2$s",
+ "Files compatibility" : "Компатибилност со датотеки",
"File Management" : "Датотеки",
- "Transfer ownership of a file or folder" : "Трансфер на сопственост на датотека или папка",
- "Choose file or folder to transfer" : "Избери датотека или папка за трансфер",
- "Change" : "Измени",
- "New owner" : "Нов сопственик",
- "Search users" : "Пребарувај корисници",
+ "Home" : "Дома",
+ "Target folder does not exist any more" : "Папката не постои повеќе",
+ "Reload current directory" : "Превчитај ја повторно моменталната папка",
+ "Go to the \"{dir}\" directory" : "Оди до \"{dir}\" папката",
+ "Current directory path" : "Патека до оваа папка",
+ "Your have used your space quota and cannot upload files anymore" : "Го имате искористено лимитот на просторот за прикачување и повеќе неможете да прикачувате датотеки",
+ "You do not have permission to upload or create files here." : "Немате дозвола да прикачувате или да креирате датотеки овде",
+ "Drag and drop files here to upload" : "Повлечи и испушти датотеки за прикачување",
+ "Favorite" : "Омилени",
+ "Back" : "Назад",
+ "File is loading" : "Датотеката се вчитува",
+ "Folder is loading" : "Папката се вчитува",
+ "Filename" : "Име на датотека",
+ "Folder name" : "Име на папка",
+ "This node is unavailable" : "Нодот е недостапен",
+ "Another entry with the same name already exists." : "Друг запис со исто име веќе постои.",
+ "Invalid filename." : "Невалидно име.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Преименувано \"{oldName}\" во \"{newName}\"",
+ "Rename file" : "Преименувај датотека",
+ "Folder" : "Папка",
+ "Unknown file type" : "Непознат тип на датотека",
+ "Pending" : "Чека",
+ "Unknown date" : "Непознат датум",
+ "Clear filter" : "Исчисти филтри",
+ "Modified" : "Променето",
+ "Search everywhere" : "Барај насекаде",
+ "Type" : "Вид",
+ "Active filters" : "Активни филтри",
+ "Remove filter" : "Острани филтер",
+ "Total rows summary" : "Резиме на вкупно редови",
+ "Name" : "Име",
+ "File type" : "Вид на датотека",
+ "Size" : "Големина",
+ "Actions" : "Акции",
+ "(selected)" : "(означени)",
+ "List of files and folders." : "Листа на датотеки и папки.",
+ "You have used your space quota and cannot upload files anymore." : "Го имате искористено лимитот на просторот за прикачување и повеќе неможете да прикачувате датотеки.",
+ "Column headers with buttons are sortable." : "Насловите на колоните со копчиња се сортираат.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
+ "File not found" : "Датотеката не е пронајдена",
+ "_{count} selected_::_{count} selected_" : ["{count} означена","{count} означени"],
+ "Search scope options" : "Параметри за опсег на пребарување",
+ "{usedQuotaByte} used" : "искористено {usedQuotaByte}",
+ "{used} of {quota} used" : "Искористени {used} од {quota}",
+ "{relative}% used" : "искористено {relative}% ",
+ "Could not refresh storage stats" : "Неможе да се ажурира статистиката за складиштата",
+ "Your storage is full, files can not be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Storage information" : "Информации за складиште",
+ "New folder" : "Нова папка",
+ "Create new folder" : "Креирај нова папка",
+ "This name is already in use." : "Името е веќе во употреба.",
+ "Create" : "Креирај",
+ "Fill template fields" : "Пополни ги полињата за шаблон",
+ "Submitting fields …" : "Испраќање полиња ...",
+ "Submit" : "Испрати",
"Choose a file or folder to transfer" : "Избери датотека или папка за трансфер",
"Transfer" : "Трансфер",
"Transfer {path} to {userid}" : "Трансфер {path} до {userid}",
"Invalid path selected" : "Избрана невалидна патека",
+ "Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Испратено барање за трансфер на сопственост",
- "Cannot transfer ownership of a file or folder you don't own" : "Неможете да направите трансвер на сопственот на папка која не е ваша",
- "Tags" : "Ознаки",
- "Unable to change the favourite state of the file" : "Неможе да се промени статусот на омимени на датотеката",
+ "Cannot transfer ownership of a file or folder you do not own" : "Неможете да направите трансвер на сопственот на папка која не е ваша",
+ "Transfer ownership of a file or folder" : "Трансфер на сопственост на датотека или папка",
+ "Choose file or folder to transfer" : "Избери датотека или папка за трансфер",
+ "Change" : "Измени",
+ "New owner" : "Нов сопственик",
+ "Use {new}" : "Користи {new}",
+ "Remove extension" : "Отстрани екстензија",
+ "Change file extension" : "Промени екстензија",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Промена на екстензијата од \"{old}\" во \"{new}\" може да ја јаправи датотеката нечитлива.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Остранување на екстензијата \"{old}\" може да ја направи датотеката нечитлива.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Додавање на екстензијата \"{new}\" може да ја направи датотеката нечитлива.",
+ "Do not show this dialog again." : "Не го прикажувај овој дијалог повторно.",
+ "Select file or folder to link to" : "Изберете датотека или папка за линк до",
+ "Choose {file}" : "Избери {file}",
+ "Share" : "Сподели",
+ "Shared by link" : "Споделено со линк",
+ "Shared" : "Споделено",
+ "Switch to list view" : "Прикажи поглед во листа",
+ "Switch to grid view" : "Прикажи поглед во мрежа",
+ "The file could not be found" : "Датотеката неможе да биде пројандена",
+ "Upload was cancelled by user" : "Прикачувањето беше откажано од корисникот",
+ "Not enough free space" : "Нема доволно слободен простор",
+ "Operation is blocked by access control" : "Операцијата е блокирана од контролата на пристап",
+ "Error during upload: {message}" : "Грешка при прикачување: {message}",
+ "Error during upload, status code {status}" : "Грешка при прикачување, статус код {status}",
+ "Unknown error during upload" : "Непозната грешка при прикачување",
+ "Loading current folder" : "Вчитување на моменталната папка",
+ "Retry" : "Обидете се повторно",
+ "No files in here" : "Тука нема датотеки",
+ "Upload some content or sync with your devices!" : "Прикачете некоја содржина или синхронизирајте со вашите уреди!",
+ "Go back" : "Назад",
+ "Views" : "Прегледи",
+ "Files settings" : "Параметри за датотеки",
+ "Your files" : "Ваши датотеки",
+ "Open in files" : "Отвори во датотеките",
+ "File cannot be accessed" : "Неможе да се пристапи до датотеката",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Датотеката не може да се пронајде или немате дозволи за да ја видите. Побарајте од испраќачот да ја сподели.",
+ "No search results for “{query}”" : "Нема резултати од пребарувањето за \"{query}\"",
+ "Search for files" : "Пребарај датотеки",
+ "Clipboard is not available" : "Клипбордот не е достапен",
+ "General" : "Општо",
+ "Default view" : "Стандарден поглед",
+ "All files" : "Сите датотеки",
+ "Personal files" : "Лични датотеки",
+ "Sort favorites first" : "Прво омилените",
+ "Sort folders before files" : "Подреди ги папките пред датотеките",
+ "Appearance" : "Изглед",
+ "Show hidden files" : "Прикажи сокриени датотеки",
+ "Show file type column" : "Прикажи колона за тип на датотека",
+ "Crop image previews" : "Исечи ја сликата за преглед",
+ "Additional settings" : "Дополнителни параметри",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV адреса",
+ "Copy" : "Копирај",
+ "Warnings" : "Предупредувања",
+ "Keyboard shortcuts" : "Кратенки преку тастатура",
+ "File actions" : "Акции со датотеки",
+ "Rename" : "Преименувај",
+ "Delete" : "Избриши",
+ "Manage tags" : "Уреди ги ознаките",
+ "Selection" : "Селектирање",
+ "Select all files" : "Селектирај ги сите датотеки",
+ "Deselect all" : "Одселектирај се",
+ "Navigation" : "Навигација",
+ "View" : "Поглед",
+ "Toggle grid view" : "Промена во мрежа",
+ "Show those shortcuts" : "Покажи ги овие кратенки",
+ "You" : "Вас",
+ "Shared multiple times with different people" : "Споделено повеќе пати со различни луѓе",
+ "Unable to change the favorite state of the file" : "Неможе да се промени статусот на омимени на датотеката",
"Error while loading the file data" : "Грешка при вчитување на податоците од датотеката",
+ "Owner" : "Сопственик",
+ "Remove from favorites" : "Отстрани од фаворити",
+ "Add to favorites" : "Додади во фаворити",
+ "Tags" : "Ознаки",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Неможе да се креира датотека од шаблон",
"Pick a template for {name}" : "Избери шаблон за {name}",
- "Cancel" : "Откажи",
- "Create" : "Креирај",
"Create a new file with the selected template" : "Креирај нова датотека со избраниот шаблон",
"Creating file" : "Креирање на датотека",
- "Blank" : "Празно",
- "Unable to create new file from template" : "Неможе да се креира датотека од шаблон",
- "Set up templates folder" : "Поставете папка за шаблони",
- "Templates" : "Шаблони",
+ "Save as {displayName}" : "Зачувај како {displayName}",
+ "Save as …" : "Зачувај како ...",
+ "Converting files …" : "Конвертирање датотеки …",
+ "Leave this share" : "Напушти го ова споделување",
+ "Leave these shares" : "Напушти ги овие споделувања",
+ "Disconnect storage" : "Исклучи складиште",
+ "Delete permanently" : "Избриши",
+ "Delete file" : "Избриши датотека",
+ "Delete files" : "Избриши датотеки",
+ "Delete folder" : "Избриши папка",
+ "Delete folders" : "Избриши папки",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Сакате да избришете {count} датотека","Сакате да избришете {count} датотеки"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Сакате да избришете {count} датотека","Сакате да избришете {count} датотеки"],
+ "Confirm deletion" : "Потврди бришење",
+ "Cancel" : "Откажи",
+ "Download" : "Преземи",
+ "Destination is not a folder" : "Дестинацијата не е папка",
+ "This file/folder is already in that directory" : "Оваа папка/датотека се наоѓа веќе во таа папка",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Неможете да преместите датотека/папка во себеси или во подпапка во себеси",
+ "(copy)" : "(копирај)",
+ "(copy %n)" : "(копирај %n)",
+ "A file or folder with that name already exists in this folder" : "Датотека или папка со тоа име веќе постои во оваа папка",
+ "The files are locked" : "Датотекатите се заклучени",
+ "The file does not exist anymore" : "Датотеката не постои",
+ "Choose destination" : "Избери дестинација",
+ "Copy to {target}" : "Копирај во {target}",
+ "Move to {target}" : "Премести во {target}",
+ "Move" : "Премести",
+ "Move or copy" : "Премести или копирај",
+ "Open folder {displayName}" : "Отвори папка {displayName}",
+ "Open in Files" : "Отвори во датотеките",
+ "Open locally" : "Отвори локално",
+ "Failed to redirect to client" : "Неуспешно пренасочување кон клиентот",
+ "Open file locally" : "Отвори ја датотеката локално",
+ "Details" : "Детали:",
+ "View in folder" : "Погледни во папката",
+ "Today" : "Денес",
+ "Last 7 days" : "Предходни 7 дена",
+ "Last 30 days" : "Предходни 30 дена",
+ "This year ({year})" : "Оваа година ({year})",
+ "Last year ({year})" : "Минатата година ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Табели",
+ "Presentations" : "Презентации",
+ "PDFs" : "PDF-и",
+ "Folders" : "Папки",
+ "Audio" : "Аудио",
+ "Images" : "Слики",
+ "Videos" : "Видеа",
+ "Created new folder \"{name}\"" : "Креирана нова папка \"{name}\"",
"Unable to initialize the templates directory" : "Не може да се иницијализира папка за шаблони",
- "%s used" : "Искористено %s",
- "%s%% of %s used" : "Искорестено%s%% од %s ",
- "%1$s of %2$s used" : "Искористено %1$s од %2$s",
- "Settings" : "Параметри",
- "Show hidden files" : "Прикажи сокриени датотеки",
- "Crop image previews" : "Исечи ја сликата за преглед",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
- "Toggle grid view" : "Промена во мрежа",
- "No files in here" : "Тука нема датотеки",
- "Upload some content or sync with your devices!" : "Прикачете некоја содржина или синхронизирајте со вашите уреди!",
+ "Create templates folder" : "Креирај папка за шаблони",
+ "Templates" : "Шаблони",
+ "New template folder" : "Нова папка за шаблони",
+ "In folder" : "Во папка",
+ "Search in folder: {folder}" : "Барај во папка: {folder}",
+ "One of the dropped files could not be processed" : "Една од испуштените датотеки неможе да се процесоира",
+ "Unable to create the directory {directory}" : "Неможе да се креира папка {directory}",
+ "Some files could not be uploaded" : "Некој датотеки неможат да се прикачат",
+ "Files uploaded successfully" : "Успешно прикачени датотеки",
+ "Some files could not be moved" : "Некои датотеки не можат да се преместат",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Неможе да се преименува \"{oldName}\", не постои повеќе",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{newName}\" веќе се користи во папката \"{dir}\". Ве молиме изберете друго име.",
+ "Could not rename \"{oldName}\"" : "Неможе да се преименува \"{oldName}\"",
+ "This operation is forbidden" : "Операцијата не е дозволена",
+ "Storage is temporarily not available" : "Складиштето моментално не е достапно",
+ "Unexpected error: {error}" : "Неочекувана грешка: {error}",
+ "_%n file_::_%n files_" : ["%n датотека","%n датотеки"],
+ "_%n folder_::_%n folders_" : ["%n папка","%n папки"],
+ "Filename must not be empty." : "Името на датотеката не може да биде празно.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" не е дозволен во името на датотеката.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" е резервирано име и не е дозволено во името на датотеката.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" не е дозволен вид на датотека.",
+ "Filenames must not end with \"{extension}\"." : "Името неможе да завршува со \"{extension}\".",
+ "List of favorite files and folders." : "Листа на омилени датотеки и папки.",
+ "No favorites yet" : "Сеуште нема фаворити",
+ "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука",
+ "List of your files and folders." : "Листа на вашите датотеки и папки.",
+ "No personal files found" : "Не се пронајдени лични датотеки ",
+ "Recent" : "Неодамнешни",
+ "List of recently modified files and folders." : "Листа на скоро изменети датотеки и папки.",
+ "No recently modified files" : "Нема скоро изменети датотеки",
+ "Files and folders you recently modified will show up here." : "Датотеките и папките кои скоро ќе ги измените ќе се појават тука.",
+ "Search" : "Барај",
"No entries found in this folder" : "Нема ништо во оваа папка",
"Select all" : "Избери се",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
- "No favorites yet" : "Сеуште нема фаворити",
- "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука",
- "Deleted files" : "Избришани датотеки",
- "Shares" : "Споделувања",
- "Shared with others" : "Споделно со други",
- "Shared with you" : "Споделено со тебе",
- "Shared by link" : "Споделено со линк",
- "Deleted shares" : "Избришани споделувања",
- "Pending shares" : "Споделувања на чекање",
+ "File could not be found" : "Неможе да се пронајде датотеката",
+ "Show list view" : "Прикажи поглед во листа",
+ "Show grid view" : "Прикажи поглед во мрежа",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Неможе да се креира папка \"{dir}\"",
+ "This will stop your current uploads." : "Ова ќе го прекине вашето моментално прикачување.",
+ "Upload cancelled." : "Преземањето е прекинато.",
+ "Processing files …" : "Обработка на датотеки ...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможе да се прикачи {filename} бидејќи е директориум или е 0 бајти",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема доволно слободен простор, прикачувате {size1} а слободен простор има {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Папката \"{dir}\" не постои повеќе",
+ "An unknown error has occurred" : "Се појави непозната грешка",
+ "File could not be uploaded" : "Датотеката неможе да се прикачи",
+ "Uploading …" : "Прикачување …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Прикачување … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Прикачување на таа датотека не е дозволено",
+ "Error when assembling chunks, status code {status}" : "Грешка при составување на парчиња, статусен код {status}",
+ "Choose target folder" : "Избери папка",
+ "Set reminder" : "Постави потсетник",
+ "Edit locally" : "Уреди локално",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Неможе да се вчитаат информации за датотеката \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Избери ознаки за одбележаното",
+ "Apply tag(s) to selection" : "Примени ознаки на обележаните",
+ "Select directory \"{dirName}\"" : "Избери папка \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Избери датотека \"{fileName}\"",
+ "Unable to determine date" : "Неможе да се одреди датумот",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овој директориум е недостапен, ве молиме проверете ги логовите или контактирајте со администраторот",
+ "Could not move \"{file}\", target exists" : "Не може да се премести \"{file}\", веќе постои",
+ "Could not move \"{file}\"" : "Не може да се премести \"{file}\"",
+ "copy" : "копирај",
+ "Could not copy \"{file}\", target exists" : "Не може да се копира \"{file}\", веќе постои",
+ "Could not copy \"{file}\"" : "Не може да се копира \"{file}\"",
+ "Copied {origin} inside {destination}" : "Копирана {origin} во {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копирана {origin} и {nbfiles} други датотеки во {destination}",
+ "{newName} already exists" : "{newName} веќе постои",
+ "Could not create file \"{file}\"" : "Неможе да се креира датотека \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Неможе да се креира датотека \"{file}\" бидејќи веќе постои",
+ "Could not create folder \"{dir}\" because it already exists" : "Неможе да се креира папка \"{dir}\" бидејќи веќе постои",
+ "Could not fetch file details \"{file}\"" : "Неможе да се вчитаат деталите за датотеката \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Грешка при бришење на датотека \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултати од пребарувањето на други места за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Внесете повеќе од два карактери за да пребарувате во другите папки",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["вклучувајќи %n скриена","вклучувајќи %n скриени"],
+ "You do not have permission to upload or create files here" : "Немате дозвола да прикачувате или да креирате датотеки овде",
+ "_Uploading %n file_::_Uploading %n files_" : ["Прикачување %n датотека","Прикачување на %n датотеки"],
+ "New" : "Нов/a",
+ "New file/folder menu" : "Мени Нова датотека/папка",
+ "Select file range" : "Избери опсег на датотеки",
+ "{used}%" : "{used}%",
+ "{used} used" : "Искористени {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" е невалидно име за датотека.",
+ "File name cannot be empty." : "Името на датотеката не може да биде празно.",
+ "\"/\" is not allowed inside a file name." : "\"/\" не е дозволено во името.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" не е дозволен вид на датотека",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Скалдиштето на {owner} е скоро исполнето ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групната папка \"{mountPoint}\" е скоро исполнета ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Надворешното складиште \"{mountPoint}\" е скоро исполнето ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Вашето складиште е скоро исполнето ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["содржи '{filter}'","содржи '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Копиран е директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
+ "Path" : "Патека",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирај директен линк (работи само за корисници кој имаат директен пристап до датотеката/папката)",
+ "Upload file" : "Прикачи датотека",
+ "An error occurred while trying to update the tags" : "Се случи грешка додека се обидувавте да ги освежите таговите",
+ "Upload (max. %s)" : "Префрлање (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" акцијата е успешно извршена",
+ "\"{displayName}\" action failed" : "\"{displayName}\" акцијата не успеа",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" сериската акција е успешно извршена",
+ "Filter filenames…" : "Филтрирај имиња на датотеки ...",
+ "WebDAV URL copied to clipboard" : "CalDAV линкот е копиран",
+ "Enable the grid view" : "Овозможи поглед во мрежа",
+ "Enable folder tree" : "Овозможи поглед на дрво",
+ "Copy to clipboard" : "Копирај во клипборд",
+ "Use this address to access your Files via WebDAV" : "Користи ја оваа адреса за пристап до вашите датотеки преку WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако имате овозможено 2FA, мора да креирате и користите нова лозинка за апликација со кликнување овде.",
+ "Deletion cancelled" : "Бришењето е откажано",
+ "Cancelled move or copy operation" : "Откажана операција на копирање или преместување",
+ "Open details" : "Отвори детали",
+ "Photos and images" : "Фотографии и слики",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} датотека","{fileCount} датотеки"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 датотека и {folderCount} папки","1 датотека и {folderCount} папки"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} датотека и 1 папка","{fileCount} датотеки и 1 папка"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} датотеки и {folderCount} папки",
+ "All folders" : "Сите папки",
+ "Personal Files" : "Лични датотеки",
"Text file" : "Текстуална датотека",
"New text file.txt" : "Нова текстуална датотека file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Складиштето на {owner} е исполнето, повеќе нема да може да сикхронизира и да прикачува датотеки!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Групната папка \"{mountPoint}\" е исполнета, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Надворешното складиште \"{mountPoint}\" е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "Your storage is full, files can not be updated or synced anymore!" : "Вашето складиште е исполнето, датотеките веќе не можат да се ажирираат или синхронизираат!",
- "_matches '{filter}'_::_match '{filter}'_" : ["содржи '{filter}'","содржи '{filter}'"]
+ "%1$s (renamed)" : "%1$s (преименувано)",
+ "renamed file" : "преименувана датотека",
+ "Filter file names …" : "Филтрирај имиња на датотеки ...",
+ "Prevent warning dialogs from open or reenable them." : "Спречете ги дијалозите за предупредување да се отвораат или повторно овозможете ги.",
+ "Show a warning dialog when changing a file extension." : "Прикажи дијалог за предупредување при промена на екстензија на датотека.",
+ "Speed up your Files experience with these quick shortcuts." : "Забрзајте го вашето искуство со овие брзи кратенки.",
+ "Open the actions menu for a file" : "Отвори Мени со акции за датотека",
+ "Rename a file" : "Преименувај датотека",
+ "Delete a file" : "Избриши датотека",
+ "Favorite or remove a file from favorites" : "Додади или острани од омилени",
+ "Manage tags for a file" : "Управувај со ознаки за датотека",
+ "Deselect all files" : "Деселектирај ги сите датотеки",
+ "Select or deselect a file" : "Селектирај или деселектирај датотека",
+ "Select a range of files" : "Селектирај опсег на датотеки",
+ "Navigate to the parent folder" : "Врати се до предходната папка",
+ "Navigate to the file above" : "Оди до датотека горе",
+ "Navigate to the file below" : "Оди до датотека доле",
+ "Navigate to the file on the left (in grid mode)" : "Оди до датотека лево (само во мрежен приказ)",
+ "Navigate to the file on the right (in grid mode)" : "Оди до датотека десно (само во мрежен приказ)",
+ "Toggle the grid view" : "Вклучи/исклучи мрежен приказ",
+ "Open the sidebar for a file" : "Отвори странична лента за датотека"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ml.js b/apps/files/l10n/ml.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/ml.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ml.json b/apps/files/l10n/ml.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/ml.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/mn.js b/apps/files/l10n/mn.js
deleted file mode 100644
index 2b8862ac09e..00000000000
--- a/apps/files/l10n/mn.js
+++ /dev/null
@@ -1,137 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Хадгалах төхөөрөмж нь түр хугацаанд ашиглах боломжгүй байна",
- "Storage invalid" : "Хадгалах төхөөрөмж буруу байна",
- "Unknown error" : "Үл мэдэгдэх алдаа",
- "File could not be found" : "Файл олдсонгүй",
- "Move or copy" : "Зөөх эсвэл хуулах",
- "Download" : "Татаж авах ",
- "Delete" : "Устгах",
- "Home" : "Нүүр хуудас",
- "Close" : "Хаах",
- "Favorites" : "Онцолсон",
- "Could not create folder \"{dir}\"" : "\"{dir}\" ийм хавтас үүсгэж болохгүй байна",
- "This will stop your current uploads." : "Энэ үйлдэл нь одоо явагдаж буй байршуулах үйл явцыг зогсоох болно",
- "Upload cancelled." : "Байршуулалт цуцлагдсан. ",
- "Processing files …" : "Файлуудыг уншиж байна",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} нь 0kb хэмжээтэй эсвэл ижил нэр бүхий хавтас байгаа тул байршуулах боломжгүй",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "хангалттай зай үлдээгүй байна, та {size1} хэмжээтэй файл оруулж байна гэхдээ зөвхөн {size2} ийн хэмжээний сул зай үлдсэн байна",
- "Target folder \"{dir}\" does not exist any more" : "{dir} гэх байршуулах хавтас олдсонгүй",
- "Not enough free space" : "Сул зай хүрэлцэхгүй байна",
- "An unknown error has occurred" : "Үл мэдэгдэх алдаа гарлаа ",
- "Uploading …" : "Байршуулж байна...",
- "Uploading that item is not supported" : "Энэ төрлийн файл байршуулах боломжгүй",
- "Target folder does not exist any more" : "Байршуулах хавтас олдсонгүй",
- "Operation is blocked by access control" : "Үйлдлийг \"access control\"-оос хориглосон байна",
- "Error when assembling chunks, status code {status}" : "Бүрдэл хэсгүүдийг нэгтгэхэд алдаа гарлаа. Төлвийн код {status}",
- "Actions" : "Үйл ажиллагаа",
- "Rename" : "Нэр өөрчлөх",
- "Copy" : "Хуулах",
- "Open" : "Онгойлгох",
- "Delete file" : "Файл устгах",
- "Delete folder" : "Хавтсыг устгах",
- "Disconnect storage" : "Хадгалах төхөөрөмж салгах",
- "Could not load info for file \"{file}\"" : "\"{file}\" файлын мэдээллийг уншиж чадсангүй",
- "Files" : "Файлууд",
- "Details" : "Дэлгэрэнгүй",
- "Select" : "Сонгох",
- "Pending" : "Хүлээгдэж байгаа",
- "Unable to determine date" : "Огноог тодорхойлох боломжгүй",
- "This operation is forbidden" : "Энэ үйлдэл хориотой",
- "This directory is unavailable, please check the logs or contact the administrator" : "Энэ хавтас байхгүй байна, үйлдлийн лог шалгах эсвэл админ хэрэглэгчтэй холбогдоно уу.",
- "Could not move \"{file}\", target exists" : "\"{file}\" -г зөөж чадсангүй, алдаа: target exists ",
- "Could not move \"{file}\"" : "Файлыг зөөж чадсангүй: \"{file}\"",
- "copy" : "Хуулах ",
- "Could not copy \"{file}\", target exists" : "\"{file}\"-г зөөж чадсангүй, файлын нэр давхцаж байна",
- "Could not copy \"{file}\"" : "\"{file}\"-г зөөж чадсангүй",
- "Copied {origin} inside {destination}" : "Хуулбар хийгдэж {destination} дотор {origin} байршлаа",
- "{newName} already exists" : "{newName} нэр давцаж байна",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" файлын нэрийг солих боломжгүй, энэ файл устгагдсан байна",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{dir}\" хавтаст \"{targetName}\" гэх нэрийг ашигласан байна. Өөр нэр сонгоно уу.",
- "Could not rename \"{fileName}\"" : "Файлын нэрийг сольж чадсангүй: \"{fileName}\"",
- "Could not create file \"{file}\"" : "\"{file}\" файлыг үүсгэж чадсангүй",
- "Could not create file \"{file}\" because it already exists" : "Ийм нэртэй файл байгаа учир \"{file}\"-г үүсгэж чадахгүй",
- "Could not create folder \"{dir}\" because it already exists" : " \"{dir}\" хавтасыг үүсгэх боломжгүй, нэр нь давцаж байна",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" файлыг устгахад алдаа гарлаа.",
- "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} хайлтад тохирох үр дүн бусад хавтасаас олсонгүй",
- "Name" : "Нэр",
- "Size" : "Хэмжээ",
- "Modified" : "Өөрчлөгдсөн",
- "_%n folder_::_%n folders_" : ["хавтас","хавтсууд"],
- "_%n file_::_%n files_" : ["файл","файлууд"],
- "{dirs} and {files}" : "{dirs} болон {files}",
- "_including %n hidden_::_including %n hidden_" : ["нуугдсан %n хамруулан","нуугдсан %n хамруулан"],
- "You don’t have permission to upload or create files here" : "Та энэ байршилд файл үүсгэх эсвэл байршуулах эрхгүй байна.",
- "_Uploading %n file_::_Uploading %n files_" : ["Файлыг байршуулж байна","%n файлыг байршуулж байна"],
- "New" : "Шинэ",
- "{used} of {quota} used" : "{quota} оноосноос {used} хэрэглэсэн",
- "{used} used" : "{user} хэрэглэсэн",
- "\"{name}\" is an invalid file name." : "\"{name}\" нь хүчин төгөлдөр бус файлын нэр",
- "File name cannot be empty." : "Файлын нэр хоосон байж болохгүй.",
- "\"/\" is not allowed inside a file name." : "файлын нэр \"/\" агуулж болохгүй",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-ий багтаамж удахгүй дүүрэх гэж байна. ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Хамт-ийн фолдер \"{mountPoint}\" удахгүй дүйрэх гэж байна {usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "Таны багтаамж дүүрэх дөхөж байна! ({usedSpacePercent}%)",
- "View in folder" : "Хавтасыг нээх",
- "Copied!" : "Хуулсан!",
- "Path" : "Зам",
- "Favorited" : "Онцолсон",
- "Favorite" : "Дуртай",
- "New folder" : "Шинэ хавтас",
- "Upload file" : "Файл байршуулах",
- "Recent" : "Сүүлийн үеийн",
- "Not favorited" : "Онцлоогүй",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Tag шинэчлэхэд алдаа гарлаа",
- "Added to favorites" : "Дуртай файлаар сонгов",
- "Removed from favorites" : "Онцлох файлаас хасав",
- "You added {file} to your favorites" : "{file} дуртай файлаар сонгов",
- "You removed {file} from your favorites" : "Та дуртай файлын жагсаалтаас {file}-г хасав",
- "File changes" : "Файлын өөрчлөлтүүд",
- "Created by {user}" : "{user} үүсгэсэн",
- "Changed by {user}" : "{user} өөрчилсөн",
- "Deleted by {user}" : "{user} устгасан",
- "Restored by {user}" : "{user} сэргээсэн",
- "Renamed by {user}" : "{user} нэр солисон",
- "Moved by {user}" : "{user} зөөсөн",
- "\"remote user\"" : "алсын хэрэглэгч",
- "You created {file}" : "{file} файлыг та үүсгэв",
- "{user} created {file}" : "{user} {file}-г үүсгэв",
- "{file} was created in a public folder" : "{file} нийтийн хавтсанд үүсгэгдсэн",
- "You changed {file}" : "Та {file} файлыг өөрчлөв",
- "{user} changed {file}" : "{user} хэрэглэгч {file}-г өөрчлөв",
- "You deleted {file}" : "Та {file} файлыг устгав",
- "{user} deleted {file}" : "{user} хэрэглэгч {file} файлыг устгав",
- "You restored {file}" : "Та {file} файлыг сэргээв",
- "{user} restored {file}" : "{user} хэрэглэгч {file} файлыг сэргээв",
- "You renamed {oldfile} to {newfile}" : "Та {oldfile} файлын нэрйиг {newfile} болгож өөрчлөв",
- "{user} renamed {oldfile} to {newfile}" : "{user} хэрэглэгч {oldfile} файлын нэрийг {newfile} болгож өөрчлөв",
- "You moved {oldfile} to {newfile}" : "Та {oldfile} файлыг {newfile} болгож зөөв",
- "{user} moved {oldfile} to {newfile}" : "{user} хэрэглэгч {oldfile} файлыг {newfile} болгож зөөв",
- "A file or folder has been <strong>changed</strong>" : "Файл эсвэл хавтас амжилттай <strong>солигдлоо</strong>",
- "All files" : "Бүх файлууд",
- "Accept" : "Хүлээн зөвшөөрөх",
- "Tags" : "Тэгүүд",
- "Cancel" : "болиулах",
- "Create" : "Үүсгэх",
- "%1$s of %2$s used" : "%1$s-с %2$s хэрэглэсэн",
- "Settings" : "Тохиргоо",
- "Show hidden files" : "Нууцлагдсан файлыг харах",
- "No files in here" : "Энд файл байхгүй байна",
- "No entries found in this folder" : "энэ хавтсан олдсон ч ямарч мэдээлэл олдохгүй байна",
- "Select all" : "бүгдийг сонгох",
- "Upload too large" : "маш том байршуулалт",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Таны байршуулах гэж оролдсон файлууд нь энэ сервер дээр файл байршуулах дээд хэмжээнээс хэтэрч.",
- "Deleted files" : "Устгасан файлууд",
- "Shares" : "Түгээлтүүд",
- "Shared with others" : "Бусдад түгээсэн",
- "Shared with you" : "тантай хуваалцсан",
- "Shared by link" : "Холбоосоор түгээсэн",
- "Text file" : "текст файл",
- "New text file.txt" : "шинэ текст file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}-ий багтаамж дүүрсэн байна",
- "Your storage is full, files can not be updated or synced anymore!" : "Таны багтаамж дүүрсэн байна!"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/mn.json b/apps/files/l10n/mn.json
deleted file mode 100644
index 5c243d4bd1d..00000000000
--- a/apps/files/l10n/mn.json
+++ /dev/null
@@ -1,135 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Хадгалах төхөөрөмж нь түр хугацаанд ашиглах боломжгүй байна",
- "Storage invalid" : "Хадгалах төхөөрөмж буруу байна",
- "Unknown error" : "Үл мэдэгдэх алдаа",
- "File could not be found" : "Файл олдсонгүй",
- "Move or copy" : "Зөөх эсвэл хуулах",
- "Download" : "Татаж авах ",
- "Delete" : "Устгах",
- "Home" : "Нүүр хуудас",
- "Close" : "Хаах",
- "Favorites" : "Онцолсон",
- "Could not create folder \"{dir}\"" : "\"{dir}\" ийм хавтас үүсгэж болохгүй байна",
- "This will stop your current uploads." : "Энэ үйлдэл нь одоо явагдаж буй байршуулах үйл явцыг зогсоох болно",
- "Upload cancelled." : "Байршуулалт цуцлагдсан. ",
- "Processing files …" : "Файлуудыг уншиж байна",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} нь 0kb хэмжээтэй эсвэл ижил нэр бүхий хавтас байгаа тул байршуулах боломжгүй",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "хангалттай зай үлдээгүй байна, та {size1} хэмжээтэй файл оруулж байна гэхдээ зөвхөн {size2} ийн хэмжээний сул зай үлдсэн байна",
- "Target folder \"{dir}\" does not exist any more" : "{dir} гэх байршуулах хавтас олдсонгүй",
- "Not enough free space" : "Сул зай хүрэлцэхгүй байна",
- "An unknown error has occurred" : "Үл мэдэгдэх алдаа гарлаа ",
- "Uploading …" : "Байршуулж байна...",
- "Uploading that item is not supported" : "Энэ төрлийн файл байршуулах боломжгүй",
- "Target folder does not exist any more" : "Байршуулах хавтас олдсонгүй",
- "Operation is blocked by access control" : "Үйлдлийг \"access control\"-оос хориглосон байна",
- "Error when assembling chunks, status code {status}" : "Бүрдэл хэсгүүдийг нэгтгэхэд алдаа гарлаа. Төлвийн код {status}",
- "Actions" : "Үйл ажиллагаа",
- "Rename" : "Нэр өөрчлөх",
- "Copy" : "Хуулах",
- "Open" : "Онгойлгох",
- "Delete file" : "Файл устгах",
- "Delete folder" : "Хавтсыг устгах",
- "Disconnect storage" : "Хадгалах төхөөрөмж салгах",
- "Could not load info for file \"{file}\"" : "\"{file}\" файлын мэдээллийг уншиж чадсангүй",
- "Files" : "Файлууд",
- "Details" : "Дэлгэрэнгүй",
- "Select" : "Сонгох",
- "Pending" : "Хүлээгдэж байгаа",
- "Unable to determine date" : "Огноог тодорхойлох боломжгүй",
- "This operation is forbidden" : "Энэ үйлдэл хориотой",
- "This directory is unavailable, please check the logs or contact the administrator" : "Энэ хавтас байхгүй байна, үйлдлийн лог шалгах эсвэл админ хэрэглэгчтэй холбогдоно уу.",
- "Could not move \"{file}\", target exists" : "\"{file}\" -г зөөж чадсангүй, алдаа: target exists ",
- "Could not move \"{file}\"" : "Файлыг зөөж чадсангүй: \"{file}\"",
- "copy" : "Хуулах ",
- "Could not copy \"{file}\", target exists" : "\"{file}\"-г зөөж чадсангүй, файлын нэр давхцаж байна",
- "Could not copy \"{file}\"" : "\"{file}\"-г зөөж чадсангүй",
- "Copied {origin} inside {destination}" : "Хуулбар хийгдэж {destination} дотор {origin} байршлаа",
- "{newName} already exists" : "{newName} нэр давцаж байна",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" файлын нэрийг солих боломжгүй, энэ файл устгагдсан байна",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{dir}\" хавтаст \"{targetName}\" гэх нэрийг ашигласан байна. Өөр нэр сонгоно уу.",
- "Could not rename \"{fileName}\"" : "Файлын нэрийг сольж чадсангүй: \"{fileName}\"",
- "Could not create file \"{file}\"" : "\"{file}\" файлыг үүсгэж чадсангүй",
- "Could not create file \"{file}\" because it already exists" : "Ийм нэртэй файл байгаа учир \"{file}\"-г үүсгэж чадахгүй",
- "Could not create folder \"{dir}\" because it already exists" : " \"{dir}\" хавтасыг үүсгэх боломжгүй, нэр нь давцаж байна",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" файлыг устгахад алдаа гарлаа.",
- "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} хайлтад тохирох үр дүн бусад хавтасаас олсонгүй",
- "Name" : "Нэр",
- "Size" : "Хэмжээ",
- "Modified" : "Өөрчлөгдсөн",
- "_%n folder_::_%n folders_" : ["хавтас","хавтсууд"],
- "_%n file_::_%n files_" : ["файл","файлууд"],
- "{dirs} and {files}" : "{dirs} болон {files}",
- "_including %n hidden_::_including %n hidden_" : ["нуугдсан %n хамруулан","нуугдсан %n хамруулан"],
- "You don’t have permission to upload or create files here" : "Та энэ байршилд файл үүсгэх эсвэл байршуулах эрхгүй байна.",
- "_Uploading %n file_::_Uploading %n files_" : ["Файлыг байршуулж байна","%n файлыг байршуулж байна"],
- "New" : "Шинэ",
- "{used} of {quota} used" : "{quota} оноосноос {used} хэрэглэсэн",
- "{used} used" : "{user} хэрэглэсэн",
- "\"{name}\" is an invalid file name." : "\"{name}\" нь хүчин төгөлдөр бус файлын нэр",
- "File name cannot be empty." : "Файлын нэр хоосон байж болохгүй.",
- "\"/\" is not allowed inside a file name." : "файлын нэр \"/\" агуулж болохгүй",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner}-ий багтаамж удахгүй дүүрэх гэж байна. ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Хамт-ийн фолдер \"{mountPoint}\" удахгүй дүйрэх гэж байна {usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "Таны багтаамж дүүрэх дөхөж байна! ({usedSpacePercent}%)",
- "View in folder" : "Хавтасыг нээх",
- "Copied!" : "Хуулсан!",
- "Path" : "Зам",
- "Favorited" : "Онцолсон",
- "Favorite" : "Дуртай",
- "New folder" : "Шинэ хавтас",
- "Upload file" : "Файл байршуулах",
- "Recent" : "Сүүлийн үеийн",
- "Not favorited" : "Онцлоогүй",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Add to favorites",
- "An error occurred while trying to update the tags" : "Tag шинэчлэхэд алдаа гарлаа",
- "Added to favorites" : "Дуртай файлаар сонгов",
- "Removed from favorites" : "Онцлох файлаас хасав",
- "You added {file} to your favorites" : "{file} дуртай файлаар сонгов",
- "You removed {file} from your favorites" : "Та дуртай файлын жагсаалтаас {file}-г хасав",
- "File changes" : "Файлын өөрчлөлтүүд",
- "Created by {user}" : "{user} үүсгэсэн",
- "Changed by {user}" : "{user} өөрчилсөн",
- "Deleted by {user}" : "{user} устгасан",
- "Restored by {user}" : "{user} сэргээсэн",
- "Renamed by {user}" : "{user} нэр солисон",
- "Moved by {user}" : "{user} зөөсөн",
- "\"remote user\"" : "алсын хэрэглэгч",
- "You created {file}" : "{file} файлыг та үүсгэв",
- "{user} created {file}" : "{user} {file}-г үүсгэв",
- "{file} was created in a public folder" : "{file} нийтийн хавтсанд үүсгэгдсэн",
- "You changed {file}" : "Та {file} файлыг өөрчлөв",
- "{user} changed {file}" : "{user} хэрэглэгч {file}-г өөрчлөв",
- "You deleted {file}" : "Та {file} файлыг устгав",
- "{user} deleted {file}" : "{user} хэрэглэгч {file} файлыг устгав",
- "You restored {file}" : "Та {file} файлыг сэргээв",
- "{user} restored {file}" : "{user} хэрэглэгч {file} файлыг сэргээв",
- "You renamed {oldfile} to {newfile}" : "Та {oldfile} файлын нэрйиг {newfile} болгож өөрчлөв",
- "{user} renamed {oldfile} to {newfile}" : "{user} хэрэглэгч {oldfile} файлын нэрийг {newfile} болгож өөрчлөв",
- "You moved {oldfile} to {newfile}" : "Та {oldfile} файлыг {newfile} болгож зөөв",
- "{user} moved {oldfile} to {newfile}" : "{user} хэрэглэгч {oldfile} файлыг {newfile} болгож зөөв",
- "A file or folder has been <strong>changed</strong>" : "Файл эсвэл хавтас амжилттай <strong>солигдлоо</strong>",
- "All files" : "Бүх файлууд",
- "Accept" : "Хүлээн зөвшөөрөх",
- "Tags" : "Тэгүүд",
- "Cancel" : "болиулах",
- "Create" : "Үүсгэх",
- "%1$s of %2$s used" : "%1$s-с %2$s хэрэглэсэн",
- "Settings" : "Тохиргоо",
- "Show hidden files" : "Нууцлагдсан файлыг харах",
- "No files in here" : "Энд файл байхгүй байна",
- "No entries found in this folder" : "энэ хавтсан олдсон ч ямарч мэдээлэл олдохгүй байна",
- "Select all" : "бүгдийг сонгох",
- "Upload too large" : "маш том байршуулалт",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Таны байршуулах гэж оролдсон файлууд нь энэ сервер дээр файл байршуулах дээд хэмжээнээс хэтэрч.",
- "Deleted files" : "Устгасан файлууд",
- "Shares" : "Түгээлтүүд",
- "Shared with others" : "Бусдад түгээсэн",
- "Shared with you" : "тантай хуваалцсан",
- "Shared by link" : "Холбоосоор түгээсэн",
- "Text file" : "текст файл",
- "New text file.txt" : "шинэ текст file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}-ий багтаамж дүүрсэн байна",
- "Your storage is full, files can not be updated or synced anymore!" : "Таны багтаамж дүүрсэн байна!"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/mr.js b/apps/files/l10n/mr.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/mr.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/mr.json b/apps/files/l10n/mr.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/mr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js
deleted file mode 100644
index c29758cfba1..00000000000
--- a/apps/files/l10n/ms_MY.js
+++ /dev/null
@@ -1,37 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "No file was uploaded. Unknown error" : "Tiada fail dimuatnaik. Ralat tidak diketahui.",
- "There is no error, the file uploaded with success" : "Tiada ralat berlaku, fail berjaya dimuatnaik",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Saiz fail yang dimuatnaik melebihi MAX_FILE_SIZE yang ditetapkan dalam borang HTML",
- "The uploaded file was only partially uploaded" : "Fail yang dimuatnaik tidak lengkap",
- "No file was uploaded" : "Tiada fail dimuatnaik",
- "Missing a temporary folder" : "Direktori sementara hilang",
- "Failed to write to disk" : "Gagal untuk disimpan",
- "Files" : "Fail-fail",
- "Home" : "Rumah",
- "Close" : "Tutup",
- "Upload cancelled." : "Muatnaik dibatalkan.",
- "Download" : "Muat turun",
- "Rename" : "Namakan",
- "Delete" : "Padam",
- "Pending" : "Dalam proses",
- "Name" : "Nama",
- "Size" : "Saiz",
- "Modified" : "Dimodifikasi",
- "New" : "Baru",
- "Folder" : "Folder",
- "Upload" : "Muat naik",
- "You created %1$s" : "Anda telah membina %1$s",
- "%2$s created %1$s" : "%2$s membina %1$s",
- "You changed %1$s" : "Anda menukar %1$s",
- "File handling" : "Pengendalian fail",
- "Maximum upload size" : "Saiz maksimum muat naik",
- "max. possible: " : "maksimum:",
- "Save" : "Simpan",
- "Settings" : "Tetapan",
- "Upload too large" : "Muatnaik terlalu besar",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
- "Text file" : "Fail teks"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json
deleted file mode 100644
index c1202e3eb40..00000000000
--- a/apps/files/l10n/ms_MY.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{ "translations": {
- "No file was uploaded. Unknown error" : "Tiada fail dimuatnaik. Ralat tidak diketahui.",
- "There is no error, the file uploaded with success" : "Tiada ralat berlaku, fail berjaya dimuatnaik",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Saiz fail yang dimuatnaik melebihi MAX_FILE_SIZE yang ditetapkan dalam borang HTML",
- "The uploaded file was only partially uploaded" : "Fail yang dimuatnaik tidak lengkap",
- "No file was uploaded" : "Tiada fail dimuatnaik",
- "Missing a temporary folder" : "Direktori sementara hilang",
- "Failed to write to disk" : "Gagal untuk disimpan",
- "Files" : "Fail-fail",
- "Home" : "Rumah",
- "Close" : "Tutup",
- "Upload cancelled." : "Muatnaik dibatalkan.",
- "Download" : "Muat turun",
- "Rename" : "Namakan",
- "Delete" : "Padam",
- "Pending" : "Dalam proses",
- "Name" : "Nama",
- "Size" : "Saiz",
- "Modified" : "Dimodifikasi",
- "New" : "Baru",
- "Folder" : "Folder",
- "Upload" : "Muat naik",
- "You created %1$s" : "Anda telah membina %1$s",
- "%2$s created %1$s" : "%2$s membina %1$s",
- "You changed %1$s" : "Anda menukar %1$s",
- "File handling" : "Pengendalian fail",
- "Maximum upload size" : "Saiz maksimum muat naik",
- "max. possible: " : "maksimum:",
- "Save" : "Simpan",
- "Settings" : "Tetapan",
- "Upload too large" : "Muatnaik terlalu besar",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
- "Text file" : "Fail teks"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/mt_MT.js b/apps/files/l10n/mt_MT.js
deleted file mode 100644
index 2cbab15890e..00000000000
--- a/apps/files/l10n/mt_MT.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["","","",""],
- "_%n file_::_%n files_" : ["","","",""],
- "_Uploading %n file_::_Uploading %n files_" : ["","","",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["","","",""]
-},
-"nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);");
diff --git a/apps/files/l10n/mt_MT.json b/apps/files/l10n/mt_MT.json
deleted file mode 100644
index f10f0a0408d..00000000000
--- a/apps/files/l10n/mt_MT.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["","","",""],
- "_%n file_::_%n files_" : ["","","",""],
- "_Uploading %n file_::_Uploading %n files_" : ["","","",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["","","",""]
-},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/nb.js b/apps/files/l10n/nb.js
index 830cf24bb65..29cec51666f 100644
--- a/apps/files/l10n/nb.js
+++ b/apps/files/l10n/nb.js
@@ -1,107 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
- "Storage invalid" : "Lagringsplass ugyldig",
- "Unknown error" : "Ukjent feil",
- "File could not be found" : "Filen ble ikke funnet",
- "Move or copy" : "Flytt eller kopier",
- "Download" : "Last ned",
- "Delete" : "Slett",
- "Home" : "Hjem",
- "Close" : "Lukk",
- "Favorites" : "Favoritter",
- "Could not create folder \"{dir}\"" : "Klarete ikke å opprette mappe \"{dir}\"",
- "This will stop your current uploads." : "Dette fille stoppe dine nåværende opplastinger.",
- "Upload cancelled." : "Opplasting avbrutt.",
- "Processing files …" : "Prosesserer filer…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 Byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp {size1} men bare {size2} er ledig",
- "Target folder \"{dir}\" does not exist any more" : "Målmappen \"{dir}\" finnes ikke lenger",
- "Not enough free space" : "Ikke nok ledig diskplass",
- "An unknown error has occurred" : "En ukjent feil oppstod",
- "Uploading …" : "Laster opp…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Opplastning av det elementet er ikke støttet",
- "Target folder does not exist any more" : "Målmappen finnes ikke lenger",
- "Operation is blocked by access control" : "Operasjonen er blokkert på grunn av tilgangskontroll",
- "Error when assembling chunks, status code {status}" : "Feil under sammenkobling av biter, statuskode {status}",
- "Actions" : "Handlinger",
- "Rename" : "Gi nytt navn",
- "Copy" : "Kopier",
- "Choose target folder" : "Velg målmappe",
- "Open" : "Åpne",
- "Delete file" : "Slett fil",
- "Delete folder" : "Slett mappe",
- "Disconnect storage" : "Koble fra lager",
- "Leave this share" : "Forlat denne delingen",
- "Could not load info for file \"{file}\"" : "Klarte ikke å hente informasjon som filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Select" : "Velg",
- "Pending" : "Venter",
- "Unable to determine date" : "Kan ikke fastslå datoen",
- "This operation is forbidden" : "Operasjonen er forbudt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
- "Could not move \"{file}\", target exists" : "Klarte ikke å flytte \"{file}\", målfilen finnes",
- "Could not move \"{file}\"" : "Klarte ikke å flytte \"{file}\"",
- "copy" : "kopier",
- "Could not copy \"{file}\", target exists" : "Klarte ikke å kopiere \"{file}\", målfilen finnes",
- "Could not copy \"{file}\"" : "Klarte ikke å kopiere \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopierte {origin} i {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierte {origin} og {nbfiles} andre filer i {destination}",
- "{newName} already exists" : "{newName} finnes allerede",
- "Could not rename \"{fileName}\", it does not exist any more" : "Klarte ikke å omdøpe \"{fileName}\", den finnes ikke lenger",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{targetName}\" brukes allerede i mappen \"{dir}\". Velg et annet navn.",
- "Could not rename \"{fileName}\"" : "Klarte ikke å gi \"{fileName}\" nytt navn",
- "Could not create file \"{file}\"" : "Klarte ikke å opprette fil \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Klarte ikke å opprette fil \"{file}\" fordi den finnes allerede",
- "Could not create folder \"{dir}\" because it already exists" : "Klarete ikke å opprette mappe \"{dir}\" fordi den finnes allerede",
- "Could not fetch file details \"{file}\"" : "Kunne ikke hente fildetaljene \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Feil ved sletting av fil \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søkeresultater i andre mapper etter {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Tast inn mer enn to tegn for å lete i andre mapper",
- "Name" : "Navn",
- "Size" : "Størrelse",
- "Modified" : "Endret",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"],
- "You don’t have permission to upload or create files here" : "Du har ikke tillatelse til å laste opp eller opprette filer her",
- "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"],
- "New" : "Ny",
- "Select file range" : "Velg filutvalg",
- "{used} of {quota} used" : "{used} av {quota} brukt",
- "{used} used" : "{used} brukt",
- "\"{name}\" is an invalid file name." : "\"{name}\" er et uglydig filnavn.",
- "File name cannot be empty." : "Filnavn kan ikke være tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" tillates ikke i et filnavn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tillatt filtype",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagringsplass for {owner} er nesten full ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Den eksterne lagringsplassen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Din lagringsplass er nesten full ({usedSpacePercent}%).",
- "View in folder" : "Vis i mappe",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopier direkte lenke (virker bare for brukere som har tilgang til denne filen/mappa)",
- "Path" : "Sti",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Favorisert",
- "Favorite" : "Gjør til favoritt",
- "You can only favorite a single file or folder at a time" : "Du kan bare legge til en fil av gangen til favoritter",
- "New folder" : "Ny mappe",
- "Upload file" : "Last opp fil",
- "Recent" : "Nylig",
- "Not favorited" : "Ikke i favoritter",
- "Remove from favorites" : "Fjern fra favoritter",
- "Add to favorites" : "Legg til i favoritter",
- "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av merkelappene",
"Added to favorites" : "Lagt til i favoritter",
"Removed from favorites" : "Fjernet fra favoritter",
"You added {file} to your favorites" : "Du la til {file} i dine favoritter",
"You removed {file} from your favorites" : "Du fjernet {file} fra dine favoritter",
+ "Favorites" : "Favoritter",
"File changes" : "Filendringer",
"Created by {user}" : "Opprettet av {user}",
"Changed by {user}" : "Endret av {user}",
@@ -109,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Gjenopprettet av {user}",
"Renamed by {user}" : "Navn endret av {user}",
"Moved by {user}" : "Flyttet av {user}",
- "\"remote user\"" : "\"ekstern bruker\"",
+ "\"remote account\"" : "\"ekstern konto\"",
"You created {file}" : "Du opprettet {file}",
"You created an encrypted file in {file}" : "Du opprettet en kryptert fil i {file}",
"{user} created {file}" : "{user} opprettet {file}",
@@ -125,20 +29,35 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} slettet en kryptert fil i {file}",
"You restored {file}" : "Du gjenopprettet {file}",
"{user} restored {file}" : "{user} gjenopprettet {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Du endret navn på {oldfile} (skjult) til {newfile} (skjult)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Du endret navn på {oldfile} (skjult) til {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Du endret navn på {oldfile} til {newfile} (skjult)",
"You renamed {oldfile} to {newfile}" : "Du endret navn på {oldfile} til {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} endret navn på {oldfile} til {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : " {user} endret navn på {oldfile} (skjult) til {newfile} (skjult)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : " {user} endret navn på {oldfile} (skjult) til {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} endret navn på {oldfile} til {newfile} (skjult)",
+ "{user} renamed {oldfile} to {newfile}" : " {user} endret navn på {oldfile} til {newfile}",
"You moved {oldfile} to {newfile}" : "Du flyttet {oldfile} til {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttet {oldfile} til {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil har blitt lagt til eller fjernet fra dine <strong>favoritter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favoritt-fil eller mappe har blitt <strong>endret</strong>",
- "All files" : "Alle filer",
- "Unlimited" : "Ubegrenset",
- "Upload (max. %s)" : "Opplasting (maks %s)",
+ "Failed to authorize" : "Autorisering feilet",
+ "Invalid folder path" : "Ugyldig mappebane",
+ "Folder not found" : "Mappe ikke funnet",
+ "The file cannot be found" : "Kunne ikke finne filen",
+ "The destination path does not exist: %1$s" : "Fildestinasjonen finnes ikke: %1$s",
+ "Could not get relative path to converted file" : "Kunne ikke hente relativ sti til den konverterte filen",
+ "Favorite files" : "Favorittfiler",
+ "No favorites" : "Ingen favoritter",
+ "More favorites" : "Flere favoritter",
"Accept" : "Aksepter",
"Reject" : "Avvis",
"Incoming ownership transfer from {user}" : "Ny eierskapsoverføring fra {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ønsker du å godta {path}?\n\nObs: Overføringsprosessen kan ta opp til 1 time.",
+ "Ownership transfer denied" : "Eierskapsoverføring nektet",
+ "Your ownership transfer of {path} was denied by {user}." : "Eierskapsoverføring av din {path} ble nektet av {user}.",
"Ownership transfer failed" : "Overføring av eierskap mislyktes",
"Your ownership transfer of {path} to {user} failed." : "Eierskapsoverføring din av {path} til {user} mislyktes.",
"The ownership transfer of {path} from {user} failed." : "Eierskapsoverføring av {path} fra {user} mislyktes.",
@@ -146,52 +65,361 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Eierskapsoverføringen din av {path} til {user} er ferdig.",
"The ownership transfer of {path} from {user} has completed." : "Eierskapsoverføring av {path} fra {user} er ferdig.",
"in %s" : "om %s",
+ "Transferred from %1$s on %2$s" : "Overført fra %1$s på %2$s",
+ "Files compatibility" : "Kompatibilitet med filer",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillat å begrense filnavn for å sikre at filer kan synkroniseres med alle klienter. Som standard er alle filnavn gyldige på POSIX (f.eks. Linux eller macOS) tillatt.",
+ "Enforce Windows compatibility" : "Håndhev Windows-kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dette vil blokkere filnavn som ikke er gyldige på Windows-systemer, for eksempel å bruke reserverte navn eller spesialtegn. Men dette vil ikke håndheve kompatibiliteten til store og små bokstaver.",
"File Management" : "Filbehandling",
- "Transfer ownership of a file or folder" : "Eierskapsoverføring av en fil eller mappe",
- "Choose file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
- "Change" : "Endre",
- "New owner" : "Ny eier",
- "Search users" : "Søk etter brukere",
+ "Home" : "Hjem",
+ "Target folder does not exist any more" : "Målmappen finnes ikke lenger",
+ "Reload current directory" : "Last inn gjeldende katalog på nytt",
+ "Go to the \"{dir}\" directory" : "Gå til \"{dir}\"-katalogen",
+ "Current directory path" : "Gjeldende katalogsti",
+ "Your have used your space quota and cannot upload files anymore" : "Du har brukt opp plasskvoten og kan ikke laste opp filer lenger",
+ "Drag and drop files here to upload" : "Dra og slipp filer her for å laste opp",
+ "Favorite" : "Gjør til favoritt",
+ "Back" : "Tilbake",
+ "Toggle selection for file \"{displayName}\"" : "Veksle valg for fil \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Veksle valg for mappe \"{displayName}\"",
+ "File is loading" : "Filen lastes inn",
+ "Folder is loading" : "Mappen lastes inn",
+ "Filename" : "Filnavn",
+ "Folder name" : "Mappenavn",
+ "This node is unavailable" : "Denne noden er utilgjengelig",
+ "Another entry with the same name already exists." : "En annen oppføring med samme navnet finnes allerede.",
+ "Invalid filename." : "Ugyldig filnavn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Omdøpte \"{oldName}\" tl \"{newName}\"",
+ "Rename file" : "Gi fil nytt navn",
+ "Folder" : "Mappe",
+ "Pending" : "Venter",
+ "Unknown date" : "Ukjent dato",
+ "Clear filter" : "Tøm filter",
+ "Modified" : "Endret",
+ "Search everywhere" : "Søk overalt",
+ "Type" : "Type",
+ "Active filters" : "Aktivt filter",
+ "Remove filter" : "Fjern filter",
+ "Total rows summary" : "Sammendrag av totalrader",
+ "Toggle selection for all files and folders" : "Veksle valg for alle filer og mapper",
+ "Name" : "Navn",
+ "Size" : "Størrelse",
+ "Actions" : "Handlinger",
+ "(selected)" : "(valgt)",
+ "List of files and folders." : "Liste over filer og mapper.",
+ "You have used your space quota and cannot upload files anymore." : "Du har brukt opp lagringskvoten din og kan ikke laste opp flere filer.",
+ "Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper kan sorteres.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denne listen er ikke fullstendig gjengitt av ytelsesgrunner. Filene gjengis når du navigerer gjennom listen.",
+ "File not found" : "Finner ikke filen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} brukt",
+ "{used} of {quota} used" : "{used} av {quota} brukt",
+ "{relative}% used" : "{relative}% brukt",
+ "Could not refresh storage stats" : "Kunne ikke oppdatere lagringsstatistikk",
+ "Your storage is full, files can not be updated or synced anymore!" : "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!",
+ "Storage information" : "Informasjon om lagring",
+ "Storage quota" : "Lagringskvote",
+ "New folder" : "Ny mappe",
+ "Create new folder" : "Opprett ny mappe",
+ "This name is already in use." : "Navnet er allerede i bruk.",
+ "Create" : "Opprett",
+ "Fill template fields" : "Fyll ut malfelt",
+ "Submit" : "Send inn",
"Choose a file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
"Transfer" : "Overfør",
"Transfer {path} to {userid}" : "Overfør {path} til {userid}",
"Invalid path selected" : "Ugyldig angitt sti",
+ "Unknown error" : "Ukjent feil",
"Ownership transfer request sent" : "Forespørsel om overføring av eierskap er sendt",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier",
- "Tags" : "Merkelapper",
- "Unable to change the favourite state of the file" : "Kan ikke endre favorittstatus til filen",
- "Error while loading the file data" : "Feil ved lasting av fildata",
- "Cancel" : "Avbryt",
- "Create" : "Opprett",
- "%s used" : "%s brukt",
- "%s%% of %s used" : "%s%% av %s brukt",
- "%1$s of %2$s used" : "%1$s av %2$s brukt",
- "Settings" : "Innstillinger",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier",
+ "Transfer ownership of a file or folder" : "Eierskapsoverføring av en fil eller mappe",
+ "Choose file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
+ "Change" : "Endre",
+ "New owner" : "Ny eier",
+ "Remove extension" : "Fjern filendelse",
+ "Change file extension" : "Endre filendelse",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Å endre filendelsen fra «{old}» til «{new}» kan føre til at filen ikke kan leses.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Å fjerne filendelsen «{old}» kan føre til at filen ikke kan leses.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Å legge til filendelsen «{new}» kan føre til at filen ikke kan leses.",
+ "Select file or folder to link to" : "Velg fil eller mappe å koble til",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Del med andre",
+ "Shared by link" : "Delt med lenke",
+ "Shared" : "Delt",
+ "Switch to list view" : "Bytt til listevisning",
+ "Switch to grid view" : "Bytt til rutevisning",
+ "Upload was cancelled by user" : "Opplasting ble avbrutt av bruker",
+ "Not enough free space" : "Ikke nok ledig diskplass",
+ "Operation is blocked by access control" : "Operasjonen er blokkert på grunn av tilgangskontroll",
+ "Error during upload: {message}" : "Feil under opplasting: {message}",
+ "Error during upload, status code {status}" : "Feil under opplasting, statuskode {status}",
+ "Unknown error during upload" : "Ukjent feil under opplasting",
+ "Loading current folder" : "Laster gjeldende mappe",
+ "Retry" : "Prøv igjen",
+ "No files in here" : "Ingen filer",
+ "Upload some content or sync with your devices!" : "Last opp innhold eller synkroniser med enhetene dine!",
+ "Go back" : "Gå tilbake",
+ "Views" : "Visninger",
+ "Files settings" : "Filinnstillinger",
+ "Your files" : "Dine filer",
+ "Open in files" : "Åpne i filer",
+ "File cannot be accessed" : "Filen er ikke tilgjengelig",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen ble ikke funnet, eller du har ikke tillatelse til å vise den. Be avsenderen om å dele den.",
+ "Clipboard is not available" : "Utklippstavlen er ikke tilgjengelig",
+ "General" : "Generell",
+ "All files" : "Alle filer",
+ "Personal files" : "Personlige filer",
+ "Sort favorites first" : "Sorter favoritter først",
+ "Sort folders before files" : "Sorter mapper før filer",
+ "Appearance" : "Utseende",
"Show hidden files" : "Vis skjulte filer",
+ "Crop image previews" : "Beskjær forhåndsvisninger av bilder",
+ "Additional settings" : "Flere innstillinger",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopier",
+ "Keyboard shortcuts" : "Tastatursnarveier",
+ "File actions" : "Filhandlinger",
+ "Rename" : "Gi nytt navn",
+ "Delete" : "Slett",
+ "Manage tags" : "Håndtere etiketter",
+ "Selection" : "Valg",
+ "Select all files" : "Velg alle filer",
+ "Deselect all" : "Fjern all markering",
+ "Navigation" : "Navigasjon",
+ "View" : "Vis",
"Toggle grid view" : "Veksle rutenett-visning",
- "No files in here" : "Ingen filer",
- "Upload some content or sync with your devices!" : "Last opp innhold eller synkroniser med enhetene dine!",
+ "Show those shortcuts" : "Vis hurtigtastene",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Del flere ganger med forskjellige personer",
+ "Error while loading the file data" : "Feil ved lasting av fildata",
+ "Owner" : "Eier",
+ "Remove from favorites" : "Fjern fra favoritter",
+ "Add to favorites" : "Legg til i favoritter",
+ "Tags" : "Merkelapper",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kan ikke opprette ny fil fra malen",
+ "Pick a template for {name}" : "Velg en mal for {name}",
+ "Create a new file with the selected template" : "Opprett en ny fil med den valgte malen",
+ "Creating file" : "Oppretter fil",
+ "Leave this share" : "Forlat denne delingen",
+ "Leave these shares" : "Forlat disse delingene",
+ "Disconnect storage" : "Koble fra lager",
+ "Disconnect storages" : "Koble fra lagringer",
+ "Delete permanently" : "Slett for godt",
+ "Delete and unshare" : "Slett og opphev deling",
+ "Delete file" : "Slett fil",
+ "Delete files" : "Slett filer",
+ "Delete folder" : "Slett mappe",
+ "Delete folders" : "Slett mapper",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du er i ferd med å slette permanent {count} element","Du er i ferd med å slette permanent {count} elementer"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du er i ferd med å slette {count} element","Du er i ferd med å slette {count} elementer"],
+ "Confirm deletion" : "Bekreft sletting",
+ "Cancel" : "Avbryt",
+ "Download" : "Last ned",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Destination is not a folder" : "Målplassering er ikke en mappe",
+ "This file/folder is already in that directory" : "Denne filen/mappen er allerede i den katalogen",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe til seg selv eller til en undermappe av seg selv",
+ "(copy)" : "(kopier)",
+ "(copy %n)" : "(kopier %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mappe med det navnet finnes allerede i denne mappen",
+ "The files are locked" : "Filene er låst",
+ "The file does not exist anymore" : "Filen finnes ikke lenger",
+ "Choose destination" : "Velg målplassering",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Flytt",
+ "Move or copy operation failed" : "Flytte- eller kopieringsoperason feilet",
+ "Move or copy" : "Flytt eller kopier",
+ "Open folder {displayName}" : "Åpne mappe {displayName}",
+ "Open in Files" : "Åpne i Filer",
+ "Open locally" : "Åpne lokalt",
+ "Failed to redirect to client" : "Kunne ikke omdirigere til klienten",
+ "Open file locally" : "Åpne fil lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen skal nå åpnes på enheten din. Om ikke, vennligst sjekk at du har skrivebordsprogrammet installert.",
+ "Retry and close" : "Prøv igjen og lukk",
+ "Details" : "Detaljer",
+ "View in folder" : "Vis i mappe",
+ "Today" : "I dag",
+ "Last 7 days" : "Siste 7 dager",
+ "Last 30 days" : "Siste 30 dager",
+ "This year ({year})" : "I år ({year})",
+ "Last year ({year})" : "I fjor ({year})",
+ "Documents" : "Dokumenter",
+ "Spreadsheets" : "Regneark",
+ "Presentations" : "Presentasjoner",
+ "PDFs" : "PDFer",
+ "Folders" : "Mapper",
+ "Audio" : "Lyd",
+ "Images" : "Bilder",
+ "Videos" : "Filmer",
+ "Created new folder \"{name}\"" : "Opprettet ny mappe \"{name}\"",
+ "Unable to initialize the templates directory" : "Kan ikke initialisere mal-mappen",
+ "Create templates folder" : "Opprett malmappe",
+ "Templates" : "Maler",
+ "New template folder" : "Ny malermappe",
+ "In folder" : "I mappen",
+ "Search in folder: {folder}" : "Søk i mappen: {folder}",
+ "One of the dropped files could not be processed" : "En av de slupne filene kunne ikke behandles",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Nettleseren din støtter ikke Filesystem API. Kataloger vil ikke bli lastet opp.",
+ "No files to upload" : "Ingen filer å laste opp",
+ "Unable to create the directory {directory}" : "Kan ikke opprette katalogen {directory}",
+ "Some files could not be uploaded" : "Noen filer kunne ikke lastes opp",
+ "Files uploaded successfully" : "Filer opplastet",
+ "No files to process" : "Ingen filer å behandle",
+ "Some files could not be copied" : "Noen filer kunne ikke kopieres",
+ "Some files could not be moved" : "Noen filer kunne ikke flyttes",
+ "Files copied successfully" : "Filer ble kopiert",
+ "Files moved successfully" : "Filer ble flyttet",
+ "Conflicts resolution skipped" : "Konfliktløsning hoppet over",
+ "Upload cancelled" : "Opplasting avbrutt",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunne ikke omdøpe \"{oldName}\", den finnes ikke lenger",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{newName}\" er allerede brukt i mappen \"{dir}\". Velg et annet navn.",
+ "Could not rename \"{oldName}\"" : "Kunne ikke omdøpe \"{oldName}\"",
+ "This operation is forbidden" : "Operasjonen er forbudt",
+ "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
+ "Unexpected error: {error}" : "Uventet feil: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
+ "Filename must not be empty." : "Filnavn kan ikke være tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er ikke tillatt i et filnavn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er et reservert navn og ikke tillatt for filnavn.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ikke en tillatt filtype.",
+ "Filenames must not end with \"{extension}\"." : "Filnavn må ikke slutte med \"{extension}\".",
+ "List of favorite files and folders." : "Liste over favorittfiler og mapper.",
+ "No favorites yet" : "Ingen favoritter enda",
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
+ "List of your files and folders." : "Liste over dine filer og mapper.",
+ "List of your files and folders that are not shared." : "Liste over dine filer og mapper som ikke er delt.",
+ "No personal files found" : "Ingen personlige filer funnet",
+ "Files that are not shared will show up here." : "Filer som ikke er delt vil vises her.",
+ "Recent" : "Nylig",
+ "List of recently modified files and folders." : "Liste over nylig endrede filer og mapper.",
+ "No recently modified files" : "Ingen nylig endrede filer",
+ "Files and folders you recently modified will show up here." : "Filer og mapper du nylig har endret, vises her.",
+ "Search" : "Søk",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
"Upload too large" : "Filen er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.",
- "No favorites yet" : "Ingen favoritter enda",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
- "Deleted files" : "Slettede filer",
- "Shares" : "Delinger",
- "Shared with others" : "Delt med andre",
- "Shared with you" : "Delt med deg",
- "Shared by link" : "Delt med lenke",
- "Deleted shares" : "Slettede delinger",
- "Pending shares" : "Ventende delinger",
+ "File could not be found" : "Filen ble ikke funnet",
+ "Show list view" : "Vis listevisning",
+ "Show grid view" : "Vis rutenett-visning",
+ "Close" : "Lukk",
+ "Could not create folder \"{dir}\"" : "Kunne ikke å opprette mappe \"{dir}\"",
+ "This will stop your current uploads." : "Dette vil stoppe dine nåværende opplastinger.",
+ "Upload cancelled." : "Opplasting avbrutt.",
+ "Processing files …" : "Prosesserer filer…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 Byte",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp {size1} men bare {size2} er ledig",
+ "Target folder \"{dir}\" does not exist any more" : "Målmappen \"{dir}\" finnes ikke lenger",
+ "An unknown error has occurred" : "En ukjent feil oppsto",
+ "File could not be uploaded" : "Fil kunne ikke lastes opp",
+ "Uploading …" : "Laster opp…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Laster opp... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Opplastning av det elementet er ikke støttet",
+ "Error when assembling chunks, status code {status}" : "Feil under sammenkobling av biter, statuskode {status}",
+ "Choose target folder" : "Velg målmappe",
+ "Set reminder" : "Angi påminnelse",
+ "Edit locally" : "Rediger lokalt",
+ "Open" : "Åpne",
+ "Could not load info for file \"{file}\"" : "Klarte ikke å hente informasjon som filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Velg merkelapper(er) for å legge til utvalget",
+ "Apply tag(s) to selection" : "Bruk merkelapp(er) på utvalget",
+ "Select directory \"{dirName}\"" : "Velg mappe \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Velg fil \"{fileName}\"",
+ "Unable to determine date" : "Kan ikke fastslå datoen",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
+ "Could not move \"{file}\", target exists" : "Klarte ikke å flytte \"{file}\", målfilen finnes",
+ "Could not move \"{file}\"" : "Klarte ikke å flytte \"{file}\"",
+ "copy" : "kopier",
+ "Could not copy \"{file}\", target exists" : "Klarte ikke å kopiere \"{file}\", målfilen finnes",
+ "Could not copy \"{file}\"" : "Klarte ikke å kopiere \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopierte {origin} i {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierte {origin} og {nbfiles} andre filer i {destination}",
+ "{newName} already exists" : "{newName} finnes allerede",
+ "Could not create file \"{file}\"" : "Klarte ikke å opprette fil \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Klarte ikke å opprette fil \"{file}\" fordi den finnes allerede",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke å opprette mappe \"{dir}\" fordi den finnes allerede",
+ "Could not fetch file details \"{file}\"" : "Kunne ikke hente fildetaljene \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Feil ved sletting av fil \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søkeresultater i andre mapper etter {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Tast inn mer enn to tegn for å lete i andre mapper",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"],
+ "You do not have permission to upload or create files here" : "Du har ikke tilgang til å laste opp eller opprette filer her",
+ "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"],
+ "New" : "Ny",
+ "New file/folder menu" : "Ny fil/mappe-meny",
+ "Select file range" : "Velg filutvalg",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} brukt",
+ "\"{name}\" is an invalid file name." : "\"{name}\" er et uglydig filnavn.",
+ "File name cannot be empty." : "Filnavn kan ikke være tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" tillates ikke i et filnavn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tillatt filtype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen av {owner} er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ekstern lagring \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Lagringen din er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagringsplass for {owner} er nesten full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Den eksterne lagringsplassen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Din lagringsplass er nesten full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Treffer \"{filter}\"","Treff \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direkte lenke ble kopiert (fungerer bare for personer som har tilgang til denne filen / mappen)",
+ "Path" : "Sti",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
+ "Favored" : "Favorittlagt",
+ "Favor" : "Favoritt",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopier direkte lenke (fungerer bare for personer som har tilgang til denne filen / mappen)",
+ "Upload file" : "Last opp fil",
+ "Not favored" : "Ikke favorittlagt",
+ "An error occurred while trying to update the tags" : "En feil oppsto under oppdatering av merkelappene",
+ "Upload (max. %s)" : "Opplasting (maks %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-handling utført",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-handling feilet",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massehandling utført",
+ "Submitting fields…" : "Sender inn felt...",
+ "Filter filenames…" : "Filtrer filnavn...",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL kopiert til utklippstavlen",
+ "Enable the grid view" : "Aktiver rutenettvisningen",
+ "Enable folder tree" : "Aktiver mappetre",
+ "Copy to clipboard" : "Kopiert til utklippstavlen",
+ "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
+ "Deletion cancelled" : "Sletting avbrutt",
+ "Move cancelled" : "Flytt avbrutt",
+ "Cancelled move or copy of \"{filename}\"." : "Kansellert flytte- eller kopieroperasjon av \"{filename}\"",
+ "Cancelled move or copy operation" : "Kansellert flytte- eller kopieroperasjon",
+ "Open details" : "Åpne detaljer",
+ "Photos and images" : "Fotoer og bilder",
+ "New folder creation cancelled" : "Oppretting av ny mappe avbrutt",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mappe","1 fil og {folderCount} mapper"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil og 1 mappe","{fileCount} filer og 1 mappe"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer og {folderCount} mapper",
+ "All folders" : "Alle mapper",
+ "Personal Files" : "Personlige filer",
"Text file" : "Tekstfil",
"New text file.txt" : "Ny tekstfil.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagringsplass for {owner} er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Denne eksterne lagringsplassen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "Your storage is full, files can not be updated or synced anymore!" : "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!",
- "_matches '{filter}'_::_match '{filter}'_" : [" stemmer med '{filter}'"," stemmer med '{filter}'"]
+ "Speed up your Files experience with these quick shortcuts." : "Jobb raskere med filer ved å bruke disse hurtigtastene.",
+ "Open the actions menu for a file" : "Åpner handlingsmenyen for en fil",
+ "Rename a file" : "Gi nytt navn til en fil",
+ "Delete a file" : "Slett en fil",
+ "Favorite or remove a file from favorites" : "Legg til og fjern en fil fra Favoritter",
+ "Manage tags for a file" : "Behandle merkelapper for en fil",
+ "Deselect all files" : "Velg ingen filer",
+ "Navigate to the parent folder" : "Gå til overordnet mappe",
+ "Navigate to the file above" : "Gå til filen over",
+ "Navigate to the file below" : "Gå til filen under",
+ "Navigate to the file on the left (in grid mode)" : "Gå til filen til venstre (i rutenettvisning)",
+ "Navigate to the file on the right (in grid mode)" : "Gå til filen til høyre (i rutenettvisning)",
+ "Toggle the grid view" : "Slå på/av rutenettvisning"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nb.json b/apps/files/l10n/nb.json
index 80cf6018963..9e77868a825 100644
--- a/apps/files/l10n/nb.json
+++ b/apps/files/l10n/nb.json
@@ -1,105 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
- "Storage invalid" : "Lagringsplass ugyldig",
- "Unknown error" : "Ukjent feil",
- "File could not be found" : "Filen ble ikke funnet",
- "Move or copy" : "Flytt eller kopier",
- "Download" : "Last ned",
- "Delete" : "Slett",
- "Home" : "Hjem",
- "Close" : "Lukk",
- "Favorites" : "Favoritter",
- "Could not create folder \"{dir}\"" : "Klarete ikke å opprette mappe \"{dir}\"",
- "This will stop your current uploads." : "Dette fille stoppe dine nåværende opplastinger.",
- "Upload cancelled." : "Opplasting avbrutt.",
- "Processing files …" : "Prosesserer filer…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 Byte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp {size1} men bare {size2} er ledig",
- "Target folder \"{dir}\" does not exist any more" : "Målmappen \"{dir}\" finnes ikke lenger",
- "Not enough free space" : "Ikke nok ledig diskplass",
- "An unknown error has occurred" : "En ukjent feil oppstod",
- "Uploading …" : "Laster opp…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Opplastning av det elementet er ikke støttet",
- "Target folder does not exist any more" : "Målmappen finnes ikke lenger",
- "Operation is blocked by access control" : "Operasjonen er blokkert på grunn av tilgangskontroll",
- "Error when assembling chunks, status code {status}" : "Feil under sammenkobling av biter, statuskode {status}",
- "Actions" : "Handlinger",
- "Rename" : "Gi nytt navn",
- "Copy" : "Kopier",
- "Choose target folder" : "Velg målmappe",
- "Open" : "Åpne",
- "Delete file" : "Slett fil",
- "Delete folder" : "Slett mappe",
- "Disconnect storage" : "Koble fra lager",
- "Leave this share" : "Forlat denne delingen",
- "Could not load info for file \"{file}\"" : "Klarte ikke å hente informasjon som filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Select" : "Velg",
- "Pending" : "Venter",
- "Unable to determine date" : "Kan ikke fastslå datoen",
- "This operation is forbidden" : "Operasjonen er forbudt",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
- "Could not move \"{file}\", target exists" : "Klarte ikke å flytte \"{file}\", målfilen finnes",
- "Could not move \"{file}\"" : "Klarte ikke å flytte \"{file}\"",
- "copy" : "kopier",
- "Could not copy \"{file}\", target exists" : "Klarte ikke å kopiere \"{file}\", målfilen finnes",
- "Could not copy \"{file}\"" : "Klarte ikke å kopiere \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopierte {origin} i {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierte {origin} og {nbfiles} andre filer i {destination}",
- "{newName} already exists" : "{newName} finnes allerede",
- "Could not rename \"{fileName}\", it does not exist any more" : "Klarte ikke å omdøpe \"{fileName}\", den finnes ikke lenger",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{targetName}\" brukes allerede i mappen \"{dir}\". Velg et annet navn.",
- "Could not rename \"{fileName}\"" : "Klarte ikke å gi \"{fileName}\" nytt navn",
- "Could not create file \"{file}\"" : "Klarte ikke å opprette fil \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Klarte ikke å opprette fil \"{file}\" fordi den finnes allerede",
- "Could not create folder \"{dir}\" because it already exists" : "Klarete ikke å opprette mappe \"{dir}\" fordi den finnes allerede",
- "Could not fetch file details \"{file}\"" : "Kunne ikke hente fildetaljene \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Feil ved sletting av fil \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søkeresultater i andre mapper etter {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Tast inn mer enn to tegn for å lete i andre mapper",
- "Name" : "Navn",
- "Size" : "Størrelse",
- "Modified" : "Endret",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"],
- "You don’t have permission to upload or create files here" : "Du har ikke tillatelse til å laste opp eller opprette filer her",
- "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"],
- "New" : "Ny",
- "Select file range" : "Velg filutvalg",
- "{used} of {quota} used" : "{used} av {quota} brukt",
- "{used} used" : "{used} brukt",
- "\"{name}\" is an invalid file name." : "\"{name}\" er et uglydig filnavn.",
- "File name cannot be empty." : "Filnavn kan ikke være tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" tillates ikke i et filnavn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tillatt filtype",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagringsplass for {owner} er nesten full ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Den eksterne lagringsplassen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Din lagringsplass er nesten full ({usedSpacePercent}%).",
- "View in folder" : "Vis i mappe",
- "Copied!" : "Kopiert!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopier direkte lenke (virker bare for brukere som har tilgang til denne filen/mappa)",
- "Path" : "Sti",
- "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
- "Favorited" : "Favorisert",
- "Favorite" : "Gjør til favoritt",
- "You can only favorite a single file or folder at a time" : "Du kan bare legge til en fil av gangen til favoritter",
- "New folder" : "Ny mappe",
- "Upload file" : "Last opp fil",
- "Recent" : "Nylig",
- "Not favorited" : "Ikke i favoritter",
- "Remove from favorites" : "Fjern fra favoritter",
- "Add to favorites" : "Legg til i favoritter",
- "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av merkelappene",
"Added to favorites" : "Lagt til i favoritter",
"Removed from favorites" : "Fjernet fra favoritter",
"You added {file} to your favorites" : "Du la til {file} i dine favoritter",
"You removed {file} from your favorites" : "Du fjernet {file} fra dine favoritter",
+ "Favorites" : "Favoritter",
"File changes" : "Filendringer",
"Created by {user}" : "Opprettet av {user}",
"Changed by {user}" : "Endret av {user}",
@@ -107,7 +11,7 @@
"Restored by {user}" : "Gjenopprettet av {user}",
"Renamed by {user}" : "Navn endret av {user}",
"Moved by {user}" : "Flyttet av {user}",
- "\"remote user\"" : "\"ekstern bruker\"",
+ "\"remote account\"" : "\"ekstern konto\"",
"You created {file}" : "Du opprettet {file}",
"You created an encrypted file in {file}" : "Du opprettet en kryptert fil i {file}",
"{user} created {file}" : "{user} opprettet {file}",
@@ -123,20 +27,35 @@
"{user} deleted an encrypted file in {file}" : "{user} slettet en kryptert fil i {file}",
"You restored {file}" : "Du gjenopprettet {file}",
"{user} restored {file}" : "{user} gjenopprettet {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Du endret navn på {oldfile} (skjult) til {newfile} (skjult)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Du endret navn på {oldfile} (skjult) til {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Du endret navn på {oldfile} til {newfile} (skjult)",
"You renamed {oldfile} to {newfile}" : "Du endret navn på {oldfile} til {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} endret navn på {oldfile} til {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : " {user} endret navn på {oldfile} (skjult) til {newfile} (skjult)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : " {user} endret navn på {oldfile} (skjult) til {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} endret navn på {oldfile} til {newfile} (skjult)",
+ "{user} renamed {oldfile} to {newfile}" : " {user} endret navn på {oldfile} til {newfile}",
"You moved {oldfile} to {newfile}" : "Du flyttet {oldfile} til {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttet {oldfile} til {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil har blitt lagt til eller fjernet fra dine <strong>favoritter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favoritt-fil eller mappe har blitt <strong>endret</strong>",
- "All files" : "Alle filer",
- "Unlimited" : "Ubegrenset",
- "Upload (max. %s)" : "Opplasting (maks %s)",
+ "Failed to authorize" : "Autorisering feilet",
+ "Invalid folder path" : "Ugyldig mappebane",
+ "Folder not found" : "Mappe ikke funnet",
+ "The file cannot be found" : "Kunne ikke finne filen",
+ "The destination path does not exist: %1$s" : "Fildestinasjonen finnes ikke: %1$s",
+ "Could not get relative path to converted file" : "Kunne ikke hente relativ sti til den konverterte filen",
+ "Favorite files" : "Favorittfiler",
+ "No favorites" : "Ingen favoritter",
+ "More favorites" : "Flere favoritter",
"Accept" : "Aksepter",
"Reject" : "Avvis",
"Incoming ownership transfer from {user}" : "Ny eierskapsoverføring fra {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ønsker du å godta {path}?\n\nObs: Overføringsprosessen kan ta opp til 1 time.",
+ "Ownership transfer denied" : "Eierskapsoverføring nektet",
+ "Your ownership transfer of {path} was denied by {user}." : "Eierskapsoverføring av din {path} ble nektet av {user}.",
"Ownership transfer failed" : "Overføring av eierskap mislyktes",
"Your ownership transfer of {path} to {user} failed." : "Eierskapsoverføring din av {path} til {user} mislyktes.",
"The ownership transfer of {path} from {user} failed." : "Eierskapsoverføring av {path} fra {user} mislyktes.",
@@ -144,52 +63,361 @@
"Your ownership transfer of {path} to {user} has completed." : "Eierskapsoverføringen din av {path} til {user} er ferdig.",
"The ownership transfer of {path} from {user} has completed." : "Eierskapsoverføring av {path} fra {user} er ferdig.",
"in %s" : "om %s",
+ "Transferred from %1$s on %2$s" : "Overført fra %1$s på %2$s",
+ "Files compatibility" : "Kompatibilitet med filer",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillat å begrense filnavn for å sikre at filer kan synkroniseres med alle klienter. Som standard er alle filnavn gyldige på POSIX (f.eks. Linux eller macOS) tillatt.",
+ "Enforce Windows compatibility" : "Håndhev Windows-kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dette vil blokkere filnavn som ikke er gyldige på Windows-systemer, for eksempel å bruke reserverte navn eller spesialtegn. Men dette vil ikke håndheve kompatibiliteten til store og små bokstaver.",
"File Management" : "Filbehandling",
- "Transfer ownership of a file or folder" : "Eierskapsoverføring av en fil eller mappe",
- "Choose file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
- "Change" : "Endre",
- "New owner" : "Ny eier",
- "Search users" : "Søk etter brukere",
+ "Home" : "Hjem",
+ "Target folder does not exist any more" : "Målmappen finnes ikke lenger",
+ "Reload current directory" : "Last inn gjeldende katalog på nytt",
+ "Go to the \"{dir}\" directory" : "Gå til \"{dir}\"-katalogen",
+ "Current directory path" : "Gjeldende katalogsti",
+ "Your have used your space quota and cannot upload files anymore" : "Du har brukt opp plasskvoten og kan ikke laste opp filer lenger",
+ "Drag and drop files here to upload" : "Dra og slipp filer her for å laste opp",
+ "Favorite" : "Gjør til favoritt",
+ "Back" : "Tilbake",
+ "Toggle selection for file \"{displayName}\"" : "Veksle valg for fil \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Veksle valg for mappe \"{displayName}\"",
+ "File is loading" : "Filen lastes inn",
+ "Folder is loading" : "Mappen lastes inn",
+ "Filename" : "Filnavn",
+ "Folder name" : "Mappenavn",
+ "This node is unavailable" : "Denne noden er utilgjengelig",
+ "Another entry with the same name already exists." : "En annen oppføring med samme navnet finnes allerede.",
+ "Invalid filename." : "Ugyldig filnavn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Omdøpte \"{oldName}\" tl \"{newName}\"",
+ "Rename file" : "Gi fil nytt navn",
+ "Folder" : "Mappe",
+ "Pending" : "Venter",
+ "Unknown date" : "Ukjent dato",
+ "Clear filter" : "Tøm filter",
+ "Modified" : "Endret",
+ "Search everywhere" : "Søk overalt",
+ "Type" : "Type",
+ "Active filters" : "Aktivt filter",
+ "Remove filter" : "Fjern filter",
+ "Total rows summary" : "Sammendrag av totalrader",
+ "Toggle selection for all files and folders" : "Veksle valg for alle filer og mapper",
+ "Name" : "Navn",
+ "Size" : "Størrelse",
+ "Actions" : "Handlinger",
+ "(selected)" : "(valgt)",
+ "List of files and folders." : "Liste over filer og mapper.",
+ "You have used your space quota and cannot upload files anymore." : "Du har brukt opp lagringskvoten din og kan ikke laste opp flere filer.",
+ "Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper kan sorteres.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denne listen er ikke fullstendig gjengitt av ytelsesgrunner. Filene gjengis når du navigerer gjennom listen.",
+ "File not found" : "Finner ikke filen",
+ "{usedQuotaByte} used" : "{usedQuotaByte} brukt",
+ "{used} of {quota} used" : "{used} av {quota} brukt",
+ "{relative}% used" : "{relative}% brukt",
+ "Could not refresh storage stats" : "Kunne ikke oppdatere lagringsstatistikk",
+ "Your storage is full, files can not be updated or synced anymore!" : "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!",
+ "Storage information" : "Informasjon om lagring",
+ "Storage quota" : "Lagringskvote",
+ "New folder" : "Ny mappe",
+ "Create new folder" : "Opprett ny mappe",
+ "This name is already in use." : "Navnet er allerede i bruk.",
+ "Create" : "Opprett",
+ "Fill template fields" : "Fyll ut malfelt",
+ "Submit" : "Send inn",
"Choose a file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
"Transfer" : "Overfør",
"Transfer {path} to {userid}" : "Overfør {path} til {userid}",
"Invalid path selected" : "Ugyldig angitt sti",
+ "Unknown error" : "Ukjent feil",
"Ownership transfer request sent" : "Forespørsel om overføring av eierskap er sendt",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier",
- "Tags" : "Merkelapper",
- "Unable to change the favourite state of the file" : "Kan ikke endre favorittstatus til filen",
- "Error while loading the file data" : "Feil ved lasting av fildata",
- "Cancel" : "Avbryt",
- "Create" : "Opprett",
- "%s used" : "%s brukt",
- "%s%% of %s used" : "%s%% av %s brukt",
- "%1$s of %2$s used" : "%1$s av %2$s brukt",
- "Settings" : "Innstillinger",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan ikke overføre eierskap til en fil eller mappe du ikke eier",
+ "Transfer ownership of a file or folder" : "Eierskapsoverføring av en fil eller mappe",
+ "Choose file or folder to transfer" : "Velg en fil eller mappe som skal overføres",
+ "Change" : "Endre",
+ "New owner" : "Ny eier",
+ "Remove extension" : "Fjern filendelse",
+ "Change file extension" : "Endre filendelse",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Å endre filendelsen fra «{old}» til «{new}» kan føre til at filen ikke kan leses.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Å fjerne filendelsen «{old}» kan føre til at filen ikke kan leses.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Å legge til filendelsen «{new}» kan føre til at filen ikke kan leses.",
+ "Select file or folder to link to" : "Velg fil eller mappe å koble til",
+ "Choose {file}" : "Choose {file}",
+ "Share" : "Del med andre",
+ "Shared by link" : "Delt med lenke",
+ "Shared" : "Delt",
+ "Switch to list view" : "Bytt til listevisning",
+ "Switch to grid view" : "Bytt til rutevisning",
+ "Upload was cancelled by user" : "Opplasting ble avbrutt av bruker",
+ "Not enough free space" : "Ikke nok ledig diskplass",
+ "Operation is blocked by access control" : "Operasjonen er blokkert på grunn av tilgangskontroll",
+ "Error during upload: {message}" : "Feil under opplasting: {message}",
+ "Error during upload, status code {status}" : "Feil under opplasting, statuskode {status}",
+ "Unknown error during upload" : "Ukjent feil under opplasting",
+ "Loading current folder" : "Laster gjeldende mappe",
+ "Retry" : "Prøv igjen",
+ "No files in here" : "Ingen filer",
+ "Upload some content or sync with your devices!" : "Last opp innhold eller synkroniser med enhetene dine!",
+ "Go back" : "Gå tilbake",
+ "Views" : "Visninger",
+ "Files settings" : "Filinnstillinger",
+ "Your files" : "Dine filer",
+ "Open in files" : "Åpne i filer",
+ "File cannot be accessed" : "Filen er ikke tilgjengelig",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen ble ikke funnet, eller du har ikke tillatelse til å vise den. Be avsenderen om å dele den.",
+ "Clipboard is not available" : "Utklippstavlen er ikke tilgjengelig",
+ "General" : "Generell",
+ "All files" : "Alle filer",
+ "Personal files" : "Personlige filer",
+ "Sort favorites first" : "Sorter favoritter først",
+ "Sort folders before files" : "Sorter mapper før filer",
+ "Appearance" : "Utseende",
"Show hidden files" : "Vis skjulte filer",
+ "Crop image previews" : "Beskjær forhåndsvisninger av bilder",
+ "Additional settings" : "Flere innstillinger",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopier",
+ "Keyboard shortcuts" : "Tastatursnarveier",
+ "File actions" : "Filhandlinger",
+ "Rename" : "Gi nytt navn",
+ "Delete" : "Slett",
+ "Manage tags" : "Håndtere etiketter",
+ "Selection" : "Valg",
+ "Select all files" : "Velg alle filer",
+ "Deselect all" : "Fjern all markering",
+ "Navigation" : "Navigasjon",
+ "View" : "Vis",
"Toggle grid view" : "Veksle rutenett-visning",
- "No files in here" : "Ingen filer",
- "Upload some content or sync with your devices!" : "Last opp innhold eller synkroniser med enhetene dine!",
+ "Show those shortcuts" : "Vis hurtigtastene",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Del flere ganger med forskjellige personer",
+ "Error while loading the file data" : "Feil ved lasting av fildata",
+ "Owner" : "Eier",
+ "Remove from favorites" : "Fjern fra favoritter",
+ "Add to favorites" : "Legg til i favoritter",
+ "Tags" : "Merkelapper",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kan ikke opprette ny fil fra malen",
+ "Pick a template for {name}" : "Velg en mal for {name}",
+ "Create a new file with the selected template" : "Opprett en ny fil med den valgte malen",
+ "Creating file" : "Oppretter fil",
+ "Leave this share" : "Forlat denne delingen",
+ "Leave these shares" : "Forlat disse delingene",
+ "Disconnect storage" : "Koble fra lager",
+ "Disconnect storages" : "Koble fra lagringer",
+ "Delete permanently" : "Slett for godt",
+ "Delete and unshare" : "Slett og opphev deling",
+ "Delete file" : "Slett fil",
+ "Delete files" : "Slett filer",
+ "Delete folder" : "Slett mappe",
+ "Delete folders" : "Slett mapper",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du er i ferd med å slette permanent {count} element","Du er i ferd med å slette permanent {count} elementer"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du er i ferd med å slette {count} element","Du er i ferd med å slette {count} elementer"],
+ "Confirm deletion" : "Bekreft sletting",
+ "Cancel" : "Avbryt",
+ "Download" : "Last ned",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
+ "Destination is not a folder" : "Målplassering er ikke en mappe",
+ "This file/folder is already in that directory" : "Denne filen/mappen er allerede i den katalogen",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe til seg selv eller til en undermappe av seg selv",
+ "(copy)" : "(kopier)",
+ "(copy %n)" : "(kopier %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mappe med det navnet finnes allerede i denne mappen",
+ "The files are locked" : "Filene er låst",
+ "The file does not exist anymore" : "Filen finnes ikke lenger",
+ "Choose destination" : "Velg målplassering",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Move to {target}",
+ "Move" : "Flytt",
+ "Move or copy operation failed" : "Flytte- eller kopieringsoperason feilet",
+ "Move or copy" : "Flytt eller kopier",
+ "Open folder {displayName}" : "Åpne mappe {displayName}",
+ "Open in Files" : "Åpne i Filer",
+ "Open locally" : "Åpne lokalt",
+ "Failed to redirect to client" : "Kunne ikke omdirigere til klienten",
+ "Open file locally" : "Åpne fil lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen skal nå åpnes på enheten din. Om ikke, vennligst sjekk at du har skrivebordsprogrammet installert.",
+ "Retry and close" : "Prøv igjen og lukk",
+ "Details" : "Detaljer",
+ "View in folder" : "Vis i mappe",
+ "Today" : "I dag",
+ "Last 7 days" : "Siste 7 dager",
+ "Last 30 days" : "Siste 30 dager",
+ "This year ({year})" : "I år ({year})",
+ "Last year ({year})" : "I fjor ({year})",
+ "Documents" : "Dokumenter",
+ "Spreadsheets" : "Regneark",
+ "Presentations" : "Presentasjoner",
+ "PDFs" : "PDFer",
+ "Folders" : "Mapper",
+ "Audio" : "Lyd",
+ "Images" : "Bilder",
+ "Videos" : "Filmer",
+ "Created new folder \"{name}\"" : "Opprettet ny mappe \"{name}\"",
+ "Unable to initialize the templates directory" : "Kan ikke initialisere mal-mappen",
+ "Create templates folder" : "Opprett malmappe",
+ "Templates" : "Maler",
+ "New template folder" : "Ny malermappe",
+ "In folder" : "I mappen",
+ "Search in folder: {folder}" : "Søk i mappen: {folder}",
+ "One of the dropped files could not be processed" : "En av de slupne filene kunne ikke behandles",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Nettleseren din støtter ikke Filesystem API. Kataloger vil ikke bli lastet opp.",
+ "No files to upload" : "Ingen filer å laste opp",
+ "Unable to create the directory {directory}" : "Kan ikke opprette katalogen {directory}",
+ "Some files could not be uploaded" : "Noen filer kunne ikke lastes opp",
+ "Files uploaded successfully" : "Filer opplastet",
+ "No files to process" : "Ingen filer å behandle",
+ "Some files could not be copied" : "Noen filer kunne ikke kopieres",
+ "Some files could not be moved" : "Noen filer kunne ikke flyttes",
+ "Files copied successfully" : "Filer ble kopiert",
+ "Files moved successfully" : "Filer ble flyttet",
+ "Conflicts resolution skipped" : "Konfliktløsning hoppet over",
+ "Upload cancelled" : "Opplasting avbrutt",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunne ikke omdøpe \"{oldName}\", den finnes ikke lenger",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Navnet \"{newName}\" er allerede brukt i mappen \"{dir}\". Velg et annet navn.",
+ "Could not rename \"{oldName}\"" : "Kunne ikke omdøpe \"{oldName}\"",
+ "This operation is forbidden" : "Operasjonen er forbudt",
+ "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
+ "Unexpected error: {error}" : "Uventet feil: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
+ "Filename must not be empty." : "Filnavn kan ikke være tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" er ikke tillatt i et filnavn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" er et reservert navn og ikke tillatt for filnavn.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" er ikke en tillatt filtype.",
+ "Filenames must not end with \"{extension}\"." : "Filnavn må ikke slutte med \"{extension}\".",
+ "List of favorite files and folders." : "Liste over favorittfiler og mapper.",
+ "No favorites yet" : "Ingen favoritter enda",
+ "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
+ "List of your files and folders." : "Liste over dine filer og mapper.",
+ "List of your files and folders that are not shared." : "Liste over dine filer og mapper som ikke er delt.",
+ "No personal files found" : "Ingen personlige filer funnet",
+ "Files that are not shared will show up here." : "Filer som ikke er delt vil vises her.",
+ "Recent" : "Nylig",
+ "List of recently modified files and folders." : "Liste over nylig endrede filer og mapper.",
+ "No recently modified files" : "Ingen nylig endrede filer",
+ "Files and folders you recently modified will show up here." : "Filer og mapper du nylig har endret, vises her.",
+ "Search" : "Søk",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
"Upload too large" : "Filen er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.",
- "No favorites yet" : "Ingen favoritter enda",
- "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her",
- "Deleted files" : "Slettede filer",
- "Shares" : "Delinger",
- "Shared with others" : "Delt med andre",
- "Shared with you" : "Delt med deg",
- "Shared by link" : "Delt med lenke",
- "Deleted shares" : "Slettede delinger",
- "Pending shares" : "Ventende delinger",
+ "File could not be found" : "Filen ble ikke funnet",
+ "Show list view" : "Vis listevisning",
+ "Show grid view" : "Vis rutenett-visning",
+ "Close" : "Lukk",
+ "Could not create folder \"{dir}\"" : "Kunne ikke å opprette mappe \"{dir}\"",
+ "This will stop your current uploads." : "Dette vil stoppe dine nåværende opplastinger.",
+ "Upload cancelled." : "Opplasting avbrutt.",
+ "Processing files …" : "Prosesserer filer…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 Byte",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp {size1} men bare {size2} er ledig",
+ "Target folder \"{dir}\" does not exist any more" : "Målmappen \"{dir}\" finnes ikke lenger",
+ "An unknown error has occurred" : "En ukjent feil oppsto",
+ "File could not be uploaded" : "Fil kunne ikke lastes opp",
+ "Uploading …" : "Laster opp…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Laster opp... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Opplastning av det elementet er ikke støttet",
+ "Error when assembling chunks, status code {status}" : "Feil under sammenkobling av biter, statuskode {status}",
+ "Choose target folder" : "Velg målmappe",
+ "Set reminder" : "Angi påminnelse",
+ "Edit locally" : "Rediger lokalt",
+ "Open" : "Åpne",
+ "Could not load info for file \"{file}\"" : "Klarte ikke å hente informasjon som filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Velg merkelapper(er) for å legge til utvalget",
+ "Apply tag(s) to selection" : "Bruk merkelapp(er) på utvalget",
+ "Select directory \"{dirName}\"" : "Velg mappe \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Velg fil \"{fileName}\"",
+ "Unable to determine date" : "Kan ikke fastslå datoen",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
+ "Could not move \"{file}\", target exists" : "Klarte ikke å flytte \"{file}\", målfilen finnes",
+ "Could not move \"{file}\"" : "Klarte ikke å flytte \"{file}\"",
+ "copy" : "kopier",
+ "Could not copy \"{file}\", target exists" : "Klarte ikke å kopiere \"{file}\", målfilen finnes",
+ "Could not copy \"{file}\"" : "Klarte ikke å kopiere \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopierte {origin} i {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierte {origin} og {nbfiles} andre filer i {destination}",
+ "{newName} already exists" : "{newName} finnes allerede",
+ "Could not create file \"{file}\"" : "Klarte ikke å opprette fil \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Klarte ikke å opprette fil \"{file}\" fordi den finnes allerede",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunne ikke å opprette mappe \"{dir}\" fordi den finnes allerede",
+ "Could not fetch file details \"{file}\"" : "Kunne ikke hente fildetaljene \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Feil ved sletting av fil \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Ingen søkeresultater i andre mapper etter {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Tast inn mer enn to tegn for å lete i andre mapper",
+ "{dirs} and {files}" : "{dirs} og {files}",
+ "_including %n hidden_::_including %n hidden_" : ["Inkludert %n skjult","Inkludert %n skjulte"],
+ "You do not have permission to upload or create files here" : "Du har ikke tilgang til å laste opp eller opprette filer her",
+ "_Uploading %n file_::_Uploading %n files_" : ["Laster opp %n fil","Laster opp %n filer"],
+ "New" : "Ny",
+ "New file/folder menu" : "Ny fil/mappe-meny",
+ "Select file range" : "Velg filutvalg",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} brukt",
+ "\"{name}\" is an invalid file name." : "\"{name}\" er et uglydig filnavn.",
+ "File name cannot be empty." : "Filnavn kan ikke være tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" tillates ikke i et filnavn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" er ikke en tillatt filtype",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagringen av {owner} er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Ekstern lagring \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Lagringen din er full, filer kan ikke oppdateres eller synkroniseres lenger!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagringsplass for {owner} er nesten full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppemappen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Den eksterne lagringsplassen \"{mountPoint}\" er nesten full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Din lagringsplass er nesten full ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["Treffer \"{filter}\"","Treff \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direkte lenke ble kopiert (fungerer bare for personer som har tilgang til denne filen / mappen)",
+ "Path" : "Sti",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"],
+ "Favored" : "Favorittlagt",
+ "Favor" : "Favoritt",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopier direkte lenke (fungerer bare for personer som har tilgang til denne filen / mappen)",
+ "Upload file" : "Last opp fil",
+ "Not favored" : "Ikke favorittlagt",
+ "An error occurred while trying to update the tags" : "En feil oppsto under oppdatering av merkelappene",
+ "Upload (max. %s)" : "Opplasting (maks %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-handling utført",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-handling feilet",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massehandling utført",
+ "Submitting fields…" : "Sender inn felt...",
+ "Filter filenames…" : "Filtrer filnavn...",
+ "WebDAV URL copied to clipboard" : "WebDAV-URL kopiert til utklippstavlen",
+ "Enable the grid view" : "Aktiver rutenettvisningen",
+ "Enable folder tree" : "Aktiver mappetre",
+ "Copy to clipboard" : "Kopiert til utklippstavlen",
+ "Use this address to access your Files via WebDAV" : "Bruk denne adressen for tilgang til filene dine via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Hvis du har aktivert 2FA, må du opprette og bruke et nytt app-passord ved å klikke her.",
+ "Deletion cancelled" : "Sletting avbrutt",
+ "Move cancelled" : "Flytt avbrutt",
+ "Cancelled move or copy of \"{filename}\"." : "Kansellert flytte- eller kopieroperasjon av \"{filename}\"",
+ "Cancelled move or copy operation" : "Kansellert flytte- eller kopieroperasjon",
+ "Open details" : "Åpne detaljer",
+ "Photos and images" : "Fotoer og bilder",
+ "New folder creation cancelled" : "Oppretting av ny mappe avbrutt",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mappe","{folderCount} mapper"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil og {folderCount} mappe","1 fil og {folderCount} mapper"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil og 1 mappe","{fileCount} filer og 1 mappe"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer og {folderCount} mapper",
+ "All folders" : "Alle mapper",
+ "Personal Files" : "Personlige filer",
"Text file" : "Tekstfil",
"New text file.txt" : "Ny tekstfil.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagringsplass for {owner} er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppemappen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Denne eksterne lagringsplassen \"{mountPoint}\" er full, filer kan ikke oppdateres eller synkroniseres lenger!",
- "Your storage is full, files can not be updated or synced anymore!" : "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!",
- "_matches '{filter}'_::_match '{filter}'_" : [" stemmer med '{filter}'"," stemmer med '{filter}'"]
+ "Speed up your Files experience with these quick shortcuts." : "Jobb raskere med filer ved å bruke disse hurtigtastene.",
+ "Open the actions menu for a file" : "Åpner handlingsmenyen for en fil",
+ "Rename a file" : "Gi nytt navn til en fil",
+ "Delete a file" : "Slett en fil",
+ "Favorite or remove a file from favorites" : "Legg til og fjern en fil fra Favoritter",
+ "Manage tags for a file" : "Behandle merkelapper for en fil",
+ "Deselect all files" : "Velg ingen filer",
+ "Navigate to the parent folder" : "Gå til overordnet mappe",
+ "Navigate to the file above" : "Gå til filen over",
+ "Navigate to the file below" : "Gå til filen under",
+ "Navigate to the file on the left (in grid mode)" : "Gå til filen til venstre (i rutenettvisning)",
+ "Navigate to the file on the right (in grid mode)" : "Gå til filen til høyre (i rutenettvisning)",
+ "Toggle the grid view" : "Slå på/av rutenettvisning"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 30a03381ade..19c2ee2eaf5 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -1,16 +1,358 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
- "Storage invalid" : "Opslag ongeldig",
+ "Added to favorites" : "Aan favorieten toegevoegd",
+ "Removed from favorites" : "Uit favorieten verwijderd",
+ "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
+ "You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
+ "Favorites" : "Favorieten",
+ "File changes" : "Bestandswijzigingen",
+ "Created by {user}" : "Gecreëerd door {user}",
+ "Changed by {user}" : "Gewijzigd door {user}",
+ "Deleted by {user}" : "Verwijderd door {user}",
+ "Restored by {user}" : "Hersteld door {user}",
+ "Renamed by {user}" : "Hernoemd door {user}",
+ "Moved by {user}" : "Verplaatst door {user}",
+ "\"remote account\"" : "\"remote account\"",
+ "You created {file}" : "Je creëerde {file}",
+ "You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
+ "{user} created {file}" : "{user} creëerde {file}",
+ "{user} created an encrypted file in {file}" : "{user} creëerde een versleuteld bestand in {file}",
+ "{file} was created in a public folder" : "{file} werd gecreëerd in een openbare map",
+ "You changed {file}" : "Je wijzigde {file}",
+ "You changed an encrypted file in {file}" : "Je wijzigde een versleuteld bestand in {file}",
+ "{user} changed {file}" : "{user} wijzigde {file}",
+ "{user} changed an encrypted file in {file}" : "{user} heeft een versleuteteld bestand veranderd in {file}",
+ "You deleted {file}" : "Je verwijderde {file}",
+ "You deleted an encrypted file in {file}" : "Je hebt een versleuteld bestand gewist in {file}",
+ "{user} deleted {file}" : "{user} verwijderde {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} heeft een versleuteld bestand gewist in {file}",
+ "You restored {file}" : "Je herstelde {file}",
+ "{user} restored {file}" : "{user} herstelde {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Je hernoemde {oldfile} (verborgen) naar {newfile}(verborgen)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Je hernoemde {oldfile} naar {newfile} (verborgen)",
+ "You renamed {oldfile} to {newfile}" : "Je hernoemde {oldfile} naar {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} hernoemde {oldfile} (verborgen) naar {newfile} (verborgen)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} hernoemde {oldfile} (verborgen) naar {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} hernoemde {oldfile} naar {newfile} (verborgen)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} hernoemde {oldfile} naar {newfile}",
+ "You moved {oldfile} to {newfile}" : "Je verplaatste {oldfile} naar {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} verplaatste {oldfile} naar {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Een bestand werd toegevoegd of verwijderd van je <strong>favorieten</strong>",
+ "Files" : "Bestanden",
+ "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Een favoriet bestand of map is <strong>gewijzigd</strong>",
+ "Failed to authorize" : "Kon niet autoriseren",
+ "Invalid folder path" : "Ongeldig pad",
+ "Folder not found" : "Map niet gevonden",
+ "The file cannot be found" : "Het bestand kan niet worden gevonden",
+ "The destination path does not exist: %1$s" : "Het bestemmingspad bestaat niet: %1$s",
+ "You do not have permission to create a file at the specified location" : "Je hebt geen toestemming om een bestand aan te maken op de opgegeven locatie",
+ "The file could not be converted." : "Het bestand kon niet worden geconverteerd.",
+ "Could not get relative path to converted file" : "Kon geen relatief pad naar geconverteerd bestand achterhalen",
+ "Favorite files" : "Favoriete bestanden",
+ "No favorites" : "Geen favorieten",
+ "More favorites" : "Meer favorieten",
+ "Accept" : "Accepteren",
+ "Reject" : "Afwijzen",
+ "Incoming ownership transfer from {user}" : "Inkomend verzoek voor eigendomsoverdracht van {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Wil je {path} aanvaarden? \n\nOpmerking: het overdrachtsproces kan na acceptatie tot 1 uur duren.",
+ "Ownership transfer denied" : "Eigendomsoverdracht geweigerd",
+ "Your ownership transfer of {path} was denied by {user}." : "Eigendomsoverdracht van {path} is geweigerd door {user}.",
+ "Ownership transfer failed" : "Eigendomsoverdracht mislukt",
+ "Your ownership transfer of {path} to {user} failed." : "Eigendomsoverdracht van {path} naar {user} is mislukt.",
+ "The ownership transfer of {path} from {user} failed." : "Eigendomsoverdracht van {path} van {user} is mislukt.",
+ "Ownership transfer done" : "Eigendomsoverdracht geslaagd",
+ "Your ownership transfer of {path} to {user} has completed." : "Eigendomsoverdracht van {path} naar {user} is gereed.",
+ "The ownership transfer of {path} from {user} has completed." : "Eigendomsoverdracht van {path} van {user} is gereed.",
+ "in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Overgezet van %1$s naar %2$s",
+ "Files compatibility" : "Bestandscompatibiliteit",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Toestaan om bestandsnamen te beperken om te borgen dat bestanden met alle cliënts gesynchroniseerd kunnen worden. Standaard zijn alle bestandsnamen valide die zijn toegestaan op POSIX (zoals Linux en macOS.)",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Het is ook mogelijk om bestanden automatisch te migreren nadat deze instelling is ingeschakeld. Raadpleeg de documentatie over het occ-commando.",
+ "Enforce Windows compatibility" : "Dwing Windows-compatibiliteit af",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dit zal bestandsnamen blokkeren die niet toegestaan zijn op Windows-systemen, zoals gereserveerde namen of speciale tekens. Dit dwingt niet tot compatibiliteit voor hoofd- en kleine letters.",
+ "File Management" : "Bestandsbeheer",
+ "Home" : "Thuis",
+ "Target folder does not exist any more" : "Doelmap bestaat niet meer",
+ "Reload current directory" : "Huidige map opnieuw laden",
+ "Go to the \"{dir}\" directory" : "Ga naar de \"{dir}\" map",
+ "Current directory path" : "Huidig directory pad",
+ "Your have used your space quota and cannot upload files anymore" : "Je hebt je ruimtequotum gebruikt en kan geen bestanden meer uploaden",
+ "You do not have permission to upload or create files here." : "Je hebt geen toestemming om hier bestanden te uploaden of aan te maken.",
+ "Drag and drop files here to upload" : "Drag en drop bestanden hier om te uploaden",
+ "Favorite" : "Favoriet",
+ "Back" : "Terug",
+ "Toggle selection for file \"{displayName}\"" : "Wijzig selectie voor bestand \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Wijzig selectie voor map \"{displayName}\"",
+ "File is loading" : "Bestand is aan het laden",
+ "Folder is loading" : "Map is aan het laden",
+ "Filename" : "Bestandsnaam",
+ "Folder name" : "Mapnaam",
+ "This node is unavailable" : "Deze node is niet beschikbaar",
+ "Another entry with the same name already exists." : "Er bestaat al een ander item met dezelfde naam",
+ "Invalid filename." : "Ongeldige bestandsnaam",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" hernoemd naar \"{newName}\"",
+ "Rename file" : "Bestand hernoemen",
+ "Folder" : "Map",
+ "Unknown file type" : "Onbekend bestandstype",
+ "{ext} image" : "{ext} afbeelding",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} tekst",
+ "Pending" : "In behandeling",
+ "Unknown date" : "Onbekende datum",
+ "Clear filter" : "Filter leegmaken",
+ "Modified" : "Aangepast",
+ "Search everywhere" : "Zoek in alles",
+ "Type" : "Type",
+ "Active filters" : "Actieve filters",
+ "Remove filter" : "Verwijder filter",
+ "Total rows summary" : "Aantal rijen samenvatting",
+ "Toggle selection for all files and folders" : "Wijzig selectie voor alle bestanden en mappen",
+ "Name" : "Naam",
+ "File type" : "Bestandstype",
+ "Size" : "Grootte",
+ "Actions" : "Acties",
+ "(selected)" : "(geselecteerd)",
+ "List of files and folders." : "Lijst van bestanden en mappen.",
+ "You have used your space quota and cannot upload files anymore." : "Je hebt je ruimtequotum gebruikt en kan geen bestanden meer uploaden",
+ "Column headers with buttons are sortable." : "Kolomkoppen met knoppen zijn sorteerbaar",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "De lijst is niet volledig verwerkt om de prestatie niet te beperken. De bestanden worden verder verwerkt als je door de lijst navigeert.",
+ "File not found" : "Bestand niet gevonden",
+ "_{count} selected_::_{count} selected_" : ["{count} geselecteerd","{count} geselecteerd"],
+ "Search scope options" : "Zoek bereikopties",
+ "{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
+ "{used} of {quota} used" : "{used} van {quota} gebruikt",
+ "{relative}% used" : "{relative}% gebruikt",
+ "Could not refresh storage stats" : "Kan opslagstatistieken niet vernieuwen",
+ "Your storage is full, files can not be updated or synced anymore!" : "Je opslagruimte zit vol. Bestanden kunnen niet meer worden gewijzigd of gesynchroniseerd!",
+ "Storage information" : "Opslaginformatie",
+ "Storage quota" : "Opslagquota",
+ "New folder" : "Nieuwe map",
+ "Create new folder" : "Nieuwe map aanmaken",
+ "This name is already in use." : "De naam is al in gebruik.",
+ "Create" : "Aanmaken",
+ "Files starting with a dot are hidden by default" : "Bestanden die met een punt beginnen, worden standaard verborgen",
+ "Fill template fields" : "Vul de velden van het sjabloon in",
+ "Submitting fields …" : "Velden verwerken ...",
+ "Submit" : "Verwerken",
+ "Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
+ "Transfer" : "Overdragen",
+ "Transfer {path} to {userid}" : "Draag {path} over aan {userid}",
+ "Invalid path selected" : "Ongeldig pad geselecteerd",
"Unknown error" : "Onbekende fout",
- "File could not be found" : "Bestand kon niet worden gevonden",
- "Move or copy" : "Verplaats of kopieer",
- "Download" : "Downloaden",
+ "Ownership transfer request sent" : "Aanvraag eigendomsoverdracht verstuurd",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan de eigendom van een bestand of map waarvan u niet de eigenaar bent, niet overdragen",
+ "Transfer ownership of a file or folder" : "Overdragen eigendom bestand of map ",
+ "Choose file or folder to transfer" : "Kies over te dragen bestand of map",
+ "Change" : "Pas aan",
+ "New owner" : "Nieuwe eigenaar",
+ "Keep {old}" : "Bewaar {old}",
+ "Keep without extension" : "Bewaren zonder extensie",
+ "Use {new}" : "Gebruik {new}",
+ "Remove extension" : "Verwijder extensie",
+ "Change file extension" : "Wijzig bestandsextensie",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Wijzigen van de bestandsextensie {old} naar {new} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Verwijderen van de extensie {old} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Toevoegen van de extensie {new} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Do not show this dialog again." : "Laat dit dialoogvenster niet meer zien.",
+ "Select file or folder to link to" : "Selecteer een bestand of map om naar te linken",
+ "Choose {file}" : "Kies {file}",
+ "Share" : "Delen",
+ "Shared by link" : "Gedeeld via link",
+ "Shared" : "Gedeeld",
+ "Switch to list view" : "Omschakelen naar lijstoverzicht",
+ "Switch to grid view" : "Omschakelen naar roosterweergave",
+ "The file could not be found" : "Het bestand kon niet worden gevonden",
+ "Upload was cancelled by user" : "Upload was geannuleerd door de gebruiker",
+ "Not enough free space" : "Onvoldoende vrije ruimte",
+ "Operation is blocked by access control" : "De operatie werd tegengehouden door toegangscontrole",
+ "Error during upload: {message}" : "Fout tijdens upload: {message}",
+ "Error during upload, status code {status}" : "Fout tijdens upload, status code {status}",
+ "Unknown error during upload" : "Onbekende fout tijdens upload",
+ "Loading current folder" : "Laden huidige map",
+ "Retry" : "Opnieuw",
+ "No files in here" : "Hier geen bestanden",
+ "Upload some content or sync with your devices!" : "Upload je inhoud of synchroniseer met je apparaten!",
+ "Go back" : "Ga terug",
+ "Views" : "Bekeken",
+ "Files settings" : "Instellingen voor bestanden",
+ "Your files" : "Jouw bestanden",
+ "Open in files" : "Open in bestanden",
+ "File cannot be accessed" : "Bestand kan niet worden benaderd",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Dit bestand is niet gevonden of je hebt geen machtigingen om het te bekijken. Vraag de verzender om het met je te delen.",
+ "No search results for “{query}”" : "No search results for “{query}”",
+ "Search for files" : "Zoeken naar bestanden",
+ "Clipboard is not available" : "Klembord niet beschikbaar",
+ "General" : "Algemeen",
+ "Default view" : "Standaardweergave",
+ "All files" : "Alle bestanden",
+ "Personal files" : "Persoonlijke bestanden",
+ "Sort favorites first" : "Sorteer eerst favorieten",
+ "Sort folders before files" : "Sorteer mappen voor bestanden",
+ "Folder tree" : "Mapboom",
+ "Appearance" : "Uiterlijk",
+ "Show hidden files" : "Toon verborgen bestanden",
+ "Show file type column" : "Toon bestandstypekolom",
+ "Crop image previews" : "Snij afbeeldingvoorbeelden bij",
+ "Additional settings" : "Aanvullende instellingen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopiëren",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tweefactorauthenticatie is ingeschakeld voor jouw account en daarom moet je een app-wachtwoord gebruiken om een externe WebDAV-client aan te sluiten.",
+ "Warnings" : "Waarschuwingen",
+ "Keyboard shortcuts" : "Toetsenbord sneltoetsen",
+ "File actions" : "Bestandsacties",
+ "Rename" : "Naam wijzigen",
"Delete" : "Verwijderen",
- "Home" : "Thuis",
+ "Manage tags" : "Berichttags",
+ "Selection" : "Selectie",
+ "Select all files" : "Selecteer alle bestanden",
+ "Deselect all" : "Deselecteer alles",
+ "Navigation" : "Navigatie",
+ "View" : "Bekijken",
+ "Toggle grid view" : "Omschakelen roosterweergave",
+ "Show those shortcuts" : "Toon die snelkoppelingen",
+ "You" : "Jij",
+ "Shared multiple times with different people" : "Meerdere keren gedeeld met verschillende mensen",
+ "Unable to change the favorite state of the file" : "Kan de favoriete status van het bestand niet wijzigen",
+ "Error while loading the file data" : "Fout bij het lezen van de bestandsgegevens",
+ "Owner" : "Eigenaar",
+ "Remove from favorites" : "Verwijderen uit favorieten",
+ "Add to favorites" : "Aan favorieten toevoegen",
+ "Tags" : "Tags",
+ "Blank" : "Blanco",
+ "Unable to create new file from template" : "Kan geen nieuw bestand maken vanuit het sjabloon",
+ "Pick a template for {name}" : "Kies een sjabloon voor {name}",
+ "Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
+ "Creating file" : "Maken bestand",
+ "Save as {displayName}" : "Opslaan als {displayName}",
+ "Save as …" : "Opslaan als...",
+ "Converting files …" : "Bestanden converteren ...",
+ "Failed to convert files: {message}" : "Conversie van bestanden mislukt: {message} ",
+ "All files failed to be converted" : "De conversie van alle bestanden is mislukt",
+ "One file could not be converted: {message}" : "Een bestand kon niet worden geconverteerd: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Een bestand kon niet geconverteerd worden","%n bestanden konden niet geconverteerd worden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Een bestand succesvol geconverteerd","%n bestanden succesvol geconverteerd"],
+ "Files successfully converted" : "Bestanden succesvol geconverteerd",
+ "Failed to convert files" : "Conversie van bestanden mislukt",
+ "Converting file …" : "Bestand converteren ...",
+ "File successfully converted" : "Bestand succesvol geconverteerd",
+ "Failed to convert file: {message}" : "Conversie van bestand mislukt: {message} ",
+ "Failed to convert file" : "Conversie van bestand mislukt",
+ "Leave this share" : "Verlaat deze share",
+ "Leave these shares" : "Verlaat deze shares",
+ "Disconnect storage" : "Verbinding met opslag verbreken",
+ "Disconnect storages" : "Opslaglocaties ontkoppelen",
+ "Delete permanently" : "Permanent verwijderen",
+ "Delete and unshare" : "Verwijder en stop delen",
+ "Delete file" : "Verwijder bestand",
+ "Delete files" : "Verwijder bestanden",
+ "Delete folder" : "Map verwijderen",
+ "Delete folders" : "Verwijder mappen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Je staat op het punt om {count} item permanent te verwijderen","Je staat op het punt om {count} items permanent te verwijderen"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Je staat op het punt om {count} item te verwijderen","Je staat op het punt om {count}items te verwijderen"],
+ "Confirm deletion" : "Bevestig verwijderen",
+ "Cancel" : "Annuleren",
+ "Download" : "Downloaden",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verplaatsen \"{source}\" naar \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiëren \"{source}\" naar \"{destination}\" …",
+ "Destination is not a folder" : "Bestemming is geen map",
+ "This file/folder is already in that directory" : "Dit bestand/deze map staat al in die map",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Je kan een bestand/map niet verplaatsen naar zichzelf of naar een subfolder van zichzelf.",
+ "(copy)" : "(kopieer)",
+ "(copy %n)" : "(kopieer %n)",
+ "A file or folder with that name already exists in this folder" : "Een bestand of map met dezelfde naam is al aanwezig in deze map",
+ "The files are locked" : "De bestanden zijn vergrendeld",
+ "The file does not exist anymore" : "Dit bestand bestaat niet meer",
+ "Choose destination" : "Kies bestemming",
+ "Copy to {target}" : "Kopieer naar {target}",
+ "Move to {target}" : "Verplaats naar {target}",
+ "Move" : "Verplaatsen",
+ "Move or copy operation failed" : "Verplaatsen of kopiëren mislukt",
+ "Move or copy" : "Verplaats of kopieer",
+ "Open folder {displayName}" : "Open map {displayName}",
+ "Open in Files" : "Open in Bestanden",
+ "Open locally" : "Lokaal openen",
+ "Failed to redirect to client" : "Omleiden naar cliënt mislukt",
+ "Open file locally" : "Bestand lokaal openen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Het bestand zou nu moeten openen op je apparaat. Als dat niet het geval is, controleer dan of je de desktop app geïnstalleerd hebt.",
+ "Retry and close" : "Probeer opnieuw en sluiten",
+ "Open online" : "Open online",
+ "Details" : "Details",
+ "View in folder" : "Bekijken in map",
+ "Today" : "Vandaag",
+ "Last 7 days" : "Laatste 7 dagen",
+ "Last 30 days" : "Laatste 30 dagen",
+ "This year ({year})" : "Dit jaar ({year})",
+ "Last year ({year})" : "Afgelopen jaar ({year})",
+ "Documents" : "Documenten",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentaties",
+ "PDFs" : "PDFs",
+ "Folders" : "Mappen",
+ "Audio" : "Geluid",
+ "Images" : "Afbeeldingen",
+ "Videos" : "Video's",
+ "Created new folder \"{name}\"" : "Nieuwe map \"¨{name}\" gemaakt.",
+ "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen",
+ "Create templates folder" : "Nieuwe sjablonenmap",
+ "Templates" : "Sjablonen",
+ "New template folder" : "Nieuwe sjablonenmap",
+ "In folder" : "In map",
+ "Search in all files" : "Zoeken in alle bestanden",
+ "Search in folder: {folder}" : "Zoeken in map: {folder}",
+ "One of the dropped files could not be processed" : "Een van de bestanden kon niet verwerkt worden.",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Je browser ondersteund de Filesystem API niet. Mappen worden niet geüpload",
+ "No files to upload" : "Geen bestanden om te uploaden",
+ "Unable to create the directory {directory}" : "Kan map {directory} niet maken",
+ "Some files could not be uploaded" : "Sommige bestanden konden niet worden geüpload",
+ "Files uploaded successfully" : "Bestand succesvol geüpload.",
+ "No files to process" : "Geen bestanden te verwerken",
+ "Some files could not be copied" : "Sommige bestanden konden niet gekopieerd worden",
+ "Some files could not be moved" : "Een paar bestanden konden niet worden verplaatst",
+ "Files copied successfully" : "Bestanden succesvol gekopieerd",
+ "Files moved successfully" : "Bestanden succesvol verplaatst",
+ "Conflicts resolution skipped" : "Conflictoplossing overgeslagen",
+ "Upload cancelled" : "Uploaden geannuleerd",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kon \"{oldName}\" niet hernoemen, het bestaat niet meer",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{newName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
+ "Could not rename \"{oldName}\"" : "Kon \"{oldName}\" niet hernoemen",
+ "This operation is forbidden" : "Deze taak is verboden",
+ "Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
+ "Unexpected error: {error}" : "Onverwachte fout: {error}",
+ "_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
+ "_%n folder_::_%n folders_" : ["%n map","%n mappen"],
+ "_%n hidden_::_%n hidden_" : ["%n onzichtbaar","%n onzichtbaar"],
+ "Filename must not be empty." : "Bestandsnaam mag niet leeg zijn",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\"is niet toegestaan in een bestandsnaam",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is een greserveerde naam en niet toegestaan voor bestandsnamen",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is geen toegestaan bestandstype",
+ "Filenames must not end with \"{extension}\"." : "Bestandsnamen mogen niet eindigen met \"{extension}\".",
+ "List of favorite files and folders." : "Lijst van favoriete bestanden en mappen.",
+ "No favorites yet" : "Nog geen favorieten",
+ "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die je als favoriet aanmerkt, worden hier getoond",
+ "List of your files and folders." : "Lijst van je bestanden en mappen.",
+ "List of your files and folders that are not shared." : "Lijst van je bestanden en mappen die niet gedeeld zijn.",
+ "No personal files found" : "Geen persoonlijke bestanden gevonden",
+ "Files that are not shared will show up here." : "Niet-gedeelde bestanden worden hier getoond.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "Lijst van recent gewijzigde bestanden en mappen.",
+ "No recently modified files" : "Geen recent gewijzigde bestanden",
+ "Files and folders you recently modified will show up here." : "Bestanden en mappen die je recent gewijzigd hebt, worden hier getoond.",
+ "Search" : "Zoeken",
+ "Search results within your files." : "Zoekresultaten binnen jouw bestanden.",
+ "No entries found in this folder" : "Niets gevonden in deze map",
+ "Select all" : "Alles selecteren",
+ "Upload too large" : "Upload is te groot",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die je probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
+ "File could not be found" : "Bestand kon niet worden gevonden",
+ "Show list view" : "Toon lijstweergave",
+ "Show grid view" : "Toon roosterweergave",
"Close" : "Sluiten",
- "Favorites" : "Favorieten",
"Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken",
"This will stop your current uploads." : "Dit beëindigt onderhanden uploads",
"Upload cancelled." : "Uploaden geannuleerd.",
@@ -19,44 +361,33 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. Je uploadt {size1}, maar er is slechts {size2} beschikbaar",
"Target folder \"{dir}\" does not exist any more" : "Doelmap \"{dir}\" bestaat niet meer",
- "Not enough free space" : "Onvoldoende vrije ruimte",
"An unknown error has occurred" : "Er trad een onbekende fout op.",
+ "File could not be uploaded" : "Bestand kon niet geüpload worden",
"Uploading …" : "Uploaden …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploaden … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Uploaden van dat object is niet ondersteund",
- "Target folder does not exist any more" : "Doelmap bestaat niet meer",
- "Operation is blocked by access control" : "De operatie werd tegengehouden door toegangscontrole",
"Error when assembling chunks, status code {status}" : "Fout tijdens samenvoegen van brokken, status code {status}",
- "Actions" : "Acties",
- "Rename" : "Naam wijzigen",
- "Copy" : "Kopiëren",
"Choose target folder" : "Kies doelmap…",
+ "Set reminder" : "Herinnering instellen",
+ "Edit locally" : "Lokaal bewerken",
"Open" : "Openen",
- "Delete file" : "Verwijderen bestand",
- "Delete folder" : "Verwijderen map",
- "Disconnect storage" : "Verbinding met opslag verbreken",
- "Leave this share" : "Verlaat deze gedeelde locatie",
"Could not load info for file \"{file}\"" : "Kon geen informatie laden voor bestand \"{file}\"",
- "Files" : "Bestanden",
- "Details" : "Details",
"Please select tag(s) to add to the selection" : "Selecteer alsjeblieft tag(s) om aan de selectie toe te voegen",
"Apply tag(s) to selection" : "Pas tag(s) toe voor selectie",
- "Select" : "Selecteer",
- "Pending" : "In behandeling",
+ "Select directory \"{dirName}\"" : "Kies map \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Kies bestand \"{fileName}\"",
"Unable to determine date" : "Kon datum niet vaststellen",
- "This operation is forbidden" : "Deze taak is verboden",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al",
"Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen",
"copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Kon \"{bestand}\" niet kopiëren, het doel bestaat",
+ "Could not copy \"{file}\", target exists" : "Kon \"{file}\" niet kopiëren, het doel bestaat",
"Could not copy \"{file}\"" : "Kon \"{file}\" niet kopiëren",
- "Copied {origin} inside {destination}" : "Kopieerde {oorsprong} binnen {bestemming}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Heeft {andere} en {nbfiles} andere bestanden in {destination} gekopieerd",
+ "Copied {origin} inside {destination}" : "Kopieerde {origin} binnen {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Heeft {origin} en {nbfiles} andere bestanden in {destination} gekopieerd",
"{newName} already exists" : "{newName} bestaat al",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
- "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen",
"Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken",
"Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken, omdat het al bestaat",
"Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken, omdat die al bestaat",
@@ -64,18 +395,14 @@ OC.L10N.register(
"Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Geen zoekresultaten voor {tag}{filter}{endtag} in andere mappen",
"Enter more than two characters to search in other folders" : "Voer meer dan twee tekens in om in andere mappen te zoeken",
- "Name" : "Naam",
- "Size" : "Grootte",
- "Modified" : "Aangepast",
- "_%n folder_::_%n folders_" : ["%n map","%n mappen"],
- "_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
"{dirs} and {files}" : "{dirs} en {files}",
"_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"],
- "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken",
+ "You do not have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden aan te maken",
"_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"],
"New" : "Nieuw",
+ "New file/folder menu" : "Nieuw bestand/map menu",
"Select file range" : "Kies een reeks bestanden",
- "{used} of {quota} used" : "{used} van {quota} gebruikt",
+ "{used}%" : "{used}%",
"{used} used" : "{used} gebruikt",
"\"{name}\" is an invalid file name." : "\"{name}\" is een ongeldige bestandsnaam.",
"File name cannot be empty." : "Bestandsnaam kan niet leeg zijn.",
@@ -90,131 +417,65 @@ OC.L10N.register(
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externe opslag \"{mountPoint}\" is bijna vol ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Je opslagruimte zit bijna vol ({usedSpacePercent}%)",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["komt overeen met \"{filter}\"","komen overeen met \"{filter}\""],
- "View in folder" : "Bekijken in map",
- "Copied!" : "Gekopieerd!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopieer de link direct (werkt alleen voor gebruikers met toegang tot map/bestand)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Directe link is gekopieerd (werkt alleen voor gebruikers met toegang tot map/bestand)",
"Path" : "Pad",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favoriet",
- "Favorite" : "Favoriet",
- "You can only favorite a single file or folder at a time" : "Je kunt maar één bestand of map tegelijk favoriet maken",
- "New folder" : "Nieuwe map",
+ "Favored" : "Favorieten",
+ "Favor" : "Favoriet",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopieer Directe link (werkt alleen voor gebruikers met toegang tot map/bestand)",
"Upload file" : "Bestand uploaden",
- "Recent" : "Recent",
- "Not favorited" : "Niet in favorieten",
- "Remove from favorites" : "Verwijderen uit favorieten",
- "Add to favorites" : "Aan favorieten toevoegen",
+ "Not favored" : "Geen favoriet",
"An error occurred while trying to update the tags" : "Er trad een fout op bij je poging om de tags bij te werken",
- "Added to favorites" : "Aan favorieten toegevoegd",
- "Removed from favorites" : "Uit favorieten verwijderd",
- "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
- "You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
- "File changes" : "Bestandswijzigingen",
- "Created by {user}" : "Gecreëerd door {user}",
- "Changed by {user}" : "Gewijzigd door {user}",
- "Deleted by {user}" : "Verwijderd door {user}",
- "Restored by {user}" : "Hersteld door {user}",
- "Renamed by {user}" : "Hernoemd door {user}",
- "Moved by {user}" : "Verplaatst door {user}",
- "\"remote user\"" : "\"externe gebruiker\"",
- "You created {file}" : "Je creëerde {file}",
- "You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
- "{user} created {file}" : "{user} creëerde {file}",
- "{user} created an encrypted file in {file}" : "{user} creëerde een versleuteld bestand in {file}",
- "{file} was created in a public folder" : "{file} werd gecreëerd in een openbare map",
- "You changed {file}" : "Je wijzigde {file}",
- "You changed an encrypted file in {file}" : "Je wijzigde een versleuteld bestand in {file}",
- "{user} changed {file}" : "{user} wijzigde {file}",
- "{user} changed an encrypted file in {file}" : "{user} heeft een versleuteteld bestand veranderd in {file}",
- "You deleted {file}" : "Je verwijderde {file}",
- "You deleted an encrypted file in {file}" : "Je hebt een versleuteld bestand gewist in {file}",
- "{user} deleted {file}" : "{user} verwijderde {file}",
- "{user} deleted an encrypted file in {file}" : "{user} heeft een versleuteld bestand gewist in {file}",
- "You restored {file}" : "Je herstelde {file}",
- "{user} restored {file}" : "{user} herstelde {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
- "You renamed {oldfile} (hidden) to {newfile}" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Je hernoemde {oldfile} naar {newfile} (verborgen)",
- "You renamed {oldfile} to {newfile}" : "Je hernoemde {oldfile} naar {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} hernoemde {oldfile} (verborgen) naar {newfile} (verborgen)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} hernoemde {oldfile} (verborgen) naar {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} hernoemde {oldfile} naar {newfile} (verborgen)",
- "{user} renamed {oldfile} to {newfile}" : "{user} hernoemde {oldfile} naar {newfile}",
- "You moved {oldfile} to {newfile}" : "Je verplaatste {oldfile} naar {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} verplaatste {oldfile} naar {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Een bestand werd toegevoegd of verwijderd van je <strong>favorieten</strong>",
- "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Een favoriet bestand of map is <strong>gewijzigd</strong>",
- "All files" : "Alle bestanden",
- "Unlimited" : "Ongelimiteerd",
"Upload (max. %s)" : "Upload (max. %s)",
- "Accept" : "Accepteren",
- "Reject" : "Afwijzen",
- "Incoming ownership transfer from {user}" : "Inkomend verzoek om eigenaarsoverdracht van {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Wil je {path} accepteren? \n\nOpmerking: het overdrachtsproces na acceptatie kan tot 1 uur duren.",
- "Ownership transfer failed" : "Eigenaarschap overdracht mislukt",
- "Your ownership transfer of {path} to {user} failed." : "Eigenaarsoverdracht van {path} naar {user} is mislukt.",
- "The ownership transfer of {path} from {user} failed." : "Eigenaarsoverdracht van {path} van {user} is mislukt.",
- "Ownership transfer done" : "Eigenaarschap overdracht geslaagd",
- "Your ownership transfer of {path} to {user} has completed." : "Eigenaarsoverdracht van {path} naar {user} is gereed.",
- "The ownership transfer of {path} from {user} has completed." : "Eigenaarsoverdracht van {path} van {user} is gereed.",
- "in %s" : "in %s",
- "File Management" : "Bestandsbeheer",
- "Transfer ownership of a file or folder" : "Overdragen eigenaarschap bestand of map ",
- "Choose file or folder to transfer" : "Kies over te dragen bestand of map",
- "Change" : "Pas aan",
- "New owner" : "Nieuwe eigenaar",
- "Search users" : "Gebruikers zoeken",
- "Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
- "Transfer" : "Transfer",
- "Transfer {path} to {userid}" : "Draag {path} over aan {userid}",
- "Invalid path selected" : "Ongeldig pad geselecteerd",
- "Ownership transfer request sent" : "Aanvraag eigenaarsoverdracht verstuurd",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan het eigenaarschap van een bestand of map waarvan u niet de eigenaar bent, niet overdragen",
- "Tags" : "Tags",
- "Unable to change the favourite state of the file" : "Niet mogelijk om favoriet status van het bestand te wijzigen",
- "Error while loading the file data" : "Fout bij het lezen van de bestandsgegevens",
- "Pick a template for {name}" : "Kies een sjabloon voor {name}",
- "Cancel" : "Annuleren",
- "Create" : "Aanmaken",
- "Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
- "Creating file" : "Maken bestand",
- "Blank" : "Blanco",
- "Unable to create new file from template" : "Kan geen nieuw bestand maken vanuit het sjabloon",
- "Set up templates folder" : "Instellen sjablonenmap",
- "Templates" : "Sjablonen",
- "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen",
- "%s used" : "%s gebruikt",
- "%s%% of %s used" : "%s%% van %s gebruikt",
- "%1$s of %2$s used" : "%1$s van %2$s gebruikt",
- "Settings" : "Instellingen",
- "Show hidden files" : "Verborgen bestanden tonen",
- "Crop image previews" : "Bijsnijden afbeeldingvoorbeeld:",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" actie succesvol uitgevoerd",
+ "\"{displayName}\" action failed" : "\"{displayName}\" actie mislukt",
+ "\"{displayName}\" failed on some elements" : "“{displayName}” mislukt op sommige elementen",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batchactie succesvol uitgevoerd",
+ "Submitting fields…" : "Verzenden velden ...",
+ "Filter filenames…" : "Filter bestandsnamen...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL naar klembord gekopieerd",
+ "Enable the grid view" : "Roosterweergave inschakelen",
+ "Enable folder tree" : "Mappenboom inschakelen",
+ "Copy to clipboard" : "Kopiëren naar het klembord",
"Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
- "Toggle %1$s sublist" : "Omschakelen%1$s sublijsten",
- "Toggle grid view" : "Omschakelen roosterweergave",
- "No files in here" : "Hier geen bestanden",
- "Upload some content or sync with your devices!" : "Upload je inhoud of synchroniseer met je apparaten!",
- "No entries found in this folder" : "Niets gevonden in deze map",
- "Select all" : "Alles selecteren",
- "Upload too large" : "Upload is te groot",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die je probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
- "No favorites yet" : "Nog geen favorieten",
- "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die je als favoriet aanmerkt, worden hier getoond",
- "Deleted files" : "Verwijderde bestanden",
- "Shares" : "Shares",
- "Shared with others" : "Gedeeld met anderen",
- "Shared with you" : "Gedeeld met jou",
- "Shared by link" : "Gedeeld via link",
- "Deleted shares" : "Verwijderde shares",
- "Pending shares" : "Deellinks in behandeling",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
+ "Deletion cancelled" : "Verwijderen geannulleerd",
+ "Move cancelled" : "Verplaatsen geannuleerd",
+ "Cancelled move or copy of \"{filename}\"." : "Verplaatsen of kopiëren van \"¨{filename}\" geannuleerd.",
+ "Cancelled move or copy operation" : "Verplaatsen of kopiëren geannuleerd.",
+ "Open details" : "Details openen",
+ "Photos and images" : "Foto's en afbeeldingen",
+ "New folder creation cancelled" : "Maken van nieuwe map geannuleerd",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} map","{folderCount} mappen"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} bestand","{fileCount} bestanden"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 bestand en {folderCount} map","1 bestand en {folderCount} mappen"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} bestand en 1 map","{fileCount} bestanden en 1 map"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} bestanden en {folderCount} mappen",
+ "All folders" : "Alle mappen",
+ "Personal Files" : "Persoonlijke bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Opslagruimte van {owner} zit vol, bestanden kunnen niet meer worden geüpload of gesynchroniseerd!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Groepsmap \"{mountPoint}\" is vol, bestanden kunnen niet meer gewijzigd of gesynchroniseerd worden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externe opslag \"{mountPoint}\" is vol, bestanden kunnen niet meer gewijzigd of gesynchroniseerd worden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Je opslagruimte zit vol. Bestanden kunnen niet meer worden gewijzigd of gesynchroniseerd!",
- "_matches '{filter}'_::_match '{filter}'_" : ["komt overeen met '{filter}'","komen overeen met '{filter}'"]
+ "%1$s (renamed)" : "%1$s (hernoemd)",
+ "renamed file" : "bestand hernoemd",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
+ "Filter file names …" : "Bestandsnamen filteren ...",
+ "Prevent warning dialogs from open or reenable them." : "Voorkom dat waarschuwingsvensters worden geopend of schakel ze opnieuw in.",
+ "Show a warning dialog when changing a file extension." : "Een waarschuwingsvenster tonen bij het wijzigen van een bestandsextensie.",
+ "Speed up your Files experience with these quick shortcuts." : "Verbeter je interactie met bestanden met deze snelkoppelingen.",
+ "Open the actions menu for a file" : "Open het actiemenu voor een bestand",
+ "Rename a file" : "Een bestand hernoemen",
+ "Delete a file" : "Een bestand verwijderen",
+ "Favorite or remove a file from favorites" : "Favoriet maken of een bestand verwijderen uit favorieten",
+ "Manage tags for a file" : "Tags voor een bestand beheren",
+ "Deselect all files" : "Selectie van bestanden ongedaan maken",
+ "Select or deselect a file" : "Een bestand selecteren of deselecteren",
+ "Select a range of files" : "Selecteer een reeks bestanden",
+ "Navigate to the parent folder" : "Navigeer naar de bovenliggende map",
+ "Navigate to the file above" : "Navigeer naar bovenliggend bestand",
+ "Navigate to the file below" : "Navigeer naar onderliggend bestand",
+ "Navigate to the file on the left (in grid mode)" : "Navigeer naar het bestand aan de linkerkant (in rastermodus)",
+ "Navigate to the file on the right (in grid mode)" : "Navigeer naar het bestand aan de rechterkant (in rastermodus)",
+ "Toggle the grid view" : "Rasterweergave omschakelen",
+ "Open the sidebar for a file" : "Open de zijbalk voor een bestand"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index f7a73e2f1d0..7eab1b33b91 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -1,14 +1,356 @@
{ "translations": {
- "Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
- "Storage invalid" : "Opslag ongeldig",
+ "Added to favorites" : "Aan favorieten toegevoegd",
+ "Removed from favorites" : "Uit favorieten verwijderd",
+ "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
+ "You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
+ "Favorites" : "Favorieten",
+ "File changes" : "Bestandswijzigingen",
+ "Created by {user}" : "Gecreëerd door {user}",
+ "Changed by {user}" : "Gewijzigd door {user}",
+ "Deleted by {user}" : "Verwijderd door {user}",
+ "Restored by {user}" : "Hersteld door {user}",
+ "Renamed by {user}" : "Hernoemd door {user}",
+ "Moved by {user}" : "Verplaatst door {user}",
+ "\"remote account\"" : "\"remote account\"",
+ "You created {file}" : "Je creëerde {file}",
+ "You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
+ "{user} created {file}" : "{user} creëerde {file}",
+ "{user} created an encrypted file in {file}" : "{user} creëerde een versleuteld bestand in {file}",
+ "{file} was created in a public folder" : "{file} werd gecreëerd in een openbare map",
+ "You changed {file}" : "Je wijzigde {file}",
+ "You changed an encrypted file in {file}" : "Je wijzigde een versleuteld bestand in {file}",
+ "{user} changed {file}" : "{user} wijzigde {file}",
+ "{user} changed an encrypted file in {file}" : "{user} heeft een versleuteteld bestand veranderd in {file}",
+ "You deleted {file}" : "Je verwijderde {file}",
+ "You deleted an encrypted file in {file}" : "Je hebt een versleuteld bestand gewist in {file}",
+ "{user} deleted {file}" : "{user} verwijderde {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} heeft een versleuteld bestand gewist in {file}",
+ "You restored {file}" : "Je herstelde {file}",
+ "{user} restored {file}" : "{user} herstelde {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Je hernoemde {oldfile} (verborgen) naar {newfile}(verborgen)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Je hernoemde {oldfile} naar {newfile} (verborgen)",
+ "You renamed {oldfile} to {newfile}" : "Je hernoemde {oldfile} naar {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} hernoemde {oldfile} (verborgen) naar {newfile} (verborgen)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} hernoemde {oldfile} (verborgen) naar {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} hernoemde {oldfile} naar {newfile} (verborgen)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} hernoemde {oldfile} naar {newfile}",
+ "You moved {oldfile} to {newfile}" : "Je verplaatste {oldfile} naar {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} verplaatste {oldfile} naar {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Een bestand werd toegevoegd of verwijderd van je <strong>favorieten</strong>",
+ "Files" : "Bestanden",
+ "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Een favoriet bestand of map is <strong>gewijzigd</strong>",
+ "Failed to authorize" : "Kon niet autoriseren",
+ "Invalid folder path" : "Ongeldig pad",
+ "Folder not found" : "Map niet gevonden",
+ "The file cannot be found" : "Het bestand kan niet worden gevonden",
+ "The destination path does not exist: %1$s" : "Het bestemmingspad bestaat niet: %1$s",
+ "You do not have permission to create a file at the specified location" : "Je hebt geen toestemming om een bestand aan te maken op de opgegeven locatie",
+ "The file could not be converted." : "Het bestand kon niet worden geconverteerd.",
+ "Could not get relative path to converted file" : "Kon geen relatief pad naar geconverteerd bestand achterhalen",
+ "Favorite files" : "Favoriete bestanden",
+ "No favorites" : "Geen favorieten",
+ "More favorites" : "Meer favorieten",
+ "Accept" : "Accepteren",
+ "Reject" : "Afwijzen",
+ "Incoming ownership transfer from {user}" : "Inkomend verzoek voor eigendomsoverdracht van {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Wil je {path} aanvaarden? \n\nOpmerking: het overdrachtsproces kan na acceptatie tot 1 uur duren.",
+ "Ownership transfer denied" : "Eigendomsoverdracht geweigerd",
+ "Your ownership transfer of {path} was denied by {user}." : "Eigendomsoverdracht van {path} is geweigerd door {user}.",
+ "Ownership transfer failed" : "Eigendomsoverdracht mislukt",
+ "Your ownership transfer of {path} to {user} failed." : "Eigendomsoverdracht van {path} naar {user} is mislukt.",
+ "The ownership transfer of {path} from {user} failed." : "Eigendomsoverdracht van {path} van {user} is mislukt.",
+ "Ownership transfer done" : "Eigendomsoverdracht geslaagd",
+ "Your ownership transfer of {path} to {user} has completed." : "Eigendomsoverdracht van {path} naar {user} is gereed.",
+ "The ownership transfer of {path} from {user} has completed." : "Eigendomsoverdracht van {path} van {user} is gereed.",
+ "in %s" : "in %s",
+ "Transferred from %1$s on %2$s" : "Overgezet van %1$s naar %2$s",
+ "Files compatibility" : "Bestandscompatibiliteit",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Toestaan om bestandsnamen te beperken om te borgen dat bestanden met alle cliënts gesynchroniseerd kunnen worden. Standaard zijn alle bestandsnamen valide die zijn toegestaan op POSIX (zoals Linux en macOS.)",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Het is ook mogelijk om bestanden automatisch te migreren nadat deze instelling is ingeschakeld. Raadpleeg de documentatie over het occ-commando.",
+ "Enforce Windows compatibility" : "Dwing Windows-compatibiliteit af",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dit zal bestandsnamen blokkeren die niet toegestaan zijn op Windows-systemen, zoals gereserveerde namen of speciale tekens. Dit dwingt niet tot compatibiliteit voor hoofd- en kleine letters.",
+ "File Management" : "Bestandsbeheer",
+ "Home" : "Thuis",
+ "Target folder does not exist any more" : "Doelmap bestaat niet meer",
+ "Reload current directory" : "Huidige map opnieuw laden",
+ "Go to the \"{dir}\" directory" : "Ga naar de \"{dir}\" map",
+ "Current directory path" : "Huidig directory pad",
+ "Your have used your space quota and cannot upload files anymore" : "Je hebt je ruimtequotum gebruikt en kan geen bestanden meer uploaden",
+ "You do not have permission to upload or create files here." : "Je hebt geen toestemming om hier bestanden te uploaden of aan te maken.",
+ "Drag and drop files here to upload" : "Drag en drop bestanden hier om te uploaden",
+ "Favorite" : "Favoriet",
+ "Back" : "Terug",
+ "Toggle selection for file \"{displayName}\"" : "Wijzig selectie voor bestand \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Wijzig selectie voor map \"{displayName}\"",
+ "File is loading" : "Bestand is aan het laden",
+ "Folder is loading" : "Map is aan het laden",
+ "Filename" : "Bestandsnaam",
+ "Folder name" : "Mapnaam",
+ "This node is unavailable" : "Deze node is niet beschikbaar",
+ "Another entry with the same name already exists." : "Er bestaat al een ander item met dezelfde naam",
+ "Invalid filename." : "Ongeldige bestandsnaam",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" hernoemd naar \"{newName}\"",
+ "Rename file" : "Bestand hernoemen",
+ "Folder" : "Map",
+ "Unknown file type" : "Onbekend bestandstype",
+ "{ext} image" : "{ext} afbeelding",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} audio",
+ "{ext} text" : "{ext} tekst",
+ "Pending" : "In behandeling",
+ "Unknown date" : "Onbekende datum",
+ "Clear filter" : "Filter leegmaken",
+ "Modified" : "Aangepast",
+ "Search everywhere" : "Zoek in alles",
+ "Type" : "Type",
+ "Active filters" : "Actieve filters",
+ "Remove filter" : "Verwijder filter",
+ "Total rows summary" : "Aantal rijen samenvatting",
+ "Toggle selection for all files and folders" : "Wijzig selectie voor alle bestanden en mappen",
+ "Name" : "Naam",
+ "File type" : "Bestandstype",
+ "Size" : "Grootte",
+ "Actions" : "Acties",
+ "(selected)" : "(geselecteerd)",
+ "List of files and folders." : "Lijst van bestanden en mappen.",
+ "You have used your space quota and cannot upload files anymore." : "Je hebt je ruimtequotum gebruikt en kan geen bestanden meer uploaden",
+ "Column headers with buttons are sortable." : "Kolomkoppen met knoppen zijn sorteerbaar",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "De lijst is niet volledig verwerkt om de prestatie niet te beperken. De bestanden worden verder verwerkt als je door de lijst navigeert.",
+ "File not found" : "Bestand niet gevonden",
+ "_{count} selected_::_{count} selected_" : ["{count} geselecteerd","{count} geselecteerd"],
+ "Search scope options" : "Zoek bereikopties",
+ "{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
+ "{used} of {quota} used" : "{used} van {quota} gebruikt",
+ "{relative}% used" : "{relative}% gebruikt",
+ "Could not refresh storage stats" : "Kan opslagstatistieken niet vernieuwen",
+ "Your storage is full, files can not be updated or synced anymore!" : "Je opslagruimte zit vol. Bestanden kunnen niet meer worden gewijzigd of gesynchroniseerd!",
+ "Storage information" : "Opslaginformatie",
+ "Storage quota" : "Opslagquota",
+ "New folder" : "Nieuwe map",
+ "Create new folder" : "Nieuwe map aanmaken",
+ "This name is already in use." : "De naam is al in gebruik.",
+ "Create" : "Aanmaken",
+ "Files starting with a dot are hidden by default" : "Bestanden die met een punt beginnen, worden standaard verborgen",
+ "Fill template fields" : "Vul de velden van het sjabloon in",
+ "Submitting fields …" : "Velden verwerken ...",
+ "Submit" : "Verwerken",
+ "Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
+ "Transfer" : "Overdragen",
+ "Transfer {path} to {userid}" : "Draag {path} over aan {userid}",
+ "Invalid path selected" : "Ongeldig pad geselecteerd",
"Unknown error" : "Onbekende fout",
- "File could not be found" : "Bestand kon niet worden gevonden",
- "Move or copy" : "Verplaats of kopieer",
- "Download" : "Downloaden",
+ "Ownership transfer request sent" : "Aanvraag eigendomsoverdracht verstuurd",
+ "Cannot transfer ownership of a file or folder you do not own" : "Kan de eigendom van een bestand of map waarvan u niet de eigenaar bent, niet overdragen",
+ "Transfer ownership of a file or folder" : "Overdragen eigendom bestand of map ",
+ "Choose file or folder to transfer" : "Kies over te dragen bestand of map",
+ "Change" : "Pas aan",
+ "New owner" : "Nieuwe eigenaar",
+ "Keep {old}" : "Bewaar {old}",
+ "Keep without extension" : "Bewaren zonder extensie",
+ "Use {new}" : "Gebruik {new}",
+ "Remove extension" : "Verwijder extensie",
+ "Change file extension" : "Wijzig bestandsextensie",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Wijzigen van de bestandsextensie {old} naar {new} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Verwijderen van de extensie {old} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Toevoegen van de extensie {new} kan ervoor zorgen dat het bestand niet meer gelezen kan worden.",
+ "Do not show this dialog again." : "Laat dit dialoogvenster niet meer zien.",
+ "Select file or folder to link to" : "Selecteer een bestand of map om naar te linken",
+ "Choose {file}" : "Kies {file}",
+ "Share" : "Delen",
+ "Shared by link" : "Gedeeld via link",
+ "Shared" : "Gedeeld",
+ "Switch to list view" : "Omschakelen naar lijstoverzicht",
+ "Switch to grid view" : "Omschakelen naar roosterweergave",
+ "The file could not be found" : "Het bestand kon niet worden gevonden",
+ "Upload was cancelled by user" : "Upload was geannuleerd door de gebruiker",
+ "Not enough free space" : "Onvoldoende vrije ruimte",
+ "Operation is blocked by access control" : "De operatie werd tegengehouden door toegangscontrole",
+ "Error during upload: {message}" : "Fout tijdens upload: {message}",
+ "Error during upload, status code {status}" : "Fout tijdens upload, status code {status}",
+ "Unknown error during upload" : "Onbekende fout tijdens upload",
+ "Loading current folder" : "Laden huidige map",
+ "Retry" : "Opnieuw",
+ "No files in here" : "Hier geen bestanden",
+ "Upload some content or sync with your devices!" : "Upload je inhoud of synchroniseer met je apparaten!",
+ "Go back" : "Ga terug",
+ "Views" : "Bekeken",
+ "Files settings" : "Instellingen voor bestanden",
+ "Your files" : "Jouw bestanden",
+ "Open in files" : "Open in bestanden",
+ "File cannot be accessed" : "Bestand kan niet worden benaderd",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Dit bestand is niet gevonden of je hebt geen machtigingen om het te bekijken. Vraag de verzender om het met je te delen.",
+ "No search results for “{query}”" : "No search results for “{query}”",
+ "Search for files" : "Zoeken naar bestanden",
+ "Clipboard is not available" : "Klembord niet beschikbaar",
+ "General" : "Algemeen",
+ "Default view" : "Standaardweergave",
+ "All files" : "Alle bestanden",
+ "Personal files" : "Persoonlijke bestanden",
+ "Sort favorites first" : "Sorteer eerst favorieten",
+ "Sort folders before files" : "Sorteer mappen voor bestanden",
+ "Folder tree" : "Mapboom",
+ "Appearance" : "Uiterlijk",
+ "Show hidden files" : "Toon verborgen bestanden",
+ "Show file type column" : "Toon bestandstypekolom",
+ "Crop image previews" : "Snij afbeeldingvoorbeelden bij",
+ "Additional settings" : "Aanvullende instellingen",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopiëren",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tweefactorauthenticatie is ingeschakeld voor jouw account en daarom moet je een app-wachtwoord gebruiken om een externe WebDAV-client aan te sluiten.",
+ "Warnings" : "Waarschuwingen",
+ "Keyboard shortcuts" : "Toetsenbord sneltoetsen",
+ "File actions" : "Bestandsacties",
+ "Rename" : "Naam wijzigen",
"Delete" : "Verwijderen",
- "Home" : "Thuis",
+ "Manage tags" : "Berichttags",
+ "Selection" : "Selectie",
+ "Select all files" : "Selecteer alle bestanden",
+ "Deselect all" : "Deselecteer alles",
+ "Navigation" : "Navigatie",
+ "View" : "Bekijken",
+ "Toggle grid view" : "Omschakelen roosterweergave",
+ "Show those shortcuts" : "Toon die snelkoppelingen",
+ "You" : "Jij",
+ "Shared multiple times with different people" : "Meerdere keren gedeeld met verschillende mensen",
+ "Unable to change the favorite state of the file" : "Kan de favoriete status van het bestand niet wijzigen",
+ "Error while loading the file data" : "Fout bij het lezen van de bestandsgegevens",
+ "Owner" : "Eigenaar",
+ "Remove from favorites" : "Verwijderen uit favorieten",
+ "Add to favorites" : "Aan favorieten toevoegen",
+ "Tags" : "Tags",
+ "Blank" : "Blanco",
+ "Unable to create new file from template" : "Kan geen nieuw bestand maken vanuit het sjabloon",
+ "Pick a template for {name}" : "Kies een sjabloon voor {name}",
+ "Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
+ "Creating file" : "Maken bestand",
+ "Save as {displayName}" : "Opslaan als {displayName}",
+ "Save as …" : "Opslaan als...",
+ "Converting files …" : "Bestanden converteren ...",
+ "Failed to convert files: {message}" : "Conversie van bestanden mislukt: {message} ",
+ "All files failed to be converted" : "De conversie van alle bestanden is mislukt",
+ "One file could not be converted: {message}" : "Een bestand kon niet worden geconverteerd: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Een bestand kon niet geconverteerd worden","%n bestanden konden niet geconverteerd worden"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Een bestand succesvol geconverteerd","%n bestanden succesvol geconverteerd"],
+ "Files successfully converted" : "Bestanden succesvol geconverteerd",
+ "Failed to convert files" : "Conversie van bestanden mislukt",
+ "Converting file …" : "Bestand converteren ...",
+ "File successfully converted" : "Bestand succesvol geconverteerd",
+ "Failed to convert file: {message}" : "Conversie van bestand mislukt: {message} ",
+ "Failed to convert file" : "Conversie van bestand mislukt",
+ "Leave this share" : "Verlaat deze share",
+ "Leave these shares" : "Verlaat deze shares",
+ "Disconnect storage" : "Verbinding met opslag verbreken",
+ "Disconnect storages" : "Opslaglocaties ontkoppelen",
+ "Delete permanently" : "Permanent verwijderen",
+ "Delete and unshare" : "Verwijder en stop delen",
+ "Delete file" : "Verwijder bestand",
+ "Delete files" : "Verwijder bestanden",
+ "Delete folder" : "Map verwijderen",
+ "Delete folders" : "Verwijder mappen",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Je staat op het punt om {count} item permanent te verwijderen","Je staat op het punt om {count} items permanent te verwijderen"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Je staat op het punt om {count} item te verwijderen","Je staat op het punt om {count}items te verwijderen"],
+ "Confirm deletion" : "Bevestig verwijderen",
+ "Cancel" : "Annuleren",
+ "Download" : "Downloaden",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verplaatsen \"{source}\" naar \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiëren \"{source}\" naar \"{destination}\" …",
+ "Destination is not a folder" : "Bestemming is geen map",
+ "This file/folder is already in that directory" : "Dit bestand/deze map staat al in die map",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Je kan een bestand/map niet verplaatsen naar zichzelf of naar een subfolder van zichzelf.",
+ "(copy)" : "(kopieer)",
+ "(copy %n)" : "(kopieer %n)",
+ "A file or folder with that name already exists in this folder" : "Een bestand of map met dezelfde naam is al aanwezig in deze map",
+ "The files are locked" : "De bestanden zijn vergrendeld",
+ "The file does not exist anymore" : "Dit bestand bestaat niet meer",
+ "Choose destination" : "Kies bestemming",
+ "Copy to {target}" : "Kopieer naar {target}",
+ "Move to {target}" : "Verplaats naar {target}",
+ "Move" : "Verplaatsen",
+ "Move or copy operation failed" : "Verplaatsen of kopiëren mislukt",
+ "Move or copy" : "Verplaats of kopieer",
+ "Open folder {displayName}" : "Open map {displayName}",
+ "Open in Files" : "Open in Bestanden",
+ "Open locally" : "Lokaal openen",
+ "Failed to redirect to client" : "Omleiden naar cliënt mislukt",
+ "Open file locally" : "Bestand lokaal openen",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Het bestand zou nu moeten openen op je apparaat. Als dat niet het geval is, controleer dan of je de desktop app geïnstalleerd hebt.",
+ "Retry and close" : "Probeer opnieuw en sluiten",
+ "Open online" : "Open online",
+ "Details" : "Details",
+ "View in folder" : "Bekijken in map",
+ "Today" : "Vandaag",
+ "Last 7 days" : "Laatste 7 dagen",
+ "Last 30 days" : "Laatste 30 dagen",
+ "This year ({year})" : "Dit jaar ({year})",
+ "Last year ({year})" : "Afgelopen jaar ({year})",
+ "Documents" : "Documenten",
+ "Spreadsheets" : "Spreadsheets",
+ "Presentations" : "Presentaties",
+ "PDFs" : "PDFs",
+ "Folders" : "Mappen",
+ "Audio" : "Geluid",
+ "Images" : "Afbeeldingen",
+ "Videos" : "Video's",
+ "Created new folder \"{name}\"" : "Nieuwe map \"¨{name}\" gemaakt.",
+ "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen",
+ "Create templates folder" : "Nieuwe sjablonenmap",
+ "Templates" : "Sjablonen",
+ "New template folder" : "Nieuwe sjablonenmap",
+ "In folder" : "In map",
+ "Search in all files" : "Zoeken in alle bestanden",
+ "Search in folder: {folder}" : "Zoeken in map: {folder}",
+ "One of the dropped files could not be processed" : "Een van de bestanden kon niet verwerkt worden.",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Je browser ondersteund de Filesystem API niet. Mappen worden niet geüpload",
+ "No files to upload" : "Geen bestanden om te uploaden",
+ "Unable to create the directory {directory}" : "Kan map {directory} niet maken",
+ "Some files could not be uploaded" : "Sommige bestanden konden niet worden geüpload",
+ "Files uploaded successfully" : "Bestand succesvol geüpload.",
+ "No files to process" : "Geen bestanden te verwerken",
+ "Some files could not be copied" : "Sommige bestanden konden niet gekopieerd worden",
+ "Some files could not be moved" : "Een paar bestanden konden niet worden verplaatst",
+ "Files copied successfully" : "Bestanden succesvol gekopieerd",
+ "Files moved successfully" : "Bestanden succesvol verplaatst",
+ "Conflicts resolution skipped" : "Conflictoplossing overgeslagen",
+ "Upload cancelled" : "Uploaden geannuleerd",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kon \"{oldName}\" niet hernoemen, het bestaat niet meer",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{newName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
+ "Could not rename \"{oldName}\"" : "Kon \"{oldName}\" niet hernoemen",
+ "This operation is forbidden" : "Deze taak is verboden",
+ "Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
+ "Unexpected error: {error}" : "Onverwachte fout: {error}",
+ "_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
+ "_%n folder_::_%n folders_" : ["%n map","%n mappen"],
+ "_%n hidden_::_%n hidden_" : ["%n onzichtbaar","%n onzichtbaar"],
+ "Filename must not be empty." : "Bestandsnaam mag niet leeg zijn",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\"is niet toegestaan in een bestandsnaam",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is een greserveerde naam en niet toegestaan voor bestandsnamen",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is geen toegestaan bestandstype",
+ "Filenames must not end with \"{extension}\"." : "Bestandsnamen mogen niet eindigen met \"{extension}\".",
+ "List of favorite files and folders." : "Lijst van favoriete bestanden en mappen.",
+ "No favorites yet" : "Nog geen favorieten",
+ "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die je als favoriet aanmerkt, worden hier getoond",
+ "List of your files and folders." : "Lijst van je bestanden en mappen.",
+ "List of your files and folders that are not shared." : "Lijst van je bestanden en mappen die niet gedeeld zijn.",
+ "No personal files found" : "Geen persoonlijke bestanden gevonden",
+ "Files that are not shared will show up here." : "Niet-gedeelde bestanden worden hier getoond.",
+ "Recent" : "Recent",
+ "List of recently modified files and folders." : "Lijst van recent gewijzigde bestanden en mappen.",
+ "No recently modified files" : "Geen recent gewijzigde bestanden",
+ "Files and folders you recently modified will show up here." : "Bestanden en mappen die je recent gewijzigd hebt, worden hier getoond.",
+ "Search" : "Zoeken",
+ "Search results within your files." : "Zoekresultaten binnen jouw bestanden.",
+ "No entries found in this folder" : "Niets gevonden in deze map",
+ "Select all" : "Alles selecteren",
+ "Upload too large" : "Upload is te groot",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die je probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
+ "File could not be found" : "Bestand kon niet worden gevonden",
+ "Show list view" : "Toon lijstweergave",
+ "Show grid view" : "Toon roosterweergave",
"Close" : "Sluiten",
- "Favorites" : "Favorieten",
"Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken",
"This will stop your current uploads." : "Dit beëindigt onderhanden uploads",
"Upload cancelled." : "Uploaden geannuleerd.",
@@ -17,44 +359,33 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. Je uploadt {size1}, maar er is slechts {size2} beschikbaar",
"Target folder \"{dir}\" does not exist any more" : "Doelmap \"{dir}\" bestaat niet meer",
- "Not enough free space" : "Onvoldoende vrije ruimte",
"An unknown error has occurred" : "Er trad een onbekende fout op.",
+ "File could not be uploaded" : "Bestand kon niet geüpload worden",
"Uploading …" : "Uploaden …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Uploaden … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Uploaden van dat object is niet ondersteund",
- "Target folder does not exist any more" : "Doelmap bestaat niet meer",
- "Operation is blocked by access control" : "De operatie werd tegengehouden door toegangscontrole",
"Error when assembling chunks, status code {status}" : "Fout tijdens samenvoegen van brokken, status code {status}",
- "Actions" : "Acties",
- "Rename" : "Naam wijzigen",
- "Copy" : "Kopiëren",
"Choose target folder" : "Kies doelmap…",
+ "Set reminder" : "Herinnering instellen",
+ "Edit locally" : "Lokaal bewerken",
"Open" : "Openen",
- "Delete file" : "Verwijderen bestand",
- "Delete folder" : "Verwijderen map",
- "Disconnect storage" : "Verbinding met opslag verbreken",
- "Leave this share" : "Verlaat deze gedeelde locatie",
"Could not load info for file \"{file}\"" : "Kon geen informatie laden voor bestand \"{file}\"",
- "Files" : "Bestanden",
- "Details" : "Details",
"Please select tag(s) to add to the selection" : "Selecteer alsjeblieft tag(s) om aan de selectie toe te voegen",
"Apply tag(s) to selection" : "Pas tag(s) toe voor selectie",
- "Select" : "Selecteer",
- "Pending" : "In behandeling",
+ "Select directory \"{dirName}\"" : "Kies map \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Kies bestand \"{fileName}\"",
"Unable to determine date" : "Kon datum niet vaststellen",
- "This operation is forbidden" : "Deze taak is verboden",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al",
"Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen",
"copy" : "kopie",
- "Could not copy \"{file}\", target exists" : "Kon \"{bestand}\" niet kopiëren, het doel bestaat",
+ "Could not copy \"{file}\", target exists" : "Kon \"{file}\" niet kopiëren, het doel bestaat",
"Could not copy \"{file}\"" : "Kon \"{file}\" niet kopiëren",
- "Copied {origin} inside {destination}" : "Kopieerde {oorsprong} binnen {bestemming}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Heeft {andere} en {nbfiles} andere bestanden in {destination} gekopieerd",
+ "Copied {origin} inside {destination}" : "Kopieerde {origin} binnen {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Heeft {origin} en {nbfiles} andere bestanden in {destination} gekopieerd",
"{newName} already exists" : "{newName} bestaat al",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
- "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen",
"Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken",
"Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken, omdat het al bestaat",
"Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken, omdat die al bestaat",
@@ -62,18 +393,14 @@
"Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Geen zoekresultaten voor {tag}{filter}{endtag} in andere mappen",
"Enter more than two characters to search in other folders" : "Voer meer dan twee tekens in om in andere mappen te zoeken",
- "Name" : "Naam",
- "Size" : "Grootte",
- "Modified" : "Aangepast",
- "_%n folder_::_%n folders_" : ["%n map","%n mappen"],
- "_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
"{dirs} and {files}" : "{dirs} en {files}",
"_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"],
- "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken",
+ "You do not have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden aan te maken",
"_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"],
"New" : "Nieuw",
+ "New file/folder menu" : "Nieuw bestand/map menu",
"Select file range" : "Kies een reeks bestanden",
- "{used} of {quota} used" : "{used} van {quota} gebruikt",
+ "{used}%" : "{used}%",
"{used} used" : "{used} gebruikt",
"\"{name}\" is an invalid file name." : "\"{name}\" is een ongeldige bestandsnaam.",
"File name cannot be empty." : "Bestandsnaam kan niet leeg zijn.",
@@ -88,131 +415,65 @@
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externe opslag \"{mountPoint}\" is bijna vol ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Je opslagruimte zit bijna vol ({usedSpacePercent}%)",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["komt overeen met \"{filter}\"","komen overeen met \"{filter}\""],
- "View in folder" : "Bekijken in map",
- "Copied!" : "Gekopieerd!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopieer de link direct (werkt alleen voor gebruikers met toegang tot map/bestand)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Directe link is gekopieerd (werkt alleen voor gebruikers met toegang tot map/bestand)",
"Path" : "Pad",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favoriet",
- "Favorite" : "Favoriet",
- "You can only favorite a single file or folder at a time" : "Je kunt maar één bestand of map tegelijk favoriet maken",
- "New folder" : "Nieuwe map",
+ "Favored" : "Favorieten",
+ "Favor" : "Favoriet",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopieer Directe link (werkt alleen voor gebruikers met toegang tot map/bestand)",
"Upload file" : "Bestand uploaden",
- "Recent" : "Recent",
- "Not favorited" : "Niet in favorieten",
- "Remove from favorites" : "Verwijderen uit favorieten",
- "Add to favorites" : "Aan favorieten toevoegen",
+ "Not favored" : "Geen favoriet",
"An error occurred while trying to update the tags" : "Er trad een fout op bij je poging om de tags bij te werken",
- "Added to favorites" : "Aan favorieten toegevoegd",
- "Removed from favorites" : "Uit favorieten verwijderd",
- "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten",
- "You removed {file} from your favorites" : "Je verwijderde {file} uit je favorieten",
- "File changes" : "Bestandswijzigingen",
- "Created by {user}" : "Gecreëerd door {user}",
- "Changed by {user}" : "Gewijzigd door {user}",
- "Deleted by {user}" : "Verwijderd door {user}",
- "Restored by {user}" : "Hersteld door {user}",
- "Renamed by {user}" : "Hernoemd door {user}",
- "Moved by {user}" : "Verplaatst door {user}",
- "\"remote user\"" : "\"externe gebruiker\"",
- "You created {file}" : "Je creëerde {file}",
- "You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
- "{user} created {file}" : "{user} creëerde {file}",
- "{user} created an encrypted file in {file}" : "{user} creëerde een versleuteld bestand in {file}",
- "{file} was created in a public folder" : "{file} werd gecreëerd in een openbare map",
- "You changed {file}" : "Je wijzigde {file}",
- "You changed an encrypted file in {file}" : "Je wijzigde een versleuteld bestand in {file}",
- "{user} changed {file}" : "{user} wijzigde {file}",
- "{user} changed an encrypted file in {file}" : "{user} heeft een versleuteteld bestand veranderd in {file}",
- "You deleted {file}" : "Je verwijderde {file}",
- "You deleted an encrypted file in {file}" : "Je hebt een versleuteld bestand gewist in {file}",
- "{user} deleted {file}" : "{user} verwijderde {file}",
- "{user} deleted an encrypted file in {file}" : "{user} heeft een versleuteld bestand gewist in {file}",
- "You restored {file}" : "Je herstelde {file}",
- "{user} restored {file}" : "{user} herstelde {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
- "You renamed {oldfile} (hidden) to {newfile}" : "Je hernoemde {oldfile} (verborgen) naar {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Je hernoemde {oldfile} naar {newfile} (verborgen)",
- "You renamed {oldfile} to {newfile}" : "Je hernoemde {oldfile} naar {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} hernoemde {oldfile} (verborgen) naar {newfile} (verborgen)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} hernoemde {oldfile} (verborgen) naar {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} hernoemde {oldfile} naar {newfile} (verborgen)",
- "{user} renamed {oldfile} to {newfile}" : "{user} hernoemde {oldfile} naar {newfile}",
- "You moved {oldfile} to {newfile}" : "Je verplaatste {oldfile} naar {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} verplaatste {oldfile} naar {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Een bestand werd toegevoegd of verwijderd van je <strong>favorieten</strong>",
- "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Een favoriet bestand of map is <strong>gewijzigd</strong>",
- "All files" : "Alle bestanden",
- "Unlimited" : "Ongelimiteerd",
"Upload (max. %s)" : "Upload (max. %s)",
- "Accept" : "Accepteren",
- "Reject" : "Afwijzen",
- "Incoming ownership transfer from {user}" : "Inkomend verzoek om eigenaarsoverdracht van {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Wil je {path} accepteren? \n\nOpmerking: het overdrachtsproces na acceptatie kan tot 1 uur duren.",
- "Ownership transfer failed" : "Eigenaarschap overdracht mislukt",
- "Your ownership transfer of {path} to {user} failed." : "Eigenaarsoverdracht van {path} naar {user} is mislukt.",
- "The ownership transfer of {path} from {user} failed." : "Eigenaarsoverdracht van {path} van {user} is mislukt.",
- "Ownership transfer done" : "Eigenaarschap overdracht geslaagd",
- "Your ownership transfer of {path} to {user} has completed." : "Eigenaarsoverdracht van {path} naar {user} is gereed.",
- "The ownership transfer of {path} from {user} has completed." : "Eigenaarsoverdracht van {path} van {user} is gereed.",
- "in %s" : "in %s",
- "File Management" : "Bestandsbeheer",
- "Transfer ownership of a file or folder" : "Overdragen eigenaarschap bestand of map ",
- "Choose file or folder to transfer" : "Kies over te dragen bestand of map",
- "Change" : "Pas aan",
- "New owner" : "Nieuwe eigenaar",
- "Search users" : "Gebruikers zoeken",
- "Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
- "Transfer" : "Transfer",
- "Transfer {path} to {userid}" : "Draag {path} over aan {userid}",
- "Invalid path selected" : "Ongeldig pad geselecteerd",
- "Ownership transfer request sent" : "Aanvraag eigenaarsoverdracht verstuurd",
- "Cannot transfer ownership of a file or folder you don't own" : "Kan het eigenaarschap van een bestand of map waarvan u niet de eigenaar bent, niet overdragen",
- "Tags" : "Tags",
- "Unable to change the favourite state of the file" : "Niet mogelijk om favoriet status van het bestand te wijzigen",
- "Error while loading the file data" : "Fout bij het lezen van de bestandsgegevens",
- "Pick a template for {name}" : "Kies een sjabloon voor {name}",
- "Cancel" : "Annuleren",
- "Create" : "Aanmaken",
- "Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
- "Creating file" : "Maken bestand",
- "Blank" : "Blanco",
- "Unable to create new file from template" : "Kan geen nieuw bestand maken vanuit het sjabloon",
- "Set up templates folder" : "Instellen sjablonenmap",
- "Templates" : "Sjablonen",
- "Unable to initialize the templates directory" : "Kon de sjablonenmap niet instellen",
- "%s used" : "%s gebruikt",
- "%s%% of %s used" : "%s%% van %s gebruikt",
- "%1$s of %2$s used" : "%1$s van %2$s gebruikt",
- "Settings" : "Instellingen",
- "Show hidden files" : "Verborgen bestanden tonen",
- "Crop image previews" : "Bijsnijden afbeeldingvoorbeeld:",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" actie succesvol uitgevoerd",
+ "\"{displayName}\" action failed" : "\"{displayName}\" actie mislukt",
+ "\"{displayName}\" failed on some elements" : "“{displayName}” mislukt op sommige elementen",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batchactie succesvol uitgevoerd",
+ "Submitting fields…" : "Verzenden velden ...",
+ "Filter filenames…" : "Filter bestandsnamen...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL naar klembord gekopieerd",
+ "Enable the grid view" : "Roosterweergave inschakelen",
+ "Enable folder tree" : "Mappenboom inschakelen",
+ "Copy to clipboard" : "Kopiëren naar het klembord",
"Use this address to access your Files via WebDAV" : "Gebruik dit adres om je bestanden via WebDAV te benaderen",
- "Toggle %1$s sublist" : "Omschakelen%1$s sublijsten",
- "Toggle grid view" : "Omschakelen roosterweergave",
- "No files in here" : "Hier geen bestanden",
- "Upload some content or sync with your devices!" : "Upload je inhoud of synchroniseer met je apparaten!",
- "No entries found in this folder" : "Niets gevonden in deze map",
- "Select all" : "Alles selecteren",
- "Upload too large" : "Upload is te groot",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die je probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
- "No favorites yet" : "Nog geen favorieten",
- "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die je als favoriet aanmerkt, worden hier getoond",
- "Deleted files" : "Verwijderde bestanden",
- "Shares" : "Shares",
- "Shared with others" : "Gedeeld met anderen",
- "Shared with you" : "Gedeeld met jou",
- "Shared by link" : "Gedeeld via link",
- "Deleted shares" : "Verwijderde shares",
- "Pending shares" : "Deellinks in behandeling",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Als je 2FA hebt ingeschakeld moet je een app wachtwoord maken en gebruiken door hier te klikken.",
+ "Deletion cancelled" : "Verwijderen geannulleerd",
+ "Move cancelled" : "Verplaatsen geannuleerd",
+ "Cancelled move or copy of \"{filename}\"." : "Verplaatsen of kopiëren van \"¨{filename}\" geannuleerd.",
+ "Cancelled move or copy operation" : "Verplaatsen of kopiëren geannuleerd.",
+ "Open details" : "Details openen",
+ "Photos and images" : "Foto's en afbeeldingen",
+ "New folder creation cancelled" : "Maken van nieuwe map geannuleerd",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} map","{folderCount} mappen"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} bestand","{fileCount} bestanden"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 bestand en {folderCount} map","1 bestand en {folderCount} mappen"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} bestand en 1 map","{fileCount} bestanden en 1 map"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} bestanden en {folderCount} mappen",
+ "All folders" : "Alle mappen",
+ "Personal Files" : "Persoonlijke bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Opslagruimte van {owner} zit vol, bestanden kunnen niet meer worden geüpload of gesynchroniseerd!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Groepsmap \"{mountPoint}\" is vol, bestanden kunnen niet meer gewijzigd of gesynchroniseerd worden!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externe opslag \"{mountPoint}\" is vol, bestanden kunnen niet meer gewijzigd of gesynchroniseerd worden!",
- "Your storage is full, files can not be updated or synced anymore!" : "Je opslagruimte zit vol. Bestanden kunnen niet meer worden gewijzigd of gesynchroniseerd!",
- "_matches '{filter}'_::_match '{filter}'_" : ["komt overeen met '{filter}'","komen overeen met '{filter}'"]
+ "%1$s (renamed)" : "%1$s (hernoemd)",
+ "renamed file" : "bestand hernoemd",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
+ "Filter file names …" : "Bestandsnamen filteren ...",
+ "Prevent warning dialogs from open or reenable them." : "Voorkom dat waarschuwingsvensters worden geopend of schakel ze opnieuw in.",
+ "Show a warning dialog when changing a file extension." : "Een waarschuwingsvenster tonen bij het wijzigen van een bestandsextensie.",
+ "Speed up your Files experience with these quick shortcuts." : "Verbeter je interactie met bestanden met deze snelkoppelingen.",
+ "Open the actions menu for a file" : "Open het actiemenu voor een bestand",
+ "Rename a file" : "Een bestand hernoemen",
+ "Delete a file" : "Een bestand verwijderen",
+ "Favorite or remove a file from favorites" : "Favoriet maken of een bestand verwijderen uit favorieten",
+ "Manage tags for a file" : "Tags voor een bestand beheren",
+ "Deselect all files" : "Selectie van bestanden ongedaan maken",
+ "Select or deselect a file" : "Een bestand selecteren of deselecteren",
+ "Select a range of files" : "Selecteer een reeks bestanden",
+ "Navigate to the parent folder" : "Navigeer naar de bovenliggende map",
+ "Navigate to the file above" : "Navigeer naar bovenliggend bestand",
+ "Navigate to the file below" : "Navigeer naar onderliggend bestand",
+ "Navigate to the file on the left (in grid mode)" : "Navigeer naar het bestand aan de linkerkant (in rastermodus)",
+ "Navigate to the file on the right (in grid mode)" : "Navigeer naar het bestand aan de rechterkant (in rastermodus)",
+ "Toggle the grid view" : "Rasterweergave omschakelen",
+ "Open the sidebar for a file" : "Open de zijbalk voor een bestand"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js
deleted file mode 100644
index 73d01d0461f..00000000000
--- a/apps/files/l10n/nn_NO.js
+++ /dev/null
@@ -1,71 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Unknown error" : "Ukjend feil",
- "Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.",
- "Invalid Token" : "Ugyldig token",
- "No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil",
- "There is no error, the file uploaded with success" : "Ingen feil, fila vart lasta opp",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Fila du lasta opp er større enn det «upload_max_filesize» i php.ini tillater: ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet",
- "The uploaded file was only partially uploaded" : "Fila vart berre delvis lasta opp",
- "No file was uploaded" : "Ingen filer vart lasta opp",
- "Missing a temporary folder" : "Manglar ei mellombels mappe",
- "Failed to write to disk" : "Klarte ikkje skriva til disk",
- "Not enough storage available" : "Ikkje nok lagringsplass tilgjengeleg",
- "Upload failed. Could not find uploaded file" : "Feil ved opplasting. Klarte ikkje å finna opplasta fil.",
- "Upload failed. Could not get file info." : "Feil ved opplasting. Klarte ikkje å henta filinfo.",
- "Invalid directory." : "Ugyldig mappe.",
- "Files" : "Filer",
- "All files" : "Alle filer",
- "Home" : "Heime",
- "Close" : "Lukk",
- "Favorites" : "Favorittar",
- "Upload cancelled." : "Opplasting avbroten.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.",
- "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.",
- "Uploading..." : "Lastar opp …",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
- "Actions" : "Handlingar",
- "Download" : "Last ned",
- "Rename" : "Endra namn",
- "Delete" : "Slett",
- "Unshare" : "Udel",
- "Details" : "Detaljar",
- "Pending" : "Under vegs",
- "Name" : "Namn",
- "Size" : "Storleik",
- "Modified" : "Endra",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_Uploading %n file_::_Uploading %n files_" : ["Lastar opp %n fil","Lastar opp %n filer"],
- "New" : "Ny",
- "File name cannot be empty." : "Filnamnet kan ikkje vera tomt.",
- "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)",
- "Favorite" : "Favoritt",
- "Folder" : "Mappe",
- "New folder" : "Ny mappe",
- "Upload" : "Last opp",
- "A new file or folder has been <strong>created</strong>" : "Ei ny fil eller mappe er <strong>oppretta</strong>",
- "A file or folder has been <strong>changed</strong>" : "Ei fil eller mappe er <strong>endra</strong>",
- "A file or folder has been <strong>deleted</strong>" : "Ei fil eller mappe er <strong>sletta</strong>",
- "You created %1$s" : "Du oppretta %1$s",
- "%2$s created %1$s" : "%2$s oppretta %1$s",
- "%1$s was created in a public folder" : "%1$s oppretta i ei offentleg mappe",
- "You changed %1$s" : "Du endra %1$s",
- "%2$s changed %1$s" : "%2$s endra %1$s",
- "You deleted %1$s" : "Du sletta %1$s",
- "%2$s deleted %1$s" : "%2$s sletta %1$s",
- "File handling" : "Filhandtering",
- "Maximum upload size" : "Maksimal opplastingsstorleik",
- "max. possible: " : "maks. moglege:",
- "Save" : "Lagre",
- "Settings" : "Innstillingar",
- "WebDAV" : "WebDAV",
- "Upload too large" : "For stor opplasting",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.",
- "Text file" : "Tekst fil"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json
deleted file mode 100644
index 199bb6aeb9a..00000000000
--- a/apps/files/l10n/nn_NO.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{ "translations": {
- "Unknown error" : "Ukjend feil",
- "Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.",
- "Invalid Token" : "Ugyldig token",
- "No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil",
- "There is no error, the file uploaded with success" : "Ingen feil, fila vart lasta opp",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Fila du lasta opp er større enn det «upload_max_filesize» i php.ini tillater: ",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet",
- "The uploaded file was only partially uploaded" : "Fila vart berre delvis lasta opp",
- "No file was uploaded" : "Ingen filer vart lasta opp",
- "Missing a temporary folder" : "Manglar ei mellombels mappe",
- "Failed to write to disk" : "Klarte ikkje skriva til disk",
- "Not enough storage available" : "Ikkje nok lagringsplass tilgjengeleg",
- "Upload failed. Could not find uploaded file" : "Feil ved opplasting. Klarte ikkje å finna opplasta fil.",
- "Upload failed. Could not get file info." : "Feil ved opplasting. Klarte ikkje å henta filinfo.",
- "Invalid directory." : "Ugyldig mappe.",
- "Files" : "Filer",
- "All files" : "Alle filer",
- "Home" : "Heime",
- "Close" : "Lukk",
- "Favorites" : "Favorittar",
- "Upload cancelled." : "Opplasting avbroten.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.",
- "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.",
- "Uploading..." : "Lastar opp …",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
- "Actions" : "Handlingar",
- "Download" : "Last ned",
- "Rename" : "Endra namn",
- "Delete" : "Slett",
- "Unshare" : "Udel",
- "Details" : "Detaljar",
- "Pending" : "Under vegs",
- "Name" : "Namn",
- "Size" : "Storleik",
- "Modified" : "Endra",
- "_%n folder_::_%n folders_" : ["%n mappe","%n mapper"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} og {files}",
- "_Uploading %n file_::_Uploading %n files_" : ["Lastar opp %n fil","Lastar opp %n filer"],
- "New" : "Ny",
- "File name cannot be empty." : "Filnamnet kan ikkje vera tomt.",
- "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)",
- "Favorite" : "Favoritt",
- "Folder" : "Mappe",
- "New folder" : "Ny mappe",
- "Upload" : "Last opp",
- "A new file or folder has been <strong>created</strong>" : "Ei ny fil eller mappe er <strong>oppretta</strong>",
- "A file or folder has been <strong>changed</strong>" : "Ei fil eller mappe er <strong>endra</strong>",
- "A file or folder has been <strong>deleted</strong>" : "Ei fil eller mappe er <strong>sletta</strong>",
- "You created %1$s" : "Du oppretta %1$s",
- "%2$s created %1$s" : "%2$s oppretta %1$s",
- "%1$s was created in a public folder" : "%1$s oppretta i ei offentleg mappe",
- "You changed %1$s" : "Du endra %1$s",
- "%2$s changed %1$s" : "%2$s endra %1$s",
- "You deleted %1$s" : "Du sletta %1$s",
- "%2$s deleted %1$s" : "%2$s sletta %1$s",
- "File handling" : "Filhandtering",
- "Maximum upload size" : "Maksimal opplastingsstorleik",
- "max. possible: " : "maks. moglege:",
- "Save" : "Lagre",
- "Settings" : "Innstillingar",
- "WebDAV" : "WebDAV",
- "Upload too large" : "For stor opplasting",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.",
- "Text file" : "Tekst fil"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/nqo.js b/apps/files/l10n/nqo.js
deleted file mode 100644
index 91d52801985..00000000000
--- a/apps/files/l10n/nqo.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : [""],
- "_%n file_::_%n files_" : [""],
- "_Uploading %n file_::_Uploading %n files_" : [""],
- "_matches '{filter}'_::_match '{filter}'_" : [""]
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/nqo.json b/apps/files/l10n/nqo.json
deleted file mode 100644
index 82cca5a0661..00000000000
--- a/apps/files/l10n/nqo.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : [""],
- "_%n file_::_%n files_" : [""],
- "_Uploading %n file_::_Uploading %n files_" : [""],
- "_matches '{filter}'_::_match '{filter}'_" : [""]
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js
deleted file mode 100644
index 5e5bc3dc11b..00000000000
--- a/apps/files/l10n/oc.js
+++ /dev/null
@@ -1,121 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "Supòrt d'emmagazinatge pas disponible",
- "Storage invalid" : "Supòrt d'emmagazinatge pas valable",
- "Unknown error" : "Error Desconeguda ",
- "Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.",
- "Invalid Token" : "Geton invalid",
- "No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda",
- "There is no error, the file uploaded with success" : "Pas cap d'error, lo fichièr es estat mandat amb succès.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Lo fichièr mandat depassa l'instruccion upload_max_filesize situada dins lo fichièr php.ini :",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Lo fichièr mandat depassa la valor MAX_FILE_SIZE qu'èra especificada dins lo formulari HTML.",
- "The uploaded file was only partially uploaded" : "Lo fichièr es estat mandat sonque parcialament.",
- "No file was uploaded" : "Pas de fichièr mandat.",
- "Missing a temporary folder" : "Abséncia de dorsièr temporari",
- "Failed to write to disk" : "Error d'escritura sul disc",
- "Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible",
- "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
- "Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.",
- "Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.",
- "Invalid directory." : "Dorsièr invalid.",
- "Files" : "Fichièrs",
- "All files" : "Totes los fichièrs",
- "Home" : "Mos fichièrs",
- "Close" : "Tampar",
- "Favorites" : "Favorits",
- "Upload cancelled." : "Mandadís anullat.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de mandar {filename} perque s'agís d'un repertòri o d'un fichièr de talha nulla",
- "Total file size {size1} exceeds upload limit {size2}" : "La talha totala del fichièr {size1} excedís la talha maximala de mandadís {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espaci liure insufisent : ensajatz de mandar {size1} mas solament {size2} son disponibles",
- "Could not get result from server." : "Pòt pas recebre los resultats del servidor.",
- "Uploading..." : "Mandadís en cors…",
- "..." : "...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.",
- "Actions" : "Accions",
- "Download" : "Telecargar",
- "Rename" : "Renomenar",
- "Delete" : "Suprimir",
- "Disconnect storage" : "Desconnectar aqueste supòrt d'emmagazinatge",
- "Unshare" : "Partejar pas",
- "Details" : "Detalhs",
- "Select" : "Seleccionar",
- "Pending" : "En espèra",
- "Unable to determine date" : "Impossible de determinar la data",
- "This operation is forbidden" : "L'operacion es interdicha",
- "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
- "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís",
- "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"",
- "{newName} already exists" : "{newName} existís ja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.",
- "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja",
- "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"",
- "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja",
- "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".",
- "No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'",
- "Name" : "Nom",
- "Size" : "Talha",
- "Modified" : "Modificat",
- "_%n folder_::_%n folders_" : ["%n dorsièr","%n dorsièrs"],
- "_%n file_::_%n files_" : ["%n fichièr","%n fichièrs"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "You don’t have permission to upload or create files here" : "Avètz pas la permission d'apondre de fichièrs aicí",
- "_Uploading %n file_::_Uploading %n files_" : ["Mandadís de %n fichièr","Mandadís de %n fichièrs"],
- "New" : "Novèl",
- "\"{name}\" is an invalid file name." : "\"{name}\" es pas un nom de fichièr valid.",
- "File name cannot be empty." : "Lo nom de fichièr pòt pas èsser void.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espaci d'emmagazinatge de {owner} es plen. Los fichièrs pòdon pas mai èsser meses a jorn o sincronizats !",
- "Your storage is full, files can not be updated or synced anymore!" : "Vòstre espaci d'emmagazinatge es plen, los fichièrs pòdon pas mai èsser aponduts o sincronizats !",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espaci d'emmagazinatge de {owner} es gaireben plen ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vòstre espace d'emmagazinatge es gaireben plen ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["correspond a '{filter}'","correspondon a '{filter}'"],
- "Path" : "Camin",
- "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
- "Favorited" : "Marcat coma favorit",
- "Favorite" : "Favorit",
- "Folder" : "Dorsièr",
- "New folder" : "Novèl dorsièr",
- "{newname} already exists" : "{new_name} existís ja",
- "Upload" : "Cargament",
- "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas",
- "A new file or folder has been <strong>created</strong>" : "Un novèl fichièr o repertòri es estat <strong>creat</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un fichièr o un repertòri es estat <strong>modificat</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notifications a çò que concernís la creacion e la modificacion de vòstres <strong>fichièrs favorits</strong> <em>(Flux unicament)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Un fichièr o un repertòri es estat <strong>suprimit</strong>",
- "A file or folder has been <strong>restored</strong>" : "Un fichièr o un repertòri es estat <strong>restablit</strong>",
- "You created %1$s" : "Avètz creat %1$s",
- "%2$s created %1$s" : "%2$s a creat %1$s",
- "%1$s was created in a public folder" : "%1$s es estat creat dins un dorsièr public",
- "You changed %1$s" : "Avètz modificat %1$s",
- "%2$s changed %1$s" : "%2$s a modificat %1$s",
- "You deleted %1$s" : "Avètz suprimit %1$s",
- "%2$s deleted %1$s" : "%2$s a suprimit %1$s",
- "You restored %1$s" : "Avètz restablit %1$s",
- "%2$s restored %1$s" : "%2$s a restablit %1$s",
- "Changed by %2$s" : "Modificat per %2$s",
- "Deleted by %2$s" : "Suprimit per %2$s",
- "Restored by %2$s" : "Restablit per %2$s",
- "Upload (max. %s)" : "Mandadís (max. %s)",
- "File handling" : "Gestion de fichièrs",
- "Maximum upload size" : "Talha max. de mandadís",
- "max. possible: " : "Max. possible :",
- "Save" : "Salvar",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.",
- "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
- "Settings" : "Paramètres",
- "WebDAV" : "WebDAV",
- "No files in here" : "Pas cap de fichièr aicí",
- "Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
- "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
- "Select all" : "Seleccionar tot",
- "Upload too large" : "Mandadís tròp voluminós",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.",
- "No favorites" : "Pas cap de favorit",
- "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí",
- "Text file" : "Fichièr tèxte",
- "New text file.txt" : "Novèl fichièr tèxte .txt"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json
deleted file mode 100644
index 156794e707d..00000000000
--- a/apps/files/l10n/oc.json
+++ /dev/null
@@ -1,119 +0,0 @@
-{ "translations": {
- "Storage not available" : "Supòrt d'emmagazinatge pas disponible",
- "Storage invalid" : "Supòrt d'emmagazinatge pas valable",
- "Unknown error" : "Error Desconeguda ",
- "Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.",
- "Invalid Token" : "Geton invalid",
- "No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda",
- "There is no error, the file uploaded with success" : "Pas cap d'error, lo fichièr es estat mandat amb succès.",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Lo fichièr mandat depassa l'instruccion upload_max_filesize situada dins lo fichièr php.ini :",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Lo fichièr mandat depassa la valor MAX_FILE_SIZE qu'èra especificada dins lo formulari HTML.",
- "The uploaded file was only partially uploaded" : "Lo fichièr es estat mandat sonque parcialament.",
- "No file was uploaded" : "Pas de fichièr mandat.",
- "Missing a temporary folder" : "Abséncia de dorsièr temporari",
- "Failed to write to disk" : "Error d'escritura sul disc",
- "Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible",
- "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.",
- "Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.",
- "Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.",
- "Invalid directory." : "Dorsièr invalid.",
- "Files" : "Fichièrs",
- "All files" : "Totes los fichièrs",
- "Home" : "Mos fichièrs",
- "Close" : "Tampar",
- "Favorites" : "Favorits",
- "Upload cancelled." : "Mandadís anullat.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de mandar {filename} perque s'agís d'un repertòri o d'un fichièr de talha nulla",
- "Total file size {size1} exceeds upload limit {size2}" : "La talha totala del fichièr {size1} excedís la talha maximala de mandadís {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espaci liure insufisent : ensajatz de mandar {size1} mas solament {size2} son disponibles",
- "Could not get result from server." : "Pòt pas recebre los resultats del servidor.",
- "Uploading..." : "Mandadís en cors…",
- "..." : "...",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.",
- "Actions" : "Accions",
- "Download" : "Telecargar",
- "Rename" : "Renomenar",
- "Delete" : "Suprimir",
- "Disconnect storage" : "Desconnectar aqueste supòrt d'emmagazinatge",
- "Unshare" : "Partejar pas",
- "Details" : "Detalhs",
- "Select" : "Seleccionar",
- "Pending" : "En espèra",
- "Unable to determine date" : "Impossible de determinar la data",
- "This operation is forbidden" : "L'operacion es interdicha",
- "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
- "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís",
- "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"",
- "{newName} already exists" : "{newName} existís ja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.",
- "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"",
- "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja",
- "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"",
- "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja",
- "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".",
- "No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'",
- "Name" : "Nom",
- "Size" : "Talha",
- "Modified" : "Modificat",
- "_%n folder_::_%n folders_" : ["%n dorsièr","%n dorsièrs"],
- "_%n file_::_%n files_" : ["%n fichièr","%n fichièrs"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "You don’t have permission to upload or create files here" : "Avètz pas la permission d'apondre de fichièrs aicí",
- "_Uploading %n file_::_Uploading %n files_" : ["Mandadís de %n fichièr","Mandadís de %n fichièrs"],
- "New" : "Novèl",
- "\"{name}\" is an invalid file name." : "\"{name}\" es pas un nom de fichièr valid.",
- "File name cannot be empty." : "Lo nom de fichièr pòt pas èsser void.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espaci d'emmagazinatge de {owner} es plen. Los fichièrs pòdon pas mai èsser meses a jorn o sincronizats !",
- "Your storage is full, files can not be updated or synced anymore!" : "Vòstre espaci d'emmagazinatge es plen, los fichièrs pòdon pas mai èsser aponduts o sincronizats !",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espaci d'emmagazinatge de {owner} es gaireben plen ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vòstre espace d'emmagazinatge es gaireben plen ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["correspond a '{filter}'","correspondon a '{filter}'"],
- "Path" : "Camin",
- "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
- "Favorited" : "Marcat coma favorit",
- "Favorite" : "Favorit",
- "Folder" : "Dorsièr",
- "New folder" : "Novèl dorsièr",
- "{newname} already exists" : "{new_name} existís ja",
- "Upload" : "Cargament",
- "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas",
- "A new file or folder has been <strong>created</strong>" : "Un novèl fichièr o repertòri es estat <strong>creat</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un fichièr o un repertòri es estat <strong>modificat</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notifications a çò que concernís la creacion e la modificacion de vòstres <strong>fichièrs favorits</strong> <em>(Flux unicament)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Un fichièr o un repertòri es estat <strong>suprimit</strong>",
- "A file or folder has been <strong>restored</strong>" : "Un fichièr o un repertòri es estat <strong>restablit</strong>",
- "You created %1$s" : "Avètz creat %1$s",
- "%2$s created %1$s" : "%2$s a creat %1$s",
- "%1$s was created in a public folder" : "%1$s es estat creat dins un dorsièr public",
- "You changed %1$s" : "Avètz modificat %1$s",
- "%2$s changed %1$s" : "%2$s a modificat %1$s",
- "You deleted %1$s" : "Avètz suprimit %1$s",
- "%2$s deleted %1$s" : "%2$s a suprimit %1$s",
- "You restored %1$s" : "Avètz restablit %1$s",
- "%2$s restored %1$s" : "%2$s a restablit %1$s",
- "Changed by %2$s" : "Modificat per %2$s",
- "Deleted by %2$s" : "Suprimit per %2$s",
- "Restored by %2$s" : "Restablit per %2$s",
- "Upload (max. %s)" : "Mandadís (max. %s)",
- "File handling" : "Gestion de fichièrs",
- "Maximum upload size" : "Talha max. de mandadís",
- "max. possible: " : "Max. possible :",
- "Save" : "Salvar",
- "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.",
- "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.",
- "Settings" : "Paramètres",
- "WebDAV" : "WebDAV",
- "No files in here" : "Pas cap de fichièr aicí",
- "Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
- "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
- "Select all" : "Seleccionar tot",
- "Upload too large" : "Mandadís tròp voluminós",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.",
- "No favorites" : "Pas cap de favorit",
- "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí",
- "Text file" : "Fichièr tèxte",
- "New text file.txt" : "Novèl fichièr tèxte .txt"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index 0e3795d7d83..b3130241bf1 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
- "Storage invalid" : "Nieprawidłowy magazyn",
- "Unknown error" : "Nieznany błąd",
- "File could not be found" : "Nie można znaleźć pliku",
- "Move or copy" : "Przenieś lub kopiuj",
- "Download" : "Pobierz",
- "Delete" : "Usuń",
- "Home" : "Strona główna",
- "Close" : "Zamknij",
- "Favorites" : "Ulubione",
- "Could not create folder \"{dir}\"" : "Nie można utworzyć katalogu \"{dir}\"",
- "This will stop your current uploads." : "Spowoduje to zatrzymanie wysyłania plików.",
- "Upload cancelled." : "Wysyłanie anulowane.",
- "Processing files …" : "Przetwarzam pliki…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można wysłać {filename} być może jest katalogiem lub posiada 0 bajtów",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, wysyłasz {size1} a pozostało tylko {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Katalog docelowy \"{dir}\" już nie istnieje",
- "Not enough free space" : "Za mało wolnego miejsca",
- "An unknown error has occurred" : "Wystąpił nieznany błąd",
- "Uploading …" : "Wysyłanie…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Wysyłanie tego elementu nie jest wspierane",
- "Target folder does not exist any more" : "Katalog docelowy już nie istnieje",
- "Operation is blocked by access control" : "Operacja jest zablokowana przez kontrolę dostępu",
- "Error when assembling chunks, status code {status}" : "Błąd podczas łączenia fragmentów, kod statusu {status}",
- "Actions" : "Akcje",
- "Rename" : "Zmień nazwę",
- "Copy" : "Kopiuj",
- "Choose target folder" : "Wybierz katalog docelowy",
- "Open" : "Otwórz",
- "Delete file" : "Usuń plik",
- "Delete folder" : "Usuń katalog",
- "Disconnect storage" : "Odłącz magazyn",
- "Leave this share" : "Opuść udostępnienie",
- "Could not load info for file \"{file}\"" : "Nie można załadować informacji o pliku \"{file}\"",
- "Files" : "Pliki",
- "Details" : "Szczegóły",
- "Please select tag(s) to add to the selection" : "Wybierz etykietę(y) do dodania dla zaznaczenia",
- "Apply tag(s) to selection" : "Zastosuj etykietę(y) dla zaznaczenia",
- "Select" : "Wybierz",
- "Pending" : "Oczekujące",
- "Unable to determine date" : "Nie można ustalić daty",
- "This operation is forbidden" : "Ta operacja jest niedozwolona",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ten katalog jest niedostępny, sprawdź logi lub skontaktuj się z administratorem",
- "Could not move \"{file}\", target exists" : "Nie można przenieść \"{file}\" - plik o takiej nazwie już istnieje",
- "Could not move \"{file}\"" : "Nie można przenieść \"{file}\"",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Nie można skopiować \"{file}\", plik już istnieje",
- "Could not copy \"{file}\"" : "Nie można skopiować \"{file}\"",
- "Copied {origin} inside {destination}" : "Skopiowano {origin} wewnątrz {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopiowano {origin} oraz {nbfiles} innych plików wewnątrz {destination}",
- "{newName} already exists" : "{newName} już istnieje",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nie można zmienić nazwy \"{fileName}\", plik już nie istnieje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{targetName}\" jest już używana w katalogu \"{dir}\". Wybierz inną nazwę.",
- "Could not rename \"{fileName}\"" : "Nie można zmienić nazwy \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nie można utworzyć pliku \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nie można utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
- "Could not create folder \"{dir}\" because it already exists" : "Nie można utworzyć katalogu \"{dir}\", ponieważ już istnieje",
- "Could not fetch file details \"{file}\"" : "Nie można pobrać szczegółów pliku \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Błąd podczas usuwania pliku \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Brak wyników wyszukiwania w innych katalogach dla {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Wprowadź więcej niż dwa znaki, aby przeszukać inne katalogi",
- "Name" : "Nazwa",
- "Size" : "Rozmiar",
- "Modified" : "Zmodyfikowany",
- "_%n folder_::_%n folders_" : ["%n katalog","%n katalogi","%n katalogów","%n katalogów"],
- "_%n file_::_%n files_" : ["%n plik","%n pliki","%n plików","%n plików"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"],
- "You don’t have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
- "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"],
- "New" : "Nowy",
- "Select file range" : "Wybierz zakres plików",
- "{used} of {quota} used" : "Wykorzystane {used} z {quota}",
- "{used} used" : "Wykorzystane {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" jest nieprawidłową nazwą pliku.",
- "File name cannot be empty." : "Nazwa pliku nie może być pusta.",
- "\"/\" is not allowed inside a file name." : "Znak \"/\" jest niedozwolony w nazwie pliku.",
- "\"{name}\" is not an allowed filetype" : "typ pliku \"{name}\" jest niedozwolony",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Magazyn zewnętrzny \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Magazyn dla {owner} jest pawie pełny ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Katalog grupowy \"{mountPoint}\" jest prawie pełny ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Pamięć zewnętrzna \"{mountPoint}\" jest prawie pełna ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Twój magazyn jest prawie pełny ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["pasuje do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\""],
- "View in folder" : "Zobacz w katalogu",
- "Copied!" : "Skopiowano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Skopiuj bezpośredni link (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
- "Path" : "Ścieżka",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów","%n bajtów"],
- "Favorited" : "Ulubiony",
- "Favorite" : "Ulubione",
- "You can only favorite a single file or folder at a time" : "Możesz dodać do ulubionych tylko pojedynczy plik lub katalog",
- "New folder" : "Nowy katalog",
- "Upload file" : "Wyślij plik",
- "Recent" : "Ostatnie",
- "Not favorited" : "Wyłączone z ulubionych",
- "Remove from favorites" : "Usuń z ulubionych",
- "Add to favorites" : "Dodaj do ulubionych",
- "An error occurred while trying to update the tags" : "Wystąpił błąd podczas próby aktualizacji etykiet",
"Added to favorites" : "Dodano do ulubionych",
"Removed from favorites" : "Usunięto z ulubionych",
"You added {file} to your favorites" : "Dodałeś {file} do ulubionych",
"You removed {file} from your favorites" : "Usunąłeś {file} z ulubionych",
+ "Favorites" : "Ulubione",
"File changes" : "Zmiany w plikach",
"Created by {user}" : "Utworzone przez {user}",
"Changed by {user}" : "Zmienione przez {user}",
@@ -116,10 +13,10 @@ OC.L10N.register(
"Restored by {user}" : "Przywrócone przez {user}",
"Renamed by {user}" : "Zmienione przez {user}",
"Moved by {user}" : "Przeniesione przez {user}",
- "\"remote user\"" : "\"użytkownik zdalny\"",
- "You created {file}" : "Utworzy‭łeś {file}",
+ "\"remote account\"" : "\"zdalne konto\"",
+ "You created {file}" : "Utworzyłeś {file}",
"You created an encrypted file in {file}" : "Stworzyłeś zaszyfrowany plik w {file}",
- "{user} created {file}" : "{user} utworzy‭ł {file}",
+ "{user} created {file}" : "{user} utworzył {file}",
"{user} created an encrypted file in {file}" : "{user} utworzył zaszyfrowany plik w {file}",
"{file} was created in a public folder" : "{file} został utworzony w katalogu publicznym",
"You changed {file}" : "Zmieniłeś {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Przeniosłeś {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} przeniósł {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Plik został dodany lub usunięty z <strong>ulubionych</strong>",
+ "Files" : "Pliki",
"A file or folder has been <strong>changed</strong>" : "Plik lub katalog został <strong>zmieniony</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Ulubiony plik lub katalog został <strong>zmieniony</strong>",
- "All files" : "Wszystkie pliki",
- "Unlimited" : "Brak limitu",
- "Upload (max. %s)" : "Wysyłanie (maks. %s)",
+ "Failed to authorize" : "Błąd autoryzacji",
+ "Invalid folder path" : "Nieprawidłowa ścieżka katalogu",
+ "Folder not found" : "Nie znaleziono katalogu",
+ "The file cannot be found" : "Nie można znaleźć pliku",
+ "The destination path does not exist: %1$s" : "Ścieżka docelowa nie istnieje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nie masz uprawnień do utworzenia pliku w określonej lokalizacji",
+ "The file could not be converted." : "Nie udało się przekonwertować pliku.",
+ "Could not get relative path to converted file" : "Nie można uzyskać ścieżki względnej do przekonwertowanego pliku",
+ "Favorite files" : "Ulubione pliki",
+ "No favorites" : "Brak ulubionych",
+ "More favorites" : "Więcej ulubionych",
"Accept" : "Akceptuj",
"Reject" : "Odrzuć",
"Incoming ownership transfer from {user}" : "Przychodzące przeniesienie własności od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Czy chcesz zaakceptować {path}\n\nUwaga: Proces transferu po zaakceptowaniu może potrwać do 1 godziny.",
+ "Ownership transfer denied" : "Odmowa przeniesienia własności",
+ "Your ownership transfer of {path} was denied by {user}." : "Twoje przeniesienie własności {path} zostało odrzucone przez {user}.",
"Ownership transfer failed" : "Przeniesienie własności nie powiodło się",
"Your ownership transfer of {path} to {user} failed." : "Twoje przeniesienie własności {path} na {user} nie powiodło się.",
"The ownership transfer of {path} from {user} failed." : "Przeniesienie własności {path} z {user} nie powiodło się.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Twoje przeniesienie własności {path} na {user} zostało zakończone.",
"The ownership transfer of {path} from {user} has completed." : "Przeniesienie własności {path} z {user} zostało zakończone.",
"in %s" : "w %s",
+ "Transferred from %1$s on %2$s" : "Przeniesiono z %1$s dnia %2$s",
+ "Files compatibility" : "Zgodność plików",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Zezwalaj na ograniczenie nazw plików, aby zapewnić synchronizację plików ze wszystkimi klientami. Domyślnie dozwolone są wszystkie nazwy plików obowiązujące w systemie POSIX (np. Linux lub macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po włączeniu nazw plików zgodnych z systemem Windows, istniejące pliki nie można już modyfikować, ale ich właściciel może zmienić ich nazwy na nowe, prawidłowe.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Możliwe jest również automatyczne migrowanie plików po włączeniu tego ustawienia. Więcej informacji można znaleźć w dokumentacji polecenia occ.",
+ "Enforce Windows compatibility" : "Wymuszaj zgodność z systemem Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Spowoduje to zablokowanie nazw plików nieprawidłowych w systemach Windows, na przykład nazw zastrzeżonych lub znaków specjalnych. Nie wymusi to jednak zgodności z rozróżnianiem wielkości liter.",
"File Management" : "Zarządzanie plikami",
- "Transfer ownership of a file or folder" : "Przenieś własność pliku lub katalogu",
- "Choose file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
- "Change" : "Zmień",
- "New owner" : "Nowy właściciel",
- "Search users" : "Wyszukaj użytkowników",
+ "Home" : "Strona główna",
+ "Target folder does not exist any more" : "Katalog docelowy już nie istnieje",
+ "Reload current directory" : "Przeładuj bieżący katalog",
+ "Go to the \"{dir}\" directory" : "Przejdź do katalogu \"{dir}\"",
+ "Current directory path" : "Obecna ścieżka katalogu",
+ "Your have used your space quota and cannot upload files anymore" : "Wykorzystałeś limit miejsca i nie możesz już wysyłać plików.",
+ "You do not have permission to upload or create files here." : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
+ "Drag and drop files here to upload" : "Przeciągnij i upuść pliki tutaj, aby je przesłać",
+ "Favorite" : "Ulubiony",
+ "Back" : "Poprzednia",
+ "Toggle selection for file \"{displayName}\"" : "Przełącz zaznaczenie dla pliku \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Przełącz zaznaczenie dla katalogu \"{displayName}\"",
+ "File is loading" : "Plik jest wczytywany",
+ "Folder is loading" : "Katalog jest wczytywany",
+ "Filename" : "Nazwa pliku",
+ "Folder name" : "Nazwa katalogu",
+ "This node is unavailable" : "Ten węzeł jest niedostępny",
+ "Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
+ "Invalid filename." : "Nieprawidłowa nazwa pliku.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Zmieniono nazwę \"{oldName}\" na \"{newName}\"",
+ "Rename file" : "Zmień nazwę pliku",
+ "Folder" : "Katalog",
+ "Unknown file type" : "Nieznany typ pliku",
+ "{ext} image" : "{ext} zdjęcie",
+ "{ext} video" : "{ext} wideo",
+ "{ext} audio" : "{ext} dźwiękowy",
+ "{ext} text" : "{ext} tekstowy",
+ "Pending" : "Oczekujące",
+ "Unknown date" : "Nieznana data",
+ "Clear filter" : "Wyczyść filtr",
+ "Modified" : "Zmodyfikowany",
+ "Search everywhere" : "Szukaj wszędzie",
+ "Type" : "Rodzaj",
+ "Active filters" : "Aktywne filtry",
+ "Remove filter" : "Usuń filtr",
+ "Total rows summary" : "Podsumowanie wszystkich wierszy",
+ "Toggle selection for all files and folders" : "Przełącz zaznaczenie dla wszystkich plików i katalogów",
+ "Name" : "Nazwa",
+ "File type" : "Typ pliku",
+ "Size" : "Rozmiar",
+ "{displayName}: failed on some elements" : "{displayName}: niepowodzenie w przypadku niektórych elementów",
+ "{displayName}: done" : "{displayName}: zakończono",
+ "{displayName}: failed" : "{displayName}: niepowodzenie",
+ "Actions" : "Akcje",
+ "(selected)" : "(wybrany)",
+ "List of files and folders." : "Lista plików i katalogów.",
+ "You have used your space quota and cannot upload files anymore." : "Wykorzystałeś limit miejsca i nie możesz już wysyłać plików.",
+ "Column headers with buttons are sortable." : "Nagłówki kolumn z przyciskami są sortowalne.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
+ "File not found" : "Nie odnaleziono pliku",
+ "_{count} selected_::_{count} selected_" : ["wybrano {count}","wybrano {count}","wybrano {count}","wybrano {count}"],
+ "Search everywhere …" : "Szukaj wszędzie…",
+ "Search here …" : "Szukaj tutaj…",
+ "Search scope options" : "Opcje zakresu wyszukiwania",
+ "Search here" : "Szukaj tutaj",
+ "{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
+ "{used} of {quota} used" : "Wykorzystane {used} z {quota}",
+ "{relative}% used" : "Wykorzystano {relative}%",
+ "Could not refresh storage stats" : "Nie można odświeżyć statystyk przechowywania",
+ "Your storage is full, files can not be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
+ "Storage information" : "Informacje o przechowywaniu",
+ "Storage quota" : "Limit przechowywania",
+ "New folder" : "Nowy katalog",
+ "Create new folder" : "Utwórz nowy katalog",
+ "This name is already in use." : "Ta nazwa jest już używana.",
+ "Create" : "Utwórz",
+ "Files starting with a dot are hidden by default" : "Pliki zaczynające się od kropki są domyślnie ukryte",
+ "Fill template fields" : "Wypełnij pola szablonu",
+ "Submitting fields …" : "Wysyłanie pól…",
+ "Submit" : "Wyślij",
"Choose a file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
"Transfer" : "Przenieś",
"Transfer {path} to {userid}" : "Przenieś {path} do {userid}",
"Invalid path selected" : "Wybrano nieprawidłową ścieżkę",
+ "Unknown error" : "Nieznany błąd",
"Ownership transfer request sent" : "Wysłano żądanie przeniesienia własności",
- "Cannot transfer ownership of a file or folder you don't own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem",
+ "Transfer ownership of a file or folder" : "Przenieś własność pliku lub katalogu",
+ "Choose file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
+ "Change" : "Zmień",
+ "New owner" : "Nowy właściciel",
+ "Keep {old}" : "Zachowaj {old}",
+ "Keep without extension" : "Przechowaj bez przedłużania",
+ "Use {new}" : "Użyj {new}",
+ "Remove extension" : "Usuń rozszerzenie",
+ "Change file extension" : "Zmień rozszerzenie pliku",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Zmienienie rozszerzenia pliku z „{old}” na „{new}” może spowodować, że plik będzie nieczytelny.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Usunięcie rozszerzenia pliku „{old}” może spowodować, że plik będzie nieczytelny.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Dodanie rozszerzenia pliku „{new}” może spowodować, że plik będzie nieczytelny.",
+ "Do not show this dialog again." : "Nie pokazuj więcej tego okna dialogowego.",
+ "Select file or folder to link to" : "Wybierz plik lub katalog do linku",
+ "Choose {file}" : "Wybierz {file}",
+ "Share" : "Udostępnij",
+ "Shared by link" : "Udostępnione linkiem",
+ "Shared" : "Udostępnione",
+ "Switch to list view" : "Przełącz na widok listy",
+ "Switch to grid view" : "Przełącz na widok siatki",
+ "The file could not be found" : "Nie można znaleźć pliku",
+ "Upload was cancelled by user" : "Przesyłanie zostało anulowane przez użytkownika",
+ "Not enough free space" : "Za mało wolnego miejsca",
+ "Operation is blocked by access control" : "Operacja jest zablokowana przez kontrolę dostępu",
+ "Error during upload: {message}" : "Błąd podczas wysyłania: {message}",
+ "Error during upload, status code {status}" : "Błąd podczas wysyłania, kod statusu {status}",
+ "Unknown error during upload" : "Nieznany błąd podczas wysyłania",
+ "Loading current folder" : "Wczytywanie bieżącego katalogu",
+ "Retry" : "Powtórz",
+ "No files in here" : "Brak plików",
+ "Upload some content or sync with your devices!" : "Wyślij lub zsynchronizuj pliki z urządzeniami.",
+ "Go back" : "Wstecz",
+ "Views" : "Widoki",
+ "Files settings" : "Ustawienia Plików",
+ "Your files" : "Twoje pliki",
+ "Open in files" : "Otwórz w Plikach",
+ "File cannot be accessed" : "Nie można uzyskać dostępu do pliku",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nie znaleziono pliku lub nie masz uprawnień, aby go wyświetlić. Poproś nadawcę o udostępnienie.",
+ "No search results for “{query}”" : "Brak wyników wyszukiwania dla \"{query}\"",
+ "Search for files" : "Szukaj plików",
+ "Clipboard is not available" : "Schowek jest niedostępny",
+ "WebDAV URL copied" : "Adres URL WebDAV skopiowany",
+ "General" : "Ogólne",
+ "Default view" : "Widok domyślny",
+ "All files" : "Wszystkie pliki",
+ "Personal files" : "Pliki osobiste",
+ "Sort favorites first" : "Najpierw sortuj ulubione",
+ "Sort folders before files" : "Sortuj katalogi przed plikami",
+ "Folder tree" : "Drzewo folderów",
+ "Appearance" : "Wygląd",
+ "Show hidden files" : "Pokaż ukryte pliki",
+ "Show file type column" : "Pokaż kolumnę typu pliku",
+ "Show file extensions" : "Pokaż rozszerzenia plików",
+ "Crop image previews" : "Przytnij podglądy obrazów",
+ "Additional settings" : "Ustawienia dodatkowe",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Kopiuj",
+ "How to access files using WebDAV" : "Jak uzyskać dostęp do plików przez WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uwierzytelnianie dwuskładnikowe jest włączone dla Twojego konta, dlatego musisz użyć hasła aplikacji, aby połączyć zewnętrznego klienta WebDAV.",
+ "Warnings" : "Ostrzeżenie",
+ "Warn before changing a file extension" : "Ostrzegaj przed zmianą rozszerzenia pliku",
+ "Warn before deleting files" : "Ostrzegaj przed usunięciem plików",
+ "Keyboard shortcuts" : "Skróty klawiaturowe",
+ "File actions" : "Akcje na plikach",
+ "Rename" : "Zmień nazwę",
+ "Delete" : "Usuń",
+ "Add or remove favorite" : "Dodaj lub usuń z ulubionych",
+ "Manage tags" : "Zarządzaj etykietami",
+ "Selection" : "Wybór",
+ "Select all files" : "Wybierz wszystkie pliki",
+ "Deselect all" : "Odznacz wszystkie",
+ "Select or deselect" : "Zaznacz lub odznacz",
+ "Select a range" : "Wybierz zakres",
+ "Navigation" : "Nawigacja",
+ "Go to parent folder" : "Przejdź do folderu nadrzędnego",
+ "Go to file above" : "Przejdź do pliku powyżej",
+ "Go to file below" : "Przejdź do pliku poniżej",
+ "Go left in grid" : "Przejdź w lewo w siatce",
+ "Go right in grid" : "Przejdź w prawo w siatce",
+ "View" : "Podgląd",
+ "Toggle grid view" : "Przełącz widok siatki",
+ "Open file sidebar" : "Otwórz panel boczny pliku",
+ "Show those shortcuts" : "Pokaż te skróty",
+ "You" : "Ty",
+ "Shared multiple times with different people" : "Udostępniony wiele razy różnym osobom",
+ "Unable to change the favorite state of the file" : "Nie można zmienić ulubionego stanu pliku",
+ "Error while loading the file data" : "Błąd podczas wczytywania danych pliku",
+ "Owner" : "Właściciel",
+ "Remove from favorites" : "Usuń z ulubionych",
+ "Add to favorites" : "Dodaj do ulubionych",
"Tags" : "Etykiety",
- "Unable to change the favourite state of the file" : "Nie można zmienić ulubionego stanu pliku",
- "Error while loading the file data" : "Błąd podczas ładowania danych pliku",
+ "Blank" : "Pusty",
+ "Unable to create new file from template" : "Nie można utworzyć nowego pliku z szablonu",
"Pick a template for {name}" : "Wybierz szablon dla {name}",
- "Cancel" : "Anuluj",
- "Create" : "Utwórz",
"Create a new file with the selected template" : "Utwórz nowy plik z wybranym szablonem",
"Creating file" : "Tworzenie pliku",
- "Blank" : "Pusty",
- "Unable to create new file from template" : "Nie można utworzyć nowego pliku z szablonu",
- "Set up templates folder" : "Skonfiguruj katalog szablonów",
- "Templates" : "Szablony",
+ "Save as {displayName}" : "Zapisz jako {displayName}",
+ "Save as …" : "Zapisz jako…",
+ "Converting files …" : "Konwertowanie plików…",
+ "Failed to convert files: {message}" : "Nie udało się przekonwertować plików: {message}",
+ "All files failed to be converted" : "Nie udało się przekonwertować żadnego pliku",
+ "One file could not be converted: {message}" : "Jednego pliku nie można przekonwertować: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Nie można przekonwertować jednego pliku","Nie można przekonwertować %n plików","Nie można przekonwertować %n plików","Nie można przekonwertować %n plików"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Pomyślnie przekonwertowany jeden plik","Pomyślnie przekonwertowane %n pliki","Pomyślnie przekonwertowanych %n plików","Pomyślnie przekonwertowanych %n plików"],
+ "Files successfully converted" : "Pliki zostały pomyślnie przekonwertowane",
+ "Failed to convert files" : "Nie udało się przekonwertować plików",
+ "Converting file …" : "Konwertowanie plików…",
+ "File successfully converted" : "Plik pomyślnie przekonwertowany",
+ "Failed to convert file: {message}" : "Nie udało się przekonwertować pliku: {message}",
+ "Failed to convert file" : "Nie udało się przekonwertować pliku",
+ "Leave this share" : "Opuść te udostępnienie",
+ "Leave these shares" : "Opuść udostępnienia",
+ "Disconnect storage" : "Odłącz magazyn",
+ "Disconnect storages" : "Odłącz magazyny",
+ "Delete permanently" : "Usuń bezpowrotnie",
+ "Delete and unshare" : "Usuń i przestań udostępniać",
+ "Delete file" : "Usuń plik",
+ "Delete files" : "Usuń pliki",
+ "Delete folder" : "Usuń katalog",
+ "Delete folders" : "Usuń katalogi",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Zamierzasz trwale usunąć {count} element","Zamierzasz trwale usunąć {count} elementy","Zamierzasz trwale usunąć {count} elementów","Zamierzasz trwale usunąć {count} elementów"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Zamierzasz usunąć {count} element","Zamierzasz usunąć {count} elementy","Zamierzasz usunąć {count} elementów","Zamierzasz usunąć {count} elementów"],
+ "Confirm deletion" : "Potwierdź usunięcie",
+ "Cancel" : "Anuluj",
+ "Download" : "Pobierz",
+ "Moving \"{source}\" to \"{destination}\" …" : "Przenoszenie „{source}” do „{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiowanie „{source}” do „{destination}”…",
+ "Destination is not a folder" : "Miejsce docelowe nie jest katalogiem",
+ "This file/folder is already in that directory" : "Ten plik/katalog znajduje się już w tym katalogu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nie można przenieść pliku/katalogu do tego samego katalogu lub do własnego podkatalogu",
+ "(copy)" : "(kopiuj)",
+ "(copy %n)" : "(kopiuj %n)",
+ "A file or folder with that name already exists in this folder" : "Plik lub katalog o tej nazwie już istnieje w tym katalogu",
+ "The files are locked" : "Pliki są zablokowane",
+ "The file does not exist anymore" : "Plik już nie istnieje",
+ "Choose destination" : "Wybierz miejsce docelowe",
+ "Copy to {target}" : "Skopiuj do {target}",
+ "Move to {target}" : "Przenieś do {target}",
+ "Move" : "Przenieś",
+ "Move or copy operation failed" : "Operacja przenoszenia lub kopiowania nie powiodła się",
+ "Move or copy" : "Przenieś lub kopiuj",
+ "Open folder {displayName}" : "Otwórz katalog {displayName}",
+ "Open in Files" : "Otwórz w Plikach",
+ "Open locally" : "Otwórz lokalnie",
+ "Failed to redirect to client" : "Nie udało się przekierować do klienta",
+ "Open file locally" : "Otwórz plik lokalnie",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Plik powinien teraz otworzyć się na Twoim urządzeniu. Jeśli tak się nie stanie, sprawdź, czy masz zainstalowaną aplikację komputerową.",
+ "Retry and close" : "Spróbuj ponownie i zamknij",
+ "Open online" : "Otwórz online",
+ "Details" : "Szczegóły",
+ "View in folder" : "Zobacz w katalogu",
+ "Today" : "Dzisiaj",
+ "Last 7 days" : "Ostatnie 7 dni",
+ "Last 30 days" : "Ostatnie 30 dni",
+ "This year ({year})" : "W tym roku ({year})",
+ "Last year ({year})" : "Ostatni rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Arkusze kalkulacyjne",
+ "Presentations" : "Prezentacje",
+ "PDFs" : "PDFy",
+ "Folders" : "Katalogi",
+ "Audio" : "Dźwięk",
+ "Images" : "Obrazy",
+ "Videos" : "Filmy",
+ "Created new folder \"{name}\"" : "Utworzono nowy katalog \"{name}\"",
"Unable to initialize the templates directory" : "Nie można zainicjować katalogu szablonów",
- "%s used" : "Wykorzystane: %s",
- "%s%% of %s used" : "Wykorzystane: %s%% z %s",
- "%1$s of %2$s used" : "Wykorzystane: %1$s z %2$s",
- "Settings" : "Ustawienia",
- "Show hidden files" : "Pokaż ukryte pliki",
- "Crop image previews" : "Przytnij podglądy obrazów",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
- "Toggle %1$s sublist" : "Przełącz podlistę %1$s",
- "Toggle grid view" : "Przełącz widok siatki",
- "No files in here" : "Brak plików",
- "Upload some content or sync with your devices!" : "Wyślij lub zsynchronizuj pliki z urządzeniami.",
+ "Create templates folder" : "Utwórz katalog szablonów",
+ "Templates" : "Szablony",
+ "New template folder" : "Nowy katalog szablonów",
+ "In folder" : "W katalogu",
+ "Search in all files" : "Szukaj we wszystkich plikach",
+ "Search in folder: {folder}" : "Szukaj w katalogu: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z upuszczonych plików nie mógł być przetworzony",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Twoja przeglądarka nie obsługuje interfejsu API systemu plików. Katalogi nie zostaną przesłane",
+ "No files to upload" : "Brak plików do przesłania",
+ "Unable to create the directory {directory}" : "Nie można utworzyć katalogu {directory}",
+ "Some files could not be uploaded" : "Nie udało się wysłać niektórych plików",
+ "Files uploaded successfully" : "Pliki przesłane pomyślnie",
+ "No files to process" : "Brak plików do przetworzenia",
+ "Some files could not be copied" : "Nie udało się skopiować niektórych plików",
+ "Some files could not be moved" : "Niektóre pliki nie mogły zostać przeniesione",
+ "Files copied successfully" : "Pliki skopiowane pomyślnie",
+ "Files moved successfully" : "Pliki zostały przeniesione pomyślnie",
+ "Conflicts resolution skipped" : "Pominięto rozwiązywanie konfliktów",
+ "Upload cancelled" : "Anulowano przesyłanie",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nie można zmienić nazwy \"{oldName}\", już nie istnieje",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{newName}\" jest już używana w katalogu \"{dir}\". Wybierz inną nazwę.",
+ "Could not rename \"{oldName}\"" : "Nie można zmienić nazwy \"{oldName}\"",
+ "This operation is forbidden" : "Ta operacja jest niedozwolona",
+ "This folder is unavailable, please try again later or contact the administration" : "Ten folder jest niedostępny, spróbuj ponownie później lub skontaktuj się z administracją",
+ "Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
+ "Unexpected error: {error}" : "Nieoczekiwany błąd: {error}",
+ "_%n file_::_%n files_" : ["%n plik","%n pliki","%n plików","%n plików"],
+ "_%n folder_::_%n folders_" : ["%n katalog","%n katalogi","%n katalogów","%n katalogów"],
+ "_%n hidden_::_%n hidden_" : ["%n ukryty","%n ukryte","%n ukrytych","%n ukrytych"],
+ "Filename must not be empty." : "Nazwa pliku nie może być pusta.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}” nie jest dozwolone w nazwie pliku.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}” jest nazwą zastrzeżoną i nie jest dozwolona w przypadku nazw plików.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}” nie jest dozwolonym typem pliku.",
+ "Filenames must not end with \"{extension}\"." : "Nazwy plików nie mogą kończyć się na „{extension}”.",
+ "List of favorite files and folders." : "Lista ulubionych plików i katalogów.",
+ "No favorites yet" : "Brak ulubionych",
+ "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj",
+ "List of your files and folders." : "Lista Twoich plików i katalogów.",
+ "List of your files and folders that are not shared." : "Lista twoich plików i katalogów, które nie są udostępniane",
+ "No personal files found" : "Nie znaleziono plików osobistych",
+ "Files that are not shared will show up here." : "Tutaj pojawią się pliki, które nie są udostępniane.",
+ "Recent" : "Ostatnie",
+ "List of recently modified files and folders." : "Lista ostatnio zmodyfikowanych plików i katalogów.",
+ "No recently modified files" : "Brak ostatnio zmodyfikowanych plików",
+ "Files and folders you recently modified will show up here." : "Tutaj pojawią się pliki i katalogi, które ostatnio zmodyfikowałeś.",
+ "Search" : "Szukaj",
+ "Search results within your files." : "Wyniki wyszukiwania w Twoich plikach.",
"No entries found in this folder" : "Brak wpisów w tym katalogu",
"Select all" : "Wybierz wszystko",
"Upload too large" : "Wysyłany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz wysłać, przekraczają maksymalną dopuszczalną wielkość.",
- "No favorites yet" : "Brak ulubionych",
- "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj",
- "Deleted files" : "Usunięte pliki",
- "Shares" : "Udostępnione",
- "Shared with others" : "Udostępnione innym",
- "Shared with you" : "Udostępnione dla Ciebie",
- "Shared by link" : "Udostępnione linkiem",
- "Deleted shares" : "Usunięte udostępnienia",
- "Pending shares" : "Oczekujące udostępnienia",
+ "File could not be found" : "Nie można znaleźć pliku",
+ "Show list view" : "Pokaż widok listy",
+ "Show grid view" : "Pokaż widok siatki",
+ "Close" : "Zamknij",
+ "Could not create folder \"{dir}\"" : "Nie można utworzyć katalogu \"{dir}\"",
+ "This will stop your current uploads." : "Spowoduje to zatrzymanie wysyłania plików.",
+ "Upload cancelled." : "Wysyłanie anulowane.",
+ "Processing files …" : "Przetwarzanie plików…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można wysłać {filename} być może jest katalogiem lub posiada 0 bajtów",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, wysyłasz {size1} a pozostało tylko {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Katalog docelowy \"{dir}\" już nie istnieje",
+ "An unknown error has occurred" : "Wystąpił nieznany błąd",
+ "File could not be uploaded" : "Nie można przesłać pliku",
+ "Uploading …" : "Wysyłanie…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Wysyłanie… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Wysyłanie tego elementu nie jest wspierane",
+ "Error when assembling chunks, status code {status}" : "Błąd podczas łączenia fragmentów, kod statusu {status}",
+ "Choose target folder" : "Wybierz katalog docelowy",
+ "Set reminder" : "Ustaw przypomnienie",
+ "Edit locally" : "Edytuj lokalnie",
+ "Open" : "Otwórz",
+ "Could not load info for file \"{file}\"" : "Nie można załadować informacji o pliku \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Wybierz etykietę(y) do dodania dla zaznaczenia",
+ "Apply tag(s) to selection" : "Zastosuj etykietę(y) dla zaznaczenia",
+ "Select directory \"{dirName}\"" : "Wybierz katalog \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Wybierz plik \"{fileName}\"",
+ "Unable to determine date" : "Nie można ustalić daty",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ten katalog jest niedostępny, sprawdź logi lub skontaktuj się z administratorem",
+ "Could not move \"{file}\", target exists" : "Nie można przenieść \"{file}\" - plik o takiej nazwie już istnieje",
+ "Could not move \"{file}\"" : "Nie można przenieść \"{file}\"",
+ "copy" : "kopia",
+ "Could not copy \"{file}\", target exists" : "Nie można skopiować \"{file}\", plik już istnieje",
+ "Could not copy \"{file}\"" : "Nie można skopiować \"{file}\"",
+ "Copied {origin} inside {destination}" : "Skopiowano {origin} wewnątrz {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopiowano {origin} oraz {nbfiles} innych plików wewnątrz {destination}",
+ "{newName} already exists" : "{newName} już istnieje",
+ "Could not create file \"{file}\"" : "Nie można utworzyć pliku \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nie można utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
+ "Could not create folder \"{dir}\" because it already exists" : "Nie można utworzyć katalogu \"{dir}\", ponieważ już istnieje",
+ "Could not fetch file details \"{file}\"" : "Nie można pobrać szczegółów pliku \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Błąd podczas usuwania pliku \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Brak wyników wyszukiwania w innych katalogach dla {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Wprowadź więcej niż dwa znaki, aby przeszukać inne katalogi",
+ "{dirs} and {files}" : "{dirs} i {files}",
+ "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"],
+ "You do not have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
+ "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"],
+ "New" : "Nowy",
+ "New file/folder menu" : "Nowe menu plików/katalogów",
+ "Select file range" : "Wybierz zakres plików",
+ "{used}%" : "{used}%",
+ "{used} used" : "Wykorzystane {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" jest nieprawidłową nazwą pliku.",
+ "File name cannot be empty." : "Nazwa pliku nie może być pusta.",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" jest niedozwolony w nazwie pliku.",
+ "\"{name}\" is not an allowed filetype" : "typ pliku \"{name}\" jest niedozwolony",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Magazyn zewnętrzny \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Magazyn dla {owner} jest pawie pełny ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Katalog grupowy \"{mountPoint}\" jest prawie pełny ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Pamięć zewnętrzna \"{mountPoint}\" jest prawie pełna ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Twój magazyn jest prawie pełny ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["pasuje do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Bezpośredni link został skopiowany (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
+ "Path" : "Ścieżka",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów","%n bajtów"],
+ "Favored" : "Polubione",
+ "Favor" : "Polub",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Skopiuj bezpośredni link (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
+ "Upload file" : "Wyślij plik",
+ "Not favored" : "Nie polubiono",
+ "An error occurred while trying to update the tags" : "Wystąpił błąd podczas próby aktualizacji etykiet",
+ "Upload (max. %s)" : "Wysyłanie (maks. %s)",
+ "\"{displayName}\" action executed successfully" : "Akcja \"{displayName}\" została wykonana pomyślnie",
+ "\"{displayName}\" action failed" : "Akcja \"{displayName}\" nie powiodła się",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" nie powiodło się w niektórych elementach",
+ "\"{displayName}\" batch action executed successfully" : "Akcja wsadowa \"{displayName}\" została wykonana pomyślnie",
+ "Submitting fields…" : "Przesyłanie pól…",
+ "Filter filenames…" : "Filtruj nazwy plików…",
+ "WebDAV URL copied to clipboard" : "Adres URL WebDAV skopiowany do schowka",
+ "Enable the grid view" : "Włącz widok siatki",
+ "Enable folder tree" : "Włącz drzewo katalogów",
+ "Copy to clipboard" : "Kopiuj do schowka",
+ "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
+ "Deletion cancelled" : "Usuwanie anulowane",
+ "Move cancelled" : "Przenoszenie anulowane",
+ "Cancelled move or copy of \"{filename}\"." : "Anulowano przeniesienie lub kopiowanie „{filename}”.",
+ "Cancelled move or copy operation" : "Anulowano operację przenoszenia lub kopiowania",
+ "Open details" : "Otwórz szczegóły",
+ "Photos and images" : "Zdjęcia i obrazy",
+ "New folder creation cancelled" : "Tworzenie nowego katalogu zostało anulowane",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} katalog","{folderCount} katalogi","{folderCount} katalogów","{folderCount} katalogów"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} plik","{fileCount} pliki","{fileCount} plików","{fileCount} plików"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 plik i {folderCount} katalog","1 plik i {folderCount} katalogi","1 plik i {folderCount} katalogów","1 plik i {folderCount} katalogów"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} plik i 1 katalog","{fileCount} pliki i 1 katalog","{fileCount} plików i 1 katalog","{fileCount} plików i 1 katalog"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} plików i {folderCount} katalogów",
+ "All folders" : "Wszystkie katalogi",
+ "Personal Files" : "Pliki osobiste",
"Text file" : "Plik tekstowy",
"New text file.txt" : "Nowy plik tekstowy.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Pamięć zewnętrzna \"{mountPoint}\" jest pełna. Nie można już aktualizować ani synchronizować plików!",
- "Your storage is full, files can not be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
- "_matches '{filter}'_::_match '{filter}'_" : ["pasujący '{filter}'","pasujące '{filter}'","pasujących '{filter}'","pasujących '{filter}'"]
+ "%1$s (renamed)" : "%1$s (zmieniona nazwa)",
+ "renamed file" : "zmieniona nazwa pliku",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po włączeniu nazw plików zgodnych z systemem Windows, istniejących plików nie można już modyfikować, ale ich właściciel może zmienić ich nazwy na nowe, prawidłowe.",
+ "Filter file names …" : "Filtruj nazwy plików…",
+ "Prevent warning dialogs from open or reenable them." : "Zapobiegaj otwieraniu okien dialogowych z ostrzeżeniami lub włącz je ponownie.",
+ "Show a warning dialog when changing a file extension." : "Pokaż okno dialogowe z ostrzeżeniem przy zmianie rozszerzenia pliku.",
+ "Speed up your Files experience with these quick shortcuts." : "Przyspiesz korzystanie z Plików dzięki tym szybkim skrótom.",
+ "Open the actions menu for a file" : "Otwórz menu akcji dla pliku",
+ "Rename a file" : "Zmień nazwę",
+ "Delete a file" : "Usuń plik",
+ "Favorite or remove a file from favorites" : "Dodaj plik do ulubionych lub usuń go z ulubionych",
+ "Manage tags for a file" : "Zarządzanie etykietami pliku",
+ "Deselect all files" : "Odznacz wszystkie pliki",
+ "Select or deselect a file" : "Wybierz lub odznacz plik",
+ "Select a range of files" : "Wybierz zakres plików",
+ "Navigate to the parent folder" : "Przejdź do katalogu nadrzędnego",
+ "Navigate to the file above" : "Przejdź do pliku powyżej",
+ "Navigate to the file below" : "Przejdź do pliku poniżej",
+ "Navigate to the file on the left (in grid mode)" : "Przejdź do pliku po lewej stronie (w trybie siatki)",
+ "Navigate to the file on the right (in grid mode)" : "Przejdź do pliku po prawej stronie (w trybie siatki)",
+ "Toggle the grid view" : "Przełącz widok siatki",
+ "Open the sidebar for a file" : "Otwórz pasek boczny dla pliku"
},
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index a24d8fe97c1..eba17ba16a9 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
- "Storage invalid" : "Nieprawidłowy magazyn",
- "Unknown error" : "Nieznany błąd",
- "File could not be found" : "Nie można znaleźć pliku",
- "Move or copy" : "Przenieś lub kopiuj",
- "Download" : "Pobierz",
- "Delete" : "Usuń",
- "Home" : "Strona główna",
- "Close" : "Zamknij",
- "Favorites" : "Ulubione",
- "Could not create folder \"{dir}\"" : "Nie można utworzyć katalogu \"{dir}\"",
- "This will stop your current uploads." : "Spowoduje to zatrzymanie wysyłania plików.",
- "Upload cancelled." : "Wysyłanie anulowane.",
- "Processing files …" : "Przetwarzam pliki…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można wysłać {filename} być może jest katalogiem lub posiada 0 bajtów",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, wysyłasz {size1} a pozostało tylko {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Katalog docelowy \"{dir}\" już nie istnieje",
- "Not enough free space" : "Za mało wolnego miejsca",
- "An unknown error has occurred" : "Wystąpił nieznany błąd",
- "Uploading …" : "Wysyłanie…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Wysyłanie tego elementu nie jest wspierane",
- "Target folder does not exist any more" : "Katalog docelowy już nie istnieje",
- "Operation is blocked by access control" : "Operacja jest zablokowana przez kontrolę dostępu",
- "Error when assembling chunks, status code {status}" : "Błąd podczas łączenia fragmentów, kod statusu {status}",
- "Actions" : "Akcje",
- "Rename" : "Zmień nazwę",
- "Copy" : "Kopiuj",
- "Choose target folder" : "Wybierz katalog docelowy",
- "Open" : "Otwórz",
- "Delete file" : "Usuń plik",
- "Delete folder" : "Usuń katalog",
- "Disconnect storage" : "Odłącz magazyn",
- "Leave this share" : "Opuść udostępnienie",
- "Could not load info for file \"{file}\"" : "Nie można załadować informacji o pliku \"{file}\"",
- "Files" : "Pliki",
- "Details" : "Szczegóły",
- "Please select tag(s) to add to the selection" : "Wybierz etykietę(y) do dodania dla zaznaczenia",
- "Apply tag(s) to selection" : "Zastosuj etykietę(y) dla zaznaczenia",
- "Select" : "Wybierz",
- "Pending" : "Oczekujące",
- "Unable to determine date" : "Nie można ustalić daty",
- "This operation is forbidden" : "Ta operacja jest niedozwolona",
- "This directory is unavailable, please check the logs or contact the administrator" : "Ten katalog jest niedostępny, sprawdź logi lub skontaktuj się z administratorem",
- "Could not move \"{file}\", target exists" : "Nie można przenieść \"{file}\" - plik o takiej nazwie już istnieje",
- "Could not move \"{file}\"" : "Nie można przenieść \"{file}\"",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Nie można skopiować \"{file}\", plik już istnieje",
- "Could not copy \"{file}\"" : "Nie można skopiować \"{file}\"",
- "Copied {origin} inside {destination}" : "Skopiowano {origin} wewnątrz {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopiowano {origin} oraz {nbfiles} innych plików wewnątrz {destination}",
- "{newName} already exists" : "{newName} już istnieje",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nie można zmienić nazwy \"{fileName}\", plik już nie istnieje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{targetName}\" jest już używana w katalogu \"{dir}\". Wybierz inną nazwę.",
- "Could not rename \"{fileName}\"" : "Nie można zmienić nazwy \"{fileName}\"",
- "Could not create file \"{file}\"" : "Nie można utworzyć pliku \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nie można utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
- "Could not create folder \"{dir}\" because it already exists" : "Nie można utworzyć katalogu \"{dir}\", ponieważ już istnieje",
- "Could not fetch file details \"{file}\"" : "Nie można pobrać szczegółów pliku \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Błąd podczas usuwania pliku \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Brak wyników wyszukiwania w innych katalogach dla {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Wprowadź więcej niż dwa znaki, aby przeszukać inne katalogi",
- "Name" : "Nazwa",
- "Size" : "Rozmiar",
- "Modified" : "Zmodyfikowany",
- "_%n folder_::_%n folders_" : ["%n katalog","%n katalogi","%n katalogów","%n katalogów"],
- "_%n file_::_%n files_" : ["%n plik","%n pliki","%n plików","%n plików"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"],
- "You don’t have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
- "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"],
- "New" : "Nowy",
- "Select file range" : "Wybierz zakres plików",
- "{used} of {quota} used" : "Wykorzystane {used} z {quota}",
- "{used} used" : "Wykorzystane {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" jest nieprawidłową nazwą pliku.",
- "File name cannot be empty." : "Nazwa pliku nie może być pusta.",
- "\"/\" is not allowed inside a file name." : "Znak \"/\" jest niedozwolony w nazwie pliku.",
- "\"{name}\" is not an allowed filetype" : "typ pliku \"{name}\" jest niedozwolony",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Magazyn zewnętrzny \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Magazyn dla {owner} jest pawie pełny ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Katalog grupowy \"{mountPoint}\" jest prawie pełny ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Pamięć zewnętrzna \"{mountPoint}\" jest prawie pełna ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Twój magazyn jest prawie pełny ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["pasuje do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\""],
- "View in folder" : "Zobacz w katalogu",
- "Copied!" : "Skopiowano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Skopiuj bezpośredni link (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
- "Path" : "Ścieżka",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów","%n bajtów"],
- "Favorited" : "Ulubiony",
- "Favorite" : "Ulubione",
- "You can only favorite a single file or folder at a time" : "Możesz dodać do ulubionych tylko pojedynczy plik lub katalog",
- "New folder" : "Nowy katalog",
- "Upload file" : "Wyślij plik",
- "Recent" : "Ostatnie",
- "Not favorited" : "Wyłączone z ulubionych",
- "Remove from favorites" : "Usuń z ulubionych",
- "Add to favorites" : "Dodaj do ulubionych",
- "An error occurred while trying to update the tags" : "Wystąpił błąd podczas próby aktualizacji etykiet",
"Added to favorites" : "Dodano do ulubionych",
"Removed from favorites" : "Usunięto z ulubionych",
"You added {file} to your favorites" : "Dodałeś {file} do ulubionych",
"You removed {file} from your favorites" : "Usunąłeś {file} z ulubionych",
+ "Favorites" : "Ulubione",
"File changes" : "Zmiany w plikach",
"Created by {user}" : "Utworzone przez {user}",
"Changed by {user}" : "Zmienione przez {user}",
@@ -114,10 +11,10 @@
"Restored by {user}" : "Przywrócone przez {user}",
"Renamed by {user}" : "Zmienione przez {user}",
"Moved by {user}" : "Przeniesione przez {user}",
- "\"remote user\"" : "\"użytkownik zdalny\"",
- "You created {file}" : "Utworzy‭łeś {file}",
+ "\"remote account\"" : "\"zdalne konto\"",
+ "You created {file}" : "Utworzyłeś {file}",
"You created an encrypted file in {file}" : "Stworzyłeś zaszyfrowany plik w {file}",
- "{user} created {file}" : "{user} utworzy‭ł {file}",
+ "{user} created {file}" : "{user} utworzył {file}",
"{user} created an encrypted file in {file}" : "{user} utworzył zaszyfrowany plik w {file}",
"{file} was created in a public folder" : "{file} został utworzony w katalogu publicznym",
"You changed {file}" : "Zmieniłeś {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Przeniosłeś {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} przeniósł {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Plik został dodany lub usunięty z <strong>ulubionych</strong>",
+ "Files" : "Pliki",
"A file or folder has been <strong>changed</strong>" : "Plik lub katalog został <strong>zmieniony</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Ulubiony plik lub katalog został <strong>zmieniony</strong>",
- "All files" : "Wszystkie pliki",
- "Unlimited" : "Brak limitu",
- "Upload (max. %s)" : "Wysyłanie (maks. %s)",
+ "Failed to authorize" : "Błąd autoryzacji",
+ "Invalid folder path" : "Nieprawidłowa ścieżka katalogu",
+ "Folder not found" : "Nie znaleziono katalogu",
+ "The file cannot be found" : "Nie można znaleźć pliku",
+ "The destination path does not exist: %1$s" : "Ścieżka docelowa nie istnieje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nie masz uprawnień do utworzenia pliku w określonej lokalizacji",
+ "The file could not be converted." : "Nie udało się przekonwertować pliku.",
+ "Could not get relative path to converted file" : "Nie można uzyskać ścieżki względnej do przekonwertowanego pliku",
+ "Favorite files" : "Ulubione pliki",
+ "No favorites" : "Brak ulubionych",
+ "More favorites" : "Więcej ulubionych",
"Accept" : "Akceptuj",
"Reject" : "Odrzuć",
"Incoming ownership transfer from {user}" : "Przychodzące przeniesienie własności od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Czy chcesz zaakceptować {path}\n\nUwaga: Proces transferu po zaakceptowaniu może potrwać do 1 godziny.",
+ "Ownership transfer denied" : "Odmowa przeniesienia własności",
+ "Your ownership transfer of {path} was denied by {user}." : "Twoje przeniesienie własności {path} zostało odrzucone przez {user}.",
"Ownership transfer failed" : "Przeniesienie własności nie powiodło się",
"Your ownership transfer of {path} to {user} failed." : "Twoje przeniesienie własności {path} na {user} nie powiodło się.",
"The ownership transfer of {path} from {user} failed." : "Przeniesienie własności {path} z {user} nie powiodło się.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Twoje przeniesienie własności {path} na {user} zostało zakończone.",
"The ownership transfer of {path} from {user} has completed." : "Przeniesienie własności {path} z {user} zostało zakończone.",
"in %s" : "w %s",
+ "Transferred from %1$s on %2$s" : "Przeniesiono z %1$s dnia %2$s",
+ "Files compatibility" : "Zgodność plików",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Zezwalaj na ograniczenie nazw plików, aby zapewnić synchronizację plików ze wszystkimi klientami. Domyślnie dozwolone są wszystkie nazwy plików obowiązujące w systemie POSIX (np. Linux lub macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po włączeniu nazw plików zgodnych z systemem Windows, istniejące pliki nie można już modyfikować, ale ich właściciel może zmienić ich nazwy na nowe, prawidłowe.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Możliwe jest również automatyczne migrowanie plików po włączeniu tego ustawienia. Więcej informacji można znaleźć w dokumentacji polecenia occ.",
+ "Enforce Windows compatibility" : "Wymuszaj zgodność z systemem Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Spowoduje to zablokowanie nazw plików nieprawidłowych w systemach Windows, na przykład nazw zastrzeżonych lub znaków specjalnych. Nie wymusi to jednak zgodności z rozróżnianiem wielkości liter.",
"File Management" : "Zarządzanie plikami",
- "Transfer ownership of a file or folder" : "Przenieś własność pliku lub katalogu",
- "Choose file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
- "Change" : "Zmień",
- "New owner" : "Nowy właściciel",
- "Search users" : "Wyszukaj użytkowników",
+ "Home" : "Strona główna",
+ "Target folder does not exist any more" : "Katalog docelowy już nie istnieje",
+ "Reload current directory" : "Przeładuj bieżący katalog",
+ "Go to the \"{dir}\" directory" : "Przejdź do katalogu \"{dir}\"",
+ "Current directory path" : "Obecna ścieżka katalogu",
+ "Your have used your space quota and cannot upload files anymore" : "Wykorzystałeś limit miejsca i nie możesz już wysyłać plików.",
+ "You do not have permission to upload or create files here." : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
+ "Drag and drop files here to upload" : "Przeciągnij i upuść pliki tutaj, aby je przesłać",
+ "Favorite" : "Ulubiony",
+ "Back" : "Poprzednia",
+ "Toggle selection for file \"{displayName}\"" : "Przełącz zaznaczenie dla pliku \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Przełącz zaznaczenie dla katalogu \"{displayName}\"",
+ "File is loading" : "Plik jest wczytywany",
+ "Folder is loading" : "Katalog jest wczytywany",
+ "Filename" : "Nazwa pliku",
+ "Folder name" : "Nazwa katalogu",
+ "This node is unavailable" : "Ten węzeł jest niedostępny",
+ "Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
+ "Invalid filename." : "Nieprawidłowa nazwa pliku.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Zmieniono nazwę \"{oldName}\" na \"{newName}\"",
+ "Rename file" : "Zmień nazwę pliku",
+ "Folder" : "Katalog",
+ "Unknown file type" : "Nieznany typ pliku",
+ "{ext} image" : "{ext} zdjęcie",
+ "{ext} video" : "{ext} wideo",
+ "{ext} audio" : "{ext} dźwiękowy",
+ "{ext} text" : "{ext} tekstowy",
+ "Pending" : "Oczekujące",
+ "Unknown date" : "Nieznana data",
+ "Clear filter" : "Wyczyść filtr",
+ "Modified" : "Zmodyfikowany",
+ "Search everywhere" : "Szukaj wszędzie",
+ "Type" : "Rodzaj",
+ "Active filters" : "Aktywne filtry",
+ "Remove filter" : "Usuń filtr",
+ "Total rows summary" : "Podsumowanie wszystkich wierszy",
+ "Toggle selection for all files and folders" : "Przełącz zaznaczenie dla wszystkich plików i katalogów",
+ "Name" : "Nazwa",
+ "File type" : "Typ pliku",
+ "Size" : "Rozmiar",
+ "{displayName}: failed on some elements" : "{displayName}: niepowodzenie w przypadku niektórych elementów",
+ "{displayName}: done" : "{displayName}: zakończono",
+ "{displayName}: failed" : "{displayName}: niepowodzenie",
+ "Actions" : "Akcje",
+ "(selected)" : "(wybrany)",
+ "List of files and folders." : "Lista plików i katalogów.",
+ "You have used your space quota and cannot upload files anymore." : "Wykorzystałeś limit miejsca i nie możesz już wysyłać plików.",
+ "Column headers with buttons are sortable." : "Nagłówki kolumn z przyciskami są sortowalne.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
+ "File not found" : "Nie odnaleziono pliku",
+ "_{count} selected_::_{count} selected_" : ["wybrano {count}","wybrano {count}","wybrano {count}","wybrano {count}"],
+ "Search everywhere …" : "Szukaj wszędzie…",
+ "Search here …" : "Szukaj tutaj…",
+ "Search scope options" : "Opcje zakresu wyszukiwania",
+ "Search here" : "Szukaj tutaj",
+ "{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
+ "{used} of {quota} used" : "Wykorzystane {used} z {quota}",
+ "{relative}% used" : "Wykorzystano {relative}%",
+ "Could not refresh storage stats" : "Nie można odświeżyć statystyk przechowywania",
+ "Your storage is full, files can not be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
+ "Storage information" : "Informacje o przechowywaniu",
+ "Storage quota" : "Limit przechowywania",
+ "New folder" : "Nowy katalog",
+ "Create new folder" : "Utwórz nowy katalog",
+ "This name is already in use." : "Ta nazwa jest już używana.",
+ "Create" : "Utwórz",
+ "Files starting with a dot are hidden by default" : "Pliki zaczynające się od kropki są domyślnie ukryte",
+ "Fill template fields" : "Wypełnij pola szablonu",
+ "Submitting fields …" : "Wysyłanie pól…",
+ "Submit" : "Wyślij",
"Choose a file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
"Transfer" : "Przenieś",
"Transfer {path} to {userid}" : "Przenieś {path} do {userid}",
"Invalid path selected" : "Wybrano nieprawidłową ścieżkę",
+ "Unknown error" : "Nieznany błąd",
"Ownership transfer request sent" : "Wysłano żądanie przeniesienia własności",
- "Cannot transfer ownership of a file or folder you don't own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nie można przenieść prawa własności do pliku lub katalogu, którego nie jesteś właścicielem",
+ "Transfer ownership of a file or folder" : "Przenieś własność pliku lub katalogu",
+ "Choose file or folder to transfer" : "Wybierz plik lub katalog do przeniesienia",
+ "Change" : "Zmień",
+ "New owner" : "Nowy właściciel",
+ "Keep {old}" : "Zachowaj {old}",
+ "Keep without extension" : "Przechowaj bez przedłużania",
+ "Use {new}" : "Użyj {new}",
+ "Remove extension" : "Usuń rozszerzenie",
+ "Change file extension" : "Zmień rozszerzenie pliku",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Zmienienie rozszerzenia pliku z „{old}” na „{new}” może spowodować, że plik będzie nieczytelny.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Usunięcie rozszerzenia pliku „{old}” może spowodować, że plik będzie nieczytelny.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Dodanie rozszerzenia pliku „{new}” może spowodować, że plik będzie nieczytelny.",
+ "Do not show this dialog again." : "Nie pokazuj więcej tego okna dialogowego.",
+ "Select file or folder to link to" : "Wybierz plik lub katalog do linku",
+ "Choose {file}" : "Wybierz {file}",
+ "Share" : "Udostępnij",
+ "Shared by link" : "Udostępnione linkiem",
+ "Shared" : "Udostępnione",
+ "Switch to list view" : "Przełącz na widok listy",
+ "Switch to grid view" : "Przełącz na widok siatki",
+ "The file could not be found" : "Nie można znaleźć pliku",
+ "Upload was cancelled by user" : "Przesyłanie zostało anulowane przez użytkownika",
+ "Not enough free space" : "Za mało wolnego miejsca",
+ "Operation is blocked by access control" : "Operacja jest zablokowana przez kontrolę dostępu",
+ "Error during upload: {message}" : "Błąd podczas wysyłania: {message}",
+ "Error during upload, status code {status}" : "Błąd podczas wysyłania, kod statusu {status}",
+ "Unknown error during upload" : "Nieznany błąd podczas wysyłania",
+ "Loading current folder" : "Wczytywanie bieżącego katalogu",
+ "Retry" : "Powtórz",
+ "No files in here" : "Brak plików",
+ "Upload some content or sync with your devices!" : "Wyślij lub zsynchronizuj pliki z urządzeniami.",
+ "Go back" : "Wstecz",
+ "Views" : "Widoki",
+ "Files settings" : "Ustawienia Plików",
+ "Your files" : "Twoje pliki",
+ "Open in files" : "Otwórz w Plikach",
+ "File cannot be accessed" : "Nie można uzyskać dostępu do pliku",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nie znaleziono pliku lub nie masz uprawnień, aby go wyświetlić. Poproś nadawcę o udostępnienie.",
+ "No search results for “{query}”" : "Brak wyników wyszukiwania dla \"{query}\"",
+ "Search for files" : "Szukaj plików",
+ "Clipboard is not available" : "Schowek jest niedostępny",
+ "WebDAV URL copied" : "Adres URL WebDAV skopiowany",
+ "General" : "Ogólne",
+ "Default view" : "Widok domyślny",
+ "All files" : "Wszystkie pliki",
+ "Personal files" : "Pliki osobiste",
+ "Sort favorites first" : "Najpierw sortuj ulubione",
+ "Sort folders before files" : "Sortuj katalogi przed plikami",
+ "Folder tree" : "Drzewo folderów",
+ "Appearance" : "Wygląd",
+ "Show hidden files" : "Pokaż ukryte pliki",
+ "Show file type column" : "Pokaż kolumnę typu pliku",
+ "Show file extensions" : "Pokaż rozszerzenia plików",
+ "Crop image previews" : "Przytnij podglądy obrazów",
+ "Additional settings" : "Ustawienia dodatkowe",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Kopiuj",
+ "How to access files using WebDAV" : "Jak uzyskać dostęp do plików przez WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uwierzytelnianie dwuskładnikowe jest włączone dla Twojego konta, dlatego musisz użyć hasła aplikacji, aby połączyć zewnętrznego klienta WebDAV.",
+ "Warnings" : "Ostrzeżenie",
+ "Warn before changing a file extension" : "Ostrzegaj przed zmianą rozszerzenia pliku",
+ "Warn before deleting files" : "Ostrzegaj przed usunięciem plików",
+ "Keyboard shortcuts" : "Skróty klawiaturowe",
+ "File actions" : "Akcje na plikach",
+ "Rename" : "Zmień nazwę",
+ "Delete" : "Usuń",
+ "Add or remove favorite" : "Dodaj lub usuń z ulubionych",
+ "Manage tags" : "Zarządzaj etykietami",
+ "Selection" : "Wybór",
+ "Select all files" : "Wybierz wszystkie pliki",
+ "Deselect all" : "Odznacz wszystkie",
+ "Select or deselect" : "Zaznacz lub odznacz",
+ "Select a range" : "Wybierz zakres",
+ "Navigation" : "Nawigacja",
+ "Go to parent folder" : "Przejdź do folderu nadrzędnego",
+ "Go to file above" : "Przejdź do pliku powyżej",
+ "Go to file below" : "Przejdź do pliku poniżej",
+ "Go left in grid" : "Przejdź w lewo w siatce",
+ "Go right in grid" : "Przejdź w prawo w siatce",
+ "View" : "Podgląd",
+ "Toggle grid view" : "Przełącz widok siatki",
+ "Open file sidebar" : "Otwórz panel boczny pliku",
+ "Show those shortcuts" : "Pokaż te skróty",
+ "You" : "Ty",
+ "Shared multiple times with different people" : "Udostępniony wiele razy różnym osobom",
+ "Unable to change the favorite state of the file" : "Nie można zmienić ulubionego stanu pliku",
+ "Error while loading the file data" : "Błąd podczas wczytywania danych pliku",
+ "Owner" : "Właściciel",
+ "Remove from favorites" : "Usuń z ulubionych",
+ "Add to favorites" : "Dodaj do ulubionych",
"Tags" : "Etykiety",
- "Unable to change the favourite state of the file" : "Nie można zmienić ulubionego stanu pliku",
- "Error while loading the file data" : "Błąd podczas ładowania danych pliku",
+ "Blank" : "Pusty",
+ "Unable to create new file from template" : "Nie można utworzyć nowego pliku z szablonu",
"Pick a template for {name}" : "Wybierz szablon dla {name}",
- "Cancel" : "Anuluj",
- "Create" : "Utwórz",
"Create a new file with the selected template" : "Utwórz nowy plik z wybranym szablonem",
"Creating file" : "Tworzenie pliku",
- "Blank" : "Pusty",
- "Unable to create new file from template" : "Nie można utworzyć nowego pliku z szablonu",
- "Set up templates folder" : "Skonfiguruj katalog szablonów",
- "Templates" : "Szablony",
+ "Save as {displayName}" : "Zapisz jako {displayName}",
+ "Save as …" : "Zapisz jako…",
+ "Converting files …" : "Konwertowanie plików…",
+ "Failed to convert files: {message}" : "Nie udało się przekonwertować plików: {message}",
+ "All files failed to be converted" : "Nie udało się przekonwertować żadnego pliku",
+ "One file could not be converted: {message}" : "Jednego pliku nie można przekonwertować: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Nie można przekonwertować jednego pliku","Nie można przekonwertować %n plików","Nie można przekonwertować %n plików","Nie można przekonwertować %n plików"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Pomyślnie przekonwertowany jeden plik","Pomyślnie przekonwertowane %n pliki","Pomyślnie przekonwertowanych %n plików","Pomyślnie przekonwertowanych %n plików"],
+ "Files successfully converted" : "Pliki zostały pomyślnie przekonwertowane",
+ "Failed to convert files" : "Nie udało się przekonwertować plików",
+ "Converting file …" : "Konwertowanie plików…",
+ "File successfully converted" : "Plik pomyślnie przekonwertowany",
+ "Failed to convert file: {message}" : "Nie udało się przekonwertować pliku: {message}",
+ "Failed to convert file" : "Nie udało się przekonwertować pliku",
+ "Leave this share" : "Opuść te udostępnienie",
+ "Leave these shares" : "Opuść udostępnienia",
+ "Disconnect storage" : "Odłącz magazyn",
+ "Disconnect storages" : "Odłącz magazyny",
+ "Delete permanently" : "Usuń bezpowrotnie",
+ "Delete and unshare" : "Usuń i przestań udostępniać",
+ "Delete file" : "Usuń plik",
+ "Delete files" : "Usuń pliki",
+ "Delete folder" : "Usuń katalog",
+ "Delete folders" : "Usuń katalogi",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Zamierzasz trwale usunąć {count} element","Zamierzasz trwale usunąć {count} elementy","Zamierzasz trwale usunąć {count} elementów","Zamierzasz trwale usunąć {count} elementów"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Zamierzasz usunąć {count} element","Zamierzasz usunąć {count} elementy","Zamierzasz usunąć {count} elementów","Zamierzasz usunąć {count} elementów"],
+ "Confirm deletion" : "Potwierdź usunięcie",
+ "Cancel" : "Anuluj",
+ "Download" : "Pobierz",
+ "Moving \"{source}\" to \"{destination}\" …" : "Przenoszenie „{source}” do „{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiowanie „{source}” do „{destination}”…",
+ "Destination is not a folder" : "Miejsce docelowe nie jest katalogiem",
+ "This file/folder is already in that directory" : "Ten plik/katalog znajduje się już w tym katalogu",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nie można przenieść pliku/katalogu do tego samego katalogu lub do własnego podkatalogu",
+ "(copy)" : "(kopiuj)",
+ "(copy %n)" : "(kopiuj %n)",
+ "A file or folder with that name already exists in this folder" : "Plik lub katalog o tej nazwie już istnieje w tym katalogu",
+ "The files are locked" : "Pliki są zablokowane",
+ "The file does not exist anymore" : "Plik już nie istnieje",
+ "Choose destination" : "Wybierz miejsce docelowe",
+ "Copy to {target}" : "Skopiuj do {target}",
+ "Move to {target}" : "Przenieś do {target}",
+ "Move" : "Przenieś",
+ "Move or copy operation failed" : "Operacja przenoszenia lub kopiowania nie powiodła się",
+ "Move or copy" : "Przenieś lub kopiuj",
+ "Open folder {displayName}" : "Otwórz katalog {displayName}",
+ "Open in Files" : "Otwórz w Plikach",
+ "Open locally" : "Otwórz lokalnie",
+ "Failed to redirect to client" : "Nie udało się przekierować do klienta",
+ "Open file locally" : "Otwórz plik lokalnie",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Plik powinien teraz otworzyć się na Twoim urządzeniu. Jeśli tak się nie stanie, sprawdź, czy masz zainstalowaną aplikację komputerową.",
+ "Retry and close" : "Spróbuj ponownie i zamknij",
+ "Open online" : "Otwórz online",
+ "Details" : "Szczegóły",
+ "View in folder" : "Zobacz w katalogu",
+ "Today" : "Dzisiaj",
+ "Last 7 days" : "Ostatnie 7 dni",
+ "Last 30 days" : "Ostatnie 30 dni",
+ "This year ({year})" : "W tym roku ({year})",
+ "Last year ({year})" : "Ostatni rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Arkusze kalkulacyjne",
+ "Presentations" : "Prezentacje",
+ "PDFs" : "PDFy",
+ "Folders" : "Katalogi",
+ "Audio" : "Dźwięk",
+ "Images" : "Obrazy",
+ "Videos" : "Filmy",
+ "Created new folder \"{name}\"" : "Utworzono nowy katalog \"{name}\"",
"Unable to initialize the templates directory" : "Nie można zainicjować katalogu szablonów",
- "%s used" : "Wykorzystane: %s",
- "%s%% of %s used" : "Wykorzystane: %s%% z %s",
- "%1$s of %2$s used" : "Wykorzystane: %1$s z %2$s",
- "Settings" : "Ustawienia",
- "Show hidden files" : "Pokaż ukryte pliki",
- "Crop image previews" : "Przytnij podglądy obrazów",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
- "Toggle %1$s sublist" : "Przełącz podlistę %1$s",
- "Toggle grid view" : "Przełącz widok siatki",
- "No files in here" : "Brak plików",
- "Upload some content or sync with your devices!" : "Wyślij lub zsynchronizuj pliki z urządzeniami.",
+ "Create templates folder" : "Utwórz katalog szablonów",
+ "Templates" : "Szablony",
+ "New template folder" : "Nowy katalog szablonów",
+ "In folder" : "W katalogu",
+ "Search in all files" : "Szukaj we wszystkich plikach",
+ "Search in folder: {folder}" : "Szukaj w katalogu: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z upuszczonych plików nie mógł być przetworzony",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Twoja przeglądarka nie obsługuje interfejsu API systemu plików. Katalogi nie zostaną przesłane",
+ "No files to upload" : "Brak plików do przesłania",
+ "Unable to create the directory {directory}" : "Nie można utworzyć katalogu {directory}",
+ "Some files could not be uploaded" : "Nie udało się wysłać niektórych plików",
+ "Files uploaded successfully" : "Pliki przesłane pomyślnie",
+ "No files to process" : "Brak plików do przetworzenia",
+ "Some files could not be copied" : "Nie udało się skopiować niektórych plików",
+ "Some files could not be moved" : "Niektóre pliki nie mogły zostać przeniesione",
+ "Files copied successfully" : "Pliki skopiowane pomyślnie",
+ "Files moved successfully" : "Pliki zostały przeniesione pomyślnie",
+ "Conflicts resolution skipped" : "Pominięto rozwiązywanie konfliktów",
+ "Upload cancelled" : "Anulowano przesyłanie",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nie można zmienić nazwy \"{oldName}\", już nie istnieje",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{newName}\" jest już używana w katalogu \"{dir}\". Wybierz inną nazwę.",
+ "Could not rename \"{oldName}\"" : "Nie można zmienić nazwy \"{oldName}\"",
+ "This operation is forbidden" : "Ta operacja jest niedozwolona",
+ "This folder is unavailable, please try again later or contact the administration" : "Ten folder jest niedostępny, spróbuj ponownie później lub skontaktuj się z administracją",
+ "Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
+ "Unexpected error: {error}" : "Nieoczekiwany błąd: {error}",
+ "_%n file_::_%n files_" : ["%n plik","%n pliki","%n plików","%n plików"],
+ "_%n folder_::_%n folders_" : ["%n katalog","%n katalogi","%n katalogów","%n katalogów"],
+ "_%n hidden_::_%n hidden_" : ["%n ukryty","%n ukryte","%n ukrytych","%n ukrytych"],
+ "Filename must not be empty." : "Nazwa pliku nie może być pusta.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}” nie jest dozwolone w nazwie pliku.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}” jest nazwą zastrzeżoną i nie jest dozwolona w przypadku nazw plików.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}” nie jest dozwolonym typem pliku.",
+ "Filenames must not end with \"{extension}\"." : "Nazwy plików nie mogą kończyć się na „{extension}”.",
+ "List of favorite files and folders." : "Lista ulubionych plików i katalogów.",
+ "No favorites yet" : "Brak ulubionych",
+ "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj",
+ "List of your files and folders." : "Lista Twoich plików i katalogów.",
+ "List of your files and folders that are not shared." : "Lista twoich plików i katalogów, które nie są udostępniane",
+ "No personal files found" : "Nie znaleziono plików osobistych",
+ "Files that are not shared will show up here." : "Tutaj pojawią się pliki, które nie są udostępniane.",
+ "Recent" : "Ostatnie",
+ "List of recently modified files and folders." : "Lista ostatnio zmodyfikowanych plików i katalogów.",
+ "No recently modified files" : "Brak ostatnio zmodyfikowanych plików",
+ "Files and folders you recently modified will show up here." : "Tutaj pojawią się pliki i katalogi, które ostatnio zmodyfikowałeś.",
+ "Search" : "Szukaj",
+ "Search results within your files." : "Wyniki wyszukiwania w Twoich plikach.",
"No entries found in this folder" : "Brak wpisów w tym katalogu",
"Select all" : "Wybierz wszystko",
"Upload too large" : "Wysyłany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz wysłać, przekraczają maksymalną dopuszczalną wielkość.",
- "No favorites yet" : "Brak ulubionych",
- "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj",
- "Deleted files" : "Usunięte pliki",
- "Shares" : "Udostępnione",
- "Shared with others" : "Udostępnione innym",
- "Shared with you" : "Udostępnione dla Ciebie",
- "Shared by link" : "Udostępnione linkiem",
- "Deleted shares" : "Usunięte udostępnienia",
- "Pending shares" : "Oczekujące udostępnienia",
+ "File could not be found" : "Nie można znaleźć pliku",
+ "Show list view" : "Pokaż widok listy",
+ "Show grid view" : "Pokaż widok siatki",
+ "Close" : "Zamknij",
+ "Could not create folder \"{dir}\"" : "Nie można utworzyć katalogu \"{dir}\"",
+ "This will stop your current uploads." : "Spowoduje to zatrzymanie wysyłania plików.",
+ "Upload cancelled." : "Wysyłanie anulowane.",
+ "Processing files …" : "Przetwarzanie plików…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można wysłać {filename} być może jest katalogiem lub posiada 0 bajtów",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, wysyłasz {size1} a pozostało tylko {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Katalog docelowy \"{dir}\" już nie istnieje",
+ "An unknown error has occurred" : "Wystąpił nieznany błąd",
+ "File could not be uploaded" : "Nie można przesłać pliku",
+ "Uploading …" : "Wysyłanie…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Wysyłanie… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Wysyłanie tego elementu nie jest wspierane",
+ "Error when assembling chunks, status code {status}" : "Błąd podczas łączenia fragmentów, kod statusu {status}",
+ "Choose target folder" : "Wybierz katalog docelowy",
+ "Set reminder" : "Ustaw przypomnienie",
+ "Edit locally" : "Edytuj lokalnie",
+ "Open" : "Otwórz",
+ "Could not load info for file \"{file}\"" : "Nie można załadować informacji o pliku \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Wybierz etykietę(y) do dodania dla zaznaczenia",
+ "Apply tag(s) to selection" : "Zastosuj etykietę(y) dla zaznaczenia",
+ "Select directory \"{dirName}\"" : "Wybierz katalog \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Wybierz plik \"{fileName}\"",
+ "Unable to determine date" : "Nie można ustalić daty",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Ten katalog jest niedostępny, sprawdź logi lub skontaktuj się z administratorem",
+ "Could not move \"{file}\", target exists" : "Nie można przenieść \"{file}\" - plik o takiej nazwie już istnieje",
+ "Could not move \"{file}\"" : "Nie można przenieść \"{file}\"",
+ "copy" : "kopia",
+ "Could not copy \"{file}\", target exists" : "Nie można skopiować \"{file}\", plik już istnieje",
+ "Could not copy \"{file}\"" : "Nie można skopiować \"{file}\"",
+ "Copied {origin} inside {destination}" : "Skopiowano {origin} wewnątrz {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopiowano {origin} oraz {nbfiles} innych plików wewnątrz {destination}",
+ "{newName} already exists" : "{newName} już istnieje",
+ "Could not create file \"{file}\"" : "Nie można utworzyć pliku \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nie można utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.",
+ "Could not create folder \"{dir}\" because it already exists" : "Nie można utworzyć katalogu \"{dir}\", ponieważ już istnieje",
+ "Could not fetch file details \"{file}\"" : "Nie można pobrać szczegółów pliku \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Błąd podczas usuwania pliku \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Brak wyników wyszukiwania w innych katalogach dla {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Wprowadź więcej niż dwa znaki, aby przeszukać inne katalogi",
+ "{dirs} and {files}" : "{dirs} i {files}",
+ "_including %n hidden_::_including %n hidden_" : ["w tym %n ukryty","w tym %n ukryte","w tym %n ukrytych","w tym %n ukrytych"],
+ "You do not have permission to upload or create files here" : "Nie masz uprawnień do wysyłania lub tworzenia plików w tym miejscu",
+ "_Uploading %n file_::_Uploading %n files_" : ["Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików","Wysyłanie %n plików"],
+ "New" : "Nowy",
+ "New file/folder menu" : "Nowe menu plików/katalogów",
+ "Select file range" : "Wybierz zakres plików",
+ "{used}%" : "{used}%",
+ "{used} used" : "Wykorzystane {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" jest nieprawidłową nazwą pliku.",
+ "File name cannot be empty." : "Nazwa pliku nie może być pusta.",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" jest niedozwolony w nazwie pliku.",
+ "\"{name}\" is not an allowed filetype" : "typ pliku \"{name}\" jest niedozwolony",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Magazyn zewnętrzny \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Magazyn dla {owner} jest pawie pełny ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Katalog grupowy \"{mountPoint}\" jest prawie pełny ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Pamięć zewnętrzna \"{mountPoint}\" jest prawie pełna ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Twój magazyn jest prawie pełny ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["pasuje do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\"","pasują do \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Bezpośredni link został skopiowany (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
+ "Path" : "Ścieżka",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów","%n bajtów"],
+ "Favored" : "Polubione",
+ "Favor" : "Polub",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Skopiuj bezpośredni link (działa tylko dla użytkowników, którzy mają dostęp do tego pliku/katalogu)",
+ "Upload file" : "Wyślij plik",
+ "Not favored" : "Nie polubiono",
+ "An error occurred while trying to update the tags" : "Wystąpił błąd podczas próby aktualizacji etykiet",
+ "Upload (max. %s)" : "Wysyłanie (maks. %s)",
+ "\"{displayName}\" action executed successfully" : "Akcja \"{displayName}\" została wykonana pomyślnie",
+ "\"{displayName}\" action failed" : "Akcja \"{displayName}\" nie powiodła się",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" nie powiodło się w niektórych elementach",
+ "\"{displayName}\" batch action executed successfully" : "Akcja wsadowa \"{displayName}\" została wykonana pomyślnie",
+ "Submitting fields…" : "Przesyłanie pól…",
+ "Filter filenames…" : "Filtruj nazwy plików…",
+ "WebDAV URL copied to clipboard" : "Adres URL WebDAV skopiowany do schowka",
+ "Enable the grid view" : "Włącz widok siatki",
+ "Enable folder tree" : "Włącz drzewo katalogów",
+ "Copy to clipboard" : "Kopiuj do schowka",
+ "Use this address to access your Files via WebDAV" : "Użyj tego adresu, aby uzyskać dostęp do plików poprzez WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Jeśli włączyłeś 2FA, musisz utworzyć i używać nowego hasła do aplikacji, klikając tutaj.",
+ "Deletion cancelled" : "Usuwanie anulowane",
+ "Move cancelled" : "Przenoszenie anulowane",
+ "Cancelled move or copy of \"{filename}\"." : "Anulowano przeniesienie lub kopiowanie „{filename}”.",
+ "Cancelled move or copy operation" : "Anulowano operację przenoszenia lub kopiowania",
+ "Open details" : "Otwórz szczegóły",
+ "Photos and images" : "Zdjęcia i obrazy",
+ "New folder creation cancelled" : "Tworzenie nowego katalogu zostało anulowane",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} katalog","{folderCount} katalogi","{folderCount} katalogów","{folderCount} katalogów"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} plik","{fileCount} pliki","{fileCount} plików","{fileCount} plików"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 plik i {folderCount} katalog","1 plik i {folderCount} katalogi","1 plik i {folderCount} katalogów","1 plik i {folderCount} katalogów"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} plik i 1 katalog","{fileCount} pliki i 1 katalog","{fileCount} plików i 1 katalog","{fileCount} plików i 1 katalog"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} plików i {folderCount} katalogów",
+ "All folders" : "Wszystkie katalogi",
+ "Personal Files" : "Pliki osobiste",
"Text file" : "Plik tekstowy",
"New text file.txt" : "Nowy plik tekstowy.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Magazyn dla {owner} jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Katalog grupowy \"{mountPoint}\" jest pełny. Nie można już aktualizować ani synchronizować plików!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Pamięć zewnętrzna \"{mountPoint}\" jest pełna. Nie można już aktualizować ani synchronizować plików!",
- "Your storage is full, files can not be updated or synced anymore!" : "Magazyn jest pełny. Nie można już zaktualizować ani zsynchronizować plików!",
- "_matches '{filter}'_::_match '{filter}'_" : ["pasujący '{filter}'","pasujące '{filter}'","pasujących '{filter}'","pasujących '{filter}'"]
+ "%1$s (renamed)" : "%1$s (zmieniona nazwa)",
+ "renamed file" : "zmieniona nazwa pliku",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po włączeniu nazw plików zgodnych z systemem Windows, istniejących plików nie można już modyfikować, ale ich właściciel może zmienić ich nazwy na nowe, prawidłowe.",
+ "Filter file names …" : "Filtruj nazwy plików…",
+ "Prevent warning dialogs from open or reenable them." : "Zapobiegaj otwieraniu okien dialogowych z ostrzeżeniami lub włącz je ponownie.",
+ "Show a warning dialog when changing a file extension." : "Pokaż okno dialogowe z ostrzeżeniem przy zmianie rozszerzenia pliku.",
+ "Speed up your Files experience with these quick shortcuts." : "Przyspiesz korzystanie z Plików dzięki tym szybkim skrótom.",
+ "Open the actions menu for a file" : "Otwórz menu akcji dla pliku",
+ "Rename a file" : "Zmień nazwę",
+ "Delete a file" : "Usuń plik",
+ "Favorite or remove a file from favorites" : "Dodaj plik do ulubionych lub usuń go z ulubionych",
+ "Manage tags for a file" : "Zarządzanie etykietami pliku",
+ "Deselect all files" : "Odznacz wszystkie pliki",
+ "Select or deselect a file" : "Wybierz lub odznacz plik",
+ "Select a range of files" : "Wybierz zakres plików",
+ "Navigate to the parent folder" : "Przejdź do katalogu nadrzędnego",
+ "Navigate to the file above" : "Przejdź do pliku powyżej",
+ "Navigate to the file below" : "Przejdź do pliku poniżej",
+ "Navigate to the file on the left (in grid mode)" : "Przejdź do pliku po lewej stronie (w trybie siatki)",
+ "Navigate to the file on the right (in grid mode)" : "Przejdź do pliku po prawej stronie (w trybie siatki)",
+ "Toggle the grid view" : "Przełącz widok siatki",
+ "Open the sidebar for a file" : "Otwórz pasek boczny dla pliku"
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ps.js b/apps/files/l10n/ps.js
deleted file mode 100644
index e9a00499d9c..00000000000
--- a/apps/files/l10n/ps.js
+++ /dev/null
@@ -1,140 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "ذخیره د لنډې مودې لپاره نشته",
- "Storage invalid" : "ذخیره ناسمه ده",
- "Unknown error" : "نامعلومه ستونزه",
- "File could not be found" : "فایل نشته",
- "Move or copy" : "انتقال یا کاپي کول",
- "Download" : "ښکته کول",
- "Delete" : "ړنګول",
- "Home" : "کور",
- "Close" : "بندول",
- "Favorites" : "په نښه شوي",
- "Could not create folder \"{dir}\"" : "\"{dir}\" فولډر نشي جوړېدای",
- "This will stop your current uploads." : "دا به اوسني فايلونه پورته کول بند کړي.",
- "Upload cancelled." : "فایل پورته کول بند شول.",
- "Processing files …" : "فایلونه د چمتووالي په حال کې دي ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} فایل نشي پورته کېدای ځکه چې تش دی. 0",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "تاسې {size1} پورته کوئ خو يوازې {size2} پاتې دی او ځای کم دی. ",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" فولډر نور شتون نلري",
- "Not enough free space" : "تش ځای نشته",
- "An unknown error has occurred" : "ستونزه وه.",
- "Uploading …" : "فايل د پورته کېدو په حال کې دی ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} له {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "دا ډول فایل نشئ پورته کولای",
- "Target folder does not exist any more" : "دغه فولډر نور شتون نلري",
- "Actions" : "کړنې",
- "Rename" : "نوم بدلول",
- "Copy" : "کاپي کول",
- "Choose target folder" : "د ورانتقالېدو فولډر ټاکل",
- "Open" : "پرانيستل",
- "Could not load info for file \"{file}\"" : "د \"{file}\" فایل معلومات نشي پرانيستل کېدای",
- "Files" : "فایلونه",
- "Details" : "معلومات",
- "Select" : "ټاکل",
- "Pending" : "د انتظار په حال کې",
- "Unable to determine date" : "نېټه نه معلومېږي",
- "This operation is forbidden" : "دا کړنه نشي کېدای",
- "Could not move \"{file}\", target exists" : "\"{file}\" فایل نشي انتقالېدای ځکه هلته له مخه شتون لري",
- "Could not move \"{file}\"" : "\"{file}\" فایل نشي انتقالېدای",
- "copy" : "کاپي",
- "Could not copy \"{file}\", target exists" : "\"{file}\" فایل نشي کاپي کېدای ځکه هلته له مخه شتون لري",
- "Could not copy \"{file}\"" : "\"{file}\" فایل نشي کاپي کېدای",
- "Copied {origin} inside {destination}" : "له {origin} څخه {destination} کاپي شو",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} او {nbfiles} نور فایلونه {destination} ته کاپي شول",
- "{newName} already exists" : "{newName} له پخوا شتون لري",
- "Could not rename \"{fileName}\"" : " \"{fileName}\" فایل نوم نشئ بدلولی",
- "Could not create file \"{file}\"" : "\"{file}\" فایل نشي جوړېدای",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" فایل موجود دی. بيا يې نشئ جوړولی.",
- "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" فولډر موجود دی. بيا يې نشئ جوړولی.",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" فايل پاکولو کې ستونزه ده",
- "No search results in other folders for {tag}{filter}{endtag}" : "په نورو فولډرونو کې د {tag}{filter}{endtag} لپاره پايلې نه وې",
- "Name" : "نوم",
- "Size" : "کچه",
- "Modified" : "د بدلون نېټه",
- "_%n folder_::_%n folders_" : ["%n فولډر","%n فولډرونه"],
- "_%n file_::_%n files_" : ["%n فایل","%n فایلونه"],
- "{dirs} and {files}" : "{dirs} او {files}",
- "_including %n hidden_::_including %n hidden_" : [" پټ سربېره","%n پټ سربېره"],
- "You don’t have permission to upload or create files here" : "تاسې په دې ځای کې د فایل يا فولډر جوړولو اجازه نلرئ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n فایل پورته کول","%n فایلونه پورته کول"],
- "New" : "نوی",
- "Select file range" : "د فایلونو اندازه وټاکئ",
- "{used} of {quota} used" : "له {quota} څخه {used} کارول شوې",
- "{used} used" : "{used} کارول شوې",
- "\"{name}\" is an invalid file name." : "\"{name}\" د فایل لپاره سم نوم نه دی",
- "File name cannot be empty." : "فایل نوم تش نشي کېدای",
- "\"/\" is not allowed inside a file name." : "د فایل په نوم کې \"/\" نشئ کارولای",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" ډول فایلونو اجازه نشته",
- "View in folder" : "په فولډر کې کتل",
- "Copied!" : "کاپي شو!",
- "Copy direct link (only works for users who have access to this file/folder)" : "نېغ لېنک کاپي کول",
- "Path" : "درک",
- "_%n byte_::_%n bytes_" : ["%n بایټ","%n بايټونه"],
- "Favorited" : "په نښه شو",
- "Favorite" : "په نښه شوی",
- "You can only favorite a single file or folder at a time" : "په يو وخت یو فایل یا فولډر په نښه کېدای شي",
- "New folder" : "نوی فولډر",
- "Upload file" : "فایل پورته کول",
- "Recent" : "وروستي",
- "Not favorited" : "په نښه شوی نه دی",
- "Remove from favorites" : "له نښو ويستل",
- "Add to favorites" : "په نښه کول",
- "Added to favorites" : "په نښه شو",
- "Removed from favorites" : "له نښو لېرې شو",
- "You added {file} to your favorites" : "تاسې خپلو په نښه شويو فایلونو ته {file} ورډېر کړ",
- "You removed {file} from your favorites" : "تاسې له خپلو په نښه شويو فایلونو څخه {file} لرې کړ",
- "File changes" : "د فایل بدلونونه",
- "Created by {user}" : "{user} لخوا جوړ شوی",
- "Changed by {user}" : "{user} لخوا تغیر شوی",
- "Deleted by {user}" : "{user} لخوا ړنګ شوی",
- "Restored by {user}" : "{user} لخوا بېرته اصلي شوی",
- "Renamed by {user}" : "{user} لخوا بیا نومول شوی",
- "Moved by {user}" : "{user} لخوا انتقال شوی",
- "\"remote user\"" : "\"د بل ځای کارن\"",
- "You created {file}" : "تاسې {file} جوړ کړی",
- "{user} created {file}" : "{user} کارن {file} فایل جوړ کړ",
- "{file} was created in a public folder" : "{file} په یو عمومي فولډر کې جوړ شوی",
- "You changed {file}" : "تاسې په {file} کې تغیر راوستی",
- "You changed an encrypted file in {file}" : " تاسې په {file} کې يو خوندي فایل بدل کړ",
- "{user} changed {file}" : "{user} کارن {file} فایل کې تغیر رواستی",
- "{user} changed an encrypted file in {file}" : "{user} يو خوندي فايل په {file} کې بدل کړ",
- "You deleted {file}" : "تاسې {file} ړنګ کړی",
- "You deleted an encrypted file in {file}" : "تاسې په {file} کې يو خوندي فايل ړنګ کړ",
- "{user} deleted {file}" : "{user} کارن {file} فایل ړنګ کړ",
- "{user} deleted an encrypted file in {file}" : "{user} په {file} کې يو خوندي فايل ړنګ کړ",
- "You restored {file}" : "تاسې {file} اصلي حالت ته کړی",
- "{user} restored {file}" : "{user} کارن {file} فایل اصلي حالت ته کړی",
- "You renamed {oldfile} to {newfile}" : "تاسې {oldfile} فایل {newfile} نوم ته اړولی ",
- "{user} renamed {oldfile} to {newfile}" : "{user} {oldfile} فایل {newfile} نوم ته اړولی ",
- "All files" : "ټول فایلونه",
- "Unlimited" : "نامحدود",
- "Upload (max. %s)" : "پورته کول (%s نهايي)",
- "File Management" : "فایلونه ترتیبول",
- "Tags" : "نښکې",
- "Cancel" : "پرېښول",
- "%s used" : "%sکارول شوې",
- "%1$s of %2$s used" : "د %2$sبرخې %1$sکارول شوې",
- "Settings" : "سمونې",
- "Show hidden files" : "پټ فایلونه ليدل",
- "Toggle grid view" : "په جدولي شکل ليدل",
- "No files in here" : "دلته فایلونه نشته",
- "No entries found in this folder" : "په دې فولډر کې څه نشته",
- "Select all" : "ټول ټاکل",
- "Upload too large" : "د پورته کېدونکي فایل کچه لوړه ده",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "د دې سرور لپاره د پورته کېدونکي فایل کچه لوړه ده",
- "No favorites yet" : "تر اوسه نښې نشته",
- "Files and folders you mark as favorite will show up here" : "هغه فایلونه او فولډرې چې تاسې په نښه کړئ دلته به ښکاري",
- "Deleted files" : "ړنګ شوي فایلونه",
- "Shares" : "شريک شوي",
- "Shared with others" : "نورو سره شريک شوي",
- "Shared with you" : "تاسې سره شريک شوي",
- "Shared by link" : "په لېنک شريک شوي",
- "Deleted shares" : "ړنګ شوي لېنکونه",
- "Text file" : "متن فایل",
- "New text file.txt" : "New text file.txt",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}' په څېر","'{filter}' په څېر"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ps.json b/apps/files/l10n/ps.json
deleted file mode 100644
index 1bac9223805..00000000000
--- a/apps/files/l10n/ps.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "ذخیره د لنډې مودې لپاره نشته",
- "Storage invalid" : "ذخیره ناسمه ده",
- "Unknown error" : "نامعلومه ستونزه",
- "File could not be found" : "فایل نشته",
- "Move or copy" : "انتقال یا کاپي کول",
- "Download" : "ښکته کول",
- "Delete" : "ړنګول",
- "Home" : "کور",
- "Close" : "بندول",
- "Favorites" : "په نښه شوي",
- "Could not create folder \"{dir}\"" : "\"{dir}\" فولډر نشي جوړېدای",
- "This will stop your current uploads." : "دا به اوسني فايلونه پورته کول بند کړي.",
- "Upload cancelled." : "فایل پورته کول بند شول.",
- "Processing files …" : "فایلونه د چمتووالي په حال کې دي ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} فایل نشي پورته کېدای ځکه چې تش دی. 0",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "تاسې {size1} پورته کوئ خو يوازې {size2} پاتې دی او ځای کم دی. ",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" فولډر نور شتون نلري",
- "Not enough free space" : "تش ځای نشته",
- "An unknown error has occurred" : "ستونزه وه.",
- "Uploading …" : "فايل د پورته کېدو په حال کې دی ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} له {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "دا ډول فایل نشئ پورته کولای",
- "Target folder does not exist any more" : "دغه فولډر نور شتون نلري",
- "Actions" : "کړنې",
- "Rename" : "نوم بدلول",
- "Copy" : "کاپي کول",
- "Choose target folder" : "د ورانتقالېدو فولډر ټاکل",
- "Open" : "پرانيستل",
- "Could not load info for file \"{file}\"" : "د \"{file}\" فایل معلومات نشي پرانيستل کېدای",
- "Files" : "فایلونه",
- "Details" : "معلومات",
- "Select" : "ټاکل",
- "Pending" : "د انتظار په حال کې",
- "Unable to determine date" : "نېټه نه معلومېږي",
- "This operation is forbidden" : "دا کړنه نشي کېدای",
- "Could not move \"{file}\", target exists" : "\"{file}\" فایل نشي انتقالېدای ځکه هلته له مخه شتون لري",
- "Could not move \"{file}\"" : "\"{file}\" فایل نشي انتقالېدای",
- "copy" : "کاپي",
- "Could not copy \"{file}\", target exists" : "\"{file}\" فایل نشي کاپي کېدای ځکه هلته له مخه شتون لري",
- "Could not copy \"{file}\"" : "\"{file}\" فایل نشي کاپي کېدای",
- "Copied {origin} inside {destination}" : "له {origin} څخه {destination} کاپي شو",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} او {nbfiles} نور فایلونه {destination} ته کاپي شول",
- "{newName} already exists" : "{newName} له پخوا شتون لري",
- "Could not rename \"{fileName}\"" : " \"{fileName}\" فایل نوم نشئ بدلولی",
- "Could not create file \"{file}\"" : "\"{file}\" فایل نشي جوړېدای",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" فایل موجود دی. بيا يې نشئ جوړولی.",
- "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" فولډر موجود دی. بيا يې نشئ جوړولی.",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" فايل پاکولو کې ستونزه ده",
- "No search results in other folders for {tag}{filter}{endtag}" : "په نورو فولډرونو کې د {tag}{filter}{endtag} لپاره پايلې نه وې",
- "Name" : "نوم",
- "Size" : "کچه",
- "Modified" : "د بدلون نېټه",
- "_%n folder_::_%n folders_" : ["%n فولډر","%n فولډرونه"],
- "_%n file_::_%n files_" : ["%n فایل","%n فایلونه"],
- "{dirs} and {files}" : "{dirs} او {files}",
- "_including %n hidden_::_including %n hidden_" : [" پټ سربېره","%n پټ سربېره"],
- "You don’t have permission to upload or create files here" : "تاسې په دې ځای کې د فایل يا فولډر جوړولو اجازه نلرئ",
- "_Uploading %n file_::_Uploading %n files_" : ["%n فایل پورته کول","%n فایلونه پورته کول"],
- "New" : "نوی",
- "Select file range" : "د فایلونو اندازه وټاکئ",
- "{used} of {quota} used" : "له {quota} څخه {used} کارول شوې",
- "{used} used" : "{used} کارول شوې",
- "\"{name}\" is an invalid file name." : "\"{name}\" د فایل لپاره سم نوم نه دی",
- "File name cannot be empty." : "فایل نوم تش نشي کېدای",
- "\"/\" is not allowed inside a file name." : "د فایل په نوم کې \"/\" نشئ کارولای",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" ډول فایلونو اجازه نشته",
- "View in folder" : "په فولډر کې کتل",
- "Copied!" : "کاپي شو!",
- "Copy direct link (only works for users who have access to this file/folder)" : "نېغ لېنک کاپي کول",
- "Path" : "درک",
- "_%n byte_::_%n bytes_" : ["%n بایټ","%n بايټونه"],
- "Favorited" : "په نښه شو",
- "Favorite" : "په نښه شوی",
- "You can only favorite a single file or folder at a time" : "په يو وخت یو فایل یا فولډر په نښه کېدای شي",
- "New folder" : "نوی فولډر",
- "Upload file" : "فایل پورته کول",
- "Recent" : "وروستي",
- "Not favorited" : "په نښه شوی نه دی",
- "Remove from favorites" : "له نښو ويستل",
- "Add to favorites" : "په نښه کول",
- "Added to favorites" : "په نښه شو",
- "Removed from favorites" : "له نښو لېرې شو",
- "You added {file} to your favorites" : "تاسې خپلو په نښه شويو فایلونو ته {file} ورډېر کړ",
- "You removed {file} from your favorites" : "تاسې له خپلو په نښه شويو فایلونو څخه {file} لرې کړ",
- "File changes" : "د فایل بدلونونه",
- "Created by {user}" : "{user} لخوا جوړ شوی",
- "Changed by {user}" : "{user} لخوا تغیر شوی",
- "Deleted by {user}" : "{user} لخوا ړنګ شوی",
- "Restored by {user}" : "{user} لخوا بېرته اصلي شوی",
- "Renamed by {user}" : "{user} لخوا بیا نومول شوی",
- "Moved by {user}" : "{user} لخوا انتقال شوی",
- "\"remote user\"" : "\"د بل ځای کارن\"",
- "You created {file}" : "تاسې {file} جوړ کړی",
- "{user} created {file}" : "{user} کارن {file} فایل جوړ کړ",
- "{file} was created in a public folder" : "{file} په یو عمومي فولډر کې جوړ شوی",
- "You changed {file}" : "تاسې په {file} کې تغیر راوستی",
- "You changed an encrypted file in {file}" : " تاسې په {file} کې يو خوندي فایل بدل کړ",
- "{user} changed {file}" : "{user} کارن {file} فایل کې تغیر رواستی",
- "{user} changed an encrypted file in {file}" : "{user} يو خوندي فايل په {file} کې بدل کړ",
- "You deleted {file}" : "تاسې {file} ړنګ کړی",
- "You deleted an encrypted file in {file}" : "تاسې په {file} کې يو خوندي فايل ړنګ کړ",
- "{user} deleted {file}" : "{user} کارن {file} فایل ړنګ کړ",
- "{user} deleted an encrypted file in {file}" : "{user} په {file} کې يو خوندي فايل ړنګ کړ",
- "You restored {file}" : "تاسې {file} اصلي حالت ته کړی",
- "{user} restored {file}" : "{user} کارن {file} فایل اصلي حالت ته کړی",
- "You renamed {oldfile} to {newfile}" : "تاسې {oldfile} فایل {newfile} نوم ته اړولی ",
- "{user} renamed {oldfile} to {newfile}" : "{user} {oldfile} فایل {newfile} نوم ته اړولی ",
- "All files" : "ټول فایلونه",
- "Unlimited" : "نامحدود",
- "Upload (max. %s)" : "پورته کول (%s نهايي)",
- "File Management" : "فایلونه ترتیبول",
- "Tags" : "نښکې",
- "Cancel" : "پرېښول",
- "%s used" : "%sکارول شوې",
- "%1$s of %2$s used" : "د %2$sبرخې %1$sکارول شوې",
- "Settings" : "سمونې",
- "Show hidden files" : "پټ فایلونه ليدل",
- "Toggle grid view" : "په جدولي شکل ليدل",
- "No files in here" : "دلته فایلونه نشته",
- "No entries found in this folder" : "په دې فولډر کې څه نشته",
- "Select all" : "ټول ټاکل",
- "Upload too large" : "د پورته کېدونکي فایل کچه لوړه ده",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "د دې سرور لپاره د پورته کېدونکي فایل کچه لوړه ده",
- "No favorites yet" : "تر اوسه نښې نشته",
- "Files and folders you mark as favorite will show up here" : "هغه فایلونه او فولډرې چې تاسې په نښه کړئ دلته به ښکاري",
- "Deleted files" : "ړنګ شوي فایلونه",
- "Shares" : "شريک شوي",
- "Shared with others" : "نورو سره شريک شوي",
- "Shared with you" : "تاسې سره شريک شوي",
- "Shared by link" : "په لېنک شريک شوي",
- "Deleted shares" : "ړنګ شوي لېنکونه",
- "Text file" : "متن فایل",
- "New text file.txt" : "New text file.txt",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}' په څېر","'{filter}' په څېر"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index aa325355dd3..2b19b2bf39c 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -1,122 +1,19 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "O armazenamento está temporariamente indisponível",
- "Storage invalid" : "Armazenamento inválido",
- "Unknown error" : "Erro desconhecido",
- "File could not be found" : "O arquivo não foi encontrado",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Baixar",
- "Delete" : "Excluir",
- "Home" : "Início",
- "Close" : "Fechar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
- "This will stop your current uploads." : "Isso irá parar seus envios atuais.",
- "Upload cancelled." : "Envio cancelado.",
- "Processing files …" : "Processando arquivos...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais",
- "Not enough free space" : "Espaço livre insuficiente",
- "An unknown error has occurred" : "Um erro desconhecido ocorreu",
- "Uploading …" : "Enviando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "O envio deste item não é suportado",
- "Target folder does not exist any more" : "Pasta destino não existe mais",
- "Operation is blocked by access control" : "A operação está bloqueada pelo controle de acesso",
- "Error when assembling chunks, status code {status}" : "Erro ao montar partes, código de status {status}",
- "Actions" : "Ações",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
- "Choose target folder" : "Escolher pasta destino",
- "Open" : "Abrir",
- "Delete file" : "Excluir arquivo",
- "Delete folder" : "Excluir pasta",
- "Disconnect storage" : "Desconectar armazenamento",
- "Leave this share" : "Sair deste compartilhamento",
- "Could not load info for file \"{file}\"" : "Não foi possível carregar informações para o arquivo \"{file}\" ",
- "Files" : "Arquivos",
- "Details" : "Detalhes",
- "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ",
- "Apply tag(s) to selection" : "Aplicar as etiqueta(s) a seleção",
- "Select" : "Selecionar",
- "Pending" : "Pendente",
- "Unable to determine date" : "Impossível determinar a data",
- "This operation is forbidden" : "Esta operação é proibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou contacte o administrador",
- "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\" pois o destino já existe",
- "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "Não foi possível copiar \"{file}\", pois já existe",
- "Could not copy \"{file}\"" : "Não foi possível copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} foi copiado para {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} e outros {nbfiles} arquivos foram copiados para {destination}",
- "{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\" pois ele não existe mais",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta  \"{dir}\". Por favor escolha um nome diferente.",
- "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
- "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" pois ele já existe",
- "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" pois ela já existe",
- "Could not fetch file details \"{file}\"" : "Não foi possível buscar os detalhes do arquivo \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar em outras pastas",
- "Name" : "Nome",
- "Size" : "Tamanho",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"],
- "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui",
- "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos"],
- "New" : "Novo",
- "Select file range" : "Selecionar o intervalo de arquivos",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.",
- "File name cannot be empty." : "O nome do arquivo não pode estar em branco.",
- "\"/\" is not allowed inside a file name." : "\"/\" não é permitido no nome do arquivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento do {owner} está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem ser enviados ou sincronizados.",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Your storage is full, files cannot be updated or synced anymore!" : "Seu armazenamento está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide \"{filter}\"","coincide \"{filter}\""],
- "View in folder" : "Exibir na pasta",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar link direto (funciona apenas para usuários que tem acesso a este arquivo/pasta)",
- "Path" : "Caminho",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favoritado",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Você só pode favoritar um único arquivo ou pasta de cada vez",
- "New folder" : "Nova pasta",
- "Upload file" : "Enviar arquivo",
- "Recent" : "Recentes",
- "Not favorited" : "Sem favoritos",
- "Remove from favorites" : "Excluir dos favoritos",
- "Add to favorites" : "Adicionar aos favoritos",
- "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
"Added to favorites" : "Adicionado aos favoritos",
"Removed from favorites" : "Removido dos favoritos",
"You added {file} to your favorites" : "Você adicionou {file} aos seus favoritos",
"You removed {file} from your favorites" : "Você excluiu {file} dos seus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Mudanças nos arquivos",
"Created by {user}" : "Criado por {user}",
"Changed by {user}" : "Modificado por {user}",
- "Deleted by {user}" : "Apagado por {user}",
+ "Deleted by {user}" : "Excluído por {user}",
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renomeado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuário remoto\"",
+ "\"remote account\"" : "\"conta remota\"",
"You created {file}" : "Você criou {file}",
"You created an encrypted file in {file}" : "Você criou um arquivo criptografado em {file}",
"{user} created {file}" : "{user} criou {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Você moveu {oldfile} para {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Um arquivo foi adicionado ou removido de seus <strong>favoritos</strong>",
+ "Files" : "Arquivos",
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta favorita foi <strong>modificado</strong>",
- "All files" : "Todos os arquivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Envio (max. %s)",
+ "Failed to authorize" : "Falha ao autorizar",
+ "Invalid folder path" : "Caminho de pasta inválido",
+ "Folder not found" : "Pasta não encontrada",
+ "The file cannot be found" : "O arquivo não pode ser encontrado",
+ "The destination path does not exist: %1$s" : "O caminho de destino não existe: %1$s",
+ "You do not have permission to create a file at the specified location" : "Você não tem permissão para criar um arquivo no local especificado",
+ "The file could not be converted." : "Não foi possível converter o arquivo.",
+ "Could not get relative path to converted file" : "Não foi possível obter o caminho relativo do arquivo convertido",
+ "Favorite files" : "Arquivos favoritos",
+ "No favorites" : "Sem favoritos",
+ "More favorites" : "Mais favoritos",
"Accept" : "Aceitar",
"Reject" : "Rejeitar",
"Incoming ownership transfer from {user}" : "Transferência de propriedade recebida de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Deseja aceitar {path}?\n\nObservação: O processo de transferência pode levar até 1 hora.",
+ "Ownership transfer denied" : "Transferência de propriedade negada",
+ "Your ownership transfer of {path} was denied by {user}." : "Sua transferência de propriedade de {path} foi negada por {user}.",
"Ownership transfer failed" : "Erro na transferência da propriedade",
"Your ownership transfer of {path} to {user} failed." : "Erro na transferência da sua propriedade de {path} para {user}.",
"The ownership transfer of {path} from {user} failed." : "Erro na transferência da propriedade de {path} de {user}.",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "A transferência da sua propriedade de {path} para {user} foi concluída.",
"The ownership transfer of {path} from {user} has completed." : "A transferência da propriedade de {path} de {user} foi concluída.",
"in %s" : "em %s",
+ "Transferred from %1$s on %2$s" : "Transferido de %1$s em %2$s",
+ "Files compatibility" : "Compatibilidade de arquivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restringir nomes de arquivos para garantir que os arquivos possam ser sincronizados com todos os clientes. Por padrão, todos os nomes de arquivos válidos em POSIX (p. ex., Linux ou macOS) são permitidos.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Depois de ativar os nomes de arquivos compatíveis com o Windows, os arquivos existentes não podem mais ser modificados, mas podem ser renomeados para novos nomes válidos pelo proprietário.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Também é possível migrar arquivos automaticamente depois de ativar esta configuração. Consulte a documentação sobre o comando occ.",
+ "Enforce Windows compatibility" : "Forçar compatibilidade com Windows ",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Isso bloqueará nomes de arquivos não válidos em sistemas Windows, como nomes reservados ou caracteres especiais. Mas isso não imporá a compatibilidade da distinção entre maiúsculas e minúsculas.",
"File Management" : "Gerenciamento de Arquivos",
- "Transfer ownership of a file or folder" : "Transferir a propriedade de um arquivo ou pasta",
- "Choose file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
- "Change" : "Mudar",
- "New owner" : "Novo proprietário",
- "Search users" : "Procurar usuários",
+ "Home" : "Início",
+ "Target folder does not exist any more" : "Pasta destino não existe mais",
+ "Reload current directory" : "Recarregar diretório atual",
+ "Go to the \"{dir}\" directory" : "Vá para o diretório \"{dir}\"",
+ "Current directory path" : "Caminho do diretório atual",
+ "Your have used your space quota and cannot upload files anymore" : "Você usou sua cota de espaço e não pode mais fazer upload de arquivos",
+ "You do not have permission to upload or create files here." : "Você não tem permissão para carregar ou criar arquivos aqui.",
+ "Drag and drop files here to upload" : "Arraste e solte os arquivos aqui para fazer upload",
+ "Favorite" : "Favorito",
+ "Back" : "Voltar",
+ "Toggle selection for file \"{displayName}\"" : "Alternar seleção do arquivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar seleção da pasta \"{displayName}\"",
+ "File is loading" : "O arquivo está carregando",
+ "Folder is loading" : "A pasta está carregando",
+ "Filename" : "Nome do arquivo",
+ "Folder name" : "Nome da pasta",
+ "This node is unavailable" : "Este nó está indisponível",
+ "Another entry with the same name already exists." : "Outra entrada com o mesmo nome já existe.",
+ "Invalid filename." : "Nome de arquivo inválido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" foi renomeado para \"{newName}\"",
+ "Rename file" : "Renomear arquivo",
+ "Folder" : "Pasta",
+ "Unknown file type" : "Tipo de arquivo desconhecido",
+ "{ext} image" : "imagem {ext}",
+ "{ext} video" : "vídeo {ext}",
+ "{ext} audio" : "áudio {ext}",
+ "{ext} text" : "texto {ext}",
+ "Pending" : "Pendente",
+ "Unknown date" : "Data desconhecida",
+ "Clear filter" : "Limpar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Pesquisar em qualquer lugar",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros ativos",
+ "Remove filter" : "Remover filtro",
+ "Total rows summary" : "Resumo do total de linhas",
+ "Toggle selection for all files and folders" : "Alternar seleção para todos os arquivos e pastas",
+ "Name" : "Nome",
+ "File type" : "Tipo de arquivo",
+ "Size" : "Tamanho",
+ "{displayName}: failed on some elements" : "{displayName}: falhou em alguns elementos",
+ "{displayName}: done" : "{displayName}: feito",
+ "{displayName}: failed" : "{displayName}: fracassado",
+ "Actions" : "Ações",
+ "(selected)" : "(selecionados)",
+ "List of files and folders." : "Lista de arquivos e pastas.",
+ "You have used your space quota and cannot upload files anymore." : "Você usou sua cota de espaço e não pode mais fazer upload de arquivos.",
+ "Column headers with buttons are sortable." : "Os cabeçalhos de coluna com botões podem ser ordenados.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados à medida que você navegar pela lista.",
+ "File not found" : "Arquivo não encontrado",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionados","{count} selecionados"],
+ "Search everywhere …" : "Pesquise em todos os lugares…",
+ "Search here …" : "Pesquise aqui…",
+ "Search scope options" : "Opções de escopo da pesquisa",
+ "Search here" : "Pesquise aqui",
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Não foi possível atualizar as estatísticas de armazenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
+ "Storage information" : "Informações de armazenamento",
+ "Storage quota" : "Cota de armazenamento",
+ "New folder" : "Nova pasta",
+ "Create new folder" : "Criar nova pasta",
+ "This name is already in use." : "Este nome já está em uso.",
+ "Create" : "Criar",
+ "Files starting with a dot are hidden by default" : "Os arquivos que começam com um ponto são ocultos por padrão",
+ "Fill template fields" : "Preencher campos do template",
+ "Submitting fields …" : "Enviando os campos …",
+ "Submit" : "Enviar",
"Choose a file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
"Transfer" : "Transferir",
"Transfer {path} to {userid}" : "Transferir {path} para {userid}",
"Invalid path selected" : "Caminho inválido selecionado",
+ "Unknown error" : "Erro desconhecido",
"Ownership transfer request sent" : "Solicitação de transferência de propriedade enviada",
- "Cannot transfer ownership of a file or folder you don't own" : "Não é possível transferir a propriedade de um arquivo ou pasta que você não possui",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "Não foi possível alterar o estado favorito do arquivo",
- "Error while loading the file data" : "Erro ao carregar os dados do arquivo",
- "Pick a template for {name}" : "Escolha um modelo para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Criar ",
- "Create a new file with the selected template" : "Crie um novo arquivo com o modelo selecionado ",
- "Creating file" : "Criando arquivo ",
- "Blank" : "Em branco ",
- "Unable to create new file from template" : "Incapaz de criar novo arquivo a partir do modelo ",
- "Set up templates folder" : "Configurar pasta de modelos ",
- "Templates" : "Modelos ",
- "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos ",
- "%s used" : "%s usado",
- "%s%% of %s used" : "%s%% usados de %s",
- "%1$s of %2$s used" : "%1$s usados de %2$s",
- "Settings" : "Configurações",
+ "Cannot transfer ownership of a file or folder you do not own" : "Não é possível transferir a propriedade de um arquivo ou pasta que não seja de sua propriedade",
+ "Transfer ownership of a file or folder" : "Transferir a propriedade de um arquivo ou pasta",
+ "Choose file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
+ "Change" : "Mudar",
+ "New owner" : "Novo proprietário",
+ "Keep {old}" : "Manter {old}",
+ "Keep without extension" : "Manter sem extensões",
+ "Use {new}" : "Usar {new}",
+ "Remove extension" : "Remover extensão",
+ "Change file extension" : "Alterar extensão de arquivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Alterar a extensão de arquivo de \"{old}\" para \"{new}\" pode tornar o arquivo ilegível.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Remover a extensão de arquivo \"{old}\" pode tornar o arquivo ilegível.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adicionar a extensão de arquivo \"{new}\" pode tornar o arquivo ilegível.",
+ "Do not show this dialog again." : "Não mostre essa caixa de diálogo novamente.",
+ "Select file or folder to link to" : "Selecione o arquivo ou pasta para vincular",
+ "Choose {file}" : "Escolher {file}",
+ "Share" : "Compartilhar",
+ "Shared by link" : "Compartilhado via link",
+ "Shared" : "Compartilhado",
+ "Switch to list view" : "Alternar para a visualização de lista",
+ "Switch to grid view" : "Alternar para a visualização em grade",
+ "The file could not be found" : "Não foi possível encontrar o arquivo",
+ "Upload was cancelled by user" : "O upload foi cancelado pelo usuário",
+ "Not enough free space" : "Espaço livre insuficiente",
+ "Operation is blocked by access control" : "A operação está bloqueada pelo controle de acesso",
+ "Error during upload: {message}" : "Erro durante o upload: {message}",
+ "Error during upload, status code {status}" : "Erro durante o upload, código de status {status}",
+ "Unknown error during upload" : "Erro desconhecido durante o upload",
+ "Loading current folder" : "Carregando a pasta atual",
+ "Retry" : "Tentar novamente",
+ "No files in here" : "Nenhum arquivo aqui",
+ "Upload some content or sync with your devices!" : "Envie um arquivo ou sincronize com seus dispositivos!",
+ "Go back" : "Voltar",
+ "Views" : "Visualizações",
+ "Files settings" : "Configurações de arquivos",
+ "Your files" : "Seus arquivos",
+ "Open in files" : "Abrir em arquivos",
+ "File cannot be accessed" : "O arquivo não pode ser acessado",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "O arquivo não foi encontrado ou você não tem permissão para visualizá-lo. Peça ao remetente para compartilhá-lo.",
+ "No search results for “{query}”" : "Sem resultados de pesquisa para \"{query}\"",
+ "Search for files" : "Pesquisar arquivos",
+ "Clipboard is not available" : "A área de transferência não está disponível",
+ "WebDAV URL copied" : "URL do WebDAV copiada",
+ "General" : "Geral",
+ "Default view" : "Visualização padrão",
+ "All files" : "Todos os arquivos",
+ "Personal files" : "Arquivos pessoais",
+ "Sort favorites first" : "Ordenar favoritos primeiro",
+ "Sort folders before files" : "Ordenar pastas antes de arquivos",
+ "Folder tree" : "Árvore de pastas",
+ "Appearance" : "Aparência",
"Show hidden files" : "Mostrar arquivos ocultos",
+ "Show file type column" : "Mostrar coluna de tipo de arquivo",
+ "Show file extensions" : "Mostrar extensões de arquivo",
"Crop image previews" : "Cortar visualizações de imagem",
+ "Additional settings" : "Configurações adicionais",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
- "Toggle %1$s sublist" : "Alternar a sublista %1$s",
- "Toggle grid view" : "Alternar vista de grade",
- "No files in here" : "Nenhum arquivo aqui",
- "Upload some content or sync with your devices!" : "Envie um arquivo ou sincronize com seus dispositivos!",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copiar",
+ "How to access files using WebDAV" : "Como acessar arquivos usando WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "A Autenticação de Dois Fatores está ativada para sua conta e, portanto, você precisa usar uma senha de aplicativo para conectar um cliente WebDAV externo.",
+ "Warnings" : "Avisos",
+ "Warn before changing a file extension" : "Avisar antes de alterar uma extensão de arquivo",
+ "Warn before deleting files" : "Avisar antes de excluir arquivos",
+ "Keyboard shortcuts" : "Atalhos do teclado",
+ "File actions" : "Ações de arquivos",
+ "Rename" : "Renomear",
+ "Delete" : "Excluir",
+ "Add or remove favorite" : "Adicionar ou remover favoritos",
+ "Manage tags" : "Gerenciar etiquetas",
+ "Selection" : "Seleção",
+ "Select all files" : "Selecionar todos os arquivos",
+ "Deselect all" : "Desselecionar todos",
+ "Select or deselect" : "Selecionar ou desmarcar",
+ "Select a range" : "Selecione um intervalo",
+ "Navigation" : "Navegação",
+ "Go to parent folder" : "Ir para a pasta mãe",
+ "Go to file above" : "Vá para o arquivo acima",
+ "Go to file below" : "Vá para o arquivo abaixo",
+ "Go left in grid" : "Vá para a esquerda na grade",
+ "Go right in grid" : "Vá para a direita na grade",
+ "View" : "Visualização",
+ "Toggle grid view" : "Alternar a visão em grade",
+ "Open file sidebar" : "Abrir barra lateral de arquivo",
+ "Show those shortcuts" : "Mostrar esses atalhos",
+ "You" : "Você",
+ "Shared multiple times with different people" : "Compartilhado várias vezes com pessoas diferentes",
+ "Unable to change the favorite state of the file" : "Impossível mudar estado de favorito do arquivo",
+ "Error while loading the file data" : "Erro ao carregar os dados do arquivo",
+ "Owner" : "Proprietário",
+ "Remove from favorites" : "Excluir dos favoritos",
+ "Add to favorites" : "Adicionar aos favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Em branco",
+ "Unable to create new file from template" : "Não é possível criar novo arquivo a partir do modelo",
+ "Pick a template for {name}" : "Escolha um modelo para {name}",
+ "Create a new file with the selected template" : "Criar um novo arquivo com o modelo selecionado",
+ "Creating file" : "Criando arquivo",
+ "Save as {displayName}" : "Salvar como {displayName}",
+ "Save as …" : "Salvar como …",
+ "Converting files …" : "Convertendo arquivos …",
+ "Failed to convert files: {message}" : "Falha ao converter arquivos: {message}",
+ "All files failed to be converted" : "Falha na conversão de todos os arquivos",
+ "One file could not be converted: {message}" : "Um arquivo não pôde ser convertido: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Não foi possível converter um arquivo","Não foi possível converter %n de arquivos","Não foi possível converter %n arquivos"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Um arquivo convertido com sucesso","%n de arquivos convertidos com sucesso","%n arquivos convertidos com sucesso"],
+ "Files successfully converted" : "Arquivos convertidos com sucesso",
+ "Failed to convert files" : "Falha ao converter arquivos",
+ "Converting file …" : "Convertendo arquivo …",
+ "File successfully converted" : "Arquivo convertido com sucesso",
+ "Failed to convert file: {message}" : "Falha ao converter arquivo: {message}",
+ "Failed to convert file" : "Falha ao converter arquivo",
+ "Leave this share" : "Sair deste compartilhamento",
+ "Leave these shares" : "Sair destes compartilhamentos",
+ "Disconnect storage" : "Desconectar armazenamento",
+ "Disconnect storages" : "Desconectar armazenamentos",
+ "Delete permanently" : "Excluir permanentemente",
+ "Delete and unshare" : "Excluir e descompartilhar",
+ "Delete file" : "Excluir arquivo",
+ "Delete files" : "Excluir arquivos",
+ "Delete folder" : "Excluir pasta",
+ "Delete folders" : "Excluir pastas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Você está prestes a excluir permanentemente {count} item","Você está prestes a excluir permanentemente {count} de itens","Você está prestes a excluir permanentemente {count} itens"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Você está prestes a excluir {count} item","Você está prestes a excluir {count} de itens","Você está prestes a excluir {count} itens"],
+ "Confirm deletion" : "Confirmar exclusão",
+ "Cancel" : "Cancelar",
+ "Download" : "Baixar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo \"{source}\" para \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" para \"{destination}\" …",
+ "Destination is not a folder" : "O destino não é uma pasta",
+ "This file/folder is already in that directory" : "Este arquivo/esta pasta já está nesse diretório",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Não é possível mover um arquivo/pasta para ele mesmo ou para uma subpasta dele mesmo",
+ "(copy)" : "(cópia)",
+ "(copy %n)" : "(cópia %n)",
+ "A file or folder with that name already exists in this folder" : "Já existe um arquivo ou uma pasta com esse nome nesta pasta",
+ "The files are locked" : "Os arquivos estão bloqueados",
+ "The file does not exist anymore" : "O arquivo não existe mais",
+ "Choose destination" : "Escolher destino",
+ "Copy to {target}" : "Copiar para {target}",
+ "Move to {target}" : "Mover para {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "Falha na operação de mover ou copiar",
+ "Move or copy" : "Mover ou copiar",
+ "Open folder {displayName}" : "Abrir a pasta {displayName}",
+ "Open in Files" : "Abrir em Arquivos",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Falha ao redirecionar para o cliente",
+ "Open file locally" : "Abrir o arquivo localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "O arquivo agora deve abrir no seu dispositivo. Caso contrário, verifique se você tem o aplicativo para desktop instalado.",
+ "Retry and close" : "Repetir e fechar",
+ "Open online" : "Abrir on-line",
+ "Details" : "Detalhes",
+ "View in folder" : "Exibir na pasta",
+ "Today" : "Hoje",
+ "Last 7 days" : "Últimos 7 dias",
+ "Last 30 days" : "Últimos 30 dias",
+ "This year ({year})" : "Este ano ({year})",
+ "Last year ({year})" : "Último ano ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Planilhas",
+ "Presentations" : "Apresentações",
+ "PDFs" : "PDFs",
+ "Folders" : "Pastas",
+ "Audio" : "Áudio",
+ "Images" : "Imagens",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Nova pasta \"{name}\" criada",
+ "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos",
+ "Create templates folder" : "Criar pasta de modelos",
+ "Templates" : "Modelos",
+ "New template folder" : "Nova pasta de modelo",
+ "In folder" : "Na pasta",
+ "Search in all files" : "Pesquisar em todos os arquivos",
+ "Search in folder: {folder}" : "Pesquisar na pasta: {folder}",
+ "One of the dropped files could not be processed" : "Um dos arquivos depositados não pôde ser processado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Seu navegador não oferece suporte à API Filesystem. Os diretórios não serão carregados",
+ "No files to upload" : "Não há arquivos para carregar",
+ "Unable to create the directory {directory}" : "Não foi possível criar o diretório {directory}",
+ "Some files could not be uploaded" : "Alguns arquivos não puderam ser carregados",
+ "Files uploaded successfully" : "Arquivos carregados com sucesso",
+ "No files to process" : "Nenhum arquivo para processar",
+ "Some files could not be copied" : "Alguns arquivos não puderam ser copiados",
+ "Some files could not be moved" : "Alguns arquivos não puderam ser movidos",
+ "Files copied successfully" : "Arquivos copiados com sucesso",
+ "Files moved successfully" : "Arquivos movidos com sucesso",
+ "Conflicts resolution skipped" : "Resolução de conflitos pulada",
+ "Upload cancelled" : "Upload cancelado",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Não foi possível renomear \"{oldName}\", ele não existe mais",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{newName}\" já é utilizado na pasta \"{dir}\". Escolha um nome diferente.",
+ "Could not rename \"{oldName}\"" : "Não foi possível renomear \"{oldName}\"",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This folder is unavailable, please try again later or contact the administration" : "Esta pasta não está disponível, tente novamente mais tarde ou entre em contato com a administração",
+ "Storage is temporarily not available" : "O armazenamento está temporariamente indisponível",
+ "Unexpected error: {error}" : "Erro inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n arquivo","%n de arquivos","%n arquivos"],
+ "_%n folder_::_%n folders_" : ["%n pasta","%n de pastas","%n pastas"],
+ "_%n hidden_::_%n hidden_" : ["%n oculto","%n de ocultos","%n ocultos"],
+ "Filename must not be empty." : "O nome do arquivo não pode estar vazio.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" não é permitido dentro de um nome de arquivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" é um nome reservado e não é permitido para nomes de arquivos.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" não é um tipo de arquivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "Os nomes de arquivos não podem terminar com \"{extension}\".",
+ "List of favorite files and folders." : "Lista de arquivos e pastas favoritos",
+ "No favorites yet" : "Você não possui favoritos!",
+ "Files and folders you mark as favorite will show up here" : "Suas pastas e arquivos favoritos serão exibidos aqui.",
+ "List of your files and folders." : "Lista de seus arquivos e pastas.",
+ "List of your files and folders that are not shared." : "Lista dos seus arquivos e pastas que não estão compartilhados.",
+ "No personal files found" : "Nenhum arquivo pessoal encontrado",
+ "Files that are not shared will show up here." : "Arquivos que não estão compartilhados aparecerão aqui.",
+ "Recent" : "Recentes",
+ "List of recently modified files and folders." : "Lista de arquivos e pastas modificados recentemente.",
+ "No recently modified files" : "Nenhum arquivo modificado recentemente",
+ "Files and folders you recently modified will show up here." : "Arquivos e pastas que você modificou recentemente aparecerão aqui.",
+ "Search" : "Pesquisar",
+ "Search results within your files." : "Resultados da pesquisa em seus arquivos.",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
- "Upload too large" : "Arquivo muito grande para envio",
+ "Upload too large" : "Arquivo muito grande para fazer upload",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excederam o tamanho máximo para arquivos no servidor.",
- "No favorites yet" : "Você não possui favoritos!",
- "Files and folders you mark as favorite will show up here" : "Suas pastas e arquivos favoritos serão exibidos aqui.",
- "Deleted files" : "Arquivos apagados",
- "Shares" : "Compartilhamentos",
- "Shared with others" : "Compartilhado com outros",
- "Shared with you" : "Compartilhado com você",
- "Shared by link" : "Compartilhado via link",
- "Deleted shares" : "Compartilhamentos apagados",
- "Pending shares" : "Compartilhamentos pendentes",
+ "File could not be found" : "O arquivo não foi encontrado",
+ "Show list view" : "Mostrar visualização em lista",
+ "Show grid view" : "Mostrar visualização em grade",
+ "Close" : "Fechar",
+ "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
+ "This will stop your current uploads." : "Isso interromperá seus uploads atuais.",
+ "Upload cancelled." : "Upload cancelado.",
+ "Processing files …" : "Processando arquivos...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer upload de {filename}, pois é um diretório ou tem 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais",
+ "An unknown error has occurred" : "Um erro desconhecido ocorreu",
+ "File could not be uploaded" : "Não foi possível fazer upload do arquivo",
+ "Uploading …" : "Enviando...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Enviando … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "O upload deste item não é suportado",
+ "Error when assembling chunks, status code {status}" : "Erro ao montar partes, código de status {status}",
+ "Choose target folder" : "Escolher pasta destino",
+ "Set reminder" : "Definir lembrete",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "Não foi possível carregar informações para o arquivo \"{file}\" ",
+ "Please select tag(s) to add to the selection" : "Por favor, selecione a(s) etiquetas(s) para adicionar à seleção ",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) à seleção",
+ "Select directory \"{dirName}\"" : "Selecionar o diretório \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selecionar o arquivo \"{fileName}\"",
+ "Unable to determine date" : "Impossível determinar a data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou contacte o administrador",
+ "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\" pois o destino já existe",
+ "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "Não foi possível copiar \"{file}\", pois já existe",
+ "Could not copy \"{file}\"" : "Não foi possível copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} foi copiado para {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} e outros {nbfiles} arquivos foram copiados para {destination}",
+ "{newName} already exists" : "{newName} já existe",
+ "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" pois ele já existe",
+ "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" pois ela já existe",
+ "Could not fetch file details \"{file}\"" : "Não foi possível buscar os detalhes do arquivo \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar em outras pastas",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n de ocultos","incluindo %n ocultos"],
+ "You do not have permission to upload or create files here" : "Você não tem permissão para carregar ou criar arquivos aqui",
+ "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n de arquivos","Enviando %n arquivos"],
+ "New" : "Novo",
+ "New file/folder menu" : "Menu de novo arquivo/pasta",
+ "Select file range" : "Selecionar o intervalo de arquivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.",
+ "File name cannot be empty." : "O nome do arquivo não pode estar em branco.",
+ "\"/\" is not allowed inside a file name." : "\"/\" não é permitido no nome do arquivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento de {owner} está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Seu armazenamento está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["corresponde a \"{filter}\"","correspondem a \"{filter}\"","correspondem a \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Link direto foi copiado (funciona apenas para pessoas que têm acesso a este arquivo/esta pasta)",
+ "Path" : "Caminho",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Marcado como favorito",
+ "Favor" : "Marcar como favorito",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar link direto (funciona apenas para pessoas que têm acesso a este arquivo/esta pasta)",
+ "Upload file" : "Enviar arquivo",
+ "Not favored" : "Não marcado como favorito",
+ "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Ação \"{displayName}\" executada com sucesso",
+ "\"{displayName}\" action failed" : "A ação \"{displayName}\" falhou",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" falhou em alguns elementos",
+ "\"{displayName}\" batch action executed successfully" : "Ação em lote \"{displayName}\" executada com êxito",
+ "Submitting fields…" : "Enviando campos…",
+ "Filter filenames…" : "Filtrar nomes de arquivos…",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiado para a área de transferência",
+ "Enable the grid view" : "Ativar a visualização em grade",
+ "Enable folder tree" : "Ativar árvore de pastas",
+ "Copy to clipboard" : "Copiar para área de transferência",
+ "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
+ "Deletion cancelled" : "Operação de exclusão cancelada",
+ "Move cancelled" : "Movimento cancelado",
+ "Cancelled move or copy of \"{filename}\"." : "Movimento ou cópia cancelada de \"{filename}\".",
+ "Cancelled move or copy operation" : "Operação de mover ou copiar cancelada",
+ "Open details" : "Abrir detalhes",
+ "Photos and images" : "Fotos e imagens",
+ "New folder creation cancelled" : "Criação de nova pasta cancelada",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} pasta","{folderCount} de pastas","{folderCount} pastas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} arquivo","{fileCount} de arquivos","{fileCount} arquivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 arquivo e {folderCount} pasta","1 arquivo e {folderCount} de pastas","1 arquivo e {folderCount} pastas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} arquivo e 1 pasta","{fileCount} de arquivos e 1 pasta","{fileCount} arquivos e 1 pasta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} arquivos e {folderCount} pastas",
+ "All folders" : "Todas as pastas",
+ "Personal Files" : "Arquivos pessoais",
"Text file" : "Arquivo texto",
- "New text file.txt" : "Novo arquivo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O armazenamento do {owner} está cheio e os arquivos não podem ser mais atualizados ou sincronizados!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem ser atualizados ou sincronizados mais!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem ser atualizados ou sincronizados mais!",
- "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide com '{filter}'","coincide com '{filter}'"]
+ "New text file.txt" : "Novo arquivo de texto.txt",
+ "%1$s (renamed)" : "%1$s (renomeado)",
+ "renamed file" : "arquivo renomeado",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Depois de ativar os nomes de arquivos compatíveis com o Windows, os arquivos existentes não podem mais ser modificados, mas podem ser renomeados para novos nomes válidos pelo proprietário.",
+ "Filter file names …" : "Filtrar nomes de arquivos …",
+ "Prevent warning dialogs from open or reenable them." : "Impedir que as caixas de diálogo de aviso sejam abertas ou reativá-las.",
+ "Show a warning dialog when changing a file extension." : "Mostrar uma caixa de diálogo de aviso ao alterar uma extensão de arquivo.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere sua experiência com os Arquivos com estes atalhos",
+ "Open the actions menu for a file" : "Abrir o menu de ações para um arquivo",
+ "Rename a file" : "Renomear um arquivo",
+ "Delete a file" : "Remover um arquivo",
+ "Favorite or remove a file from favorites" : "Favoritar ou remover arquivo dos favoritos",
+ "Manage tags for a file" : "Gerenciar etiquetas para arquivo",
+ "Deselect all files" : "Deselecionar todos os arquivos",
+ "Select or deselect a file" : "Selecionar ou deselecionar um arquivo",
+ "Select a range of files" : "Selecione um intervalo de arquivos",
+ "Navigate to the parent folder" : "Navegar para o diretório pai",
+ "Navigate to the file above" : "Navegar para o arquivo acima",
+ "Navigate to the file below" : "Navegar para o arquivo abaixo",
+ "Navigate to the file on the left (in grid mode)" : "Navegar para o arquivo à esquerda (no modo de grade)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar para o arquivo à direita (no modo de grade)",
+ "Toggle the grid view" : "Alternar visualização em grade",
+ "Open the sidebar for a file" : "Abrir barra lateral para um arquivo"
},
-"nplurals=2; plural=(n > 1);");
+"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index d4f5e809e55..55a603b6107 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -1,120 +1,17 @@
{ "translations": {
- "Storage is temporarily not available" : "O armazenamento está temporariamente indisponível",
- "Storage invalid" : "Armazenamento inválido",
- "Unknown error" : "Erro desconhecido",
- "File could not be found" : "O arquivo não foi encontrado",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Baixar",
- "Delete" : "Excluir",
- "Home" : "Início",
- "Close" : "Fechar",
- "Favorites" : "Favoritos",
- "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
- "This will stop your current uploads." : "Isso irá parar seus envios atuais.",
- "Upload cancelled." : "Envio cancelado.",
- "Processing files …" : "Processando arquivos...",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais",
- "Not enough free space" : "Espaço livre insuficiente",
- "An unknown error has occurred" : "Um erro desconhecido ocorreu",
- "Uploading …" : "Enviando...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "O envio deste item não é suportado",
- "Target folder does not exist any more" : "Pasta destino não existe mais",
- "Operation is blocked by access control" : "A operação está bloqueada pelo controle de acesso",
- "Error when assembling chunks, status code {status}" : "Erro ao montar partes, código de status {status}",
- "Actions" : "Ações",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
- "Choose target folder" : "Escolher pasta destino",
- "Open" : "Abrir",
- "Delete file" : "Excluir arquivo",
- "Delete folder" : "Excluir pasta",
- "Disconnect storage" : "Desconectar armazenamento",
- "Leave this share" : "Sair deste compartilhamento",
- "Could not load info for file \"{file}\"" : "Não foi possível carregar informações para o arquivo \"{file}\" ",
- "Files" : "Arquivos",
- "Details" : "Detalhes",
- "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ",
- "Apply tag(s) to selection" : "Aplicar as etiqueta(s) a seleção",
- "Select" : "Selecionar",
- "Pending" : "Pendente",
- "Unable to determine date" : "Impossível determinar a data",
- "This operation is forbidden" : "Esta operação é proibida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou contacte o administrador",
- "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\" pois o destino já existe",
- "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"",
- "copy" : "copiar",
- "Could not copy \"{file}\", target exists" : "Não foi possível copiar \"{file}\", pois já existe",
- "Could not copy \"{file}\"" : "Não foi possível copiar \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} foi copiado para {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} e outros {nbfiles} arquivos foram copiados para {destination}",
- "{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\" pois ele não existe mais",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta  \"{dir}\". Por favor escolha um nome diferente.",
- "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
- "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" pois ele já existe",
- "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" pois ela já existe",
- "Could not fetch file details \"{file}\"" : "Não foi possível buscar os detalhes do arquivo \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar em outras pastas",
- "Name" : "Nome",
- "Size" : "Tamanho",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"],
- "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui",
- "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos"],
- "New" : "Novo",
- "Select file range" : "Selecionar o intervalo de arquivos",
- "{used} of {quota} used" : "{used} de {quota} usados",
- "{used} used" : "{used} usados",
- "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.",
- "File name cannot be empty." : "O nome do arquivo não pode estar em branco.",
- "\"/\" is not allowed inside a file name." : "\"/\" não é permitido no nome do arquivo.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo permitido",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento do {owner} está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem ser enviados ou sincronizados.",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Your storage is full, files cannot be updated or synced anymore!" : "Seu armazenamento está cheio, os arquivos não podem ser enviados ou sincronizados.",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["coincide \"{filter}\"","coincide \"{filter}\""],
- "View in folder" : "Exibir na pasta",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar link direto (funciona apenas para usuários que tem acesso a este arquivo/pasta)",
- "Path" : "Caminho",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Favoritado",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Você só pode favoritar um único arquivo ou pasta de cada vez",
- "New folder" : "Nova pasta",
- "Upload file" : "Enviar arquivo",
- "Recent" : "Recentes",
- "Not favorited" : "Sem favoritos",
- "Remove from favorites" : "Excluir dos favoritos",
- "Add to favorites" : "Adicionar aos favoritos",
- "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
"Added to favorites" : "Adicionado aos favoritos",
"Removed from favorites" : "Removido dos favoritos",
"You added {file} to your favorites" : "Você adicionou {file} aos seus favoritos",
"You removed {file} from your favorites" : "Você excluiu {file} dos seus favoritos",
+ "Favorites" : "Favoritos",
"File changes" : "Mudanças nos arquivos",
"Created by {user}" : "Criado por {user}",
"Changed by {user}" : "Modificado por {user}",
- "Deleted by {user}" : "Apagado por {user}",
+ "Deleted by {user}" : "Excluído por {user}",
"Restored by {user}" : "Restaurado por {user}",
"Renamed by {user}" : "Renomeado por {user}",
"Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"usuário remoto\"",
+ "\"remote account\"" : "\"conta remota\"",
"You created {file}" : "Você criou {file}",
"You created an encrypted file in {file}" : "Você criou um arquivo criptografado em {file}",
"{user} created {file}" : "{user} criou {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Você moveu {oldfile} para {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Um arquivo foi adicionado ou removido de seus <strong>favoritos</strong>",
+ "Files" : "Arquivos",
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta favorita foi <strong>modificado</strong>",
- "All files" : "Todos os arquivos",
- "Unlimited" : "Ilimitado",
- "Upload (max. %s)" : "Envio (max. %s)",
+ "Failed to authorize" : "Falha ao autorizar",
+ "Invalid folder path" : "Caminho de pasta inválido",
+ "Folder not found" : "Pasta não encontrada",
+ "The file cannot be found" : "O arquivo não pode ser encontrado",
+ "The destination path does not exist: %1$s" : "O caminho de destino não existe: %1$s",
+ "You do not have permission to create a file at the specified location" : "Você não tem permissão para criar um arquivo no local especificado",
+ "The file could not be converted." : "Não foi possível converter o arquivo.",
+ "Could not get relative path to converted file" : "Não foi possível obter o caminho relativo do arquivo convertido",
+ "Favorite files" : "Arquivos favoritos",
+ "No favorites" : "Sem favoritos",
+ "More favorites" : "Mais favoritos",
"Accept" : "Aceitar",
"Reject" : "Rejeitar",
"Incoming ownership transfer from {user}" : "Transferência de propriedade recebida de {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Deseja aceitar {path}?\n\nObservação: O processo de transferência pode levar até 1 hora.",
+ "Ownership transfer denied" : "Transferência de propriedade negada",
+ "Your ownership transfer of {path} was denied by {user}." : "Sua transferência de propriedade de {path} foi negada por {user}.",
"Ownership transfer failed" : "Erro na transferência da propriedade",
"Your ownership transfer of {path} to {user} failed." : "Erro na transferência da sua propriedade de {path} para {user}.",
"The ownership transfer of {path} from {user} failed." : "Erro na transferência da propriedade de {path} de {user}.",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "A transferência da sua propriedade de {path} para {user} foi concluída.",
"The ownership transfer of {path} from {user} has completed." : "A transferência da propriedade de {path} de {user} foi concluída.",
"in %s" : "em %s",
+ "Transferred from %1$s on %2$s" : "Transferido de %1$s em %2$s",
+ "Files compatibility" : "Compatibilidade de arquivos",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir restringir nomes de arquivos para garantir que os arquivos possam ser sincronizados com todos os clientes. Por padrão, todos os nomes de arquivos válidos em POSIX (p. ex., Linux ou macOS) são permitidos.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Depois de ativar os nomes de arquivos compatíveis com o Windows, os arquivos existentes não podem mais ser modificados, mas podem ser renomeados para novos nomes válidos pelo proprietário.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Também é possível migrar arquivos automaticamente depois de ativar esta configuração. Consulte a documentação sobre o comando occ.",
+ "Enforce Windows compatibility" : "Forçar compatibilidade com Windows ",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Isso bloqueará nomes de arquivos não válidos em sistemas Windows, como nomes reservados ou caracteres especiais. Mas isso não imporá a compatibilidade da distinção entre maiúsculas e minúsculas.",
"File Management" : "Gerenciamento de Arquivos",
- "Transfer ownership of a file or folder" : "Transferir a propriedade de um arquivo ou pasta",
- "Choose file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
- "Change" : "Mudar",
- "New owner" : "Novo proprietário",
- "Search users" : "Procurar usuários",
+ "Home" : "Início",
+ "Target folder does not exist any more" : "Pasta destino não existe mais",
+ "Reload current directory" : "Recarregar diretório atual",
+ "Go to the \"{dir}\" directory" : "Vá para o diretório \"{dir}\"",
+ "Current directory path" : "Caminho do diretório atual",
+ "Your have used your space quota and cannot upload files anymore" : "Você usou sua cota de espaço e não pode mais fazer upload de arquivos",
+ "You do not have permission to upload or create files here." : "Você não tem permissão para carregar ou criar arquivos aqui.",
+ "Drag and drop files here to upload" : "Arraste e solte os arquivos aqui para fazer upload",
+ "Favorite" : "Favorito",
+ "Back" : "Voltar",
+ "Toggle selection for file \"{displayName}\"" : "Alternar seleção do arquivo \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar seleção da pasta \"{displayName}\"",
+ "File is loading" : "O arquivo está carregando",
+ "Folder is loading" : "A pasta está carregando",
+ "Filename" : "Nome do arquivo",
+ "Folder name" : "Nome da pasta",
+ "This node is unavailable" : "Este nó está indisponível",
+ "Another entry with the same name already exists." : "Outra entrada com o mesmo nome já existe.",
+ "Invalid filename." : "Nome de arquivo inválido.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" foi renomeado para \"{newName}\"",
+ "Rename file" : "Renomear arquivo",
+ "Folder" : "Pasta",
+ "Unknown file type" : "Tipo de arquivo desconhecido",
+ "{ext} image" : "imagem {ext}",
+ "{ext} video" : "vídeo {ext}",
+ "{ext} audio" : "áudio {ext}",
+ "{ext} text" : "texto {ext}",
+ "Pending" : "Pendente",
+ "Unknown date" : "Data desconhecida",
+ "Clear filter" : "Limpar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Pesquisar em qualquer lugar",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros ativos",
+ "Remove filter" : "Remover filtro",
+ "Total rows summary" : "Resumo do total de linhas",
+ "Toggle selection for all files and folders" : "Alternar seleção para todos os arquivos e pastas",
+ "Name" : "Nome",
+ "File type" : "Tipo de arquivo",
+ "Size" : "Tamanho",
+ "{displayName}: failed on some elements" : "{displayName}: falhou em alguns elementos",
+ "{displayName}: done" : "{displayName}: feito",
+ "{displayName}: failed" : "{displayName}: fracassado",
+ "Actions" : "Ações",
+ "(selected)" : "(selecionados)",
+ "List of files and folders." : "Lista de arquivos e pastas.",
+ "You have used your space quota and cannot upload files anymore." : "Você usou sua cota de espaço e não pode mais fazer upload de arquivos.",
+ "Column headers with buttons are sortable." : "Os cabeçalhos de coluna com botões podem ser ordenados.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados à medida que você navegar pela lista.",
+ "File not found" : "Arquivo não encontrado",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionados","{count} selecionados"],
+ "Search everywhere …" : "Pesquise em todos os lugares…",
+ "Search here …" : "Pesquise aqui…",
+ "Search scope options" : "Opções de escopo da pesquisa",
+ "Search here" : "Pesquise aqui",
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "{used} de {quota} usados",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Não foi possível atualizar as estatísticas de armazenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
+ "Storage information" : "Informações de armazenamento",
+ "Storage quota" : "Cota de armazenamento",
+ "New folder" : "Nova pasta",
+ "Create new folder" : "Criar nova pasta",
+ "This name is already in use." : "Este nome já está em uso.",
+ "Create" : "Criar",
+ "Files starting with a dot are hidden by default" : "Os arquivos que começam com um ponto são ocultos por padrão",
+ "Fill template fields" : "Preencher campos do template",
+ "Submitting fields …" : "Enviando os campos …",
+ "Submit" : "Enviar",
"Choose a file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
"Transfer" : "Transferir",
"Transfer {path} to {userid}" : "Transferir {path} para {userid}",
"Invalid path selected" : "Caminho inválido selecionado",
+ "Unknown error" : "Erro desconhecido",
"Ownership transfer request sent" : "Solicitação de transferência de propriedade enviada",
- "Cannot transfer ownership of a file or folder you don't own" : "Não é possível transferir a propriedade de um arquivo ou pasta que você não possui",
- "Tags" : "Etiquetas",
- "Unable to change the favourite state of the file" : "Não foi possível alterar o estado favorito do arquivo",
- "Error while loading the file data" : "Erro ao carregar os dados do arquivo",
- "Pick a template for {name}" : "Escolha um modelo para {name}",
- "Cancel" : "Cancelar",
- "Create" : "Criar ",
- "Create a new file with the selected template" : "Crie um novo arquivo com o modelo selecionado ",
- "Creating file" : "Criando arquivo ",
- "Blank" : "Em branco ",
- "Unable to create new file from template" : "Incapaz de criar novo arquivo a partir do modelo ",
- "Set up templates folder" : "Configurar pasta de modelos ",
- "Templates" : "Modelos ",
- "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos ",
- "%s used" : "%s usado",
- "%s%% of %s used" : "%s%% usados de %s",
- "%1$s of %2$s used" : "%1$s usados de %2$s",
- "Settings" : "Configurações",
+ "Cannot transfer ownership of a file or folder you do not own" : "Não é possível transferir a propriedade de um arquivo ou pasta que não seja de sua propriedade",
+ "Transfer ownership of a file or folder" : "Transferir a propriedade de um arquivo ou pasta",
+ "Choose file or folder to transfer" : "Escolha o arquivo ou pasta a transferir",
+ "Change" : "Mudar",
+ "New owner" : "Novo proprietário",
+ "Keep {old}" : "Manter {old}",
+ "Keep without extension" : "Manter sem extensões",
+ "Use {new}" : "Usar {new}",
+ "Remove extension" : "Remover extensão",
+ "Change file extension" : "Alterar extensão de arquivo",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Alterar a extensão de arquivo de \"{old}\" para \"{new}\" pode tornar o arquivo ilegível.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Remover a extensão de arquivo \"{old}\" pode tornar o arquivo ilegível.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Adicionar a extensão de arquivo \"{new}\" pode tornar o arquivo ilegível.",
+ "Do not show this dialog again." : "Não mostre essa caixa de diálogo novamente.",
+ "Select file or folder to link to" : "Selecione o arquivo ou pasta para vincular",
+ "Choose {file}" : "Escolher {file}",
+ "Share" : "Compartilhar",
+ "Shared by link" : "Compartilhado via link",
+ "Shared" : "Compartilhado",
+ "Switch to list view" : "Alternar para a visualização de lista",
+ "Switch to grid view" : "Alternar para a visualização em grade",
+ "The file could not be found" : "Não foi possível encontrar o arquivo",
+ "Upload was cancelled by user" : "O upload foi cancelado pelo usuário",
+ "Not enough free space" : "Espaço livre insuficiente",
+ "Operation is blocked by access control" : "A operação está bloqueada pelo controle de acesso",
+ "Error during upload: {message}" : "Erro durante o upload: {message}",
+ "Error during upload, status code {status}" : "Erro durante o upload, código de status {status}",
+ "Unknown error during upload" : "Erro desconhecido durante o upload",
+ "Loading current folder" : "Carregando a pasta atual",
+ "Retry" : "Tentar novamente",
+ "No files in here" : "Nenhum arquivo aqui",
+ "Upload some content or sync with your devices!" : "Envie um arquivo ou sincronize com seus dispositivos!",
+ "Go back" : "Voltar",
+ "Views" : "Visualizações",
+ "Files settings" : "Configurações de arquivos",
+ "Your files" : "Seus arquivos",
+ "Open in files" : "Abrir em arquivos",
+ "File cannot be accessed" : "O arquivo não pode ser acessado",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "O arquivo não foi encontrado ou você não tem permissão para visualizá-lo. Peça ao remetente para compartilhá-lo.",
+ "No search results for “{query}”" : "Sem resultados de pesquisa para \"{query}\"",
+ "Search for files" : "Pesquisar arquivos",
+ "Clipboard is not available" : "A área de transferência não está disponível",
+ "WebDAV URL copied" : "URL do WebDAV copiada",
+ "General" : "Geral",
+ "Default view" : "Visualização padrão",
+ "All files" : "Todos os arquivos",
+ "Personal files" : "Arquivos pessoais",
+ "Sort favorites first" : "Ordenar favoritos primeiro",
+ "Sort folders before files" : "Ordenar pastas antes de arquivos",
+ "Folder tree" : "Árvore de pastas",
+ "Appearance" : "Aparência",
"Show hidden files" : "Mostrar arquivos ocultos",
+ "Show file type column" : "Mostrar coluna de tipo de arquivo",
+ "Show file extensions" : "Mostrar extensões de arquivo",
"Crop image previews" : "Cortar visualizações de imagem",
+ "Additional settings" : "Configurações adicionais",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
- "Toggle %1$s sublist" : "Alternar a sublista %1$s",
- "Toggle grid view" : "Alternar vista de grade",
- "No files in here" : "Nenhum arquivo aqui",
- "Upload some content or sync with your devices!" : "Envie um arquivo ou sincronize com seus dispositivos!",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Copiar",
+ "How to access files using WebDAV" : "Como acessar arquivos usando WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "A Autenticação de Dois Fatores está ativada para sua conta e, portanto, você precisa usar uma senha de aplicativo para conectar um cliente WebDAV externo.",
+ "Warnings" : "Avisos",
+ "Warn before changing a file extension" : "Avisar antes de alterar uma extensão de arquivo",
+ "Warn before deleting files" : "Avisar antes de excluir arquivos",
+ "Keyboard shortcuts" : "Atalhos do teclado",
+ "File actions" : "Ações de arquivos",
+ "Rename" : "Renomear",
+ "Delete" : "Excluir",
+ "Add or remove favorite" : "Adicionar ou remover favoritos",
+ "Manage tags" : "Gerenciar etiquetas",
+ "Selection" : "Seleção",
+ "Select all files" : "Selecionar todos os arquivos",
+ "Deselect all" : "Desselecionar todos",
+ "Select or deselect" : "Selecionar ou desmarcar",
+ "Select a range" : "Selecione um intervalo",
+ "Navigation" : "Navegação",
+ "Go to parent folder" : "Ir para a pasta mãe",
+ "Go to file above" : "Vá para o arquivo acima",
+ "Go to file below" : "Vá para o arquivo abaixo",
+ "Go left in grid" : "Vá para a esquerda na grade",
+ "Go right in grid" : "Vá para a direita na grade",
+ "View" : "Visualização",
+ "Toggle grid view" : "Alternar a visão em grade",
+ "Open file sidebar" : "Abrir barra lateral de arquivo",
+ "Show those shortcuts" : "Mostrar esses atalhos",
+ "You" : "Você",
+ "Shared multiple times with different people" : "Compartilhado várias vezes com pessoas diferentes",
+ "Unable to change the favorite state of the file" : "Impossível mudar estado de favorito do arquivo",
+ "Error while loading the file data" : "Erro ao carregar os dados do arquivo",
+ "Owner" : "Proprietário",
+ "Remove from favorites" : "Excluir dos favoritos",
+ "Add to favorites" : "Adicionar aos favoritos",
+ "Tags" : "Etiquetas",
+ "Blank" : "Em branco",
+ "Unable to create new file from template" : "Não é possível criar novo arquivo a partir do modelo",
+ "Pick a template for {name}" : "Escolha um modelo para {name}",
+ "Create a new file with the selected template" : "Criar um novo arquivo com o modelo selecionado",
+ "Creating file" : "Criando arquivo",
+ "Save as {displayName}" : "Salvar como {displayName}",
+ "Save as …" : "Salvar como …",
+ "Converting files …" : "Convertendo arquivos …",
+ "Failed to convert files: {message}" : "Falha ao converter arquivos: {message}",
+ "All files failed to be converted" : "Falha na conversão de todos os arquivos",
+ "One file could not be converted: {message}" : "Um arquivo não pôde ser convertido: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Não foi possível converter um arquivo","Não foi possível converter %n de arquivos","Não foi possível converter %n arquivos"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Um arquivo convertido com sucesso","%n de arquivos convertidos com sucesso","%n arquivos convertidos com sucesso"],
+ "Files successfully converted" : "Arquivos convertidos com sucesso",
+ "Failed to convert files" : "Falha ao converter arquivos",
+ "Converting file …" : "Convertendo arquivo …",
+ "File successfully converted" : "Arquivo convertido com sucesso",
+ "Failed to convert file: {message}" : "Falha ao converter arquivo: {message}",
+ "Failed to convert file" : "Falha ao converter arquivo",
+ "Leave this share" : "Sair deste compartilhamento",
+ "Leave these shares" : "Sair destes compartilhamentos",
+ "Disconnect storage" : "Desconectar armazenamento",
+ "Disconnect storages" : "Desconectar armazenamentos",
+ "Delete permanently" : "Excluir permanentemente",
+ "Delete and unshare" : "Excluir e descompartilhar",
+ "Delete file" : "Excluir arquivo",
+ "Delete files" : "Excluir arquivos",
+ "Delete folder" : "Excluir pasta",
+ "Delete folders" : "Excluir pastas",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Você está prestes a excluir permanentemente {count} item","Você está prestes a excluir permanentemente {count} de itens","Você está prestes a excluir permanentemente {count} itens"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Você está prestes a excluir {count} item","Você está prestes a excluir {count} de itens","Você está prestes a excluir {count} itens"],
+ "Confirm deletion" : "Confirmar exclusão",
+ "Cancel" : "Cancelar",
+ "Download" : "Baixar",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo \"{source}\" para \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando \"{source}\" para \"{destination}\" …",
+ "Destination is not a folder" : "O destino não é uma pasta",
+ "This file/folder is already in that directory" : "Este arquivo/esta pasta já está nesse diretório",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Não é possível mover um arquivo/pasta para ele mesmo ou para uma subpasta dele mesmo",
+ "(copy)" : "(cópia)",
+ "(copy %n)" : "(cópia %n)",
+ "A file or folder with that name already exists in this folder" : "Já existe um arquivo ou uma pasta com esse nome nesta pasta",
+ "The files are locked" : "Os arquivos estão bloqueados",
+ "The file does not exist anymore" : "O arquivo não existe mais",
+ "Choose destination" : "Escolher destino",
+ "Copy to {target}" : "Copiar para {target}",
+ "Move to {target}" : "Mover para {target}",
+ "Move" : "Mover",
+ "Move or copy operation failed" : "Falha na operação de mover ou copiar",
+ "Move or copy" : "Mover ou copiar",
+ "Open folder {displayName}" : "Abrir a pasta {displayName}",
+ "Open in Files" : "Abrir em Arquivos",
+ "Open locally" : "Abrir localmente",
+ "Failed to redirect to client" : "Falha ao redirecionar para o cliente",
+ "Open file locally" : "Abrir o arquivo localmente",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "O arquivo agora deve abrir no seu dispositivo. Caso contrário, verifique se você tem o aplicativo para desktop instalado.",
+ "Retry and close" : "Repetir e fechar",
+ "Open online" : "Abrir on-line",
+ "Details" : "Detalhes",
+ "View in folder" : "Exibir na pasta",
+ "Today" : "Hoje",
+ "Last 7 days" : "Últimos 7 dias",
+ "Last 30 days" : "Últimos 30 dias",
+ "This year ({year})" : "Este ano ({year})",
+ "Last year ({year})" : "Último ano ({year})",
+ "Documents" : "Documentos",
+ "Spreadsheets" : "Planilhas",
+ "Presentations" : "Apresentações",
+ "PDFs" : "PDFs",
+ "Folders" : "Pastas",
+ "Audio" : "Áudio",
+ "Images" : "Imagens",
+ "Videos" : "Vídeos",
+ "Created new folder \"{name}\"" : "Nova pasta \"{name}\" criada",
+ "Unable to initialize the templates directory" : "Não foi possível inicializar o diretório de modelos",
+ "Create templates folder" : "Criar pasta de modelos",
+ "Templates" : "Modelos",
+ "New template folder" : "Nova pasta de modelo",
+ "In folder" : "Na pasta",
+ "Search in all files" : "Pesquisar em todos os arquivos",
+ "Search in folder: {folder}" : "Pesquisar na pasta: {folder}",
+ "One of the dropped files could not be processed" : "Um dos arquivos depositados não pôde ser processado",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Seu navegador não oferece suporte à API Filesystem. Os diretórios não serão carregados",
+ "No files to upload" : "Não há arquivos para carregar",
+ "Unable to create the directory {directory}" : "Não foi possível criar o diretório {directory}",
+ "Some files could not be uploaded" : "Alguns arquivos não puderam ser carregados",
+ "Files uploaded successfully" : "Arquivos carregados com sucesso",
+ "No files to process" : "Nenhum arquivo para processar",
+ "Some files could not be copied" : "Alguns arquivos não puderam ser copiados",
+ "Some files could not be moved" : "Alguns arquivos não puderam ser movidos",
+ "Files copied successfully" : "Arquivos copiados com sucesso",
+ "Files moved successfully" : "Arquivos movidos com sucesso",
+ "Conflicts resolution skipped" : "Resolução de conflitos pulada",
+ "Upload cancelled" : "Upload cancelado",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Não foi possível renomear \"{oldName}\", ele não existe mais",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{newName}\" já é utilizado na pasta \"{dir}\". Escolha um nome diferente.",
+ "Could not rename \"{oldName}\"" : "Não foi possível renomear \"{oldName}\"",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "This folder is unavailable, please try again later or contact the administration" : "Esta pasta não está disponível, tente novamente mais tarde ou entre em contato com a administração",
+ "Storage is temporarily not available" : "O armazenamento está temporariamente indisponível",
+ "Unexpected error: {error}" : "Erro inesperado: {error}",
+ "_%n file_::_%n files_" : ["%n arquivo","%n de arquivos","%n arquivos"],
+ "_%n folder_::_%n folders_" : ["%n pasta","%n de pastas","%n pastas"],
+ "_%n hidden_::_%n hidden_" : ["%n oculto","%n de ocultos","%n ocultos"],
+ "Filename must not be empty." : "O nome do arquivo não pode estar vazio.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" não é permitido dentro de um nome de arquivo.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" é um nome reservado e não é permitido para nomes de arquivos.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" não é um tipo de arquivo permitido.",
+ "Filenames must not end with \"{extension}\"." : "Os nomes de arquivos não podem terminar com \"{extension}\".",
+ "List of favorite files and folders." : "Lista de arquivos e pastas favoritos",
+ "No favorites yet" : "Você não possui favoritos!",
+ "Files and folders you mark as favorite will show up here" : "Suas pastas e arquivos favoritos serão exibidos aqui.",
+ "List of your files and folders." : "Lista de seus arquivos e pastas.",
+ "List of your files and folders that are not shared." : "Lista dos seus arquivos e pastas que não estão compartilhados.",
+ "No personal files found" : "Nenhum arquivo pessoal encontrado",
+ "Files that are not shared will show up here." : "Arquivos que não estão compartilhados aparecerão aqui.",
+ "Recent" : "Recentes",
+ "List of recently modified files and folders." : "Lista de arquivos e pastas modificados recentemente.",
+ "No recently modified files" : "Nenhum arquivo modificado recentemente",
+ "Files and folders you recently modified will show up here." : "Arquivos e pastas que você modificou recentemente aparecerão aqui.",
+ "Search" : "Pesquisar",
+ "Search results within your files." : "Resultados da pesquisa em seus arquivos.",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
- "Upload too large" : "Arquivo muito grande para envio",
+ "Upload too large" : "Arquivo muito grande para fazer upload",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excederam o tamanho máximo para arquivos no servidor.",
- "No favorites yet" : "Você não possui favoritos!",
- "Files and folders you mark as favorite will show up here" : "Suas pastas e arquivos favoritos serão exibidos aqui.",
- "Deleted files" : "Arquivos apagados",
- "Shares" : "Compartilhamentos",
- "Shared with others" : "Compartilhado com outros",
- "Shared with you" : "Compartilhado com você",
- "Shared by link" : "Compartilhado via link",
- "Deleted shares" : "Compartilhamentos apagados",
- "Pending shares" : "Compartilhamentos pendentes",
+ "File could not be found" : "O arquivo não foi encontrado",
+ "Show list view" : "Mostrar visualização em lista",
+ "Show grid view" : "Mostrar visualização em grade",
+ "Close" : "Fechar",
+ "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
+ "This will stop your current uploads." : "Isso interromperá seus uploads atuais.",
+ "Upload cancelled." : "Upload cancelado.",
+ "Processing files …" : "Processando arquivos...",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer upload de {filename}, pois é um diretório ou tem 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais",
+ "An unknown error has occurred" : "Um erro desconhecido ocorreu",
+ "File could not be uploaded" : "Não foi possível fazer upload do arquivo",
+ "Uploading …" : "Enviando...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Enviando … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "O upload deste item não é suportado",
+ "Error when assembling chunks, status code {status}" : "Erro ao montar partes, código de status {status}",
+ "Choose target folder" : "Escolher pasta destino",
+ "Set reminder" : "Definir lembrete",
+ "Edit locally" : "Editar localmente",
+ "Open" : "Abrir",
+ "Could not load info for file \"{file}\"" : "Não foi possível carregar informações para o arquivo \"{file}\" ",
+ "Please select tag(s) to add to the selection" : "Por favor, selecione a(s) etiquetas(s) para adicionar à seleção ",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) à seleção",
+ "Select directory \"{dirName}\"" : "Selecionar o diretório \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selecionar o arquivo \"{fileName}\"",
+ "Unable to determine date" : "Impossível determinar a data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou contacte o administrador",
+ "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\" pois o destino já existe",
+ "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"",
+ "copy" : "copiar",
+ "Could not copy \"{file}\", target exists" : "Não foi possível copiar \"{file}\", pois já existe",
+ "Could not copy \"{file}\"" : "Não foi possível copiar \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} foi copiado para {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} e outros {nbfiles} arquivos foram copiados para {destination}",
+ "{newName} already exists" : "{newName} já existe",
+ "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" pois ele já existe",
+ "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" pois ela já existe",
+ "Could not fetch file details \"{file}\"" : "Não foi possível buscar os detalhes do arquivo \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar em outras pastas",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["incluindo %n oculto","incluindo %n de ocultos","incluindo %n ocultos"],
+ "You do not have permission to upload or create files here" : "Você não tem permissão para carregar ou criar arquivos aqui",
+ "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n de arquivos","Enviando %n arquivos"],
+ "New" : "Novo",
+ "New file/folder menu" : "Menu de novo arquivo/pasta",
+ "Select file range" : "Selecionar o intervalo de arquivos",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} usados",
+ "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.",
+ "File name cannot be empty." : "O nome do arquivo não pode estar em branco.",
+ "\"/\" is not allowed inside a file name." : "\"/\" não é permitido no nome do arquivo.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo permitido",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento de {owner} está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Seu armazenamento está cheio, os arquivos não podem mais ser atualizados ou sincronizados!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["corresponde a \"{filter}\"","correspondem a \"{filter}\"","correspondem a \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Link direto foi copiado (funciona apenas para pessoas que têm acesso a este arquivo/esta pasta)",
+ "Path" : "Caminho",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
+ "Favored" : "Marcado como favorito",
+ "Favor" : "Marcar como favorito",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Copiar link direto (funciona apenas para pessoas que têm acesso a este arquivo/esta pasta)",
+ "Upload file" : "Enviar arquivo",
+ "Not favored" : "Não marcado como favorito",
+ "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas",
+ "Upload (max. %s)" : "Upload (max. %s)",
+ "\"{displayName}\" action executed successfully" : "Ação \"{displayName}\" executada com sucesso",
+ "\"{displayName}\" action failed" : "A ação \"{displayName}\" falhou",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" falhou em alguns elementos",
+ "\"{displayName}\" batch action executed successfully" : "Ação em lote \"{displayName}\" executada com êxito",
+ "Submitting fields…" : "Enviando campos…",
+ "Filter filenames…" : "Filtrar nomes de arquivos…",
+ "WebDAV URL copied to clipboard" : "URL de WebDAV copiado para a área de transferência",
+ "Enable the grid view" : "Ativar a visualização em grade",
+ "Enable folder tree" : "Ativar árvore de pastas",
+ "Copy to clipboard" : "Copiar para área de transferência",
+ "Use this address to access your Files via WebDAV" : "Use este endereço para acessar seus Arquivos via WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Se tiver ativado a 2FA, você deverá criar e usar uma nova senha do aplicativo clicando aqui.",
+ "Deletion cancelled" : "Operação de exclusão cancelada",
+ "Move cancelled" : "Movimento cancelado",
+ "Cancelled move or copy of \"{filename}\"." : "Movimento ou cópia cancelada de \"{filename}\".",
+ "Cancelled move or copy operation" : "Operação de mover ou copiar cancelada",
+ "Open details" : "Abrir detalhes",
+ "Photos and images" : "Fotos e imagens",
+ "New folder creation cancelled" : "Criação de nova pasta cancelada",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} pasta","{folderCount} de pastas","{folderCount} pastas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} arquivo","{fileCount} de arquivos","{fileCount} arquivos"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 arquivo e {folderCount} pasta","1 arquivo e {folderCount} de pastas","1 arquivo e {folderCount} pastas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} arquivo e 1 pasta","{fileCount} de arquivos e 1 pasta","{fileCount} arquivos e 1 pasta"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} arquivos e {folderCount} pastas",
+ "All folders" : "Todas as pastas",
+ "Personal Files" : "Arquivos pessoais",
"Text file" : "Arquivo texto",
- "New text file.txt" : "Novo arquivo.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O armazenamento do {owner} está cheio e os arquivos não podem ser mais atualizados ou sincronizados!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "A pasta do grupo \"{mountPoint}\" está cheia, os arquivos não podem ser atualizados ou sincronizados mais!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "O armazenamento externo \"{mountPoint}\" está cheio, os arquivos não podem ser atualizados ou sincronizados mais!",
- "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
- "_matches '{filter}'_::_match '{filter}'_" : ["coincide com '{filter}'","coincide com '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
+ "New text file.txt" : "Novo arquivo de texto.txt",
+ "%1$s (renamed)" : "%1$s (renomeado)",
+ "renamed file" : "arquivo renomeado",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Depois de ativar os nomes de arquivos compatíveis com o Windows, os arquivos existentes não podem mais ser modificados, mas podem ser renomeados para novos nomes válidos pelo proprietário.",
+ "Filter file names …" : "Filtrar nomes de arquivos …",
+ "Prevent warning dialogs from open or reenable them." : "Impedir que as caixas de diálogo de aviso sejam abertas ou reativá-las.",
+ "Show a warning dialog when changing a file extension." : "Mostrar uma caixa de diálogo de aviso ao alterar uma extensão de arquivo.",
+ "Speed up your Files experience with these quick shortcuts." : "Acelere sua experiência com os Arquivos com estes atalhos",
+ "Open the actions menu for a file" : "Abrir o menu de ações para um arquivo",
+ "Rename a file" : "Renomear um arquivo",
+ "Delete a file" : "Remover um arquivo",
+ "Favorite or remove a file from favorites" : "Favoritar ou remover arquivo dos favoritos",
+ "Manage tags for a file" : "Gerenciar etiquetas para arquivo",
+ "Deselect all files" : "Deselecionar todos os arquivos",
+ "Select or deselect a file" : "Selecionar ou deselecionar um arquivo",
+ "Select a range of files" : "Selecione um intervalo de arquivos",
+ "Navigate to the parent folder" : "Navegar para o diretório pai",
+ "Navigate to the file above" : "Navegar para o arquivo acima",
+ "Navigate to the file below" : "Navegar para o arquivo abaixo",
+ "Navigate to the file on the left (in grid mode)" : "Navegar para o arquivo à esquerda (no modo de grade)",
+ "Navigate to the file on the right (in grid mode)" : "Navegar para o arquivo à direita (no modo de grade)",
+ "Toggle the grid view" : "Alternar visualização em grade",
+ "Open the sidebar for a file" : "Abrir barra lateral para um arquivo"
+},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index b3bd8df04c6..d896d838112 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -1,16 +1,208 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
- "Storage invalid" : "Armazenamento inválido",
+ "Added to favorites" : "Adicionado aos favoritos",
+ "Removed from favorites" : "Removido dos favoritos",
+ "You added {file} to your favorites" : "Adicionou {file} aos seus favoritos",
+ "You removed {file} from your favorites" : "Removeu {file} dos favoritos",
+ "Favorites" : "Favoritos",
+ "File changes" : "Alterações no ficheiro",
+ "Created by {user}" : "Criado por {user}",
+ "Changed by {user}" : "Modificado por {user}",
+ "Deleted by {user}" : "Apagado por {user}",
+ "Restored by {user}" : "Restaurado por {user}",
+ "Renamed by {user}" : "Renomeado por {user}",
+ "Moved by {user}" : "Movido por {user}",
+ "\"remote account\"" : "conta remota",
+ "You created {file}" : "Criou {file}",
+ "You created an encrypted file in {file}" : "Criou um ficheiro encriptado em {file}",
+ "{user} created {file}" : "{user} criou {file}",
+ "{user} created an encrypted file in {file}" : "{user} criou um ficheiro encriptado em {file}",
+ "{file} was created in a public folder" : "{file} foi criado numa pasta pública",
+ "You changed {file}" : "Alterou {file}",
+ "You changed an encrypted file in {file}" : "Alterou um ficheiro encriptado em {file}",
+ "{user} changed {file}" : "{user} modificou {file}",
+ "{user} changed an encrypted file in {file}" : "{user} alterou um ficheiro encriptado em {file}",
+ "You deleted {file}" : "Apagou {file}",
+ "You deleted an encrypted file in {file}" : "Apagou um ficheiro encriptado em {file}",
+ "{user} deleted {file}" : "{user} apagou {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} apagou um ficheiro encriptado em {file} ",
+ "You restored {file}" : "Restaurou {file}",
+ "{user} restored {file}" : "{user} restaurou {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomeou {oldfile} (oculto) para {newfile} (oculto)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Renomeou {oldfile} (oculto) para {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Renomeou {oldfile} para {newfile} (escondido)",
+ "You renamed {oldfile} to {newfile}" : "Renomeou {oldfile} para {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (escondido) para {newfile} (escondido)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (escondido) para {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomeou {oldfile} para {newfile} (escondido)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
+ "You moved {oldfile} to {newfile}" : "Moveu {oldfile} para {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Um ficheiro foi adicionado ou removido dos seus <strong>favoritos</strong>",
+ "Files" : "Ficheiros",
+ "A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
+ "A favorite file or folder has been <strong>changed</strong>" : "Uma pasta ou ficheiro favorito foi <strong>alterado</strong>",
+ "Failed to authorize" : "Falhou a autorização",
+ "Invalid folder path" : "Caminho da pasta inválido",
+ "Folder not found" : "Pasta não encontrada",
+ "No favorites" : "Sem favoritos",
+ "Accept" : "Aceitar",
+ "Reject" : "Rejeitar",
+ "Incoming ownership transfer from {user}" : "Transferência de propriedade recebida de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quer aceitar {path} ?\n\nNota: O processo de transferência pode demorar até 1 hora após aceitar.",
+ "Ownership transfer denied" : "Transferência de propriedade negada",
+ "Your ownership transfer of {path} was denied by {user}." : "A sua transferência de propriedade de {path} foi negada por {user}.",
+ "Ownership transfer failed" : "Transferência de propriedade falhou",
+ "Your ownership transfer of {path} to {user} failed." : "A sua transferência de propriedade de {path} para {user} falhou.",
+ "The ownership transfer of {path} from {user} failed." : "A transferência de propriedade de {path} de {user} falhou.",
+ "Ownership transfer done" : "Transferência de propriedade concluída ",
+ "Your ownership transfer of {path} to {user} has completed." : "A sua transferência de propriedade de {path} para {user} foi concluída.",
+ "The ownership transfer of {path} from {user} has completed." : "A sua transferência de propriedade de {path} de {user} foi concluída",
+ "in %s" : "em %s",
+ "Transferred from %1$s on %2$s" : "Transferido de %1$s em %2$s",
+ "Files compatibility" : "Compatibilidade de ficheiros",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir a restrição dos nomes de ficheiro para garantir que possam ser sincronizados com todos os clientes. Por predefinição, todos os nomes de ficheiro válidos em POSIX (por exemplo, Linux ou macOS) são permitidos.",
+ "Enforce Windows compatibility" : "Forçar a compatibilidade com Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : " Isto bloqueará os nomes de ficheiro não válidos nos sistemas Windows, como a utilização de nomes reservados ou carateres especiais. Mas isto não irá impor a compatibilidade da sensibilidade à caixa alta maiúsculas ou baixa minúsculas.",
+ "File Management" : "Gestão de ficheiros",
+ "Home" : "Início",
+ "Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Reload current directory" : "Recarregar a pasta atual",
+ "Go to the \"{dir}\" directory" : "Ir para a pasta \"{dir}\"",
+ "Current directory path" : "Caminho da pasta atual",
+ "Your have used your space quota and cannot upload files anymore" : "Utilizou a sua quota de espaço e já não pode carregar mais ficheiros",
+ "Drag and drop files here to upload" : "Arraste e largue os ficheiros aqui para carregar",
+ "Favorite" : "Favorito",
+ "Back" : "Voltar",
+ "Toggle selection for file \"{displayName}\"" : "Alternar a seleção para o ficheiro \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar a seleção para a pasta \"{displayName}\"",
+ "File is loading" : "Ficheiro está a carregar",
+ "Folder is loading" : "Pasta está a carregar",
+ "Filename" : "Nome do ficheiro",
+ "Folder name" : "Nome da pasta",
+ "This node is unavailable" : "Este nó não está disponível",
+ "Another entry with the same name already exists." : "Já existe outra entrada com o mesmo nome",
+ "Invalid filename." : "Nome de ficheiro inválido",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renomeado de \"{oldName}\" para \"{newName}\"",
+ "Rename file" : "Renomear ficheiro",
+ "Folder" : "Pasta",
+ "Pending" : "Pendente",
+ "Clear filter" : "Limpar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Pesquisar em todo o lado",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros ativos",
+ "Remove filter" : "Remover filtro",
+ "Total rows summary" : "Resumo do total de linhas",
+ "Toggle selection for all files and folders" : "Alternar a seleção para todos os ficheiros e pastas",
+ "Name" : "Nome",
+ "Size" : "Tamanho",
+ "Actions" : "Ações",
+ "(selected)" : "(selecionado)",
+ "List of files and folders." : "Lista de ficheiros e pastas.",
+ "Column headers with buttons are sortable." : "Os cabeçalhos das colunas com botões são ordenáveis",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Por motivos de desempenho, esta lista não é totalmente processada. Os ficheiros serão processados à medida que navega na lista.",
+ "File not found" : "Ficheiro não encontrado",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionado","{count} selecionado"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "utilizado {used} de {quota}",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Não foi possível atualizar as estatísticas de armazenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "O seu armazenamento está cheio, os ficheiros já não podem ser atualizados ou sincronizados.",
+ "Storage information" : "Informação de armazenamento",
+ "Storage quota" : "Quota de armazenamento",
+ "New folder" : "Nova pasta",
+ "Create new folder" : "Criar nova pasta",
+ "This name is already in use." : "Este nome já está em uso.",
+ "Create" : "Criar",
+ "Fill template fields" : "Preencher campos do modelo",
+ "Submit" : "Submeter",
+ "Choose a file or folder to transfer" : "Escolher um ficheiro ou pasta para transferir",
+ "Transfer" : "Transfere",
+ "Transfer {path} to {userid}" : "Transfere {path} para {userid}",
+ "Invalid path selected" : "Caminho inválido selecionado",
"Unknown error" : "Erro desconhecido",
- "File could not be found" : "O ficheiro não foi encontrado",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Transferir",
+ "Ownership transfer request sent" : "Pedido de transferência de propriedade enviado",
+ "Cannot transfer ownership of a file or folder you do not own" : "Não é possível transferir a propriedade de um ficheiro ou pasta de que não é proprietário",
+ "Transfer ownership of a file or folder" : "Transferir a propriedade de um ficheiro ou pasta",
+ "Choose file or folder to transfer" : "Escolher ficheiro ou pasta para transferir",
+ "Change" : "Mudar",
+ "New owner" : "Novo proprietário",
+ "Choose {file}" : "Escolher {file}",
+ "Share" : "Partilhar",
+ "Shared by link" : "Partilhado por hiperligação",
+ "Shared" : "Partilhados",
+ "Not enough free space" : "Espaço insuficiente",
+ "Operation is blocked by access control" : "A operação está bloqueada pelo controlo de acesso",
+ "Retry" : "Repetir",
+ "No files in here" : "Nenhuns ficheiros aqui",
+ "Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
+ "Go back" : "Voltar",
+ "Views" : "Vistas",
+ "Files settings" : "Definições do Ficheiros",
+ "General" : "Geral",
+ "All files" : "Todos os ficheiros",
+ "Personal files" : "Ficheiros pessoais",
+ "Show hidden files" : "Mostrar ficheiros ocultos",
+ "Additional settings" : "Definições adicionais",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atalhos de teclado",
+ "File actions" : "Ações sobre ficheiros",
+ "Rename" : "Renomear",
"Delete" : "Apagar",
- "Home" : "Início",
+ "Deselect all" : "Desselecionar tudo",
+ "Navigation" : "Navegação",
+ "View" : "Ver",
+ "You" : "Vovê",
+ "Owner" : "Proprietário",
+ "Remove from favorites" : "Remover dos favoritos",
+ "Add to favorites" : "Adicionar aos favoritos",
+ "Tags" : "Etiquetas",
+ "Leave this share" : "Sair desta partilha",
+ "Disconnect storage" : "Desligar armazenamento",
+ "Disconnect storages" : "Desligar armazenamentos",
+ "Delete permanently" : "Eliminar permanentemente",
+ "Delete file" : "Apagar ficheiro",
+ "Delete folder" : "Apagar pasta",
+ "Cancel" : "Cancelar",
+ "Download" : "Transferir",
+ "Copy to {target}" : "Copiar para {target}",
+ "Move to {target}" : "Mover para {target}",
+ "Move" : "Mover",
+ "Move or copy" : "Mover ou copiar",
+ "Failed to redirect to client" : "Erro ao redirecionar para o cliente",
+ "Details" : "Detalhes",
+ "View in folder" : "Ver na pasta",
+ "Today" : "Hoje",
+ "Last 7 days" : "Últimos 7 dias",
+ "Last 30 days" : "Últimos 30 dias",
+ "Documents" : "Documentos",
+ "Audio" : "Áudio",
+ "Images" : "Imagens",
+ "Videos" : "Vídeos",
+ "Templates" : "Modelos",
+ "Some files could not be moved" : "Não foi possível mover alguns ficheiros",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Não foi possível renomear “{oldName}”, já não existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome “{newName}” já está a ser utilizado na pasta “{dir}”. Por favor, escolha um nome diferente.",
+ "Could not rename \"{oldName}\"" : "Não foi possível renomear \"{oldName}\"",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
+ "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros","%n ficheiros"],
+ "_%n folder_::_%n folders_" : ["%n pasta","%n pastas","%n pastas"],
+ "No favorites yet" : "Sem favoritos",
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
+ "Recent" : "Recentes",
+ "Search" : "Pesquisa sobre",
+ "No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
+ "Select all" : "Selecionar todos",
+ "Upload too large" : "Envio muito grande",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
+ "File could not be found" : "O ficheiro não foi encontrado",
+ "Show list view" : "Mostrar visualização em lista",
+ "Show grid view" : "Mostrar visualização em grelha",
"Close" : "Fechar",
- "Favorites" : "Favoritos",
"Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
"This will stop your current uploads." : "Isto irá interromper os seus carregamentos atuais.",
"Upload cancelled." : "Envio cancelado.",
@@ -19,29 +211,21 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível enviar {filename}, porque este é uma diretoria ou tem 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Não existe espaço suficiente, está a enviar {size1} mas resta apenas {size2}",
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
- "Not enough free space" : "Espaço insuficiente",
"An unknown error has occurred" : "Ocorreu um erro desconhecido",
+ "File could not be uploaded" : "O ficheiro não foi carregado",
"Uploading …" : "A carregar ...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "O carregamento do item não é suportado",
- "Target folder does not exist any more" : "A pasta de destino já não existe",
- "Operation is blocked by access control" : "A operação está bloqueada pelo controlo de acesso",
"Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {status}",
- "Actions" : "Ações",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
"Choose target folder" : "Escolher pasta de destino",
+ "Edit locally" : "Editar localmente",
"Open" : "Abrir",
- "Delete file" : "Apagar ficheiro",
- "Delete folder" : "Apagar pasta",
- "Disconnect storage" : "Desligue o armazenamento",
"Could not load info for file \"{file}\"" : "Não foi possível carregar informações do ficheiro \"{file}\"",
- "Files" : "Ficheiros",
- "Details" : "Detalhes",
- "Select" : "Selecionar",
- "Pending" : "Pendente",
+ "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) à seleção",
+ "Select directory \"{dirName}\"" : "Selecionar o diretório \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selecionar o ficheiro \"{fileName}\"",
"Unable to determine date" : "Não é possível determinar a data",
- "This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
"Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", destino já existe",
"Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"",
@@ -51,9 +235,6 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "Copiado {origin} para {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} outros ficheiros para dentro de {destination}",
"{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", este já não existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em utilização na pasta \"{dir}\". Por favor, escolha um nome diferente.",
- "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
"Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe",
"Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe",
@@ -61,18 +242,14 @@ OC.L10N.register(
"Error deleting file \"{fileName}\"." : "Erro ao eliminar o ficheiro \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nenhum resultado noutras pastas para {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar noutras pastas",
- "Name" : "Nome",
- "Size" : "Tamanho",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"],
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
"{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Não tem permissão para enviar ou criar ficheiros aqui",
- "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros"],
+ "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos","incluindo %n ocultos"],
+ "You do not have permission to upload or create files here" : "Não tem permissão para carregar ou criar ficheiros aqui",
+ "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros","A enviar %n ficheiros"],
"New" : "Novo",
+ "New file/folder menu" : "Novo menu ficheiro/pasta",
"Select file range" : "Selecionar o intervalo",
- "{used} of {quota} used" : "utilizado {used} de {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "{used} utilizado",
"\"{name}\" is an invalid file name." : "\"{name}\" é um nome de ficheiro inválido.",
"File name cannot be empty." : "O nome do ficheiro não pode estar em branco.",
@@ -80,83 +257,21 @@ OC.L10N.register(
"\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de ficheiro permitido",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento de {owner} está cheio. Os ficheiros não podem ser enviados ou sincronizados.",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
- "View in folder" : "Ver na pasta",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar hiperligação direta (apenas funciona para os utilizadores que tenham acesso a este ficheiro/pasta)",
"Path" : "Caminho",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Nos Favoritos",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Apenas pode definir como favorito um ficheiro ou uma pasta de cada vez",
- "New folder" : "Nova pasta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
"Upload file" : "Enviar ficheiro",
- "Recent" : "Recentes",
- "Not favorited" : "Não favorito",
- "Remove from favorites" : "Remover dos favoritos",
- "Add to favorites" : "Adicionar aos favoritos",
"An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as etiquetas",
- "Added to favorites" : "Adicionado aos favoritos",
- "Removed from favorites" : "Removido dos favoritos",
- "You added {file} to your favorites" : "Adicionou {file} aos favoritos",
- "You removed {file} from your favorites" : "Removeu {file} dos favoritos",
- "File changes" : "Alterações no ficheiro",
- "Created by {user}" : "Criado por {user}",
- "Changed by {user}" : "Modificado por {user}",
- "Deleted by {user}" : "Apagado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renomeado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"utilizador remoto\"",
- "You created {file}" : "Criou {file}",
- "{user} created {file}" : "{user} criou {file}",
- "{user} created an encrypted file in {file}" : "{user} criou um ficheiro encriptado em {file}",
- "{file} was created in a public folder" : "{file} foi criado numa pasta pública",
- "You changed {file}" : "Modificou {file}",
- "{user} changed {file}" : "{user} modificou {file}",
- "You deleted {file}" : "Eliminou {file}",
- "{user} deleted {file}" : "{user} eliminou {file}",
- "You restored {file}" : "Restaurou {file}",
- "{user} restored {file}" : "{user} restaurou {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomeou {oldfile} (oculto) para {newfile} (oculto)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Renomeou {oldfile} (oculto) para {newfile}",
- "You renamed {oldfile} to {newfile}" : "Renomeou {oldfile} para {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
- "You moved {oldfile} to {newfile}" : "Moveu {oldfile} para {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Um ficheiro foi adicionado ou removido dos seus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
- "All files" : "Todos os ficheiros",
- "Unlimited" : "Ilimitado",
"Upload (max. %s)" : "Envio (máx. %s)",
- "Accept" : "Aceitar",
- "in %s" : "em %s",
- "Transfer" : "Transfere",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Criar",
- "Templates" : "Modelos",
- "%s used" : "%s utilizado",
- "%1$s of %2$s used" : "Usado %1$s de %2$s",
- "Settings" : "Configurações",
- "Show hidden files" : "Mostrar ficheiros ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nenhuns ficheiros aqui",
- "Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
- "No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
- "Select all" : "Selecionar todos",
- "Upload too large" : "Envio muito grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
- "No favorites yet" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
- "Deleted files" : "Ficheiros eliminados",
- "Shares" : "Partilhas",
- "Shared with others" : "Partilhado com terceiros",
- "Shared with you" : "Partilhado consigo ",
- "Shared by link" : "Partilhado por hiperligação",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ação executada com sucesso ",
+ "\"{displayName}\" action failed" : "\"{displayName}\" a ação falhou",
+ "\"{displayName}\" batch action executed successfully" : "Ação de lote “{displayName}” executada com sucesso",
+ "Submitting fields…" : "Submeter campos…",
+ "Copy to clipboard" : "Copiar para área de transferência",
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheiros e {folderCount} pastas",
+ "Personal Files" : "Ficheiros pessoais",
"Text file" : "Ficheiro de Texto",
"New text file.txt" : "Novo texto ficheiro.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O armazenamento de {owner} está cheio. Os ficheiros já não podem ser atualizados ou sincronizados!",
- "Your storage is full, files can not be updated or synced anymore!" : "O seu armazenamento está cheio, os ficheiros já não podem ser atualizados ou sincronizados.",
- "_matches '{filter}'_::_match '{filter}'_" : ["corresponde a '{filter}'","correspondem a '{filter}'"]
+ "%1$s (renamed)" : "%1$s (renomeado)",
+ "renamed file" : "ficheiro renomeado"
},
-"nplurals=2; plural=(n != 1);");
+"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 9bcfee51041..ec180778cce 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -1,14 +1,206 @@
{ "translations": {
- "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
- "Storage invalid" : "Armazenamento inválido",
+ "Added to favorites" : "Adicionado aos favoritos",
+ "Removed from favorites" : "Removido dos favoritos",
+ "You added {file} to your favorites" : "Adicionou {file} aos seus favoritos",
+ "You removed {file} from your favorites" : "Removeu {file} dos favoritos",
+ "Favorites" : "Favoritos",
+ "File changes" : "Alterações no ficheiro",
+ "Created by {user}" : "Criado por {user}",
+ "Changed by {user}" : "Modificado por {user}",
+ "Deleted by {user}" : "Apagado por {user}",
+ "Restored by {user}" : "Restaurado por {user}",
+ "Renamed by {user}" : "Renomeado por {user}",
+ "Moved by {user}" : "Movido por {user}",
+ "\"remote account\"" : "conta remota",
+ "You created {file}" : "Criou {file}",
+ "You created an encrypted file in {file}" : "Criou um ficheiro encriptado em {file}",
+ "{user} created {file}" : "{user} criou {file}",
+ "{user} created an encrypted file in {file}" : "{user} criou um ficheiro encriptado em {file}",
+ "{file} was created in a public folder" : "{file} foi criado numa pasta pública",
+ "You changed {file}" : "Alterou {file}",
+ "You changed an encrypted file in {file}" : "Alterou um ficheiro encriptado em {file}",
+ "{user} changed {file}" : "{user} modificou {file}",
+ "{user} changed an encrypted file in {file}" : "{user} alterou um ficheiro encriptado em {file}",
+ "You deleted {file}" : "Apagou {file}",
+ "You deleted an encrypted file in {file}" : "Apagou um ficheiro encriptado em {file}",
+ "{user} deleted {file}" : "{user} apagou {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} apagou um ficheiro encriptado em {file} ",
+ "You restored {file}" : "Restaurou {file}",
+ "{user} restored {file}" : "{user} restaurou {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomeou {oldfile} (oculto) para {newfile} (oculto)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Renomeou {oldfile} (oculto) para {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Renomeou {oldfile} para {newfile} (escondido)",
+ "You renamed {oldfile} to {newfile}" : "Renomeou {oldfile} para {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomeou {oldfile} (escondido) para {newfile} (escondido)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomeou {oldfile} (escondido) para {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomeou {oldfile} para {newfile} (escondido)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
+ "You moved {oldfile} to {newfile}" : "Moveu {oldfile} para {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Um ficheiro foi adicionado ou removido dos seus <strong>favoritos</strong>",
+ "Files" : "Ficheiros",
+ "A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
+ "A favorite file or folder has been <strong>changed</strong>" : "Uma pasta ou ficheiro favorito foi <strong>alterado</strong>",
+ "Failed to authorize" : "Falhou a autorização",
+ "Invalid folder path" : "Caminho da pasta inválido",
+ "Folder not found" : "Pasta não encontrada",
+ "No favorites" : "Sem favoritos",
+ "Accept" : "Aceitar",
+ "Reject" : "Rejeitar",
+ "Incoming ownership transfer from {user}" : "Transferência de propriedade recebida de {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Quer aceitar {path} ?\n\nNota: O processo de transferência pode demorar até 1 hora após aceitar.",
+ "Ownership transfer denied" : "Transferência de propriedade negada",
+ "Your ownership transfer of {path} was denied by {user}." : "A sua transferência de propriedade de {path} foi negada por {user}.",
+ "Ownership transfer failed" : "Transferência de propriedade falhou",
+ "Your ownership transfer of {path} to {user} failed." : "A sua transferência de propriedade de {path} para {user} falhou.",
+ "The ownership transfer of {path} from {user} failed." : "A transferência de propriedade de {path} de {user} falhou.",
+ "Ownership transfer done" : "Transferência de propriedade concluída ",
+ "Your ownership transfer of {path} to {user} has completed." : "A sua transferência de propriedade de {path} para {user} foi concluída.",
+ "The ownership transfer of {path} from {user} has completed." : "A sua transferência de propriedade de {path} de {user} foi concluída",
+ "in %s" : "em %s",
+ "Transferred from %1$s on %2$s" : "Transferido de %1$s em %2$s",
+ "Files compatibility" : "Compatibilidade de ficheiros",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permitir a restrição dos nomes de ficheiro para garantir que possam ser sincronizados com todos os clientes. Por predefinição, todos os nomes de ficheiro válidos em POSIX (por exemplo, Linux ou macOS) são permitidos.",
+ "Enforce Windows compatibility" : "Forçar a compatibilidade com Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : " Isto bloqueará os nomes de ficheiro não válidos nos sistemas Windows, como a utilização de nomes reservados ou carateres especiais. Mas isto não irá impor a compatibilidade da sensibilidade à caixa alta maiúsculas ou baixa minúsculas.",
+ "File Management" : "Gestão de ficheiros",
+ "Home" : "Início",
+ "Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Reload current directory" : "Recarregar a pasta atual",
+ "Go to the \"{dir}\" directory" : "Ir para a pasta \"{dir}\"",
+ "Current directory path" : "Caminho da pasta atual",
+ "Your have used your space quota and cannot upload files anymore" : "Utilizou a sua quota de espaço e já não pode carregar mais ficheiros",
+ "Drag and drop files here to upload" : "Arraste e largue os ficheiros aqui para carregar",
+ "Favorite" : "Favorito",
+ "Back" : "Voltar",
+ "Toggle selection for file \"{displayName}\"" : "Alternar a seleção para o ficheiro \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Alternar a seleção para a pasta \"{displayName}\"",
+ "File is loading" : "Ficheiro está a carregar",
+ "Folder is loading" : "Pasta está a carregar",
+ "Filename" : "Nome do ficheiro",
+ "Folder name" : "Nome da pasta",
+ "This node is unavailable" : "Este nó não está disponível",
+ "Another entry with the same name already exists." : "Já existe outra entrada com o mesmo nome",
+ "Invalid filename." : "Nome de ficheiro inválido",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Renomeado de \"{oldName}\" para \"{newName}\"",
+ "Rename file" : "Renomear ficheiro",
+ "Folder" : "Pasta",
+ "Pending" : "Pendente",
+ "Clear filter" : "Limpar filtro",
+ "Modified" : "Modificado",
+ "Search everywhere" : "Pesquisar em todo o lado",
+ "Type" : "Tipo",
+ "Active filters" : "Filtros ativos",
+ "Remove filter" : "Remover filtro",
+ "Total rows summary" : "Resumo do total de linhas",
+ "Toggle selection for all files and folders" : "Alternar a seleção para todos os ficheiros e pastas",
+ "Name" : "Nome",
+ "Size" : "Tamanho",
+ "Actions" : "Ações",
+ "(selected)" : "(selecionado)",
+ "List of files and folders." : "Lista de ficheiros e pastas.",
+ "Column headers with buttons are sortable." : "Os cabeçalhos das colunas com botões são ordenáveis",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Por motivos de desempenho, esta lista não é totalmente processada. Os ficheiros serão processados à medida que navega na lista.",
+ "File not found" : "Ficheiro não encontrado",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionado","{count} selecionado"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} usado",
+ "{used} of {quota} used" : "utilizado {used} de {quota}",
+ "{relative}% used" : "{relative}% usado",
+ "Could not refresh storage stats" : "Não foi possível atualizar as estatísticas de armazenamento",
+ "Your storage is full, files can not be updated or synced anymore!" : "O seu armazenamento está cheio, os ficheiros já não podem ser atualizados ou sincronizados.",
+ "Storage information" : "Informação de armazenamento",
+ "Storage quota" : "Quota de armazenamento",
+ "New folder" : "Nova pasta",
+ "Create new folder" : "Criar nova pasta",
+ "This name is already in use." : "Este nome já está em uso.",
+ "Create" : "Criar",
+ "Fill template fields" : "Preencher campos do modelo",
+ "Submit" : "Submeter",
+ "Choose a file or folder to transfer" : "Escolher um ficheiro ou pasta para transferir",
+ "Transfer" : "Transfere",
+ "Transfer {path} to {userid}" : "Transfere {path} para {userid}",
+ "Invalid path selected" : "Caminho inválido selecionado",
"Unknown error" : "Erro desconhecido",
- "File could not be found" : "O ficheiro não foi encontrado",
- "Move or copy" : "Mover ou copiar",
- "Download" : "Transferir",
+ "Ownership transfer request sent" : "Pedido de transferência de propriedade enviado",
+ "Cannot transfer ownership of a file or folder you do not own" : "Não é possível transferir a propriedade de um ficheiro ou pasta de que não é proprietário",
+ "Transfer ownership of a file or folder" : "Transferir a propriedade de um ficheiro ou pasta",
+ "Choose file or folder to transfer" : "Escolher ficheiro ou pasta para transferir",
+ "Change" : "Mudar",
+ "New owner" : "Novo proprietário",
+ "Choose {file}" : "Escolher {file}",
+ "Share" : "Partilhar",
+ "Shared by link" : "Partilhado por hiperligação",
+ "Shared" : "Partilhados",
+ "Not enough free space" : "Espaço insuficiente",
+ "Operation is blocked by access control" : "A operação está bloqueada pelo controlo de acesso",
+ "Retry" : "Repetir",
+ "No files in here" : "Nenhuns ficheiros aqui",
+ "Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
+ "Go back" : "Voltar",
+ "Views" : "Vistas",
+ "Files settings" : "Definições do Ficheiros",
+ "General" : "Geral",
+ "All files" : "Todos os ficheiros",
+ "Personal files" : "Ficheiros pessoais",
+ "Show hidden files" : "Mostrar ficheiros ocultos",
+ "Additional settings" : "Definições adicionais",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiar",
+ "Keyboard shortcuts" : "Atalhos de teclado",
+ "File actions" : "Ações sobre ficheiros",
+ "Rename" : "Renomear",
"Delete" : "Apagar",
- "Home" : "Início",
+ "Deselect all" : "Desselecionar tudo",
+ "Navigation" : "Navegação",
+ "View" : "Ver",
+ "You" : "Vovê",
+ "Owner" : "Proprietário",
+ "Remove from favorites" : "Remover dos favoritos",
+ "Add to favorites" : "Adicionar aos favoritos",
+ "Tags" : "Etiquetas",
+ "Leave this share" : "Sair desta partilha",
+ "Disconnect storage" : "Desligar armazenamento",
+ "Disconnect storages" : "Desligar armazenamentos",
+ "Delete permanently" : "Eliminar permanentemente",
+ "Delete file" : "Apagar ficheiro",
+ "Delete folder" : "Apagar pasta",
+ "Cancel" : "Cancelar",
+ "Download" : "Transferir",
+ "Copy to {target}" : "Copiar para {target}",
+ "Move to {target}" : "Mover para {target}",
+ "Move" : "Mover",
+ "Move or copy" : "Mover ou copiar",
+ "Failed to redirect to client" : "Erro ao redirecionar para o cliente",
+ "Details" : "Detalhes",
+ "View in folder" : "Ver na pasta",
+ "Today" : "Hoje",
+ "Last 7 days" : "Últimos 7 dias",
+ "Last 30 days" : "Últimos 30 dias",
+ "Documents" : "Documentos",
+ "Audio" : "Áudio",
+ "Images" : "Imagens",
+ "Videos" : "Vídeos",
+ "Templates" : "Modelos",
+ "Some files could not be moved" : "Não foi possível mover alguns ficheiros",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Não foi possível renomear “{oldName}”, já não existe",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome “{newName}” já está a ser utilizado na pasta “{dir}”. Por favor, escolha um nome diferente.",
+ "Could not rename \"{oldName}\"" : "Não foi possível renomear \"{oldName}\"",
+ "This operation is forbidden" : "Esta operação é proibida",
+ "Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
+ "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros","%n ficheiros"],
+ "_%n folder_::_%n folders_" : ["%n pasta","%n pastas","%n pastas"],
+ "No favorites yet" : "Sem favoritos",
+ "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
+ "Recent" : "Recentes",
+ "Search" : "Pesquisa sobre",
+ "No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
+ "Select all" : "Selecionar todos",
+ "Upload too large" : "Envio muito grande",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
+ "File could not be found" : "O ficheiro não foi encontrado",
+ "Show list view" : "Mostrar visualização em lista",
+ "Show grid view" : "Mostrar visualização em grelha",
"Close" : "Fechar",
- "Favorites" : "Favoritos",
"Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"",
"This will stop your current uploads." : "Isto irá interromper os seus carregamentos atuais.",
"Upload cancelled." : "Envio cancelado.",
@@ -17,29 +209,21 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível enviar {filename}, porque este é uma diretoria ou tem 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Não existe espaço suficiente, está a enviar {size1} mas resta apenas {size2}",
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
- "Not enough free space" : "Espaço insuficiente",
"An unknown error has occurred" : "Ocorreu um erro desconhecido",
+ "File could not be uploaded" : "O ficheiro não foi carregado",
"Uploading …" : "A carregar ...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "O carregamento do item não é suportado",
- "Target folder does not exist any more" : "A pasta de destino já não existe",
- "Operation is blocked by access control" : "A operação está bloqueada pelo controlo de acesso",
"Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {status}",
- "Actions" : "Ações",
- "Rename" : "Renomear",
- "Copy" : "Copiar",
"Choose target folder" : "Escolher pasta de destino",
+ "Edit locally" : "Editar localmente",
"Open" : "Abrir",
- "Delete file" : "Apagar ficheiro",
- "Delete folder" : "Apagar pasta",
- "Disconnect storage" : "Desligue o armazenamento",
"Could not load info for file \"{file}\"" : "Não foi possível carregar informações do ficheiro \"{file}\"",
- "Files" : "Ficheiros",
- "Details" : "Detalhes",
- "Select" : "Selecionar",
- "Pending" : "Pendente",
+ "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ",
+ "Apply tag(s) to selection" : "Aplicar etiqueta(s) à seleção",
+ "Select directory \"{dirName}\"" : "Selecionar o diretório \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selecionar o ficheiro \"{fileName}\"",
"Unable to determine date" : "Não é possível determinar a data",
- "This operation is forbidden" : "Esta operação é proibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador",
"Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", destino já existe",
"Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"",
@@ -49,9 +233,6 @@
"Copied {origin} inside {destination}" : "Copiado {origin} para {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} outros ficheiros para dentro de {destination}",
"{newName} already exists" : "{newName} já existe",
- "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", este já não existe",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em utilização na pasta \"{dir}\". Por favor, escolha um nome diferente.",
- "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"",
"Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe",
"Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe",
@@ -59,18 +240,14 @@
"Error deleting file \"{fileName}\"." : "Erro ao eliminar o ficheiro \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nenhum resultado noutras pastas para {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Digite mais de dois caracteres para pesquisar noutras pastas",
- "Name" : "Nome",
- "Size" : "Tamanho",
- "Modified" : "Modificado",
- "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"],
- "_%n file_::_%n files_" : ["%n ficheiro","%n ficheiros"],
"{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos"],
- "You don’t have permission to upload or create files here" : "Não tem permissão para enviar ou criar ficheiros aqui",
- "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros"],
+ "_including %n hidden_::_including %n hidden_" : ["incluindo %n ocultos","incluindo %n ocultos","incluindo %n ocultos"],
+ "You do not have permission to upload or create files here" : "Não tem permissão para carregar ou criar ficheiros aqui",
+ "_Uploading %n file_::_Uploading %n files_" : ["A enviar %n ficheiro","A enviar %n ficheiros","A enviar %n ficheiros"],
"New" : "Novo",
+ "New file/folder menu" : "Novo menu ficheiro/pasta",
"Select file range" : "Selecionar o intervalo",
- "{used} of {quota} used" : "utilizado {used} de {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "{used} utilizado",
"\"{name}\" is an invalid file name." : "\"{name}\" é um nome de ficheiro inválido.",
"File name cannot be empty." : "O nome do ficheiro não pode estar em branco.",
@@ -78,83 +255,21 @@
"\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de ficheiro permitido",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "O armazenamento de {owner} está cheio. Os ficheiros não podem ser enviados ou sincronizados.",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
- "View in folder" : "Ver na pasta",
- "Copied!" : "Copiado!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiar hiperligação direta (apenas funciona para os utilizadores que tenham acesso a este ficheiro/pasta)",
"Path" : "Caminho",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Nos Favoritos",
- "Favorite" : "Favorito",
- "You can only favorite a single file or folder at a time" : "Apenas pode definir como favorito um ficheiro ou uma pasta de cada vez",
- "New folder" : "Nova pasta",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes","%n bytes"],
"Upload file" : "Enviar ficheiro",
- "Recent" : "Recentes",
- "Not favorited" : "Não favorito",
- "Remove from favorites" : "Remover dos favoritos",
- "Add to favorites" : "Adicionar aos favoritos",
"An error occurred while trying to update the tags" : "Ocorreu um erro ao tentar atualizar as etiquetas",
- "Added to favorites" : "Adicionado aos favoritos",
- "Removed from favorites" : "Removido dos favoritos",
- "You added {file} to your favorites" : "Adicionou {file} aos favoritos",
- "You removed {file} from your favorites" : "Removeu {file} dos favoritos",
- "File changes" : "Alterações no ficheiro",
- "Created by {user}" : "Criado por {user}",
- "Changed by {user}" : "Modificado por {user}",
- "Deleted by {user}" : "Apagado por {user}",
- "Restored by {user}" : "Restaurado por {user}",
- "Renamed by {user}" : "Renomeado por {user}",
- "Moved by {user}" : "Movido por {user}",
- "\"remote user\"" : "\"utilizador remoto\"",
- "You created {file}" : "Criou {file}",
- "{user} created {file}" : "{user} criou {file}",
- "{user} created an encrypted file in {file}" : "{user} criou um ficheiro encriptado em {file}",
- "{file} was created in a public folder" : "{file} foi criado numa pasta pública",
- "You changed {file}" : "Modificou {file}",
- "{user} changed {file}" : "{user} modificou {file}",
- "You deleted {file}" : "Eliminou {file}",
- "{user} deleted {file}" : "{user} eliminou {file}",
- "You restored {file}" : "Restaurou {file}",
- "{user} restored {file}" : "{user} restaurou {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomeou {oldfile} (oculto) para {newfile} (oculto)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Renomeou {oldfile} (oculto) para {newfile}",
- "You renamed {oldfile} to {newfile}" : "Renomeou {oldfile} para {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
- "You moved {oldfile} to {newfile}" : "Moveu {oldfile} para {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Um ficheiro foi adicionado ou removido dos seus <strong>favoritos</strong>",
- "A file or folder has been <strong>changed</strong>" : "Foi <strong>alterado</strong> um ficheiro ou pasta",
- "All files" : "Todos os ficheiros",
- "Unlimited" : "Ilimitado",
"Upload (max. %s)" : "Envio (máx. %s)",
- "Accept" : "Aceitar",
- "in %s" : "em %s",
- "Transfer" : "Transfere",
- "Tags" : "Etiquetas",
- "Cancel" : "Cancelar",
- "Create" : "Criar",
- "Templates" : "Modelos",
- "%s used" : "%s utilizado",
- "%1$s of %2$s used" : "Usado %1$s de %2$s",
- "Settings" : "Configurações",
- "Show hidden files" : "Mostrar ficheiros ocultos",
- "WebDAV" : "WebDAV",
- "No files in here" : "Nenhuns ficheiros aqui",
- "Upload some content or sync with your devices!" : "Envie algum conteúdo ou sincronize com os seus dispositivos!",
- "No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
- "Select all" : "Selecionar todos",
- "Upload too large" : "Envio muito grande",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que está a tentar enviar excedem o tamanho máximo para os envios de ficheiro neste servidor.",
- "No favorites yet" : "Sem favoritos",
- "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui",
- "Deleted files" : "Ficheiros eliminados",
- "Shares" : "Partilhas",
- "Shared with others" : "Partilhado com terceiros",
- "Shared with you" : "Partilhado consigo ",
- "Shared by link" : "Partilhado por hiperligação",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ação executada com sucesso ",
+ "\"{displayName}\" action failed" : "\"{displayName}\" a ação falhou",
+ "\"{displayName}\" batch action executed successfully" : "Ação de lote “{displayName}” executada com sucesso",
+ "Submitting fields…" : "Submeter campos…",
+ "Copy to clipboard" : "Copiar para área de transferência",
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ficheiros e {folderCount} pastas",
+ "Personal Files" : "Ficheiros pessoais",
"Text file" : "Ficheiro de Texto",
"New text file.txt" : "Novo texto ficheiro.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "O armazenamento de {owner} está cheio. Os ficheiros já não podem ser atualizados ou sincronizados!",
- "Your storage is full, files can not be updated or synced anymore!" : "O seu armazenamento está cheio, os ficheiros já não podem ser atualizados ou sincronizados.",
- "_matches '{filter}'_::_match '{filter}'_" : ["corresponde a '{filter}'","correspondem a '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
+ "%1$s (renamed)" : "%1$s (renomeado)",
+ "renamed file" : "ficheiro renomeado"
+},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 0f68ad4c6d0..50a11451c1f 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -1,16 +1,206 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Spațiu de stocare este indisponibil temporar",
- "Storage invalid" : "Spațiu de stocare invalid",
+ "Added to favorites" : "Adaugat la favorite",
+ "Removed from favorites" : "Șters din favorite",
+ "You added {file} to your favorites" : "Ai adaugat {file} în favorite",
+ "You removed {file} from your favorites" : "Ai șters {file} din favorite",
+ "Favorites" : "Favorite",
+ "File changes" : "Modificări fișiere",
+ "Created by {user}" : "Creat de {user}",
+ "Changed by {user}" : "Modificat de {user}",
+ "Deleted by {user}" : "Șters de {user}",
+ "Restored by {user}" : "Restaurat de {user}",
+ "Renamed by {user}" : "Redenumit de {user}",
+ "Moved by {user}" : "Mutat de {user}",
+ "You created {file}" : "Ai creat {file}",
+ "You created an encrypted file in {file}" : "Ai creat un fișier criptat în {file}",
+ "{user} created {file}" : "{user} a creat {file}",
+ "{user} created an encrypted file in {file}" : "{user} a creat un fișier criptat în {file}",
+ "{file} was created in a public folder" : "{file} a fost creat într-un director public ",
+ "You changed {file}" : "Ai modificat {file}",
+ "You changed an encrypted file in {file}" : "Ai modificat un fișier criptat în {file}",
+ "{user} changed {file}" : "{user} a modificat {file}",
+ "{user} changed an encrypted file in {file}" : "{user} a modificat un fișier criptat în {file}",
+ "You deleted {file}" : "Ai șters {file}",
+ "You deleted an encrypted file in {file}" : "Ai șters un fișier criptat în {file}",
+ "{user} deleted {file}" : "{user} a șters {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} a șters un fișier criptat în {file}",
+ "You restored {file}" : "Ai restaurat {file}",
+ "{user} restored {file}" : "{user} a restaurat {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Ai redenumit {oldfile} (hidden) în {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Ai redenumit {oldfile} (hidden) în {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Ai redenumit {oldfile} în {newfile} (ascuns)",
+ "You renamed {oldfile} to {newfile}" : "Ai redenumit {oldfile} în {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} a redenumit {oldfile} (hidden) în {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} a redenumit {oldfile} (hidden) în {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} a redenumit {oldfile} în {newfile} (hidden)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} a redenumit {oldfile} în {newfile}",
+ "You moved {oldfile} to {newfile}" : "Ai mutat {oldfile} în {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} a mutat {oldfile} în {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Un fișier a fost adăugat în sau șters din <strong>favorites</strong>",
+ "Files" : "Fișiere",
+ "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un fișier sau dosar favorit a fost <strong>schimbat</strong>",
+ "No favorites" : "Fără favorite",
+ "Accept" : "Accept",
+ "Reject" : "Respinge",
+ "Incoming ownership transfer from {user}" : "Se transferă proprietatea de la {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Dorești să accepți {path}?\n\nNotă: Procesul de transfer după acceptare poate să durește până la 1 oră.",
+ "Ownership transfer failed" : "Transferul de proprietate a eșuat",
+ "Your ownership transfer of {path} to {user} failed." : "Transferul tău de proprietate de {path} către {user} a eșuat.",
+ "The ownership transfer of {path} from {user} failed." : "Transferul de proprietate de {path} către {user} a eșuat.",
+ "Ownership transfer done" : "Transferul de proprietate s-a finalizat",
+ "Your ownership transfer of {path} to {user} has completed." : "Transferul tău de proprietate de {path} către {user} s-a finalizat.",
+ "The ownership transfer of {path} from {user} has completed." : "Transferul de proprietate de {path} către {user} s-a finalizat.",
+ "in %s" : "în %s",
+ "File Management" : "Management fișiere",
+ "Home" : "Acasă",
+ "Target folder does not exist any more" : "Directorul destinație nu mai există",
+ "Reload current directory" : "Reîncarcă directorul curent",
+ "Go to the \"{dir}\" directory" : "Salt la directorul \"{dir}\" ",
+ "Drag and drop files here to upload" : "Faceți Drag and drop cu fișierele aici pentru upload",
+ "Favorite" : "Favorit",
+ "Back" : "Înapoi",
+ "Filename" : "Nume fișier",
+ "Folder name" : "Denumire director",
+ "This node is unavailable" : "Acest nod este indisponibil",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "A fost redenumit \"{oldName}\" cu \"{newName}\"",
+ "Rename file" : "Redenumire fișier",
+ "Folder" : "Director",
+ "Pending" : "În așteptare",
+ "Clear filter" : "Șterge filtrul",
+ "Modified" : "Modificat",
+ "Search everywhere" : "Caută oriunde",
+ "Type" : "Tip",
+ "Active filters" : "Filtre active",
+ "Total rows summary" : "Rezumat total rânduri",
+ "Name" : "Nume",
+ "Size" : "Mărime",
+ "Actions" : "Acțiuni",
+ "List of files and folders." : "Listă fișiere și foldere",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați prin listă.",
+ "File not found" : "Fișierul nu a fost găsit",
+ "_{count} selected_::_{count} selected_" : ["{count}selectat","{count}selectate","{count}selectate"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizați",
+ "{used} of {quota} used" : "{used} din {quota} folosiți",
+ "{relative}% used" : "{relative}% utilizat",
+ "Could not refresh storage stats" : "Nu pot actualiza statisticile de stocare",
+ "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!",
+ "New folder" : "Un nou dosar",
+ "Create new folder" : "Creează director nou",
+ "Create" : "Crează",
+ "Submit" : "Trimite",
+ "Choose a file or folder to transfer" : "Alege un fișier sau dosar de transferat",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transferă {path} către {userid}",
+ "Invalid path selected" : "Calea selectată este invalidă",
"Unknown error" : "Eroare necunoscută",
- "File could not be found" : "Fișierul nu a fost găsit",
- "Move or copy" : "Mută sau copiază",
- "Download" : "Descarcă",
+ "Ownership transfer request sent" : "Cererea de transfer a fost trimisă",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nu se poate transfera proprietatea unui fișier sau dosar daca nu le deții",
+ "Transfer ownership of a file or folder" : "Transferă proprietatea unui fisier sau dosar",
+ "Choose file or folder to transfer" : "Alege fișierul sau dosarul de transferat",
+ "Change" : "Modificare",
+ "New owner" : "Proprietarul nou",
+ "Select file or folder to link to" : "Selectați fișierul sau folderul țintă a link-ului",
+ "Choose {file}" : "Selectați {file}",
+ "Share" : "Partajează",
+ "Shared by link" : "Partajat prin link",
+ "Shared" : "Partajat",
+ "Switch to list view" : "Comuta la organizarea tip listă",
+ "Switch to grid view" : "Comută la organizare tip grilă",
+ "Not enough free space" : "Spațiu insuficient",
+ "Operation is blocked by access control" : "Operația este blocată de către controlul de acces",
+ "Loading current folder" : "Se încarcă folderul curent",
+ "Retry" : "Reîncearcă",
+ "No files in here" : "Niciun fișier aici",
+ "Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
+ "Go back" : "Înapoi",
+ "Views" : "Mod de viziualizare",
+ "Files settings" : "Setări Fișiere",
+ "File cannot be accessed" : "Fișierul nu poate fi accesat",
+ "Clipboard is not available" : "Clipboardul este indisponibil",
+ "General" : "General",
+ "All files" : "Toate fișierele",
+ "Personal files" : "Fișiere personale",
+ "Sort favorites first" : "Sortați favoritele primele",
+ "Appearance" : "Aspect",
+ "Show hidden files" : "Arată fișierele ascunse",
+ "Crop image previews" : "Previzualizarea imaginii decupate",
+ "Additional settings" : "Setări adiționale",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiază",
+ "Keyboard shortcuts" : "Scurtături din tastatură",
+ "Rename" : "Redenumește",
"Delete" : "Șterge",
- "Home" : "Acasă",
+ "Manage tags" : "Administrați etichete",
+ "Deselect all" : "Deselectează tot",
+ "Navigation" : "Navigare",
+ "View" : "Vizualizare",
+ "Toggle grid view" : "Comută vizualizarea grilă",
+ "You" : "Tu",
+ "Error while loading the file data" : "A apărut o eroare în timpul încărcării datele din fișier",
+ "Owner" : "Proprietar",
+ "Remove from favorites" : "Șterge din favorite",
+ "Add to favorites" : "Adaugă la favorite",
+ "Tags" : "Etichete",
+ "Blank" : "Gol",
+ "Unable to create new file from template" : "Nu s-a putut creea un fisier nou pentru acest șablon",
+ "Pick a template for {name}" : "Alege un șablon pentru {name}",
+ "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
+ "Creating file" : "Se crează fișierul",
+ "Disconnect storage" : "Deconectează stocarea",
+ "Delete permanently" : "Șterge permanent",
+ "Cancel" : "Anulare",
+ "Download" : "Descarcă",
+ "Destination is not a folder" : "Destinația nu este un folder",
+ "This file/folder is already in that directory" : "Acest fișier/folder există în acel dosar",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nu se poate muta/redenumi un fișier/folder în el însuși sau într-un subfolder al său",
+ "A file or folder with that name already exists in this folder" : "Un fișier sau folder cu acest nume există deja în acest folder",
+ "The file does not exist anymore" : "Fișierul nu mai există",
+ "Copy to {target}" : "Copiază la {target}",
+ "Move to {target}" : "Mută la {target}",
+ "Move" : "Mută",
+ "Move or copy" : "Mută sau copiază",
+ "Open folder {displayName}" : "Deschide dosarul {displayName}",
+ "Open in Files" : "Deschide în Fișiere",
+ "Failed to redirect to client" : "Eroare la redirectarea către client",
+ "Details" : "Detalii",
+ "View in folder" : "Vizualizează în director",
+ "Today" : "Azi",
+ "Last 7 days" : "Ultimele 7 zile",
+ "Last 30 days" : "Ultimele 30 de zile",
+ "Documents" : "Documente",
+ "Audio" : "Audio",
+ "Images" : "Imagini",
+ "Videos" : "Fișiere video",
+ "Created new folder \"{name}\"" : "A fost creat folderul nou \"{name}\"",
+ "Unable to initialize the templates directory" : "Nu s-a putut inițializa dosarul cu șabloane",
+ "Templates" : "Șabloane",
+ "Some files could not be moved" : "Unele fișiere nu au putut fi mutate",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" nu poate fi redenumit deoarece nu mai există",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Numele \"{newName}\" există în folderul \"{dir}\". Selectați, vă rog, alt nume.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" nu poate fi redenumit",
+ "This operation is forbidden" : "Operațiunea este interzisă",
+ "Storage is temporarily not available" : "Spațiu de stocare este indisponibil temporar",
+ "_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
+ "_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
+ "No favorites yet" : "Nu aveți favorite încă",
+ "Files and folders you mark as favorite will show up here" : "FIșierele și directoarele pe care le marchezi ca favorite vor apărea aici",
+ "List of your files and folders." : "Lista fișierelor și dosarelor personale.",
+ "Recent" : "Recente",
+ "List of recently modified files and folders." : "Lista fișierelor și dosarelor modificate recent.",
+ "No recently modified files" : "Niciun fișier modificat recent",
+ "Files and folders you recently modified will show up here." : "Fișierele și dosarele modificate recent vor fi afișate aici",
+ "Search" : "Căutare",
+ "No entries found in this folder" : "Niciun element găsit în acest director",
+ "Select all" : "Selectează tot",
+ "Upload too large" : "Fișierul încărcat este prea mare",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
+ "File could not be found" : "Fișierul nu a fost găsit",
+ "Show list view" : "Afișează vizualizarea listă",
+ "Show grid view" : "Afișează vizualizarea grilă",
"Close" : "Închide",
- "Favorites" : "Favorite",
"Could not create folder \"{dir}\"" : "Nu s-a putut crea directorul \"{dir}\"",
"This will stop your current uploads." : "Asta va opri descărcările curente.",
"Upload cancelled." : "Încărcare anulată.",
@@ -19,29 +209,23 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
"Target folder \"{dir}\" does not exist any more" : "Directorul \"{dir}\" nu mai există",
- "Not enough free space" : "Spațiu insuficient",
"An unknown error has occurred" : "A apărut o eroare necunoscută!",
+ "File could not be uploaded" : "Fișierele nu au putut fi încărcate",
"Uploading …" : "Încărcare...",
+ "Uploading … ({currentNumber}/{total})" : "Se încarcă … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} din {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Încărcarea acestui obiect nu este suportată",
- "Target folder does not exist any more" : "Directorul destinație nu mai există",
"Error when assembling chunks, status code {status}" : "Eroare la asambralea bucăților, status cod {status}",
- "Actions" : "Acțiuni",
- "Rename" : "Redenumește",
- "Copy" : "Copiază",
"Choose target folder" : "Alege directorul destinație",
+ "Set reminder" : "Setează memo",
+ "Edit locally" : "Editează local",
"Open" : "Deschide",
- "Delete file" : "Șterge fișier",
- "Delete folder" : "Șterge director",
- "Disconnect storage" : "Deconectează stocarea",
- "Leave this share" : "Părăsește acest cerc",
"Could not load info for file \"{file}\"" : "Nu s-a putut încărca informația pentru fișierul \"{file}\"",
- "Files" : "Fișiere",
- "Details" : "Detalii",
- "Select" : "Alege",
- "Pending" : "În așteptare",
+ "Please select tag(s) to add to the selection" : "Selectați eticheta(ele) pentru adăugare la selecție",
+ "Apply tag(s) to selection" : "Aplică eticheta(ele) selecției",
+ "Select directory \"{dirName}\"" : "Selectează dosarul \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selectează fișierul \"{fileName}\"",
"Unable to determine date" : "Nu s-a putut determina data",
- "This operation is forbidden" : "Operațiunea este interzisă",
"This directory is unavailable, please check the logs or contact the administrator" : "Acest director nu este disponibil, te rugăm verifică logurile sau contactează un administrator",
"Could not move \"{file}\", target exists" : "Nu s-a putut muta fișierul \"{file}\", există deja un altul cu același nume în directorul destinație",
"Could not move \"{file}\"" : "Nu s-a putut muta fișierul \"{file}\"",
@@ -51,122 +235,55 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "S-a copiat {origin} în {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "S-a copiat {origin} și {nbfiles} alte fișiere în {destination}",
"{newName} already exists" : "{newName} există deja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nu s-a putut redenumi \"{fileName}\", fișierul nu mai există",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Numele \"{targetName}\" este deja folosit în directorul \"{dir}\". Alege un nume diferit.",
- "Could not rename \"{fileName}\"" : "Nu s-a putut redenumi \"{fileName}\"",
"Could not create file \"{file}\"" : "Nu s-a putut crea fișierul \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nu s-a putut crea fișierul \"{file}\" deoarece există deja unul cu același nume",
"Could not create folder \"{dir}\" because it already exists" : "Nu s-a putut crea directorul \"{dir}\" deoarece există deja unul cu același nume",
+ "Could not fetch file details \"{file}\"" : "Nu s-au putut aduna detalii \"{file}\"",
"Error deleting file \"{fileName}\"." : "Eroare la ștergerea fișierului \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nu au fost găsite rezultate în alte directoare pentru {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduceți mai mult de două caractere pentru a căuta în alte dosare",
- "Name" : "Nume",
- "Size" : "Mărime",
- "Modified" : "Modificat",
- "_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
- "_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
"{dirs} and {files}" : "{dirs} și {files}",
"_including %n hidden_::_including %n hidden_" : ["incluzând %n ascuns","incluzând %nascunse","incluzând %nascuns"],
- "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici",
+ "You do not have permission to upload or create files here" : "Nu ai permisiunea de a încărca fișiere aici",
"_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."],
"New" : "Nou",
+ "New file/folder menu" : "Meniu Fișier/Folder nou",
"Select file range" : "Selectează un interval",
- "{used} of {quota} used" : "{used} din {quota} folosiți",
"{used} used" : "{used} folosiți",
"\"{name}\" is an invalid file name." : "\"{name}\" este un nume de fișier nevalid.",
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
"\"/\" is not allowed inside a file name." : "\"/\" nu este permis în denumirea fișierului.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Spațiul de stocare alocat {owner} este plin, drept urmare fișierele nu mai pot fi sincronizate sau updatate !",
- "View in folder" : "Vizualizează în director",
- "Copied!" : "S-a copiat!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiază link direct (funcționeză numai pentru utilizatorii care au acces la acest fișier/director)",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Dosarul \"{mountPoint}\" este plin, fisiere nu mai pot fi reîmprospătate sau sincronizate!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Stocarea externă \"{mountPoint}\" este plina, fisierele nu mai pot fi reîmprospătate sau sincronizate!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Dosarul tău este plin, fisiere nu mai pot fi reîmprospătate sau sincronizate!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Stocarea lui {owner} este aproape plină în proporție de ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Dosarul \"{mountPoint}\" este aproape plin in proporție de ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Stocarea externă \"{mountPoint}\" este aproape plină in proporție de ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Stocarea dumneavoastra este aproape plină în proporție de ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["potrivește \"{filter}\"","potrivește \"{filter}\"","potrivește \"{filter}\""],
"Path" : "Cale",
"_%n byte_::_%n bytes_" : ["%n octet","%n octeți","%n octeți"],
- "Favorited" : "Adăugate la favorite",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Poți adauga la favorite un singur fișier sau director odată",
- "New folder" : "Un nou dosar",
"Upload file" : "Încarcă fișier",
- "Recent" : "Recente",
- "Not favorited" : "Scoate de la favorite",
- "Remove from favorites" : "Șterge din favorite",
- "Add to favorites" : "Adaugă la favorite",
"An error occurred while trying to update the tags" : "A apărut o eroare în timpul actualizării etichetelor",
- "Added to favorites" : "Adaugat la favorite",
- "Removed from favorites" : "Șters din favorite",
- "You added {file} to your favorites" : "Ai adaugat {file} în favorite",
- "You removed {file} from your favorites" : "Ai șters {file} din favorite",
- "File changes" : "Modificări fișiere",
- "Created by {user}" : "Creat de {user}",
- "Changed by {user}" : "Modificat de {user}",
- "Deleted by {user}" : "Șters de {user}",
- "Restored by {user}" : "Restaurat de {user}",
- "Renamed by {user}" : "Redenumit de {user}",
- "Moved by {user}" : "Mutat de {user}",
- "\"remote user\"" : "\"utilizator la distanță\"",
- "You created {file}" : "Ai creat {file}",
- "You created an encrypted file in {file}" : "Ai creat un fișier criptat în {file}",
- "{user} created {file}" : "{user} a creat {file}",
- "{user} created an encrypted file in {file}" : "{user} a creat un fișier criptat în {file}",
- "{file} was created in a public folder" : "{file} a fost creat într-un director public ",
- "You changed {file}" : "Ai modificat {file}",
- "You changed an encrypted file in {file}" : "Ai modificat un fișier criptat în {file}",
- "{user} changed {file}" : "{user} a modificat {file}",
- "{user} changed an encrypted file in {file}" : "{user} a modificat un fișier criptat în {file}",
- "You deleted {file}" : "Ai șters {file}",
- "You deleted an encrypted file in {file}" : "Ai șters un fișier criptat în {file}",
- "{user} deleted {file}" : "{user} a șters {file}",
- "{user} deleted an encrypted file in {file}" : "{user} a șters un fișier criptat în {file}",
- "You restored {file}" : "Ai restaurat {file}",
- "{user} restored {file}" : "{user} a restaurat {file}",
- "You renamed {oldfile} to {newfile}" : "Ai redenumit {oldfile} în {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} a redenumit {oldfile} în {newfile}",
- "You moved {oldfile} to {newfile}" : "Ai mutat {oldfile} în {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} a mutat {oldfile} în {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un fișier a fost adăugat în sau șters din <strong>favorites</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
- "All files" : "Toate fișierele",
- "Unlimited" : "Nelimitată",
"Upload (max. %s)" : "Încarcă (max. %s)",
- "Accept" : "Accept",
- "in %s" : "în %s",
- "File Management" : "Management fișiere",
- "Transfer" : "Transfer",
- "Tags" : "Etichete",
- "Cancel" : "Anulare",
- "Create" : "Crează",
- "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
- "Creating file" : "Se crează fișierul",
- "Blank" : "Gol",
- "%s used" : "%s folosiți",
- "%s%% of %s used" : "%s%%din %sfolosiți",
- "%1$s of %2$s used" : "%1$s din %2$s utilizat",
- "Settings" : "Setări",
- "Show hidden files" : "Arată fișierele ascunse",
- "Crop image previews" : "Previzualizarea imaginii decupate",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "Acțiunea \"{displayName}\" a fost executată cu succes",
+ "\"{displayName}\" action failed" : "Acțiunea \"{displayName}\" a eșuat",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" acțiunea batch a fost executată cu succes",
+ "WebDAV URL copied to clipboard" : "URL-ul WebDAV a fost copiat în clipboard",
+ "Enable the grid view" : "Activați organizarea tip grilă",
+ "Copy to clipboard" : "Copiază în clipboard",
"Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
- "Toggle %1$s sublist" : "Comută %1$s sublistă",
- "Toggle grid view" : "Comută vizualizarea grilă",
- "No files in here" : "Niciun fișier aici",
- "Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
- "No entries found in this folder" : "Niciun element găsit în acest director",
- "Select all" : "Selectează tot",
- "Upload too large" : "Fișierul încărcat este prea mare",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
- "No favorites yet" : "Nu aveți favorite încă",
- "Files and folders you mark as favorite will show up here" : "FIșierele și directoarele pe care le marchezi ca favorite vor apărea aici",
- "Deleted files" : "Fișiere șterse",
- "Shares" : "Partajări",
- "Shared with others" : "Partajat cu alții",
- "Shared with you" : "Partajat cu tine",
- "Shared by link" : "Partajat prin link",
- "Deleted shares" : "Partajări șterse",
- "Pending shares" : "Partajări in asteptare",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
+ "Cancelled move or copy operation" : "Copierea sau mutarea a fost anulată",
+ "Open details" : "Deschide detaliile",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} foldere","{folderCount} foldere"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fișier","{fileCount} fișiere","{fileCount} fișiere"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fișier și {folderCount} folder","1 fișier și {folderCount} foldere","1 fișier și {folderCount} foldere"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fișier și 1 folder","{fileCount} fișiere și 1 folder","{fileCount} fișiere și 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fișiere și {folderCount} dosare",
"Text file" : "Fișier text",
- "New text file.txt" : "Fișier nou.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Spațiul de stocare pentru {owner} este plin, fișierele nu mai pot fi incărcate sau sincronizate!",
- "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!"
+ "New text file.txt" : "Fișier nou.txt"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index bede97489a4..2e2336ddbba 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -1,14 +1,204 @@
{ "translations": {
- "Storage is temporarily not available" : "Spațiu de stocare este indisponibil temporar",
- "Storage invalid" : "Spațiu de stocare invalid",
+ "Added to favorites" : "Adaugat la favorite",
+ "Removed from favorites" : "Șters din favorite",
+ "You added {file} to your favorites" : "Ai adaugat {file} în favorite",
+ "You removed {file} from your favorites" : "Ai șters {file} din favorite",
+ "Favorites" : "Favorite",
+ "File changes" : "Modificări fișiere",
+ "Created by {user}" : "Creat de {user}",
+ "Changed by {user}" : "Modificat de {user}",
+ "Deleted by {user}" : "Șters de {user}",
+ "Restored by {user}" : "Restaurat de {user}",
+ "Renamed by {user}" : "Redenumit de {user}",
+ "Moved by {user}" : "Mutat de {user}",
+ "You created {file}" : "Ai creat {file}",
+ "You created an encrypted file in {file}" : "Ai creat un fișier criptat în {file}",
+ "{user} created {file}" : "{user} a creat {file}",
+ "{user} created an encrypted file in {file}" : "{user} a creat un fișier criptat în {file}",
+ "{file} was created in a public folder" : "{file} a fost creat într-un director public ",
+ "You changed {file}" : "Ai modificat {file}",
+ "You changed an encrypted file in {file}" : "Ai modificat un fișier criptat în {file}",
+ "{user} changed {file}" : "{user} a modificat {file}",
+ "{user} changed an encrypted file in {file}" : "{user} a modificat un fișier criptat în {file}",
+ "You deleted {file}" : "Ai șters {file}",
+ "You deleted an encrypted file in {file}" : "Ai șters un fișier criptat în {file}",
+ "{user} deleted {file}" : "{user} a șters {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} a șters un fișier criptat în {file}",
+ "You restored {file}" : "Ai restaurat {file}",
+ "{user} restored {file}" : "{user} a restaurat {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Ai redenumit {oldfile} (hidden) în {newfile} (hidden)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Ai redenumit {oldfile} (hidden) în {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Ai redenumit {oldfile} în {newfile} (ascuns)",
+ "You renamed {oldfile} to {newfile}" : "Ai redenumit {oldfile} în {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} a redenumit {oldfile} (hidden) în {newfile} (hidden)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} a redenumit {oldfile} (hidden) în {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} a redenumit {oldfile} în {newfile} (hidden)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} a redenumit {oldfile} în {newfile}",
+ "You moved {oldfile} to {newfile}" : "Ai mutat {oldfile} în {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} a mutat {oldfile} în {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Un fișier a fost adăugat în sau șters din <strong>favorites</strong>",
+ "Files" : "Fișiere",
+ "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Un fișier sau dosar favorit a fost <strong>schimbat</strong>",
+ "No favorites" : "Fără favorite",
+ "Accept" : "Accept",
+ "Reject" : "Respinge",
+ "Incoming ownership transfer from {user}" : "Se transferă proprietatea de la {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Dorești să accepți {path}?\n\nNotă: Procesul de transfer după acceptare poate să durește până la 1 oră.",
+ "Ownership transfer failed" : "Transferul de proprietate a eșuat",
+ "Your ownership transfer of {path} to {user} failed." : "Transferul tău de proprietate de {path} către {user} a eșuat.",
+ "The ownership transfer of {path} from {user} failed." : "Transferul de proprietate de {path} către {user} a eșuat.",
+ "Ownership transfer done" : "Transferul de proprietate s-a finalizat",
+ "Your ownership transfer of {path} to {user} has completed." : "Transferul tău de proprietate de {path} către {user} s-a finalizat.",
+ "The ownership transfer of {path} from {user} has completed." : "Transferul de proprietate de {path} către {user} s-a finalizat.",
+ "in %s" : "în %s",
+ "File Management" : "Management fișiere",
+ "Home" : "Acasă",
+ "Target folder does not exist any more" : "Directorul destinație nu mai există",
+ "Reload current directory" : "Reîncarcă directorul curent",
+ "Go to the \"{dir}\" directory" : "Salt la directorul \"{dir}\" ",
+ "Drag and drop files here to upload" : "Faceți Drag and drop cu fișierele aici pentru upload",
+ "Favorite" : "Favorit",
+ "Back" : "Înapoi",
+ "Filename" : "Nume fișier",
+ "Folder name" : "Denumire director",
+ "This node is unavailable" : "Acest nod este indisponibil",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "A fost redenumit \"{oldName}\" cu \"{newName}\"",
+ "Rename file" : "Redenumire fișier",
+ "Folder" : "Director",
+ "Pending" : "În așteptare",
+ "Clear filter" : "Șterge filtrul",
+ "Modified" : "Modificat",
+ "Search everywhere" : "Caută oriunde",
+ "Type" : "Tip",
+ "Active filters" : "Filtre active",
+ "Total rows summary" : "Rezumat total rânduri",
+ "Name" : "Nume",
+ "Size" : "Mărime",
+ "Actions" : "Acțiuni",
+ "List of files and folders." : "Listă fișiere și foldere",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați prin listă.",
+ "File not found" : "Fișierul nu a fost găsit",
+ "_{count} selected_::_{count} selected_" : ["{count}selectat","{count}selectate","{count}selectate"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} utilizați",
+ "{used} of {quota} used" : "{used} din {quota} folosiți",
+ "{relative}% used" : "{relative}% utilizat",
+ "Could not refresh storage stats" : "Nu pot actualiza statisticile de stocare",
+ "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!",
+ "New folder" : "Un nou dosar",
+ "Create new folder" : "Creează director nou",
+ "Create" : "Crează",
+ "Submit" : "Trimite",
+ "Choose a file or folder to transfer" : "Alege un fișier sau dosar de transferat",
+ "Transfer" : "Transfer",
+ "Transfer {path} to {userid}" : "Transferă {path} către {userid}",
+ "Invalid path selected" : "Calea selectată este invalidă",
"Unknown error" : "Eroare necunoscută",
- "File could not be found" : "Fișierul nu a fost găsit",
- "Move or copy" : "Mută sau copiază",
- "Download" : "Descarcă",
+ "Ownership transfer request sent" : "Cererea de transfer a fost trimisă",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nu se poate transfera proprietatea unui fișier sau dosar daca nu le deții",
+ "Transfer ownership of a file or folder" : "Transferă proprietatea unui fisier sau dosar",
+ "Choose file or folder to transfer" : "Alege fișierul sau dosarul de transferat",
+ "Change" : "Modificare",
+ "New owner" : "Proprietarul nou",
+ "Select file or folder to link to" : "Selectați fișierul sau folderul țintă a link-ului",
+ "Choose {file}" : "Selectați {file}",
+ "Share" : "Partajează",
+ "Shared by link" : "Partajat prin link",
+ "Shared" : "Partajat",
+ "Switch to list view" : "Comuta la organizarea tip listă",
+ "Switch to grid view" : "Comută la organizare tip grilă",
+ "Not enough free space" : "Spațiu insuficient",
+ "Operation is blocked by access control" : "Operația este blocată de către controlul de acces",
+ "Loading current folder" : "Se încarcă folderul curent",
+ "Retry" : "Reîncearcă",
+ "No files in here" : "Niciun fișier aici",
+ "Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
+ "Go back" : "Înapoi",
+ "Views" : "Mod de viziualizare",
+ "Files settings" : "Setări Fișiere",
+ "File cannot be accessed" : "Fișierul nu poate fi accesat",
+ "Clipboard is not available" : "Clipboardul este indisponibil",
+ "General" : "General",
+ "All files" : "Toate fișierele",
+ "Personal files" : "Fișiere personale",
+ "Sort favorites first" : "Sortați favoritele primele",
+ "Appearance" : "Aspect",
+ "Show hidden files" : "Arată fișierele ascunse",
+ "Crop image previews" : "Previzualizarea imaginii decupate",
+ "Additional settings" : "Setări adiționale",
+ "WebDAV" : "WebDAV",
+ "Copy" : "Copiază",
+ "Keyboard shortcuts" : "Scurtături din tastatură",
+ "Rename" : "Redenumește",
"Delete" : "Șterge",
- "Home" : "Acasă",
+ "Manage tags" : "Administrați etichete",
+ "Deselect all" : "Deselectează tot",
+ "Navigation" : "Navigare",
+ "View" : "Vizualizare",
+ "Toggle grid view" : "Comută vizualizarea grilă",
+ "You" : "Tu",
+ "Error while loading the file data" : "A apărut o eroare în timpul încărcării datele din fișier",
+ "Owner" : "Proprietar",
+ "Remove from favorites" : "Șterge din favorite",
+ "Add to favorites" : "Adaugă la favorite",
+ "Tags" : "Etichete",
+ "Blank" : "Gol",
+ "Unable to create new file from template" : "Nu s-a putut creea un fisier nou pentru acest șablon",
+ "Pick a template for {name}" : "Alege un șablon pentru {name}",
+ "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
+ "Creating file" : "Se crează fișierul",
+ "Disconnect storage" : "Deconectează stocarea",
+ "Delete permanently" : "Șterge permanent",
+ "Cancel" : "Anulare",
+ "Download" : "Descarcă",
+ "Destination is not a folder" : "Destinația nu este un folder",
+ "This file/folder is already in that directory" : "Acest fișier/folder există în acel dosar",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nu se poate muta/redenumi un fișier/folder în el însuși sau într-un subfolder al său",
+ "A file or folder with that name already exists in this folder" : "Un fișier sau folder cu acest nume există deja în acest folder",
+ "The file does not exist anymore" : "Fișierul nu mai există",
+ "Copy to {target}" : "Copiază la {target}",
+ "Move to {target}" : "Mută la {target}",
+ "Move" : "Mută",
+ "Move or copy" : "Mută sau copiază",
+ "Open folder {displayName}" : "Deschide dosarul {displayName}",
+ "Open in Files" : "Deschide în Fișiere",
+ "Failed to redirect to client" : "Eroare la redirectarea către client",
+ "Details" : "Detalii",
+ "View in folder" : "Vizualizează în director",
+ "Today" : "Azi",
+ "Last 7 days" : "Ultimele 7 zile",
+ "Last 30 days" : "Ultimele 30 de zile",
+ "Documents" : "Documente",
+ "Audio" : "Audio",
+ "Images" : "Imagini",
+ "Videos" : "Fișiere video",
+ "Created new folder \"{name}\"" : "A fost creat folderul nou \"{name}\"",
+ "Unable to initialize the templates directory" : "Nu s-a putut inițializa dosarul cu șabloane",
+ "Templates" : "Șabloane",
+ "Some files could not be moved" : "Unele fișiere nu au putut fi mutate",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" nu poate fi redenumit deoarece nu mai există",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Numele \"{newName}\" există în folderul \"{dir}\". Selectați, vă rog, alt nume.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" nu poate fi redenumit",
+ "This operation is forbidden" : "Operațiunea este interzisă",
+ "Storage is temporarily not available" : "Spațiu de stocare este indisponibil temporar",
+ "_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
+ "_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
+ "No favorites yet" : "Nu aveți favorite încă",
+ "Files and folders you mark as favorite will show up here" : "FIșierele și directoarele pe care le marchezi ca favorite vor apărea aici",
+ "List of your files and folders." : "Lista fișierelor și dosarelor personale.",
+ "Recent" : "Recente",
+ "List of recently modified files and folders." : "Lista fișierelor și dosarelor modificate recent.",
+ "No recently modified files" : "Niciun fișier modificat recent",
+ "Files and folders you recently modified will show up here." : "Fișierele și dosarele modificate recent vor fi afișate aici",
+ "Search" : "Căutare",
+ "No entries found in this folder" : "Niciun element găsit în acest director",
+ "Select all" : "Selectează tot",
+ "Upload too large" : "Fișierul încărcat este prea mare",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
+ "File could not be found" : "Fișierul nu a fost găsit",
+ "Show list view" : "Afișează vizualizarea listă",
+ "Show grid view" : "Afișează vizualizarea grilă",
"Close" : "Închide",
- "Favorites" : "Favorite",
"Could not create folder \"{dir}\"" : "Nu s-a putut crea directorul \"{dir}\"",
"This will stop your current uploads." : "Asta va opri descărcările curente.",
"Upload cancelled." : "Încărcare anulată.",
@@ -17,29 +207,23 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
"Target folder \"{dir}\" does not exist any more" : "Directorul \"{dir}\" nu mai există",
- "Not enough free space" : "Spațiu insuficient",
"An unknown error has occurred" : "A apărut o eroare necunoscută!",
+ "File could not be uploaded" : "Fișierele nu au putut fi încărcate",
"Uploading …" : "Încărcare...",
+ "Uploading … ({currentNumber}/{total})" : "Se încarcă … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} din {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Încărcarea acestui obiect nu este suportată",
- "Target folder does not exist any more" : "Directorul destinație nu mai există",
"Error when assembling chunks, status code {status}" : "Eroare la asambralea bucăților, status cod {status}",
- "Actions" : "Acțiuni",
- "Rename" : "Redenumește",
- "Copy" : "Copiază",
"Choose target folder" : "Alege directorul destinație",
+ "Set reminder" : "Setează memo",
+ "Edit locally" : "Editează local",
"Open" : "Deschide",
- "Delete file" : "Șterge fișier",
- "Delete folder" : "Șterge director",
- "Disconnect storage" : "Deconectează stocarea",
- "Leave this share" : "Părăsește acest cerc",
"Could not load info for file \"{file}\"" : "Nu s-a putut încărca informația pentru fișierul \"{file}\"",
- "Files" : "Fișiere",
- "Details" : "Detalii",
- "Select" : "Alege",
- "Pending" : "În așteptare",
+ "Please select tag(s) to add to the selection" : "Selectați eticheta(ele) pentru adăugare la selecție",
+ "Apply tag(s) to selection" : "Aplică eticheta(ele) selecției",
+ "Select directory \"{dirName}\"" : "Selectează dosarul \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Selectează fișierul \"{fileName}\"",
"Unable to determine date" : "Nu s-a putut determina data",
- "This operation is forbidden" : "Operațiunea este interzisă",
"This directory is unavailable, please check the logs or contact the administrator" : "Acest director nu este disponibil, te rugăm verifică logurile sau contactează un administrator",
"Could not move \"{file}\", target exists" : "Nu s-a putut muta fișierul \"{file}\", există deja un altul cu același nume în directorul destinație",
"Could not move \"{file}\"" : "Nu s-a putut muta fișierul \"{file}\"",
@@ -49,122 +233,55 @@
"Copied {origin} inside {destination}" : "S-a copiat {origin} în {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "S-a copiat {origin} și {nbfiles} alte fișiere în {destination}",
"{newName} already exists" : "{newName} există deja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nu s-a putut redenumi \"{fileName}\", fișierul nu mai există",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Numele \"{targetName}\" este deja folosit în directorul \"{dir}\". Alege un nume diferit.",
- "Could not rename \"{fileName}\"" : "Nu s-a putut redenumi \"{fileName}\"",
"Could not create file \"{file}\"" : "Nu s-a putut crea fișierul \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nu s-a putut crea fișierul \"{file}\" deoarece există deja unul cu același nume",
"Could not create folder \"{dir}\" because it already exists" : "Nu s-a putut crea directorul \"{dir}\" deoarece există deja unul cu același nume",
+ "Could not fetch file details \"{file}\"" : "Nu s-au putut aduna detalii \"{file}\"",
"Error deleting file \"{fileName}\"." : "Eroare la ștergerea fișierului \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nu au fost găsite rezultate în alte directoare pentru {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduceți mai mult de două caractere pentru a căuta în alte dosare",
- "Name" : "Nume",
- "Size" : "Mărime",
- "Modified" : "Modificat",
- "_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
- "_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
"{dirs} and {files}" : "{dirs} și {files}",
"_including %n hidden_::_including %n hidden_" : ["incluzând %n ascuns","incluzând %nascunse","incluzând %nascuns"],
- "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici",
+ "You do not have permission to upload or create files here" : "Nu ai permisiunea de a încărca fișiere aici",
"_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."],
"New" : "Nou",
+ "New file/folder menu" : "Meniu Fișier/Folder nou",
"Select file range" : "Selectează un interval",
- "{used} of {quota} used" : "{used} din {quota} folosiți",
"{used} used" : "{used} folosiți",
"\"{name}\" is an invalid file name." : "\"{name}\" este un nume de fișier nevalid.",
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
"\"/\" is not allowed inside a file name." : "\"/\" nu este permis în denumirea fișierului.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Spațiul de stocare alocat {owner} este plin, drept urmare fișierele nu mai pot fi sincronizate sau updatate !",
- "View in folder" : "Vizualizează în director",
- "Copied!" : "S-a copiat!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Copiază link direct (funcționeză numai pentru utilizatorii care au acces la acest fișier/director)",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Dosarul \"{mountPoint}\" este plin, fisiere nu mai pot fi reîmprospătate sau sincronizate!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Stocarea externă \"{mountPoint}\" este plina, fisierele nu mai pot fi reîmprospătate sau sincronizate!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Dosarul tău este plin, fisiere nu mai pot fi reîmprospătate sau sincronizate!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Stocarea lui {owner} este aproape plină în proporție de ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Dosarul \"{mountPoint}\" este aproape plin in proporție de ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Stocarea externă \"{mountPoint}\" este aproape plină in proporție de ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Stocarea dumneavoastra este aproape plină în proporție de ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["potrivește \"{filter}\"","potrivește \"{filter}\"","potrivește \"{filter}\""],
"Path" : "Cale",
"_%n byte_::_%n bytes_" : ["%n octet","%n octeți","%n octeți"],
- "Favorited" : "Adăugate la favorite",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Poți adauga la favorite un singur fișier sau director odată",
- "New folder" : "Un nou dosar",
"Upload file" : "Încarcă fișier",
- "Recent" : "Recente",
- "Not favorited" : "Scoate de la favorite",
- "Remove from favorites" : "Șterge din favorite",
- "Add to favorites" : "Adaugă la favorite",
"An error occurred while trying to update the tags" : "A apărut o eroare în timpul actualizării etichetelor",
- "Added to favorites" : "Adaugat la favorite",
- "Removed from favorites" : "Șters din favorite",
- "You added {file} to your favorites" : "Ai adaugat {file} în favorite",
- "You removed {file} from your favorites" : "Ai șters {file} din favorite",
- "File changes" : "Modificări fișiere",
- "Created by {user}" : "Creat de {user}",
- "Changed by {user}" : "Modificat de {user}",
- "Deleted by {user}" : "Șters de {user}",
- "Restored by {user}" : "Restaurat de {user}",
- "Renamed by {user}" : "Redenumit de {user}",
- "Moved by {user}" : "Mutat de {user}",
- "\"remote user\"" : "\"utilizator la distanță\"",
- "You created {file}" : "Ai creat {file}",
- "You created an encrypted file in {file}" : "Ai creat un fișier criptat în {file}",
- "{user} created {file}" : "{user} a creat {file}",
- "{user} created an encrypted file in {file}" : "{user} a creat un fișier criptat în {file}",
- "{file} was created in a public folder" : "{file} a fost creat într-un director public ",
- "You changed {file}" : "Ai modificat {file}",
- "You changed an encrypted file in {file}" : "Ai modificat un fișier criptat în {file}",
- "{user} changed {file}" : "{user} a modificat {file}",
- "{user} changed an encrypted file in {file}" : "{user} a modificat un fișier criptat în {file}",
- "You deleted {file}" : "Ai șters {file}",
- "You deleted an encrypted file in {file}" : "Ai șters un fișier criptat în {file}",
- "{user} deleted {file}" : "{user} a șters {file}",
- "{user} deleted an encrypted file in {file}" : "{user} a șters un fișier criptat în {file}",
- "You restored {file}" : "Ai restaurat {file}",
- "{user} restored {file}" : "{user} a restaurat {file}",
- "You renamed {oldfile} to {newfile}" : "Ai redenumit {oldfile} în {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} a redenumit {oldfile} în {newfile}",
- "You moved {oldfile} to {newfile}" : "Ai mutat {oldfile} în {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} a mutat {oldfile} în {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Un fișier a fost adăugat în sau șters din <strong>favorites</strong>",
- "A file or folder has been <strong>changed</strong>" : "Un nou fișier sau dosar a fost <strong>modificat</strong>",
- "All files" : "Toate fișierele",
- "Unlimited" : "Nelimitată",
"Upload (max. %s)" : "Încarcă (max. %s)",
- "Accept" : "Accept",
- "in %s" : "în %s",
- "File Management" : "Management fișiere",
- "Transfer" : "Transfer",
- "Tags" : "Etichete",
- "Cancel" : "Anulare",
- "Create" : "Crează",
- "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
- "Creating file" : "Se crează fișierul",
- "Blank" : "Gol",
- "%s used" : "%s folosiți",
- "%s%% of %s used" : "%s%%din %sfolosiți",
- "%1$s of %2$s used" : "%1$s din %2$s utilizat",
- "Settings" : "Setări",
- "Show hidden files" : "Arată fișierele ascunse",
- "Crop image previews" : "Previzualizarea imaginii decupate",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "Acțiunea \"{displayName}\" a fost executată cu succes",
+ "\"{displayName}\" action failed" : "Acțiunea \"{displayName}\" a eșuat",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" acțiunea batch a fost executată cu succes",
+ "WebDAV URL copied to clipboard" : "URL-ul WebDAV a fost copiat în clipboard",
+ "Enable the grid view" : "Activați organizarea tip grilă",
+ "Copy to clipboard" : "Copiază în clipboard",
"Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
- "Toggle %1$s sublist" : "Comută %1$s sublistă",
- "Toggle grid view" : "Comută vizualizarea grilă",
- "No files in here" : "Niciun fișier aici",
- "Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
- "No entries found in this folder" : "Niciun element găsit în acest director",
- "Select all" : "Selectează tot",
- "Upload too large" : "Fișierul încărcat este prea mare",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
- "No favorites yet" : "Nu aveți favorite încă",
- "Files and folders you mark as favorite will show up here" : "FIșierele și directoarele pe care le marchezi ca favorite vor apărea aici",
- "Deleted files" : "Fișiere șterse",
- "Shares" : "Partajări",
- "Shared with others" : "Partajat cu alții",
- "Shared with you" : "Partajat cu tine",
- "Shared by link" : "Partajat prin link",
- "Deleted shares" : "Partajări șterse",
- "Pending shares" : "Partajări in asteptare",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Dacă ați activat 2FA, trebuie să creați și să folosiți o nouă parolă de aplicație, dând click aici.",
+ "Cancelled move or copy operation" : "Copierea sau mutarea a fost anulată",
+ "Open details" : "Deschide detaliile",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","{folderCount} foldere","{folderCount} foldere"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fișier","{fileCount} fișiere","{fileCount} fișiere"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fișier și {folderCount} folder","1 fișier și {folderCount} foldere","1 fișier și {folderCount} foldere"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fișier și 1 folder","{fileCount} fișiere și 1 folder","{fileCount} fișiere și 1 folder"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} fișiere și {folderCount} dosare",
"Text file" : "Fișier text",
- "New text file.txt" : "Fișier nou.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Spațiul de stocare pentru {owner} este plin, fișierele nu mai pot fi incărcate sau sincronizate!",
- "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!"
+ "New text file.txt" : "Fișier nou.txt"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
} \ No newline at end of file
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 8acc311ea36..78ae4efb64d 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -1,16 +1,358 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Хранилище временно недоступно",
- "Storage invalid" : "Хранилище неисправно",
+ "Added to favorites" : "Добавлено в избранное",
+ "Removed from favorites" : "Удалено из избранного",
+ "You added {file} to your favorites" : "Вы добавили «{file}» в избранное",
+ "You removed {file} from your favorites" : "Вы удалили «{file}» из избранного",
+ "Favorites" : "Избранные",
+ "File changes" : "Изменения файлов",
+ "Created by {user}" : "Создано пользователем {user}",
+ "Changed by {user}" : "Изменено пользователем {user}",
+ "Deleted by {user}" : "Удалено пользователем {user}",
+ "Restored by {user}" : "Восстановлено пользователем {user}",
+ "Renamed by {user}" : "Переименовано пользователем {user}",
+ "Moved by {user}" : "Перемещено пользователем {user}",
+ "\"remote account\"" : "«пользователь другого сервера»",
+ "You created {file}" : "Вы создали «{file}»",
+ "You created an encrypted file in {file}" : "Вы создали зашифрованный файл в «{file}»",
+ "{user} created {file}" : "{user} создал(а) «{file}»",
+ "{user} created an encrypted file in {file}" : "{user} создал(а) зашифрованный файл в «{file}»",
+ "{file} was created in a public folder" : "«{file}» создан в общедоступом каталоге",
+ "You changed {file}" : "Вы изменили «{file}»",
+ "You changed an encrypted file in {file}" : "Вы изменили зашифрованный файл в «{file}»",
+ "{user} changed {file}" : "{user} изменил(а) «{file}»",
+ "{user} changed an encrypted file in {file}" : "{user} изменил(а) зашифрованный файл в «{file}»",
+ "You deleted {file}" : "Вы удалили «{file}»",
+ "You deleted an encrypted file in {file}" : "Вы удалили зашифрованный файл в «{file}»",
+ "{user} deleted {file}" : "{user} удалил(а) «{file}»",
+ "{user} deleted an encrypted file in {file}" : " {user} удалил(а) зашифрованный файл в «{file}»",
+ "You restored {file}" : "Вы восстановили «{file}»",
+ "{user} restored {file}" : "{user} восстановил(а) «{file}»",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы переименовали {oldfile} (скрытый) в {newfile} (скрытый)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы переименовали {oldfile} (скрытый) в {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы переименовали {oldfile} в {newfile} (скрытый)",
+ "You renamed {oldfile} to {newfile}" : "Вы переименовали «{oldfile}» в «{newfile}»",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile} (скрытый)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} в {newfile} (скрытый)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} переименовал(а) «{oldfile}» в «{newfile}»",
+ "You moved {oldfile} to {newfile}" : "Вы переместили «{oldfile}» в «{newfile}»",
+ "{user} moved {oldfile} to {newfile}" : "{user} переместил(а) «{oldfile}» в «{newfile}»",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл добавлен в <strong>избранное</strong> или удалён оттуда",
+ "Files" : "Файлы",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или папка отмеченные как избранное",
+ "Failed to authorize" : "Не удалось авторизовать",
+ "Invalid folder path" : "Неверный путь к папке",
+ "Folder not found" : "Папка не найдена",
+ "The file cannot be found" : "Файл не может быть найден",
+ "The destination path does not exist: %1$s" : "Конечный путь не существует: %1$s",
+ "You do not have permission to create a file at the specified location" : "У вас нет разрешения на создание файла в указанном месте",
+ "The file could not be converted." : "Файл не может быть преобразован.",
+ "Could not get relative path to converted file" : "Не удалось получить относительный путь к преобразованному файлу",
+ "Favorite files" : "Избранные файлы",
+ "No favorites" : "Нет избранного",
+ "More favorites" : "Больше избранного",
+ "Accept" : "Принять",
+ "Reject" : "Отклонить",
+ "Incoming ownership transfer from {user}" : "Запрос передачи владения от пользователя {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Принять владение {path}?\n\nПримечание: процесс переноса может занять до одного часа.",
+ "Ownership transfer denied" : "Передача владения отклонена",
+ "Your ownership transfer of {path} was denied by {user}." : "Передача владения {path} отклонена {user}.",
+ "Ownership transfer failed" : "Не удалось передать владение",
+ "Your ownership transfer of {path} to {user} failed." : "Вам не удалось передать владение «{path}» пользователю {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Пользователю {user} не удалось передать владение «{path}».",
+ "Ownership transfer done" : "Передача владения завершена",
+ "Your ownership transfer of {path} to {user} has completed." : "Завершена передача владения «{path}» от вас пользователю {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Завершена передача владения «{path}» от пользователя {user}.",
+ "in %s" : "в %s",
+ "Transferred from %1$s on %2$s" : "Передано от %1$s %2$s",
+ "Files compatibility" : "Совместимость файлов",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Разрешить ограничения на имена файлов для обеспечения возможности их синхронизации со всеми клиентами. По умолчанию разрешены все имена файлов, допустимые в POSIX (например, в Linux или macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "После включения совместимых с Windows названий файлов, существующие файлы нельзя будет изменить, но они могут быть переименованы их владельцем в допустимые новые имена.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Также возможно мигрировать файлы автоматически после включения этой настройки, пожалуйста, обратитесь к документации о команде occ.",
+ "Enforce Windows compatibility" : "Обеспечить совместимость с Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Это позволит блокировать имена файлов, недопустимые в системах Windows, например, использующие зарезервированные имена или специальные символы. Однако это не обеспечит совместимость в части чувствительности к регистру.",
+ "File Management" : "Управление файлами",
+ "Home" : "Главная",
+ "Target folder does not exist any more" : "Каталог больше не существует",
+ "Reload current directory" : "Обновить текущий каталог",
+ "Go to the \"{dir}\" directory" : "Перейти в каталог \"{dir}\"",
+ "Current directory path" : "Текущий путь к каталогу",
+ "Your have used your space quota and cannot upload files anymore" : "Вы использовали всё доступное вам место и не можете больше загружать файлы",
+ "You do not have permission to upload or create files here." : "У вас нет прав загружать или создавать здесь файлы.",
+ "Drag and drop files here to upload" : "Перетаскивайте файлы сюда для загрузки",
+ "Favorite" : "Добавить в избранное",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Установить или снять выделение файла «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Установить или снять выделение папки «{displayName}»",
+ "File is loading" : "Файл загружается",
+ "Folder is loading" : "Папка загружается",
+ "Filename" : "Имя файла",
+ "Folder name" : "Имя папки",
+ "This node is unavailable" : "Этот узел недоступен",
+ "Another entry with the same name already exists." : "Другая запись с таким же именем уже существует.",
+ "Invalid filename." : "Недопустимое имя файла.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Переименовано «{oldName}» в \"{newName}\"",
+ "Rename file" : "Переименовать файл",
+ "Folder" : "Каталог",
+ "Unknown file type" : "Неизвестный тип файла",
+ "{ext} image" : "{ext} изображение",
+ "{ext} video" : "{ext} видео",
+ "{ext} audio" : "{ext} аудио",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "Ожидается",
+ "Unknown date" : "Неизвестная дата",
+ "Clear filter" : "Сбросить фильтр",
+ "Modified" : "Изменён",
+ "Search everywhere" : "Искать везде",
+ "Type" : "Тип",
+ "Active filters" : "Активные фильтры",
+ "Remove filter" : "Удалить фильтр",
+ "Total rows summary" : "Количество строк в общем",
+ "Toggle selection for all files and folders" : "Установить или снять выделение всех файлов и папок",
+ "Name" : "Имя",
+ "File type" : "Тип файла",
+ "Size" : "Размер",
+ "Actions" : "Действия",
+ "(selected)" : "(выбранный)",
+ "List of files and folders." : "Список файлов и каталогов.",
+ "You have used your space quota and cannot upload files anymore." : "Вы использовали свою квоту свободного места и больше не можете загружать файлы.",
+ "Column headers with buttons are sortable." : "Заголовки столбцов с кнопками можно сортировать.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
+ "File not found" : "Файл не найден",
+ "_{count} selected_::_{count} selected_" : ["Выбран {count}","Выбрано {count}","Выбрано {count}","Выбрано {count} "],
+ "Search scope options" : "Настройки области поиска",
+ "{usedQuotaByte} used" : "Использовано {usedQuotaByte}",
+ "{used} of {quota} used" : "использовано {used} из {quota}",
+ "{relative}% used" : "Использовано {relative}%",
+ "Could not refresh storage stats" : "Не удалось обновить данные об использовании хранилища",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище переполнено, файлы больше не могут быть обновлены или синхронизированы.",
+ "Storage information" : "Информация о хранении",
+ "Storage quota" : "Квота хранилища",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Создать папку",
+ "This name is already in use." : "Это название уже используется.",
+ "Create" : "Создать",
+ "Files starting with a dot are hidden by default" : "Файлы, начинающиеся с точки, скрыты по умолчанию",
+ "Fill template fields" : "Заполните поля шаблона",
+ "Submitting fields …" : "Отправка полей…",
+ "Submit" : "Отправить ответ",
+ "Choose a file or folder to transfer" : "Выберите файл или папку для передачи",
+ "Transfer" : "Передать",
+ "Transfer {path} to {userid}" : "Передать {path} пользователю {userid}",
+ "Invalid path selected" : "Указан некорректный путь",
"Unknown error" : "Неизвестная ошибка",
- "File could not be found" : "Невозможно найти файл",
- "Move or copy" : "Переместить или копировать",
- "Download" : "Скачать",
+ "Ownership transfer request sent" : "Запрос на передачу прав владения отправлен",
+ "Cannot transfer ownership of a file or folder you do not own" : "Невозможно передать право владения на файл или каталог, которые вам не принадлежат",
+ "Transfer ownership of a file or folder" : "Изменение владельца файла или папки",
+ "Choose file or folder to transfer" : "Выберите файл или папку для передачи владения",
+ "Change" : "Изменить",
+ "New owner" : "Новый владелец",
+ "Keep {old}" : "Сохранить {old}",
+ "Keep without extension" : "Сохранить без расширения",
+ "Use {new}" : "Использовать{new}",
+ "Remove extension" : "Удалить расширение",
+ "Change file extension" : "Изменить расширение файла",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Изменение расширения файла с \"{old}\" на \"{new}\" может сделать файл нечитаемым.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Удаление расширения файла \"{old}\" может сделать файл нечитаемым.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Добавление расширения файла \"{new}\" может сделать его нечитаемым.",
+ "Do not show this dialog again." : "Больше не показывать это диалоговое окно.",
+ "Select file or folder to link to" : "Выберите файл или папку для создания ссылки",
+ "Choose {file}" : "Выберан {file}",
+ "Share" : "Поделиться",
+ "Shared by link" : "Доступные по ссылке",
+ "Shared" : "Опубликованное",
+ "Switch to list view" : "Переключение в режим просмотра списка",
+ "Switch to grid view" : "Переключиться на режим просмотра сеткой",
+ "The file could not be found" : "Файл не найден.",
+ "Upload was cancelled by user" : "Загрузка была отменена пользователем",
+ "Not enough free space" : "Недостаточно свободного места",
+ "Operation is blocked by access control" : "Операция не разрешена модулем контроля доступа",
+ "Error during upload: {message}" : "Ошибка при загрузке: {message}",
+ "Error during upload, status code {status}" : "Ошибка при передаче на сервер. Сообщение об ошибке: {status}",
+ "Unknown error during upload" : "Неизвестная ошибка при загрузке",
+ "Loading current folder" : "Загрузка текущей папки",
+ "Retry" : "Попробовать снова",
+ "No files in here" : "Здесь нет файлов",
+ "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
+ "Go back" : "Назад",
+ "Views" : "Представления",
+ "Files settings" : "Настройки файлов",
+ "Your files" : "Ваши файлы",
+ "Open in files" : "Открыть в приложении Файлы",
+ "File cannot be accessed" : "Не удалось получить доступ к файлу",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Не удалось найти файл или у вас отсутствуют права на его просмотр. Попросите отправителя предоставить вам доступ к этому файлу.",
+ "No search results for “{query}”" : "Нет результатов поиска по запросу «{query}»",
+ "Search for files" : "Поиск файлов",
+ "Clipboard is not available" : "Буфер обмена недоступен",
+ "General" : "Основные",
+ "Default view" : "Вид по умолчанию",
+ "All files" : "Все файлы",
+ "Personal files" : "Личные файлы",
+ "Sort favorites first" : "Сначала избранное",
+ "Sort folders before files" : "Начинать список с папок",
+ "Folder tree" : "Дерево папок",
+ "Appearance" : "Внешний вид",
+ "Show hidden files" : "Показывать скрытые файлы",
+ "Show file type column" : "Показать колонку с типом файла",
+ "Crop image previews" : "Обрезать пред. просмотр",
+ "Additional settings" : "Дополнительные параметры",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "Ссылка WebDAV",
+ "Copy" : "Копировать",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашего аккаунта включена двухфакторная аутентификация, поэтому вам необходимо использовать пароль приложения чтобы подключить внешний WebDAV клиент.",
+ "Warnings" : "Предупреждения",
+ "Keyboard shortcuts" : "Сочетания клавиш",
+ "File actions" : "Сценарии файла",
+ "Rename" : "Переименовать",
"Delete" : "Удалить",
- "Home" : "Главная",
+ "Manage tags" : "Управление метками",
+ "Selection" : "Выбор",
+ "Select all files" : "Выбрать все файлы",
+ "Deselect all" : "Снять выбор со всех",
+ "Navigation" : "Навигация",
+ "View" : "Режим просмотра",
+ "Toggle grid view" : "Включить или отключить режим просмотра сеткой",
+ "Show those shortcuts" : "Показать ярлыки",
+ "You" : "Вы",
+ "Shared multiple times with different people" : "Делиться несколько раз с разными людьми",
+ "Unable to change the favorite state of the file" : "Невозможно изменить избранное состояние файла",
+ "Error while loading the file data" : "Не удалось загрузить данные файла",
+ "Owner" : "Владелец",
+ "Remove from favorites" : "Удалить из избранных",
+ "Add to favorites" : "Добавить в избранное",
+ "Tags" : "Метки",
+ "Blank" : "Пустой",
+ "Unable to create new file from template" : "Не удалось создать файл на основе шаблона",
+ "Pick a template for {name}" : "Выбрать шаблон для {name}",
+ "Create a new file with the selected template" : "Создать файл на основе шаблона",
+ "Creating file" : "Создание файла",
+ "Save as {displayName}" : "Сохранить как {displayName}",
+ "Save as …" : "Сохранить как…",
+ "Converting files …" : "Преобразование файлов…",
+ "Failed to convert files: {message}" : "Не удалось преобразовать файлы: {message}",
+ "All files failed to be converted" : "Не удалось преобразовать все файлы",
+ "One file could not be converted: {message}" : "Один файл не удалось преобразовать: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Файл не удалось преобразовать","%n файлы не могут быть преобразованы","%n файлы не могут быть преобразованы","%n файлы не могут быть преобразованы"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Файл успешно преобразован","%n файлы успешно преобразованы","%n файлы успешно преобразованы","%n файлы успешно преобразованы"],
+ "Files successfully converted" : "Файлы успешно конвертированы",
+ "Failed to convert files" : "Не удалось преобразовать файлы",
+ "Converting file …" : "Преобразование файла…",
+ "File successfully converted" : "Файл успешно преобразован",
+ "Failed to convert file: {message}" : "Не удалось преобразовать файл: {message}",
+ "Failed to convert file" : "Не удалось преобразовать файл",
+ "Leave this share" : "Перестать использовать общий ресурс",
+ "Leave these shares" : "Отказаться от доступа к общим ресурсам",
+ "Disconnect storage" : "Отсоединить хранилище",
+ "Disconnect storages" : "Отключить хранилища",
+ "Delete permanently" : "Удалить навсегда",
+ "Delete and unshare" : "Удалить и закрыть общий доступ",
+ "Delete file" : "Удалить файл",
+ "Delete files" : "Удалить файлы",
+ "Delete folder" : "Удалить папку",
+ "Delete folders" : "Удалить папки",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы собираетесь безвозвратно удалить {count} элемент","Вы собираетесь безвозвратно удалить {count} элемента","Вы собираетесь безвозвратно удалить {count} элементов","Вы собираетесь безвозвратно удалить {count} элементов"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Подтвердите удаление {count} объекта.","Подтвердите удаление {count} объектов","Подтвердите удаление {count} объектов","Подтвердите удаление {count} объектов"],
+ "Confirm deletion" : "Подтвердить удаление",
+ "Cancel" : "Отменить",
+ "Download" : "Скачать",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перемещение \"{source}\" в \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Копирование \"{source}\" в \"{destination}\" …",
+ "Destination is not a folder" : "Указанное назначение не является папкой",
+ "This file/folder is already in that directory" : "Файл или папка уже расположены в этой папке",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Папка или файл не могут быть перемещены во вложенную папку или в себя",
+ "(copy)" : "(копия)",
+ "(copy %n)" : "(копия %n)",
+ "A file or folder with that name already exists in this folder" : "В этой папке уже есть файл или папка с этим именем",
+ "The files are locked" : "Файлы заблокированы",
+ "The file does not exist anymore" : "Файл больше не существует",
+ "Choose destination" : "Выберите место назначения",
+ "Copy to {target}" : "Скопировать в «{target}»",
+ "Move to {target}" : "Переместить в «{target}»",
+ "Move" : "Переместить",
+ "Move or copy operation failed" : "Ошибка перемещение или копирования",
+ "Move or copy" : "Переместить или копировать",
+ "Open folder {displayName}" : "Открыть папку «{displayName}»",
+ "Open in Files" : "Открыть в приложении «Файлы»",
+ "Open locally" : "Открыть локально",
+ "Failed to redirect to client" : "Ошибка перенаправления в клиент",
+ "Open file locally" : "Открыть файл локально",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Теперь файл должен открыться на вашем устройстве. Если это не произошло, пожалуйста, убедитесь, что у вас установлено настольное приложение.",
+ "Retry and close" : "Повторить попытку и закрыть",
+ "Open online" : "Открыть онлайн",
+ "Details" : "Подробно",
+ "View in folder" : "Посмотреть в каталоге",
+ "Today" : "Сегодня",
+ "Last 7 days" : "Последние 7 дней",
+ "Last 30 days" : "Последние 30 дней",
+ "This year ({year})" : "Этот год ({year})",
+ "Last year ({year})" : "Последний год ({year})",
+ "Documents" : "Документы",
+ "Spreadsheets" : "Таблицы",
+ "Presentations" : "Презентации",
+ "PDFs" : "PDFs",
+ "Folders" : "Папки",
+ "Audio" : "Звук",
+ "Images" : "Изображения",
+ "Videos" : "Видео",
+ "Created new folder \"{name}\"" : "Создана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов",
+ "Create templates folder" : "Создать папку шаблонов",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонов",
+ "In folder" : "В папке",
+ "Search in all files" : "Поиск во всех файлах",
+ "Search in folder: {folder}" : "Поиск в папке: «{folder}»",
+ "One of the dropped files could not be processed" : "Один из перетащенных файлов не может быть обработан",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Папки не будут загружены, так как используемый браузер не поддерживает работу с файловой системой.",
+ "No files to upload" : "Не выбрано ни одного файла для передачи на сервер",
+ "Unable to create the directory {directory}" : "Не удалось создать папку «{directory}»",
+ "Some files could not be uploaded" : "Не удалось загрузить некоторые файлы",
+ "Files uploaded successfully" : "Файлы успешно обновлены",
+ "No files to process" : "Нет файлов для обработки",
+ "Some files could not be copied" : "Не удалось скопировать некоторые файлы",
+ "Some files could not be moved" : "Не удалось переместить некоторые файлы",
+ "Files copied successfully" : "Файлы успешно скопированы",
+ "Files moved successfully" : "Файлы успешно перемещены",
+ "Conflicts resolution skipped" : "Разрешение конфликтов пропущено",
+ "Upload cancelled" : "Передача на сервер отменена",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не удалось переименовать \"{oldName}\", его больше не существует",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Имя \"{newName}\" уже используется в каталоге \"{dir}\". Выберите другое имя.",
+ "Could not rename \"{oldName}\"" : "Не удалось переименовать «{oldName}»",
+ "This operation is forbidden" : "Операция запрещена",
+ "Storage is temporarily not available" : "Хранилище временно недоступно",
+ "Unexpected error: {error}" : "Неожиданная ошибка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
+ "_%n folder_::_%n folders_" : ["%n каталог","%n каталога","%n каталогов","%n каталогов"],
+ "_%n hidden_::_%n hidden_" : ["скрыто %n","скрыто %n","скрыто %n","скрыто %n"],
+ "Filename must not be empty." : "Имя файла не должно быть пустым.",
+ "\"{char}\" is not allowed inside a filename." : "не допускается внутри имени файла.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "является зарезервированным именем и не допускается для имен файлов.",
+ "\"{extension}\" is not an allowed filetype." : "не является разрешенным типом файла.",
+ "Filenames must not end with \"{extension}\"." : "Имена файлов не должны заканчиваться на",
+ "List of favorite files and folders." : "Список избранных файлов и папок.",
+ "No favorites yet" : "В избранное ещё ничего не добавлено ",
+ "Files and folders you mark as favorite will show up here" : "Здесь будут показаны файлы и каталоги, отмеченные как избранные",
+ "List of your files and folders." : "Список ваших файлов и каталогов.",
+ "List of your files and folders that are not shared." : "Список ваших неопубликованных файлов и папок.",
+ "No personal files found" : "Личные файлы не найдены",
+ "Files that are not shared will show up here." : "Файлы, которые не опубликованы, показаны здесь.",
+ "Recent" : "Недавно изменённые",
+ "List of recently modified files and folders." : "Список недавно измененных файлов и директорий.",
+ "No recently modified files" : "Нет недавно измененных файлов",
+ "Files and folders you recently modified will show up here." : "Здесь будут показаны недавно изменённые файлы и папки",
+ "Search" : "Поиск",
+ "Search results within your files." : "Результаты поиска в ваших файлах.",
+ "No entries found in this folder" : "В этом каталоге ничего не найдено",
+ "Select all" : "Выбрать всё",
+ "Upload too large" : "Файл слишком велик",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь передать, превышают лимит максимального размера на этом сервере.",
+ "File could not be found" : "Невозможно найти файл",
+ "Show list view" : "Просмотр списком",
+ "Show grid view" : "Просмотр сеткой",
"Close" : "Закрыть",
- "Favorites" : "Избранные",
"Could not create folder \"{dir}\"" : "Невозможно создать каталог «{dir}»",
"This will stop your current uploads." : "Это действие остановит активные сеансы передачи файлов на сервер. ",
"Upload cancelled." : "Отправка отменена.",
@@ -19,32 +361,24 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно передать «{filename}», так как это либо каталог, либо файл нулевого размера",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостаточно свободного места, вы передаёте на сервер {size1}, но доступно только {size2}",
"Target folder \"{dir}\" does not exist any more" : "Целевой каталог «{dir}» более не существует",
- "Not enough free space" : "Недостаточно свободного места",
"An unknown error has occurred" : "Произошла неизвестная ошибка",
+ "File could not be uploaded" : "Файл не может быть загружен",
"Uploading …" : "Передача…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Загрузка … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} из {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Загрузка этого элемента не поддерживается",
- "Target folder does not exist any more" : "Каталог больше не существует",
- "Operation is blocked by access control" : "Операция не разрешена модулем контроля доступа",
"Error when assembling chunks, status code {status}" : "Ошибка при сборке чанков, код ошибки {status}",
- "Actions" : "Действия",
- "Rename" : "Переименовать",
- "Copy" : "Копировать",
"Choose target folder" : "Выбор папки назначения",
+ "Set reminder" : "Установить напоминание",
+ "Edit locally" : "Редактировать локально",
"Open" : "Открыть",
- "Delete file" : "Удалить файл",
- "Delete folder" : "Удалить каталог",
- "Disconnect storage" : "Отсоединить хранилище",
- "Leave this share" : "Отказаться от совместного доступа к этому ресурсу",
"Could not load info for file \"{file}\"" : "Не удаётся загрузить информацию для файла \"{file}\"",
- "Files" : "Файлы",
- "Details" : "Подробно",
"Please select tag(s) to add to the selection" : "Выберите метки для назначения выбранным объектам",
"Apply tag(s) to selection" : "Назначить метки выбранным объектам",
- "Select" : "Выбрать",
- "Pending" : "Ожидается",
+ "Select directory \"{dirName}\"" : "Выберите каталог \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Выберите файл \"{fileName}\"",
"Unable to determine date" : "Невозможно определить дату",
- "This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Каталог недоступен. Проверьте журналы событий или свяжитесь с администратором",
"Could not move \"{file}\", target exists" : "Невозможно переместить файл «{file}», он уже существует в каталоге назначения",
"Could not move \"{file}\"" : "Невозможно переместить файл «{file}»",
@@ -54,9 +388,6 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "{origin} скопирован в {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} и {nbfiles} других файлов скопированы в {destination}",
"{newName} already exists" : "«{newName}» уже существует",
- "Could not rename \"{fileName}\", it does not exist any more" : "Невозможно переименовать «{fileName}», файл больше не существует",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Имя «{targetName}» уже используется в каталоге «{dir}». Выберите другое имя.",
- "Could not rename \"{fileName}\"" : "Невозможно переименовать «{fileName}»",
"Could not create file \"{file}\"" : "Невозможно создать файл «{file}»",
"Could not create file \"{file}\" because it already exists" : "Невозможно создать файл «{file}», он уже существует",
"Could not create folder \"{dir}\" because it already exists" : "Невозможно создать каталог «{dir}», он уже существует",
@@ -64,18 +395,14 @@ OC.L10N.register(
"Error deleting file \"{fileName}\"." : "Ошибка удаления файла «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "Нет результатов поиска в других папках для {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Введите более двух символов для поиска в других каталогах",
- "Name" : "Имя",
- "Size" : "Размер",
- "Modified" : "Изменён",
- "_%n folder_::_%n folders_" : ["%n каталог","%n каталога","%n каталогов","%n каталогов"],
- "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
"{dirs} and {files}" : "{dirs} и {files}",
"_including %n hidden_::_including %n hidden_" : ["включая %n скрытый","включая %n скрытых","включая %n скрытых","включая %n скрытых"],
- "You don’t have permission to upload or create files here" : "У вас нет прав на создание или загрузку файлов в эту папку.",
+ "You do not have permission to upload or create files here" : "У вас нет разрешения на загрузку или создание файлов здесь",
"_Uploading %n file_::_Uploading %n files_" : ["Передача %n файла","Передача %n файлов","Передача %n файлов","Передача %n файлов"],
"New" : "Новый",
+ "New file/folder menu" : "Меню создания файла или папки",
"Select file range" : "Выбор диапазона файлов",
- "{used} of {quota} used" : "использовано {used} из {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "Использовано {used}",
"\"{name}\" is an invalid file name." : "«{name}» — недопустимое имя файла.",
"File name cannot be empty." : "Имя файла не может быть пустым.",
@@ -90,131 +417,65 @@ OC.L10N.register(
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Внешнее хранилище «{mountPoint}» почти заполнено (использовано {usedSpacePercent} %).",
"Your storage is almost full ({usedSpacePercent}%)." : "Ваше хранилище почти заполнено (использовано {usedSpacePercent} %).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["соответствуют «{filter}»","соответствуют «{filter}»","соответствуют «{filter}»","соответствует «{filter}»"],
- "View in folder" : "Посмотреть в каталоге",
- "Copied!" : "Скопировано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копировать прямую ссылку (работает только для пользователей с правами доступа к этому файлу или каталогу)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Внутренняя ссылка скопирована. Она может быть использована только пользователями, у которых уже есть доступ к этому файлу или папке. ",
"Path" : "Путь",
"_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байт","%n байт"],
- "Favorited" : "Избранное",
- "Favorite" : "Добавить в избранное",
- "You can only favorite a single file or folder at a time" : "Одновременно можно выбрать только один файл или папку",
- "New folder" : "Новый каталог",
+ "Favored" : "Избранные",
+ "Favor" : "Услуга",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копировать прямую ссылку (она сработает только для пользователей, у которых уже есть доступ к этому файлу или каталогу)",
"Upload file" : "Загрузить файл",
- "Recent" : "Недавно изменённые",
- "Not favorited" : "Не избранное",
- "Remove from favorites" : "Удалить из избранных",
- "Add to favorites" : "Добавить в избранное",
+ "Not favored" : "Не одобрен",
"An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка",
- "Added to favorites" : "Добавлено в избранное",
- "Removed from favorites" : "Удалено из избранного",
- "You added {file} to your favorites" : "Вы добавили «{file}» в избранное",
- "You removed {file} from your favorites" : "Вы удалили «{file}» из избранного",
- "File changes" : "Изменения файлов",
- "Created by {user}" : "Создано {user}",
- "Changed by {user}" : "Изменено {user}",
- "Deleted by {user}" : "Удалено {user}",
- "Restored by {user}" : "Восстановлено {user}",
- "Renamed by {user}" : "Переименовано {user}",
- "Moved by {user}" : "Перемещено {user}",
- "\"remote user\"" : "«пользователь с другого сервера»",
- "You created {file}" : "Вы создали «{file}»",
- "You created an encrypted file in {file}" : "Вы создали зашифрованный файл в «{file}»",
- "{user} created {file}" : "{user} создал(а) «{file}»",
- "{user} created an encrypted file in {file}" : "{user} создал(а) зашифрованный файл в «{file}»",
- "{file} was created in a public folder" : "«{file}» создан в общедоступом каталоге",
- "You changed {file}" : "Вы изменили «{file}»",
- "You changed an encrypted file in {file}" : "Вы изменили зашифрованный файл в «{file}»",
- "{user} changed {file}" : "{user} изменил(а) «{file}»",
- "{user} changed an encrypted file in {file}" : "{user} изменил(а) зашифрованный файл в «{file}»",
- "You deleted {file}" : "Вы удалили «{file}»",
- "You deleted an encrypted file in {file}" : "Вы удалили зашифрованный файл в «{file}»",
- "{user} deleted {file}" : "{user} удалил(а) «{file}»",
- "{user} deleted an encrypted file in {file}" : " {user} удалил(а) зашифрованный файл в «{file}»",
- "You restored {file}" : "Вы восстановили «{file}»",
- "{user} restored {file}" : "{user} восстановил(а) «{file}»",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы переименовали {oldfile} (скрытый) в {newfile} (скрытый)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Вы переименовали {oldfile} (скрытый) в {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Вы переименовали {oldfile} в {newfile} (скрытый)",
- "You renamed {oldfile} to {newfile}" : "Вы переименовали «{oldfile}» в «{newfile}»",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile} (скрытый)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} в {newfile} (скрытый)",
- "{user} renamed {oldfile} to {newfile}" : "{user} переименовал(а) «{oldfile}» в «{newfile}»",
- "You moved {oldfile} to {newfile}" : "Вы переместили «{oldfile}» в «{newfile}»",
- "{user} moved {oldfile} to {newfile}" : "{user} переместил(а) «{oldfile}» в «{newfile}»",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Файл добавлен в <strong>избранное</strong> или удалён оттуда",
- "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
- "A favorite file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или папка отмеченные как избранное",
- "All files" : "Все файлы",
- "Unlimited" : "Неограничено",
"Upload (max. %s)" : "Загрузка (максимум %s)",
- "Accept" : "Принять",
- "Reject" : "Отклонить",
- "Incoming ownership transfer from {user}" : "Запрос передачи владения от пользователя {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Принять владение {path}?\n\nПримечание: процесс переноса может занять до одного часа.",
- "Ownership transfer failed" : "Не удалось передать владение",
- "Your ownership transfer of {path} to {user} failed." : "Вам не удалось передать владение «{path}» пользователю {user}.",
- "The ownership transfer of {path} from {user} failed." : "Пользователю {user} не удалось передать владение «{path}».",
- "Ownership transfer done" : "Передача владения завершена",
- "Your ownership transfer of {path} to {user} has completed." : "Завершена передача владения «{path}» от вас пользователю {user}.",
- "The ownership transfer of {path} from {user} has completed." : "Завершена передача владения «{path}» от пользователя {user}.",
- "in %s" : "в %s",
- "File Management" : "Управление файлами",
- "Transfer ownership of a file or folder" : "Изменение владельца файла или папки",
- "Choose file or folder to transfer" : "Выберите файл или папку для передачи владения",
- "Change" : "Изменить",
- "New owner" : "Новый владелец",
- "Search users" : "Поиск пользователей",
- "Choose a file or folder to transfer" : "Выберите файл или папку для передачи",
- "Transfer" : "Передать",
- "Transfer {path} to {userid}" : "Передать {path} пользователю {userid}",
- "Invalid path selected" : "Указан некорректный путь",
- "Ownership transfer request sent" : "Запрос на передачу прав владения отправлен",
- "Cannot transfer ownership of a file or folder you don't own" : "Изменение владельца возможно только для своих файлов и папок",
- "Tags" : "Метки",
- "Unable to change the favourite state of the file" : "Не удалось изменить состояние «избранный» этого файла.",
- "Error while loading the file data" : "Не удалось загрузить данные файла",
- "Pick a template for {name}" : "Выбрать шаблон для {name}",
- "Cancel" : "Отменить",
- "Create" : "Создать",
- "Create a new file with the selected template" : "Создать файл на основе шаблона",
- "Creating file" : "Создание файла",
- "Blank" : "Пустой",
- "Unable to create new file from template" : "Не удалось создать файл на основе шаблона",
- "Set up templates folder" : "Указать папку шаблонов",
- "Templates" : "Шаблоны",
- "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов",
- "%s used" : "%s использовано",
- "%s%% of %s used" : "использовано %s%% из %s",
- "%1$s of %2$s used" : "использовано %1$s из %2$s ",
- "Settings" : "Настройки",
- "Show hidden files" : "Показывать скрытые файлы",
- "Crop image previews" : "Обрезать пред. просмотр",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "Действие «{displayName}» выполнено успешно",
+ "\"{displayName}\" action failed" : "Действие «{displayName}» завершилось неудачно",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" не удалось выполнить некоторые элементы",
+ "\"{displayName}\" batch action executed successfully" : "Пакетное действие \"{displayName}\" выполнено успешно",
+ "Submitting fields…" : "Отправка полей…",
+ "Filter filenames…" : "Фильтровать имена файлов…",
+ "WebDAV URL copied to clipboard" : "Ссылка CalDAV скопирована в буфер обмена",
+ "Enable the grid view" : "Включить режим просмотра сеткой",
+ "Enable folder tree" : "Включить дерево папок",
+ "Copy to clipboard" : "Копировать в буфер",
"Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
- "Toggle %1$s sublist" : "Переключить %1$s подсписок",
- "Toggle grid view" : "Включить или отключить режим просмотра сеткой",
- "No files in here" : "Здесь нет файлов",
- "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
- "No entries found in this folder" : "В этом каталоге ничего не найдено",
- "Select all" : "Выбрать всё",
- "Upload too large" : "Файл слишком велик",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь передать, превышают лимит максимального размера на этом сервере.",
- "No favorites yet" : "В избранное ещё ничего не добавлено ",
- "Files and folders you mark as favorite will show up here" : "Здесь будут показаны файлы и каталоги, отмеченные как избранные",
- "Deleted files" : "Корзина",
- "Shares" : "Общие ресурсы",
- "Shared with others" : "Доступные для других",
- "Shared with you" : "Доступные для вас",
- "Shared by link" : "Доступные по ссылке",
- "Deleted shares" : "Удалённые общие ресурсы",
- "Pending shares" : "Ожидающие общие ресурсы",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
+ "Deletion cancelled" : "Удаление отменено",
+ "Move cancelled" : "Перемещение отменено",
+ "Cancelled move or copy of \"{filename}\"." : "Отменено перемещение или копирование \"{filename}\".",
+ "Cancelled move or copy operation" : "Копирование или перемещение отменено",
+ "Open details" : "Открыть подробности",
+ "Photos and images" : "Фотографии и изображения",
+ "New folder creation cancelled" : "Создание новой папки отменено",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки","{folderCount} папок","{folderCount} папки"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файла","{fileCount} файлов","{fileCount} файла"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["один файл и {folderCount} папка","один файл и {folderCount} папки","один файл и {folderCount} папок","один файл и {folderCount} папки"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл и одна папка","{fileCount} файла и одна папка","{fileCount} файлов и одна папка","{fileCount} файла и одна папка"],
+ "{fileCount} files and {folderCount} folders" : "файлов: {fileCount}, папок: {folderCount}",
+ "All folders" : "Все папки",
+ "Personal Files" : "Личные файлы",
"Text file" : "Текстовый файл",
"New text file.txt" : "Новый текстовый файл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Хранилище {owner} переполнено, файлы больше не могут быть обновлены или синхронизированы!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Папки группы «{mountPoint}» заполнена, файлы более не могут быть обновлены или синхронизированы.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Внешнее хранилище «{mountPoint}» заполнено, файлы более не могут быть обновлены или синхронизированы.",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище переполнено, файлы больше не могут быть обновлены или синхронизированы.",
- "_matches '{filter}'_::_match '{filter}'_" : ["соответствует '{filter}'","соответствуют '{filter}'","соответствуют '{filter}'","соответствуют '{filter}'"]
+ "%1$s (renamed)" : "%1$s (переименовано)",
+ "renamed file" : "переименованный файл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "После включения совместимых с Windows названий файлов, существующие файлы нельзя будет изменить, но они могут быть переименованы их владельцем в допустимые новые имена.",
+ "Filter file names …" : "Фильтровать имена файлов…",
+ "Prevent warning dialogs from open or reenable them." : "Предотвратить открытие диалоговых окон с предупреждениями или включить их повторно.",
+ "Show a warning dialog when changing a file extension." : "Показать диалоговое окно предупреждения при изменении расширения файла.",
+ "Speed up your Files experience with these quick shortcuts." : "Ускорьте работу с файлами с помощью сочетаний клавиш.",
+ "Open the actions menu for a file" : "Открыть меню действий для файла",
+ "Rename a file" : "Переименовать файл",
+ "Delete a file" : "Удалить файл",
+ "Favorite or remove a file from favorites" : "Добавить или убрать из избранного ",
+ "Manage tags for a file" : "Управление тегами файла",
+ "Deselect all files" : "Отменить выбор всех файлов",
+ "Select or deselect a file" : "Выберите или отмените выбор файла",
+ "Select a range of files" : "Выбрать диапазон файлов",
+ "Navigate to the parent folder" : "Перейти к родительской папке",
+ "Navigate to the file above" : "Перейти к файлу выше",
+ "Navigate to the file below" : "Перейти к файлу ниже",
+ "Navigate to the file on the left (in grid mode)" : "Перейдите к файлу слева (в режиме сетки)",
+ "Navigate to the file on the right (in grid mode)" : "Перейдите к файлу справа (в режиме сетки)",
+ "Toggle the grid view" : "Переключение вида сетки",
+ "Open the sidebar for a file" : "Откройте боковую панель для поиска файла"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 1786e8c2eef..3fc809d957d 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -1,14 +1,356 @@
{ "translations": {
- "Storage is temporarily not available" : "Хранилище временно недоступно",
- "Storage invalid" : "Хранилище неисправно",
+ "Added to favorites" : "Добавлено в избранное",
+ "Removed from favorites" : "Удалено из избранного",
+ "You added {file} to your favorites" : "Вы добавили «{file}» в избранное",
+ "You removed {file} from your favorites" : "Вы удалили «{file}» из избранного",
+ "Favorites" : "Избранные",
+ "File changes" : "Изменения файлов",
+ "Created by {user}" : "Создано пользователем {user}",
+ "Changed by {user}" : "Изменено пользователем {user}",
+ "Deleted by {user}" : "Удалено пользователем {user}",
+ "Restored by {user}" : "Восстановлено пользователем {user}",
+ "Renamed by {user}" : "Переименовано пользователем {user}",
+ "Moved by {user}" : "Перемещено пользователем {user}",
+ "\"remote account\"" : "«пользователь другого сервера»",
+ "You created {file}" : "Вы создали «{file}»",
+ "You created an encrypted file in {file}" : "Вы создали зашифрованный файл в «{file}»",
+ "{user} created {file}" : "{user} создал(а) «{file}»",
+ "{user} created an encrypted file in {file}" : "{user} создал(а) зашифрованный файл в «{file}»",
+ "{file} was created in a public folder" : "«{file}» создан в общедоступом каталоге",
+ "You changed {file}" : "Вы изменили «{file}»",
+ "You changed an encrypted file in {file}" : "Вы изменили зашифрованный файл в «{file}»",
+ "{user} changed {file}" : "{user} изменил(а) «{file}»",
+ "{user} changed an encrypted file in {file}" : "{user} изменил(а) зашифрованный файл в «{file}»",
+ "You deleted {file}" : "Вы удалили «{file}»",
+ "You deleted an encrypted file in {file}" : "Вы удалили зашифрованный файл в «{file}»",
+ "{user} deleted {file}" : "{user} удалил(а) «{file}»",
+ "{user} deleted an encrypted file in {file}" : " {user} удалил(а) зашифрованный файл в «{file}»",
+ "You restored {file}" : "Вы восстановили «{file}»",
+ "{user} restored {file}" : "{user} восстановил(а) «{file}»",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы переименовали {oldfile} (скрытый) в {newfile} (скрытый)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Вы переименовали {oldfile} (скрытый) в {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Вы переименовали {oldfile} в {newfile} (скрытый)",
+ "You renamed {oldfile} to {newfile}" : "Вы переименовали «{oldfile}» в «{newfile}»",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile} (скрытый)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} в {newfile} (скрытый)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} переименовал(а) «{oldfile}» в «{newfile}»",
+ "You moved {oldfile} to {newfile}" : "Вы переместили «{oldfile}» в «{newfile}»",
+ "{user} moved {oldfile} to {newfile}" : "{user} переместил(а) «{oldfile}» в «{newfile}»",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл добавлен в <strong>избранное</strong> или удалён оттуда",
+ "Files" : "Файлы",
+ "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
+ "A favorite file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или папка отмеченные как избранное",
+ "Failed to authorize" : "Не удалось авторизовать",
+ "Invalid folder path" : "Неверный путь к папке",
+ "Folder not found" : "Папка не найдена",
+ "The file cannot be found" : "Файл не может быть найден",
+ "The destination path does not exist: %1$s" : "Конечный путь не существует: %1$s",
+ "You do not have permission to create a file at the specified location" : "У вас нет разрешения на создание файла в указанном месте",
+ "The file could not be converted." : "Файл не может быть преобразован.",
+ "Could not get relative path to converted file" : "Не удалось получить относительный путь к преобразованному файлу",
+ "Favorite files" : "Избранные файлы",
+ "No favorites" : "Нет избранного",
+ "More favorites" : "Больше избранного",
+ "Accept" : "Принять",
+ "Reject" : "Отклонить",
+ "Incoming ownership transfer from {user}" : "Запрос передачи владения от пользователя {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Принять владение {path}?\n\nПримечание: процесс переноса может занять до одного часа.",
+ "Ownership transfer denied" : "Передача владения отклонена",
+ "Your ownership transfer of {path} was denied by {user}." : "Передача владения {path} отклонена {user}.",
+ "Ownership transfer failed" : "Не удалось передать владение",
+ "Your ownership transfer of {path} to {user} failed." : "Вам не удалось передать владение «{path}» пользователю {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Пользователю {user} не удалось передать владение «{path}».",
+ "Ownership transfer done" : "Передача владения завершена",
+ "Your ownership transfer of {path} to {user} has completed." : "Завершена передача владения «{path}» от вас пользователю {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Завершена передача владения «{path}» от пользователя {user}.",
+ "in %s" : "в %s",
+ "Transferred from %1$s on %2$s" : "Передано от %1$s %2$s",
+ "Files compatibility" : "Совместимость файлов",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Разрешить ограничения на имена файлов для обеспечения возможности их синхронизации со всеми клиентами. По умолчанию разрешены все имена файлов, допустимые в POSIX (например, в Linux или macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "После включения совместимых с Windows названий файлов, существующие файлы нельзя будет изменить, но они могут быть переименованы их владельцем в допустимые новые имена.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Также возможно мигрировать файлы автоматически после включения этой настройки, пожалуйста, обратитесь к документации о команде occ.",
+ "Enforce Windows compatibility" : "Обеспечить совместимость с Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Это позволит блокировать имена файлов, недопустимые в системах Windows, например, использующие зарезервированные имена или специальные символы. Однако это не обеспечит совместимость в части чувствительности к регистру.",
+ "File Management" : "Управление файлами",
+ "Home" : "Главная",
+ "Target folder does not exist any more" : "Каталог больше не существует",
+ "Reload current directory" : "Обновить текущий каталог",
+ "Go to the \"{dir}\" directory" : "Перейти в каталог \"{dir}\"",
+ "Current directory path" : "Текущий путь к каталогу",
+ "Your have used your space quota and cannot upload files anymore" : "Вы использовали всё доступное вам место и не можете больше загружать файлы",
+ "You do not have permission to upload or create files here." : "У вас нет прав загружать или создавать здесь файлы.",
+ "Drag and drop files here to upload" : "Перетаскивайте файлы сюда для загрузки",
+ "Favorite" : "Добавить в избранное",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Установить или снять выделение файла «{displayName}»",
+ "Toggle selection for folder \"{displayName}\"" : "Установить или снять выделение папки «{displayName}»",
+ "File is loading" : "Файл загружается",
+ "Folder is loading" : "Папка загружается",
+ "Filename" : "Имя файла",
+ "Folder name" : "Имя папки",
+ "This node is unavailable" : "Этот узел недоступен",
+ "Another entry with the same name already exists." : "Другая запись с таким же именем уже существует.",
+ "Invalid filename." : "Недопустимое имя файла.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Переименовано «{oldName}» в \"{newName}\"",
+ "Rename file" : "Переименовать файл",
+ "Folder" : "Каталог",
+ "Unknown file type" : "Неизвестный тип файла",
+ "{ext} image" : "{ext} изображение",
+ "{ext} video" : "{ext} видео",
+ "{ext} audio" : "{ext} аудио",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "Ожидается",
+ "Unknown date" : "Неизвестная дата",
+ "Clear filter" : "Сбросить фильтр",
+ "Modified" : "Изменён",
+ "Search everywhere" : "Искать везде",
+ "Type" : "Тип",
+ "Active filters" : "Активные фильтры",
+ "Remove filter" : "Удалить фильтр",
+ "Total rows summary" : "Количество строк в общем",
+ "Toggle selection for all files and folders" : "Установить или снять выделение всех файлов и папок",
+ "Name" : "Имя",
+ "File type" : "Тип файла",
+ "Size" : "Размер",
+ "Actions" : "Действия",
+ "(selected)" : "(выбранный)",
+ "List of files and folders." : "Список файлов и каталогов.",
+ "You have used your space quota and cannot upload files anymore." : "Вы использовали свою квоту свободного места и больше не можете загружать файлы.",
+ "Column headers with buttons are sortable." : "Заголовки столбцов с кнопками можно сортировать.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
+ "File not found" : "Файл не найден",
+ "_{count} selected_::_{count} selected_" : ["Выбран {count}","Выбрано {count}","Выбрано {count}","Выбрано {count} "],
+ "Search scope options" : "Настройки области поиска",
+ "{usedQuotaByte} used" : "Использовано {usedQuotaByte}",
+ "{used} of {quota} used" : "использовано {used} из {quota}",
+ "{relative}% used" : "Использовано {relative}%",
+ "Could not refresh storage stats" : "Не удалось обновить данные об использовании хранилища",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище переполнено, файлы больше не могут быть обновлены или синхронизированы.",
+ "Storage information" : "Информация о хранении",
+ "Storage quota" : "Квота хранилища",
+ "New folder" : "Новая папка",
+ "Create new folder" : "Создать папку",
+ "This name is already in use." : "Это название уже используется.",
+ "Create" : "Создать",
+ "Files starting with a dot are hidden by default" : "Файлы, начинающиеся с точки, скрыты по умолчанию",
+ "Fill template fields" : "Заполните поля шаблона",
+ "Submitting fields …" : "Отправка полей…",
+ "Submit" : "Отправить ответ",
+ "Choose a file or folder to transfer" : "Выберите файл или папку для передачи",
+ "Transfer" : "Передать",
+ "Transfer {path} to {userid}" : "Передать {path} пользователю {userid}",
+ "Invalid path selected" : "Указан некорректный путь",
"Unknown error" : "Неизвестная ошибка",
- "File could not be found" : "Невозможно найти файл",
- "Move or copy" : "Переместить или копировать",
- "Download" : "Скачать",
+ "Ownership transfer request sent" : "Запрос на передачу прав владения отправлен",
+ "Cannot transfer ownership of a file or folder you do not own" : "Невозможно передать право владения на файл или каталог, которые вам не принадлежат",
+ "Transfer ownership of a file or folder" : "Изменение владельца файла или папки",
+ "Choose file or folder to transfer" : "Выберите файл или папку для передачи владения",
+ "Change" : "Изменить",
+ "New owner" : "Новый владелец",
+ "Keep {old}" : "Сохранить {old}",
+ "Keep without extension" : "Сохранить без расширения",
+ "Use {new}" : "Использовать{new}",
+ "Remove extension" : "Удалить расширение",
+ "Change file extension" : "Изменить расширение файла",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Изменение расширения файла с \"{old}\" на \"{new}\" может сделать файл нечитаемым.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Удаление расширения файла \"{old}\" может сделать файл нечитаемым.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Добавление расширения файла \"{new}\" может сделать его нечитаемым.",
+ "Do not show this dialog again." : "Больше не показывать это диалоговое окно.",
+ "Select file or folder to link to" : "Выберите файл или папку для создания ссылки",
+ "Choose {file}" : "Выберан {file}",
+ "Share" : "Поделиться",
+ "Shared by link" : "Доступные по ссылке",
+ "Shared" : "Опубликованное",
+ "Switch to list view" : "Переключение в режим просмотра списка",
+ "Switch to grid view" : "Переключиться на режим просмотра сеткой",
+ "The file could not be found" : "Файл не найден.",
+ "Upload was cancelled by user" : "Загрузка была отменена пользователем",
+ "Not enough free space" : "Недостаточно свободного места",
+ "Operation is blocked by access control" : "Операция не разрешена модулем контроля доступа",
+ "Error during upload: {message}" : "Ошибка при загрузке: {message}",
+ "Error during upload, status code {status}" : "Ошибка при передаче на сервер. Сообщение об ошибке: {status}",
+ "Unknown error during upload" : "Неизвестная ошибка при загрузке",
+ "Loading current folder" : "Загрузка текущей папки",
+ "Retry" : "Попробовать снова",
+ "No files in here" : "Здесь нет файлов",
+ "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
+ "Go back" : "Назад",
+ "Views" : "Представления",
+ "Files settings" : "Настройки файлов",
+ "Your files" : "Ваши файлы",
+ "Open in files" : "Открыть в приложении Файлы",
+ "File cannot be accessed" : "Не удалось получить доступ к файлу",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Не удалось найти файл или у вас отсутствуют права на его просмотр. Попросите отправителя предоставить вам доступ к этому файлу.",
+ "No search results for “{query}”" : "Нет результатов поиска по запросу «{query}»",
+ "Search for files" : "Поиск файлов",
+ "Clipboard is not available" : "Буфер обмена недоступен",
+ "General" : "Основные",
+ "Default view" : "Вид по умолчанию",
+ "All files" : "Все файлы",
+ "Personal files" : "Личные файлы",
+ "Sort favorites first" : "Сначала избранное",
+ "Sort folders before files" : "Начинать список с папок",
+ "Folder tree" : "Дерево папок",
+ "Appearance" : "Внешний вид",
+ "Show hidden files" : "Показывать скрытые файлы",
+ "Show file type column" : "Показать колонку с типом файла",
+ "Crop image previews" : "Обрезать пред. просмотр",
+ "Additional settings" : "Дополнительные параметры",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "Ссылка WebDAV",
+ "Copy" : "Копировать",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашего аккаунта включена двухфакторная аутентификация, поэтому вам необходимо использовать пароль приложения чтобы подключить внешний WebDAV клиент.",
+ "Warnings" : "Предупреждения",
+ "Keyboard shortcuts" : "Сочетания клавиш",
+ "File actions" : "Сценарии файла",
+ "Rename" : "Переименовать",
"Delete" : "Удалить",
- "Home" : "Главная",
+ "Manage tags" : "Управление метками",
+ "Selection" : "Выбор",
+ "Select all files" : "Выбрать все файлы",
+ "Deselect all" : "Снять выбор со всех",
+ "Navigation" : "Навигация",
+ "View" : "Режим просмотра",
+ "Toggle grid view" : "Включить или отключить режим просмотра сеткой",
+ "Show those shortcuts" : "Показать ярлыки",
+ "You" : "Вы",
+ "Shared multiple times with different people" : "Делиться несколько раз с разными людьми",
+ "Unable to change the favorite state of the file" : "Невозможно изменить избранное состояние файла",
+ "Error while loading the file data" : "Не удалось загрузить данные файла",
+ "Owner" : "Владелец",
+ "Remove from favorites" : "Удалить из избранных",
+ "Add to favorites" : "Добавить в избранное",
+ "Tags" : "Метки",
+ "Blank" : "Пустой",
+ "Unable to create new file from template" : "Не удалось создать файл на основе шаблона",
+ "Pick a template for {name}" : "Выбрать шаблон для {name}",
+ "Create a new file with the selected template" : "Создать файл на основе шаблона",
+ "Creating file" : "Создание файла",
+ "Save as {displayName}" : "Сохранить как {displayName}",
+ "Save as …" : "Сохранить как…",
+ "Converting files …" : "Преобразование файлов…",
+ "Failed to convert files: {message}" : "Не удалось преобразовать файлы: {message}",
+ "All files failed to be converted" : "Не удалось преобразовать все файлы",
+ "One file could not be converted: {message}" : "Один файл не удалось преобразовать: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Файл не удалось преобразовать","%n файлы не могут быть преобразованы","%n файлы не могут быть преобразованы","%n файлы не могут быть преобразованы"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Файл успешно преобразован","%n файлы успешно преобразованы","%n файлы успешно преобразованы","%n файлы успешно преобразованы"],
+ "Files successfully converted" : "Файлы успешно конвертированы",
+ "Failed to convert files" : "Не удалось преобразовать файлы",
+ "Converting file …" : "Преобразование файла…",
+ "File successfully converted" : "Файл успешно преобразован",
+ "Failed to convert file: {message}" : "Не удалось преобразовать файл: {message}",
+ "Failed to convert file" : "Не удалось преобразовать файл",
+ "Leave this share" : "Перестать использовать общий ресурс",
+ "Leave these shares" : "Отказаться от доступа к общим ресурсам",
+ "Disconnect storage" : "Отсоединить хранилище",
+ "Disconnect storages" : "Отключить хранилища",
+ "Delete permanently" : "Удалить навсегда",
+ "Delete and unshare" : "Удалить и закрыть общий доступ",
+ "Delete file" : "Удалить файл",
+ "Delete files" : "Удалить файлы",
+ "Delete folder" : "Удалить папку",
+ "Delete folders" : "Удалить папки",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Вы собираетесь безвозвратно удалить {count} элемент","Вы собираетесь безвозвратно удалить {count} элемента","Вы собираетесь безвозвратно удалить {count} элементов","Вы собираетесь безвозвратно удалить {count} элементов"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Подтвердите удаление {count} объекта.","Подтвердите удаление {count} объектов","Подтвердите удаление {count} объектов","Подтвердите удаление {count} объектов"],
+ "Confirm deletion" : "Подтвердить удаление",
+ "Cancel" : "Отменить",
+ "Download" : "Скачать",
+ "Moving \"{source}\" to \"{destination}\" …" : "Перемещение \"{source}\" в \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Копирование \"{source}\" в \"{destination}\" …",
+ "Destination is not a folder" : "Указанное назначение не является папкой",
+ "This file/folder is already in that directory" : "Файл или папка уже расположены в этой папке",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Папка или файл не могут быть перемещены во вложенную папку или в себя",
+ "(copy)" : "(копия)",
+ "(copy %n)" : "(копия %n)",
+ "A file or folder with that name already exists in this folder" : "В этой папке уже есть файл или папка с этим именем",
+ "The files are locked" : "Файлы заблокированы",
+ "The file does not exist anymore" : "Файл больше не существует",
+ "Choose destination" : "Выберите место назначения",
+ "Copy to {target}" : "Скопировать в «{target}»",
+ "Move to {target}" : "Переместить в «{target}»",
+ "Move" : "Переместить",
+ "Move or copy operation failed" : "Ошибка перемещение или копирования",
+ "Move or copy" : "Переместить или копировать",
+ "Open folder {displayName}" : "Открыть папку «{displayName}»",
+ "Open in Files" : "Открыть в приложении «Файлы»",
+ "Open locally" : "Открыть локально",
+ "Failed to redirect to client" : "Ошибка перенаправления в клиент",
+ "Open file locally" : "Открыть файл локально",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Теперь файл должен открыться на вашем устройстве. Если это не произошло, пожалуйста, убедитесь, что у вас установлено настольное приложение.",
+ "Retry and close" : "Повторить попытку и закрыть",
+ "Open online" : "Открыть онлайн",
+ "Details" : "Подробно",
+ "View in folder" : "Посмотреть в каталоге",
+ "Today" : "Сегодня",
+ "Last 7 days" : "Последние 7 дней",
+ "Last 30 days" : "Последние 30 дней",
+ "This year ({year})" : "Этот год ({year})",
+ "Last year ({year})" : "Последний год ({year})",
+ "Documents" : "Документы",
+ "Spreadsheets" : "Таблицы",
+ "Presentations" : "Презентации",
+ "PDFs" : "PDFs",
+ "Folders" : "Папки",
+ "Audio" : "Звук",
+ "Images" : "Изображения",
+ "Videos" : "Видео",
+ "Created new folder \"{name}\"" : "Создана новая папка \"{name}\"",
+ "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов",
+ "Create templates folder" : "Создать папку шаблонов",
+ "Templates" : "Шаблоны",
+ "New template folder" : "Новая папка шаблонов",
+ "In folder" : "В папке",
+ "Search in all files" : "Поиск во всех файлах",
+ "Search in folder: {folder}" : "Поиск в папке: «{folder}»",
+ "One of the dropped files could not be processed" : "Один из перетащенных файлов не может быть обработан",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Папки не будут загружены, так как используемый браузер не поддерживает работу с файловой системой.",
+ "No files to upload" : "Не выбрано ни одного файла для передачи на сервер",
+ "Unable to create the directory {directory}" : "Не удалось создать папку «{directory}»",
+ "Some files could not be uploaded" : "Не удалось загрузить некоторые файлы",
+ "Files uploaded successfully" : "Файлы успешно обновлены",
+ "No files to process" : "Нет файлов для обработки",
+ "Some files could not be copied" : "Не удалось скопировать некоторые файлы",
+ "Some files could not be moved" : "Не удалось переместить некоторые файлы",
+ "Files copied successfully" : "Файлы успешно скопированы",
+ "Files moved successfully" : "Файлы успешно перемещены",
+ "Conflicts resolution skipped" : "Разрешение конфликтов пропущено",
+ "Upload cancelled" : "Передача на сервер отменена",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не удалось переименовать \"{oldName}\", его больше не существует",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Имя \"{newName}\" уже используется в каталоге \"{dir}\". Выберите другое имя.",
+ "Could not rename \"{oldName}\"" : "Не удалось переименовать «{oldName}»",
+ "This operation is forbidden" : "Операция запрещена",
+ "Storage is temporarily not available" : "Хранилище временно недоступно",
+ "Unexpected error: {error}" : "Неожиданная ошибка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
+ "_%n folder_::_%n folders_" : ["%n каталог","%n каталога","%n каталогов","%n каталогов"],
+ "_%n hidden_::_%n hidden_" : ["скрыто %n","скрыто %n","скрыто %n","скрыто %n"],
+ "Filename must not be empty." : "Имя файла не должно быть пустым.",
+ "\"{char}\" is not allowed inside a filename." : "не допускается внутри имени файла.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "является зарезервированным именем и не допускается для имен файлов.",
+ "\"{extension}\" is not an allowed filetype." : "не является разрешенным типом файла.",
+ "Filenames must not end with \"{extension}\"." : "Имена файлов не должны заканчиваться на",
+ "List of favorite files and folders." : "Список избранных файлов и папок.",
+ "No favorites yet" : "В избранное ещё ничего не добавлено ",
+ "Files and folders you mark as favorite will show up here" : "Здесь будут показаны файлы и каталоги, отмеченные как избранные",
+ "List of your files and folders." : "Список ваших файлов и каталогов.",
+ "List of your files and folders that are not shared." : "Список ваших неопубликованных файлов и папок.",
+ "No personal files found" : "Личные файлы не найдены",
+ "Files that are not shared will show up here." : "Файлы, которые не опубликованы, показаны здесь.",
+ "Recent" : "Недавно изменённые",
+ "List of recently modified files and folders." : "Список недавно измененных файлов и директорий.",
+ "No recently modified files" : "Нет недавно измененных файлов",
+ "Files and folders you recently modified will show up here." : "Здесь будут показаны недавно изменённые файлы и папки",
+ "Search" : "Поиск",
+ "Search results within your files." : "Результаты поиска в ваших файлах.",
+ "No entries found in this folder" : "В этом каталоге ничего не найдено",
+ "Select all" : "Выбрать всё",
+ "Upload too large" : "Файл слишком велик",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь передать, превышают лимит максимального размера на этом сервере.",
+ "File could not be found" : "Невозможно найти файл",
+ "Show list view" : "Просмотр списком",
+ "Show grid view" : "Просмотр сеткой",
"Close" : "Закрыть",
- "Favorites" : "Избранные",
"Could not create folder \"{dir}\"" : "Невозможно создать каталог «{dir}»",
"This will stop your current uploads." : "Это действие остановит активные сеансы передачи файлов на сервер. ",
"Upload cancelled." : "Отправка отменена.",
@@ -17,32 +359,24 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно передать «{filename}», так как это либо каталог, либо файл нулевого размера",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостаточно свободного места, вы передаёте на сервер {size1}, но доступно только {size2}",
"Target folder \"{dir}\" does not exist any more" : "Целевой каталог «{dir}» более не существует",
- "Not enough free space" : "Недостаточно свободного места",
"An unknown error has occurred" : "Произошла неизвестная ошибка",
+ "File could not be uploaded" : "Файл не может быть загружен",
"Uploading …" : "Передача…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Загрузка … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} из {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Загрузка этого элемента не поддерживается",
- "Target folder does not exist any more" : "Каталог больше не существует",
- "Operation is blocked by access control" : "Операция не разрешена модулем контроля доступа",
"Error when assembling chunks, status code {status}" : "Ошибка при сборке чанков, код ошибки {status}",
- "Actions" : "Действия",
- "Rename" : "Переименовать",
- "Copy" : "Копировать",
"Choose target folder" : "Выбор папки назначения",
+ "Set reminder" : "Установить напоминание",
+ "Edit locally" : "Редактировать локально",
"Open" : "Открыть",
- "Delete file" : "Удалить файл",
- "Delete folder" : "Удалить каталог",
- "Disconnect storage" : "Отсоединить хранилище",
- "Leave this share" : "Отказаться от совместного доступа к этому ресурсу",
"Could not load info for file \"{file}\"" : "Не удаётся загрузить информацию для файла \"{file}\"",
- "Files" : "Файлы",
- "Details" : "Подробно",
"Please select tag(s) to add to the selection" : "Выберите метки для назначения выбранным объектам",
"Apply tag(s) to selection" : "Назначить метки выбранным объектам",
- "Select" : "Выбрать",
- "Pending" : "Ожидается",
+ "Select directory \"{dirName}\"" : "Выберите каталог \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Выберите файл \"{fileName}\"",
"Unable to determine date" : "Невозможно определить дату",
- "This operation is forbidden" : "Операция запрещена",
"This directory is unavailable, please check the logs or contact the administrator" : "Каталог недоступен. Проверьте журналы событий или свяжитесь с администратором",
"Could not move \"{file}\", target exists" : "Невозможно переместить файл «{file}», он уже существует в каталоге назначения",
"Could not move \"{file}\"" : "Невозможно переместить файл «{file}»",
@@ -52,9 +386,6 @@
"Copied {origin} inside {destination}" : "{origin} скопирован в {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} и {nbfiles} других файлов скопированы в {destination}",
"{newName} already exists" : "«{newName}» уже существует",
- "Could not rename \"{fileName}\", it does not exist any more" : "Невозможно переименовать «{fileName}», файл больше не существует",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Имя «{targetName}» уже используется в каталоге «{dir}». Выберите другое имя.",
- "Could not rename \"{fileName}\"" : "Невозможно переименовать «{fileName}»",
"Could not create file \"{file}\"" : "Невозможно создать файл «{file}»",
"Could not create file \"{file}\" because it already exists" : "Невозможно создать файл «{file}», он уже существует",
"Could not create folder \"{dir}\" because it already exists" : "Невозможно создать каталог «{dir}», он уже существует",
@@ -62,18 +393,14 @@
"Error deleting file \"{fileName}\"." : "Ошибка удаления файла «{fileName}».",
"No search results in other folders for {tag}{filter}{endtag}" : "Нет результатов поиска в других папках для {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Введите более двух символов для поиска в других каталогах",
- "Name" : "Имя",
- "Size" : "Размер",
- "Modified" : "Изменён",
- "_%n folder_::_%n folders_" : ["%n каталог","%n каталога","%n каталогов","%n каталогов"],
- "_%n file_::_%n files_" : ["%n файл","%n файла","%n файлов","%n файлов"],
"{dirs} and {files}" : "{dirs} и {files}",
"_including %n hidden_::_including %n hidden_" : ["включая %n скрытый","включая %n скрытых","включая %n скрытых","включая %n скрытых"],
- "You don’t have permission to upload or create files here" : "У вас нет прав на создание или загрузку файлов в эту папку.",
+ "You do not have permission to upload or create files here" : "У вас нет разрешения на загрузку или создание файлов здесь",
"_Uploading %n file_::_Uploading %n files_" : ["Передача %n файла","Передача %n файлов","Передача %n файлов","Передача %n файлов"],
"New" : "Новый",
+ "New file/folder menu" : "Меню создания файла или папки",
"Select file range" : "Выбор диапазона файлов",
- "{used} of {quota} used" : "использовано {used} из {quota}",
+ "{used}%" : "{used}%",
"{used} used" : "Использовано {used}",
"\"{name}\" is an invalid file name." : "«{name}» — недопустимое имя файла.",
"File name cannot be empty." : "Имя файла не может быть пустым.",
@@ -88,131 +415,65 @@
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Внешнее хранилище «{mountPoint}» почти заполнено (использовано {usedSpacePercent} %).",
"Your storage is almost full ({usedSpacePercent}%)." : "Ваше хранилище почти заполнено (использовано {usedSpacePercent} %).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["соответствуют «{filter}»","соответствуют «{filter}»","соответствуют «{filter}»","соответствует «{filter}»"],
- "View in folder" : "Посмотреть в каталоге",
- "Copied!" : "Скопировано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копировать прямую ссылку (работает только для пользователей с правами доступа к этому файлу или каталогу)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Внутренняя ссылка скопирована. Она может быть использована только пользователями, у которых уже есть доступ к этому файлу или папке. ",
"Path" : "Путь",
"_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байт","%n байт"],
- "Favorited" : "Избранное",
- "Favorite" : "Добавить в избранное",
- "You can only favorite a single file or folder at a time" : "Одновременно можно выбрать только один файл или папку",
- "New folder" : "Новый каталог",
+ "Favored" : "Избранные",
+ "Favor" : "Услуга",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копировать прямую ссылку (она сработает только для пользователей, у которых уже есть доступ к этому файлу или каталогу)",
"Upload file" : "Загрузить файл",
- "Recent" : "Недавно изменённые",
- "Not favorited" : "Не избранное",
- "Remove from favorites" : "Удалить из избранных",
- "Add to favorites" : "Добавить в избранное",
+ "Not favored" : "Не одобрен",
"An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка",
- "Added to favorites" : "Добавлено в избранное",
- "Removed from favorites" : "Удалено из избранного",
- "You added {file} to your favorites" : "Вы добавили «{file}» в избранное",
- "You removed {file} from your favorites" : "Вы удалили «{file}» из избранного",
- "File changes" : "Изменения файлов",
- "Created by {user}" : "Создано {user}",
- "Changed by {user}" : "Изменено {user}",
- "Deleted by {user}" : "Удалено {user}",
- "Restored by {user}" : "Восстановлено {user}",
- "Renamed by {user}" : "Переименовано {user}",
- "Moved by {user}" : "Перемещено {user}",
- "\"remote user\"" : "«пользователь с другого сервера»",
- "You created {file}" : "Вы создали «{file}»",
- "You created an encrypted file in {file}" : "Вы создали зашифрованный файл в «{file}»",
- "{user} created {file}" : "{user} создал(а) «{file}»",
- "{user} created an encrypted file in {file}" : "{user} создал(а) зашифрованный файл в «{file}»",
- "{file} was created in a public folder" : "«{file}» создан в общедоступом каталоге",
- "You changed {file}" : "Вы изменили «{file}»",
- "You changed an encrypted file in {file}" : "Вы изменили зашифрованный файл в «{file}»",
- "{user} changed {file}" : "{user} изменил(а) «{file}»",
- "{user} changed an encrypted file in {file}" : "{user} изменил(а) зашифрованный файл в «{file}»",
- "You deleted {file}" : "Вы удалили «{file}»",
- "You deleted an encrypted file in {file}" : "Вы удалили зашифрованный файл в «{file}»",
- "{user} deleted {file}" : "{user} удалил(а) «{file}»",
- "{user} deleted an encrypted file in {file}" : " {user} удалил(а) зашифрованный файл в «{file}»",
- "You restored {file}" : "Вы восстановили «{file}»",
- "{user} restored {file}" : "{user} восстановил(а) «{file}»",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Вы переименовали {oldfile} (скрытый) в {newfile} (скрытый)",
- "You renamed {oldfile} (hidden) to {newfile}" : "Вы переименовали {oldfile} (скрытый) в {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "Вы переименовали {oldfile} в {newfile} (скрытый)",
- "You renamed {oldfile} to {newfile}" : "Вы переименовали «{oldfile}» в «{newfile}»",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile} (скрытый)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} переименовал(а) {oldfile} (скрытый) в {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} переименовал(а) {oldfile} в {newfile} (скрытый)",
- "{user} renamed {oldfile} to {newfile}" : "{user} переименовал(а) «{oldfile}» в «{newfile}»",
- "You moved {oldfile} to {newfile}" : "Вы переместили «{oldfile}» в «{newfile}»",
- "{user} moved {oldfile} to {newfile}" : "{user} переместил(а) «{oldfile}» в «{newfile}»",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Файл добавлен в <strong>избранное</strong> или удалён оттуда",
- "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог",
- "A favorite file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или папка отмеченные как избранное",
- "All files" : "Все файлы",
- "Unlimited" : "Неограничено",
"Upload (max. %s)" : "Загрузка (максимум %s)",
- "Accept" : "Принять",
- "Reject" : "Отклонить",
- "Incoming ownership transfer from {user}" : "Запрос передачи владения от пользователя {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Принять владение {path}?\n\nПримечание: процесс переноса может занять до одного часа.",
- "Ownership transfer failed" : "Не удалось передать владение",
- "Your ownership transfer of {path} to {user} failed." : "Вам не удалось передать владение «{path}» пользователю {user}.",
- "The ownership transfer of {path} from {user} failed." : "Пользователю {user} не удалось передать владение «{path}».",
- "Ownership transfer done" : "Передача владения завершена",
- "Your ownership transfer of {path} to {user} has completed." : "Завершена передача владения «{path}» от вас пользователю {user}.",
- "The ownership transfer of {path} from {user} has completed." : "Завершена передача владения «{path}» от пользователя {user}.",
- "in %s" : "в %s",
- "File Management" : "Управление файлами",
- "Transfer ownership of a file or folder" : "Изменение владельца файла или папки",
- "Choose file or folder to transfer" : "Выберите файл или папку для передачи владения",
- "Change" : "Изменить",
- "New owner" : "Новый владелец",
- "Search users" : "Поиск пользователей",
- "Choose a file or folder to transfer" : "Выберите файл или папку для передачи",
- "Transfer" : "Передать",
- "Transfer {path} to {userid}" : "Передать {path} пользователю {userid}",
- "Invalid path selected" : "Указан некорректный путь",
- "Ownership transfer request sent" : "Запрос на передачу прав владения отправлен",
- "Cannot transfer ownership of a file or folder you don't own" : "Изменение владельца возможно только для своих файлов и папок",
- "Tags" : "Метки",
- "Unable to change the favourite state of the file" : "Не удалось изменить состояние «избранный» этого файла.",
- "Error while loading the file data" : "Не удалось загрузить данные файла",
- "Pick a template for {name}" : "Выбрать шаблон для {name}",
- "Cancel" : "Отменить",
- "Create" : "Создать",
- "Create a new file with the selected template" : "Создать файл на основе шаблона",
- "Creating file" : "Создание файла",
- "Blank" : "Пустой",
- "Unable to create new file from template" : "Не удалось создать файл на основе шаблона",
- "Set up templates folder" : "Указать папку шаблонов",
- "Templates" : "Шаблоны",
- "Unable to initialize the templates directory" : "Не удалось инициализировать каталог шаблонов",
- "%s used" : "%s использовано",
- "%s%% of %s used" : "использовано %s%% из %s",
- "%1$s of %2$s used" : "использовано %1$s из %2$s ",
- "Settings" : "Настройки",
- "Show hidden files" : "Показывать скрытые файлы",
- "Crop image previews" : "Обрезать пред. просмотр",
- "WebDAV" : "WebDAV",
+ "\"{displayName}\" action executed successfully" : "Действие «{displayName}» выполнено успешно",
+ "\"{displayName}\" action failed" : "Действие «{displayName}» завершилось неудачно",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" не удалось выполнить некоторые элементы",
+ "\"{displayName}\" batch action executed successfully" : "Пакетное действие \"{displayName}\" выполнено успешно",
+ "Submitting fields…" : "Отправка полей…",
+ "Filter filenames…" : "Фильтровать имена файлов…",
+ "WebDAV URL copied to clipboard" : "Ссылка CalDAV скопирована в буфер обмена",
+ "Enable the grid view" : "Включить режим просмотра сеткой",
+ "Enable folder tree" : "Включить дерево папок",
+ "Copy to clipboard" : "Копировать в буфер",
"Use this address to access your Files via WebDAV" : "Используйте этот адрес для подключения WebDAV",
- "Toggle %1$s sublist" : "Переключить %1$s подсписок",
- "Toggle grid view" : "Включить или отключить режим просмотра сеткой",
- "No files in here" : "Здесь нет файлов",
- "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
- "No entries found in this folder" : "В этом каталоге ничего не найдено",
- "Select all" : "Выбрать всё",
- "Upload too large" : "Файл слишком велик",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь передать, превышают лимит максимального размера на этом сервере.",
- "No favorites yet" : "В избранное ещё ничего не добавлено ",
- "Files and folders you mark as favorite will show up here" : "Здесь будут показаны файлы и каталоги, отмеченные как избранные",
- "Deleted files" : "Корзина",
- "Shares" : "Общие ресурсы",
- "Shared with others" : "Доступные для других",
- "Shared with you" : "Доступные для вас",
- "Shared by link" : "Доступные по ссылке",
- "Deleted shares" : "Удалённые общие ресурсы",
- "Pending shares" : "Ожидающие общие ресурсы",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Если вы включили двухфакторную аутентификацию, то нажмите здесь, чтобы создать пароль приложения.",
+ "Deletion cancelled" : "Удаление отменено",
+ "Move cancelled" : "Перемещение отменено",
+ "Cancelled move or copy of \"{filename}\"." : "Отменено перемещение или копирование \"{filename}\".",
+ "Cancelled move or copy operation" : "Копирование или перемещение отменено",
+ "Open details" : "Открыть подробности",
+ "Photos and images" : "Фотографии и изображения",
+ "New folder creation cancelled" : "Создание новой папки отменено",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} папка","{folderCount} папки","{folderCount} папок","{folderCount} папки"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файла","{fileCount} файлов","{fileCount} файла"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["один файл и {folderCount} папка","один файл и {folderCount} папки","один файл и {folderCount} папок","один файл и {folderCount} папки"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл и одна папка","{fileCount} файла и одна папка","{fileCount} файлов и одна папка","{fileCount} файла и одна папка"],
+ "{fileCount} files and {folderCount} folders" : "файлов: {fileCount}, папок: {folderCount}",
+ "All folders" : "Все папки",
+ "Personal Files" : "Личные файлы",
"Text file" : "Текстовый файл",
"New text file.txt" : "Новый текстовый файл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Хранилище {owner} переполнено, файлы больше не могут быть обновлены или синхронизированы!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Папки группы «{mountPoint}» заполнена, файлы более не могут быть обновлены или синхронизированы.",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Внешнее хранилище «{mountPoint}» заполнено, файлы более не могут быть обновлены или синхронизированы.",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище переполнено, файлы больше не могут быть обновлены или синхронизированы.",
- "_matches '{filter}'_::_match '{filter}'_" : ["соответствует '{filter}'","соответствуют '{filter}'","соответствуют '{filter}'","соответствуют '{filter}'"]
+ "%1$s (renamed)" : "%1$s (переименовано)",
+ "renamed file" : "переименованный файл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "После включения совместимых с Windows названий файлов, существующие файлы нельзя будет изменить, но они могут быть переименованы их владельцем в допустимые новые имена.",
+ "Filter file names …" : "Фильтровать имена файлов…",
+ "Prevent warning dialogs from open or reenable them." : "Предотвратить открытие диалоговых окон с предупреждениями или включить их повторно.",
+ "Show a warning dialog when changing a file extension." : "Показать диалоговое окно предупреждения при изменении расширения файла.",
+ "Speed up your Files experience with these quick shortcuts." : "Ускорьте работу с файлами с помощью сочетаний клавиш.",
+ "Open the actions menu for a file" : "Открыть меню действий для файла",
+ "Rename a file" : "Переименовать файл",
+ "Delete a file" : "Удалить файл",
+ "Favorite or remove a file from favorites" : "Добавить или убрать из избранного ",
+ "Manage tags for a file" : "Управление тегами файла",
+ "Deselect all files" : "Отменить выбор всех файлов",
+ "Select or deselect a file" : "Выберите или отмените выбор файла",
+ "Select a range of files" : "Выбрать диапазон файлов",
+ "Navigate to the parent folder" : "Перейти к родительской папке",
+ "Navigate to the file above" : "Перейти к файлу выше",
+ "Navigate to the file below" : "Перейти к файлу ниже",
+ "Navigate to the file on the left (in grid mode)" : "Перейдите к файлу слева (в режиме сетки)",
+ "Navigate to the file on the right (in grid mode)" : "Перейдите к файлу справа (в режиме сетки)",
+ "Toggle the grid view" : "Переключение вида сетки",
+ "Open the sidebar for a file" : "Откройте боковую панель для поиска файла"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sc.js b/apps/files/l10n/sc.js
index 38494e0ff9e..dc6241260b4 100644
--- a/apps/files/l10n/sc.js
+++ b/apps/files/l10n/sc.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "S'archiviatzione immoe no est a disponimentu",
- "Storage invalid" : "Archiviatzione non vàlida",
- "Unknown error" : "Errore disconnotu",
- "File could not be found" : "No at fatu a agatare s'archìviu",
- "Move or copy" : "Tràmuda o còpia",
- "Download" : "Iscàrriga",
- "Delete" : "Cantzella",
- "Home" : "Pàgina printzipale",
- "Close" : "Serra",
- "Favorites" : "Preferidos",
- "Could not create folder \"{dir}\"" : "No at fatu a creare sa cartella \"{dir}\"",
- "This will stop your current uploads." : "Custu at a firmare is carrigamentos tuos atuales.",
- "Upload cancelled." : "Carrigamentu annulladu.",
- "Processing files …" : "Elaborende is archìvios ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No at fatu a carrigare {filename} ca est una cartella o tenet 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non b'at logu, ses carrighende {size1} ma est abarradu isceti {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Sa cartella de destinatzione \"{dir}\" no esistit prus",
- "Not enough free space" : "Non b'at logu lìberu",
- "An unknown error has occurred" : "B'at àpidu un'errore disconnotu",
- "Uploading …" : "Carrighende ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Su carrigamentu de s'elementu no est suportadu.",
- "Target folder does not exist any more" : "Sa cartella de destinatzione no esistit prus",
- "Operation is blocked by access control" : "S'operatzione est blocada dae su controllu de intrada",
- "Error when assembling chunks, status code {status}" : "Errore in s'assentada de is blocos, còdighe de istadu {status}",
- "Actions" : "Atziones",
- "Rename" : "Torra a numenare",
- "Copy" : "Còpia",
- "Choose target folder" : "Sèbera cartella de destinatzione",
- "Open" : "Aberi",
- "Delete file" : "Cantzella archìviu",
- "Delete folder" : "Cantzella cartella",
- "Disconnect storage" : "Disconnete archiviatzione",
- "Leave this share" : "Lassa custa cumpartzidura",
- "Could not load info for file \"{file}\"" : "No at fatu a carrigare informatziones de s'archìviu \"{file}\"",
- "Files" : "Archìvios",
- "Details" : "Detàllios",
- "Please select tag(s) to add to the selection" : "Seletziona eticheta(s) pro agiùnghere a sa seletzione",
- "Apply tag(s) to selection" : "Àplica eticheta(s) a sa seletzione",
- "Select" : "Seletziona",
- "Pending" : "In suspesu",
- "Unable to determine date" : "Non faghet a determinare sa data",
- "This operation is forbidden" : "Custa operatzione no est permìtida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Custa cartella no est a disponimentu, controlla is informes o cuntata s'amministratzione",
- "Could not move \"{file}\", target exists" : "No at fatu a tramudare \"{file}\", sa destinatzione esistit giai",
- "Could not move \"{file}\"" : "No at fatu a tramudare \"{file}\"",
- "copy" : "còpia",
- "Could not copy \"{file}\", target exists" : "No at fatu a copiare \"{file}\", sa destinatzione esistit giai",
- "Could not copy \"{file}\"" : "No at fatu a copiare \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} copiadu a intro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} àteros archìvios a intro de {destination}",
- "{newName} already exists" : "{newName} esistit giai",
- "Could not rename \"{fileName}\", it does not exist any more" : "No at fatu a torrare a numenare \"{fileName}\", ca no esistit prus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Su nùmene \"{targetName}\" est giai impreadu in sa cartella \"{dir}\". Sèbera un'àteru nùmene.",
- "Could not rename \"{fileName}\"" : "No at fatu a torrare a numenare \"{fileName}\"",
- "Could not create file \"{file}\"" : "No at fatu a creare s'archìviu \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No at fatu a creare s'archìviu \"{file}\" ca esitit giai",
- "Could not create folder \"{dir}\" because it already exists" : "No at fatu a creare sa cartella \"{dir}\" ca esistit giai",
- "Could not fetch file details \"{file}\"" : "No at fatu a recuperare is detàllios de s'archìviu \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Errore cantzellende s'archìviu \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Perunu resurtadu de chirca in àteras cartellas pro {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Inserta prus de duos caràteres pro chircare in àteras cartellas",
- "Name" : "Nùmene",
- "Size" : "Mannària",
- "Modified" : "Modificadu",
- "_%n folder_::_%n folders_" : ["%n cartella","%n cartellas"],
- "_%n file_::_%n files_" : ["%n archìviu","%n archìvios"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"],
- "You don’t have permission to upload or create files here" : "Non tenes su permissu pro carrigare o creare archìvios inoghe",
- "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"],
- "New" : "Nou",
- "Select file range" : "Seletziona classe de archìviu",
- "{used} of {quota} used" : "{used} de {quota} impreadu",
- "{used} used" : "{used} impreadu",
- "\"{name}\" is an invalid file name." : "\"{name}\" est unu nùmene de archìviu non vàlidu.",
- "File name cannot be empty." : "Su nùmene de s'archìviu non podet èssere bòidu.",
- "\"/\" is not allowed inside a file name." : "\"/\" no est permìtidu in unu nùmene de archìviu.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" no est una genia de archìviu permìtida",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "Your storage is full, files cannot be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "S'archiviatzione de {owner} est giai prena ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Sa cartella de grupu \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "S'archiviatzione esterna \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "S'archiviatzione tua est giai prena ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["currispondet '{filter}'","currispondent '{filter}'"],
- "View in folder" : "Visualiza in sa cartella",
- "Copied!" : "Copiadu!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Còpia ligòngiu deretu (faghet isceti pro utentes chi tenent atzessu a custu archìviu/cartella)",
- "Path" : "Percursu",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Preferidu",
- "Favorite" : "Preferidu",
- "You can only favorite a single file or folder at a time" : "Podes preferire isceti un'archìviu o una cartella cada borta",
- "New folder" : "Cartella noa",
- "Upload file" : "Carriga archìviu",
- "Recent" : "Reghente",
- "Not favorited" : "Non preferidu",
- "Remove from favorites" : "Boga dae preferidos",
- "Add to favorites" : "Agiunghe a preferidos",
- "An error occurred while trying to update the tags" : "B'at àpidu un'errore proende a agiornare is etichetas",
"Added to favorites" : "Agiuntu a preferidos",
"Removed from favorites" : "Bogadu dae preferidos",
"You added {file} to your favorites" : "As agiuntu {file} a preferidos",
"You removed {file} from your favorites" : "As bogadu {file} dae preferidos",
+ "Favorites" : "Preferidos",
"File changes" : "Modìficas de s'archìviu",
"Created by {user}" : "Creadu dae {user}",
"Changed by {user}" : "Modificadu dae {user}",
@@ -116,7 +13,6 @@ OC.L10N.register(
"Restored by {user}" : "Ripristinadu dae {user}",
"Renamed by {user}" : "Torradu a numenare dae {user}",
"Moved by {user}" : "Tramudadu dae {user}",
- "\"remote user\"" : "\"utèntzia remota\"",
"You created {file}" : "As creadu {file}",
"You created an encrypted file in {file}" : "As creadu un'archìviu tzifradu in {file}",
"{user} created {file}" : "{user} at creadu {file}",
@@ -143,11 +39,9 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "As tramudadu {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} at tramudadu {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Ant agiuntu o bogadu un'archìviu dae is <strong>preferidos</strong>",
+ "Files" : "Archìvios",
"A file or folder has been <strong>changed</strong>" : "Ant <strong>cambiadu</strong> un'archìviu o una cartella",
"A favorite file or folder has been <strong>changed</strong>" : "Ant <strong>cambiadu</strong>un'archìviu o una cartella preferida",
- "All files" : "Totu is archìvios",
- "Unlimited" : "Chene lìmites",
- "Upload (max. %s)" : "Càrriga (max. %s)",
"Accept" : "Atzeta",
"Reject" : "Refuda",
"Incoming ownership transfer from {user}" : "Tràmuda de propriedade in intrada dae {user}",
@@ -160,61 +54,245 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "Tràmuda de propriedade de {path} dae {user} cumpletada.",
"in %s" : "in %s",
"File Management" : "Gestione archìvios",
- "Transfer ownership of a file or folder" : "Tràmuda propriedade de un'archìviu o una cartella",
- "Choose file or folder to transfer" : "Sèbera archìviu o cartella de tramudare",
- "Change" : "Càmbia",
- "New owner" : "Propriedade noa",
- "Search users" : "Chirca utentes",
+ "Home" : "Pàgina printzipale",
+ "Target folder does not exist any more" : "Sa cartella de destinatzione no esistit prus",
+ "Reload current directory" : "Torra a carrigare sa cartella atuale",
+ "Go to the \"{dir}\" directory" : "Bae a sa cartella \"{dir}\"",
+ "Drag and drop files here to upload" : "Traga archìvios inoghe pro ddos carrigare",
+ "Favorite" : "Preferidu",
+ "Back" : "In segus",
+ "Filename" : "Nùmene de s'archìviu",
+ "Folder name" : "Nùmene de sa cartella",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" s'est torradu a numenare comente \"{newName}\"",
+ "Rename file" : "Torra a numenare s'archìviu",
+ "Folder" : "Cartella",
+ "Pending" : "In suspesu",
+ "Clear filter" : "Lìmpia filtru",
+ "Modified" : "Modificadu",
+ "Type" : "Genia",
+ "Name" : "Nùmene",
+ "Size" : "Mannària",
+ "Actions" : "Atziones",
+ "(selected)" : "(seletzionados)",
+ "List of files and folders." : "Lista de archìvios e cartellas.",
+ "File not found" : "Archìviu no agatadu",
+ "{usedQuotaByte} used" : "{usedQuotaByte} impreadu",
+ "{used} of {quota} used" : "{used} de {quota} impreadu",
+ "{relative}% used" : "{relative}% impreadu",
+ "Could not refresh storage stats" : "Impossìbile atualizare is istatìsticas de archiviatzione",
+ "Your storage is full, files can not be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
+ "New folder" : "Cartella noa",
+ "Create new folder" : "Crea cartella noa",
+ "Create" : "Crea",
+ "Submit" : "Imbia",
"Choose a file or folder to transfer" : "Sèbera un'archìviu o una cartella de tramudare",
"Transfer" : "Tràmuda",
"Transfer {path} to {userid}" : "Tràmuda {path} a {userid}",
"Invalid path selected" : "Percursu seletzionadu non vàlidu",
+ "Unknown error" : "Errore disconnotu",
"Ownership transfer request sent" : "Dimanda de tràmuda de propriedade imbiada",
- "Cannot transfer ownership of a file or folder you don't own" : "Non faghet a tramudare sa propriedade de un'archìviu o cartella de is chi non ses mere",
- "Tags" : "Etichetas",
- "Unable to change the favourite state of the file" : "Non faghet a cambiare s'istadu de preferidu de s'archìviu",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossìbile tramudare sa propiedade de un'archìviu o de una cartella chi no sunt tuos",
+ "Transfer ownership of a file or folder" : "Tràmuda propriedade de un'archìviu o una cartella",
+ "Choose file or folder to transfer" : "Sèbera archìviu o cartella de tramudare",
+ "Change" : "Càmbia",
+ "New owner" : "Propriedade noa",
+ "Select file or folder to link to" : "Seletziona un'archìviu o una cartella de ligongiare",
+ "Choose {file}" : "Sèbera {file}",
+ "Share" : "Cumpartzidura",
+ "Shared by link" : "Cumpartzidu cun ligòngiu",
+ "Shared" : "Cumpartzidu",
+ "Switch to list view" : "Càmbia a sa vista de s'elencu",
+ "Switch to grid view" : "Càmbia a vista de mosàicu",
+ "Not enough free space" : "Non b'at logu lìberu",
+ "Operation is blocked by access control" : "S'operatzione est blocada dae su controllu de intrada",
+ "Error during upload: {message}" : "Errore in sa càrriga: {message}",
+ "Unknown error during upload" : "Errore disconnotu durante sa càrriga",
+ "Loading current folder" : "Carrighende sa cartella atuale",
+ "No files in here" : "Perunu archìviu",
+ "Upload some content or sync with your devices!" : "Càrriga cuntenutos o sincroniza cun is dispositivos tuos!",
+ "Go back" : "In segus",
+ "Views" : "Visualizatziones",
+ "Files settings" : "Cunfiguratziones de archìvios",
+ "File cannot be accessed" : "Impossìbile atzèdere a s'archìviu",
+ "All files" : "Totu is archìvios",
+ "Personal files" : "Archìvios personales",
+ "Sort favorites first" : "Assenta cun is preferidos in antis",
+ "Sort folders before files" : "Assenta cun is cartellas in antis de is archìvios",
+ "Appearance" : "Aspetu",
+ "Show hidden files" : "Mustra archìvios cuados",
+ "Crop image previews" : "Retàllia anteprimas de s'immàgine",
+ "Additional settings" : "Cunfiguratziones in agiunta",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Còpia",
+ "Keyboard shortcuts" : "Curtziadòrgios de tecladu",
+ "Rename" : "Torra a numenare",
+ "Delete" : "Cantzella",
+ "Manage tags" : "Gesti etichetas",
+ "Selection" : "Seletzione",
+ "Deselect all" : "Deseletziona totu",
+ "Navigation" : "Navigatzione",
+ "View" : "Visualiza",
+ "Toggle grid view" : "Càmbia a visualizatzione in mosàicu",
+ "You" : "Tue",
"Error while loading the file data" : "Errore in su carrigamentu de is datos de s'archìviu",
+ "Remove from favorites" : "Boga dae preferidos",
+ "Add to favorites" : "Agiunghe a preferidos",
+ "Tags" : "Etichetas",
+ "Blank" : "Isbòidu",
+ "Unable to create new file from template" : "Non faghet a creare un'archìviu nou dae su modellu",
"Pick a template for {name}" : "Sèbera unu modellu pro {name}",
- "Cancel" : "Annulla",
- "Create" : "Crea",
"Create a new file with the selected template" : "Crea un'archìviu nou cun su modellu seletzionadu",
"Creating file" : "Creende s'archìviu",
- "Blank" : "Isbòidu",
- "Unable to create new file from template" : "Non faghet a creare un'archìviu nou dae su modellu",
- "Set up templates folder" : "Imposta cartella de is modellos",
- "Templates" : "Modellos",
+ "Disconnect storage" : "Disconnete archiviatzione",
+ "Delete permanently" : "Cantzella in manera definitiva",
+ "Delete and unshare" : "Cantzella e firma sa cumpartzidura",
+ "Delete file" : "Cantzella archìviu",
+ "Delete folder" : "Cantzella sa cartella",
+ "Cancel" : "Annulla",
+ "Download" : "Iscàrriga",
+ "Destination is not a folder" : "Sa destinatzione no est una cartella",
+ "This file/folder is already in that directory" : "Custu archìviu o cartella est giai in cussu diretòriu",
+ "The file does not exist anymore" : "S'archìviu no esistit prus",
+ "Choose destination" : "Sèbera unu destinu",
+ "Copy to {target}" : "Còpia a {target}",
+ "Move to {target}" : "Tràmuda a {target}",
+ "Move" : "Tràmuda",
+ "Move or copy operation failed" : "Errore in s'operatzione de tràmuda o de còpia",
+ "Move or copy" : "Tràmuda o còpia",
+ "Open folder {displayName}" : "Aberi sa cartella {displayName}",
+ "Open in Files" : "Aberi in Archìvios",
+ "Open locally" : "Aberi in locale",
+ "Open file locally" : "Aberi s'archìviu in locale",
+ "Details" : "Detàllios",
+ "View in folder" : "Visualiza in sa cartella",
+ "Today" : "Oe ",
+ "Last 7 days" : "Ùrtimas 7 dies",
+ "Last 30 days" : "Ùrtimas 30 dies",
+ "Documents" : "Documentos",
+ "Folders" : "Cartellas",
+ "Images" : "Immàgines",
+ "Videos" : "Vìdeos",
+ "Created new folder \"{name}\"" : "Cartella noa \"{name}\" creada",
"Unable to initialize the templates directory" : "Non faghet a initzializare sa cartella de is modellos",
- "%s used" : "%s impreadu",
- "%s%% of %s used" : "%s%% de %s impreadu",
- "%1$s of %2$s used" : "%1$s de %2$s impreadu",
- "Settings" : "Impostatziones",
- "Show hidden files" : "Mustra archìvios cuados",
- "Crop image previews" : "Retàllia anteprimas de s'imàgine",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
- "Toggle %1$s sublist" : "Passa a sa sutalista %1$s",
- "Toggle grid view" : "Càmbia a visualizatzione in mosàicu",
- "No files in here" : "Perunu archìviu",
- "Upload some content or sync with your devices!" : "Càrriga cuntenutos o sincroniza cun is dispositivos tuos!",
+ "Templates" : "Modellos",
+ "No files to upload" : "Perunu archìviu de carrigare",
+ "Some files could not be uploaded" : "No at fatu a carrigare unos cantos archìvios",
+ "Files uploaded successfully" : "Archìvios carrigados",
+ "Some files could not be moved" : "No at fatu a tramudare carchi archìviu",
+ "Upload cancelled" : "Carrigamentu annulladu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossìbile torrare a numenare \"{oldName}\", dae chi no esistit prus",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Su nùmene \"{newName}\" est giai impreadu in sa cartella \"{dir}\". Sèbera unu nùmene diferente.",
+ "Could not rename \"{oldName}\"" : "Impossìbile torrare a numenare \"{oldName}\"",
+ "This operation is forbidden" : "Custa operatzione no est permìtida",
+ "Storage is temporarily not available" : "S'archiviatzione immoe no est a disponimentu",
+ "_%n file_::_%n files_" : ["%n archìviu","%n archìvios"],
+ "_%n folder_::_%n folders_" : ["%n cartella","%n cartellas"],
+ "No favorites yet" : "Ancora perunu preferidu",
+ "Files and folders you mark as favorite will show up here" : "Is archìvios e is cartellas chi marcas comente preferidos ant a aparèssere inoghe",
+ "List of your files and folders." : "Lista de is cartellas e is archìvios tuos.",
+ "No personal files found" : "Perunu archìviu personale agatadu",
+ "Recent" : "Reghente",
+ "List of recently modified files and folders." : "Lista de cartellas e archìvios modificados de reghente.",
+ "No recently modified files" : "Nissunu archìviu modificadu de reghente",
+ "Files and folders you recently modified will show up here." : "Is cartellas e is archìvios chi apas modificadu de reghente ant a èssere mustrados inoghe.",
+ "Search" : "Chirca",
"No entries found in this folder" : "Perunu elementu agatadu in custa cartella",
"Select all" : "Seletziona totu",
"Upload too large" : "Carrigamentu tropu mannu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Is archìvios chi boles carrigare passant sa mannària màssima de carrigamentu de archìvios in custu serbidore.",
- "No favorites yet" : "Ancora perunu preferidu",
- "Files and folders you mark as favorite will show up here" : "Is archìvios e is cartellas chi marcas comente preferidos ant a aparèssere inoghe",
- "Deleted files" : "Archìvios cantzellados",
- "Shares" : "Cumpartziduras",
- "Shared with others" : "Cumpartzidu cun àtere",
- "Shared with you" : "Cumpartzidu cun tegus",
- "Shared by link" : "Cumpartzidu cun ligòngiu",
- "Deleted shares" : "Cumpartziduras cantzelladas",
- "Pending shares" : "Cumpartziduras in suspesu",
+ "File could not be found" : "No at fatu a agatare s'archìviu",
+ "Show list view" : "Mustra sa visualizatzione de lista",
+ "Show grid view" : "Mustra sa visualizatzione de mosàicu",
+ "Close" : "Serra",
+ "Could not create folder \"{dir}\"" : "No at fatu a creare sa cartella \"{dir}\"",
+ "This will stop your current uploads." : "Custu at a firmare is carrigamentos tuos atuales.",
+ "Upload cancelled." : "Carrigamentu annulladu.",
+ "Processing files …" : "Elaborende is archìvios ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No at fatu a carrigare {filename} ca est una cartella o tenet 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non b'at logu, ses carrighende {size1} ma est abarradu isceti {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Sa cartella de destinatzione \"{dir}\" no esistit prus",
+ "An unknown error has occurred" : "B'at àpidu un'errore disconnotu",
+ "File could not be uploaded" : "Impossìbile carrigare s'archìviu",
+ "Uploading …" : "Carrighende ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Carrighende ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Su carrigamentu de s'elementu no est suportadu.",
+ "Error when assembling chunks, status code {status}" : "Errore in s'assentada de is blocos, còdighe de istadu {status}",
+ "Choose target folder" : "Sèbera cartella de destinatzione",
+ "Set reminder" : "Cunfigura un'apuntu",
+ "Edit locally" : "Modìfica in locale",
+ "Open" : "Aberi",
+ "Could not load info for file \"{file}\"" : "No at fatu a carrigare informatziones de s'archìviu \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seletziona eticheta(s) pro agiùnghere a sa seletzione",
+ "Apply tag(s) to selection" : "Àplica eticheta(s) a sa seletzione",
+ "Select directory \"{dirName}\"" : "Seletziona sa cartella \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seletziona s'archìviu \"{fileName}\"",
+ "Unable to determine date" : "Non faghet a determinare sa data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Custa cartella no est a disponimentu, controlla is informes o cuntata s'amministratzione",
+ "Could not move \"{file}\", target exists" : "No at fatu a tramudare \"{file}\", sa destinatzione esistit giai",
+ "Could not move \"{file}\"" : "No at fatu a tramudare \"{file}\"",
+ "copy" : "còpia",
+ "Could not copy \"{file}\", target exists" : "No at fatu a copiare \"{file}\", sa destinatzione esistit giai",
+ "Could not copy \"{file}\"" : "No at fatu a copiare \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} copiadu a intro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} àteros archìvios a intro de {destination}",
+ "{newName} already exists" : "{newName} esistit giai",
+ "Could not create file \"{file}\"" : "No at fatu a creare s'archìviu \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No at fatu a creare s'archìviu \"{file}\" ca esitit giai",
+ "Could not create folder \"{dir}\" because it already exists" : "No at fatu a creare sa cartella \"{dir}\" ca esistit giai",
+ "Could not fetch file details \"{file}\"" : "No at fatu a recuperare is detàllios de s'archìviu \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Errore cantzellende s'archìviu \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Perunu resurtadu de chirca in àteras cartellas pro {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Inserta prus de duos caràteres pro chircare in àteras cartellas",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"],
+ "You do not have permission to upload or create files here" : "Non tenes permissu pro carrigare o creare archìvios inoghe",
+ "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"],
+ "New" : "Nou",
+ "New file/folder menu" : "Menù de cartella o archìviu nou",
+ "Select file range" : "Seletziona classe de archìviu",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} impreadu",
+ "\"{name}\" is an invalid file name." : "\"{name}\" est unu nùmene de archìviu non vàlidu.",
+ "File name cannot be empty." : "Su nùmene de s'archìviu non podet èssere bòidu.",
+ "\"/\" is not allowed inside a file name." : "\"/\" no est permìtidu in unu nùmene de archìviu.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" no est una genia de archìviu permìtida",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "S'archiviatzione de {owner} est giai prena ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Sa cartella de grupu \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "S'archiviatzione esterna \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "S'archiviatzione tua est giai prena ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["currispondet '{filter}'","currispondent '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Ligòngiu diretu copiadu (funtzionat isceti pro gente chi tenet atzessu a custu archìviu o cartella)",
+ "Path" : "Percursu",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Còpia su ligòngiu diretu (funtzionat isceti pro gente chi tenet atzessu a custu archìviu o cartella)",
+ "Upload file" : "Càrriga archìviu",
+ "An error occurred while trying to update the tags" : "B'at àpidu un'errore proende a agiornare is etichetas",
+ "Upload (max. %s)" : "Càrriga (max. %s)",
+ "Filter filenames…" : "Filtra nùmenes de archìviu...",
+ "WebDAV URL copied to clipboard" : "URL WebDAV copiadu in punta de billete.",
+ "Enable the grid view" : "Ativa sa visualizatzione de mosàicu",
+ "Copy to clipboard" : "Còpia in is punta de billete",
+ "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
+ "Cancelled move or copy of \"{filename}\"." : "Operatzione de tràmuda o de còpia annullada pro s'archìviu: \"{filename}\".",
+ "Cancelled move or copy operation" : "Operatzione de tràmuda o còpia annullada",
+ "Open details" : "Aberi is detàllios",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartellas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archìviu","{fileCount} archìvios"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archìviu e {folderCount} cartella","1 archìviu e {folderCount} cartellas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archìviu e 1 cartella","{fileCount} archìvios e 1 cartella"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archìvios e {folderCount} cartellas",
+ "All folders" : "Totu is cartellas",
+ "Personal Files" : "Archìvios personales",
"Text file" : "Archìviu de testu",
- "New text file.txt" : "Archìviu de testu .txt nou",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "Your storage is full, files can not be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
- "_matches '{filter}'_::_match '{filter}'_" : ["currispondèntzias '{filter}'","currispondèntzia '{filter}'"]
+ "New text file.txt" : "Archìviu de testu .txt nou"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sc.json b/apps/files/l10n/sc.json
index c653005e288..9a43069dd7c 100644
--- a/apps/files/l10n/sc.json
+++ b/apps/files/l10n/sc.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "S'archiviatzione immoe no est a disponimentu",
- "Storage invalid" : "Archiviatzione non vàlida",
- "Unknown error" : "Errore disconnotu",
- "File could not be found" : "No at fatu a agatare s'archìviu",
- "Move or copy" : "Tràmuda o còpia",
- "Download" : "Iscàrriga",
- "Delete" : "Cantzella",
- "Home" : "Pàgina printzipale",
- "Close" : "Serra",
- "Favorites" : "Preferidos",
- "Could not create folder \"{dir}\"" : "No at fatu a creare sa cartella \"{dir}\"",
- "This will stop your current uploads." : "Custu at a firmare is carrigamentos tuos atuales.",
- "Upload cancelled." : "Carrigamentu annulladu.",
- "Processing files …" : "Elaborende is archìvios ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "No at fatu a carrigare {filename} ca est una cartella o tenet 0 bytes",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non b'at logu, ses carrighende {size1} ma est abarradu isceti {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Sa cartella de destinatzione \"{dir}\" no esistit prus",
- "Not enough free space" : "Non b'at logu lìberu",
- "An unknown error has occurred" : "B'at àpidu un'errore disconnotu",
- "Uploading …" : "Carrighende ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Su carrigamentu de s'elementu no est suportadu.",
- "Target folder does not exist any more" : "Sa cartella de destinatzione no esistit prus",
- "Operation is blocked by access control" : "S'operatzione est blocada dae su controllu de intrada",
- "Error when assembling chunks, status code {status}" : "Errore in s'assentada de is blocos, còdighe de istadu {status}",
- "Actions" : "Atziones",
- "Rename" : "Torra a numenare",
- "Copy" : "Còpia",
- "Choose target folder" : "Sèbera cartella de destinatzione",
- "Open" : "Aberi",
- "Delete file" : "Cantzella archìviu",
- "Delete folder" : "Cantzella cartella",
- "Disconnect storage" : "Disconnete archiviatzione",
- "Leave this share" : "Lassa custa cumpartzidura",
- "Could not load info for file \"{file}\"" : "No at fatu a carrigare informatziones de s'archìviu \"{file}\"",
- "Files" : "Archìvios",
- "Details" : "Detàllios",
- "Please select tag(s) to add to the selection" : "Seletziona eticheta(s) pro agiùnghere a sa seletzione",
- "Apply tag(s) to selection" : "Àplica eticheta(s) a sa seletzione",
- "Select" : "Seletziona",
- "Pending" : "In suspesu",
- "Unable to determine date" : "Non faghet a determinare sa data",
- "This operation is forbidden" : "Custa operatzione no est permìtida",
- "This directory is unavailable, please check the logs or contact the administrator" : "Custa cartella no est a disponimentu, controlla is informes o cuntata s'amministratzione",
- "Could not move \"{file}\", target exists" : "No at fatu a tramudare \"{file}\", sa destinatzione esistit giai",
- "Could not move \"{file}\"" : "No at fatu a tramudare \"{file}\"",
- "copy" : "còpia",
- "Could not copy \"{file}\", target exists" : "No at fatu a copiare \"{file}\", sa destinatzione esistit giai",
- "Could not copy \"{file}\"" : "No at fatu a copiare \"{file}\"",
- "Copied {origin} inside {destination}" : "{origin} copiadu a intro de {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} àteros archìvios a intro de {destination}",
- "{newName} already exists" : "{newName} esistit giai",
- "Could not rename \"{fileName}\", it does not exist any more" : "No at fatu a torrare a numenare \"{fileName}\", ca no esistit prus",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Su nùmene \"{targetName}\" est giai impreadu in sa cartella \"{dir}\". Sèbera un'àteru nùmene.",
- "Could not rename \"{fileName}\"" : "No at fatu a torrare a numenare \"{fileName}\"",
- "Could not create file \"{file}\"" : "No at fatu a creare s'archìviu \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "No at fatu a creare s'archìviu \"{file}\" ca esitit giai",
- "Could not create folder \"{dir}\" because it already exists" : "No at fatu a creare sa cartella \"{dir}\" ca esistit giai",
- "Could not fetch file details \"{file}\"" : "No at fatu a recuperare is detàllios de s'archìviu \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Errore cantzellende s'archìviu \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Perunu resurtadu de chirca in àteras cartellas pro {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Inserta prus de duos caràteres pro chircare in àteras cartellas",
- "Name" : "Nùmene",
- "Size" : "Mannària",
- "Modified" : "Modificadu",
- "_%n folder_::_%n folders_" : ["%n cartella","%n cartellas"],
- "_%n file_::_%n files_" : ["%n archìviu","%n archìvios"],
- "{dirs} and {files}" : "{dirs} e {files}",
- "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"],
- "You don’t have permission to upload or create files here" : "Non tenes su permissu pro carrigare o creare archìvios inoghe",
- "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"],
- "New" : "Nou",
- "Select file range" : "Seletziona classe de archìviu",
- "{used} of {quota} used" : "{used} de {quota} impreadu",
- "{used} used" : "{used} impreadu",
- "\"{name}\" is an invalid file name." : "\"{name}\" est unu nùmene de archìviu non vàlidu.",
- "File name cannot be empty." : "Su nùmene de s'archìviu non podet èssere bòidu.",
- "\"/\" is not allowed inside a file name." : "\"/\" no est permìtidu in unu nùmene de archìviu.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" no est una genia de archìviu permìtida",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "Your storage is full, files cannot be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "S'archiviatzione de {owner} est giai prena ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Sa cartella de grupu \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "S'archiviatzione esterna \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "S'archiviatzione tua est giai prena ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["currispondet '{filter}'","currispondent '{filter}'"],
- "View in folder" : "Visualiza in sa cartella",
- "Copied!" : "Copiadu!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Còpia ligòngiu deretu (faghet isceti pro utentes chi tenent atzessu a custu archìviu/cartella)",
- "Path" : "Percursu",
- "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Favorited" : "Preferidu",
- "Favorite" : "Preferidu",
- "You can only favorite a single file or folder at a time" : "Podes preferire isceti un'archìviu o una cartella cada borta",
- "New folder" : "Cartella noa",
- "Upload file" : "Carriga archìviu",
- "Recent" : "Reghente",
- "Not favorited" : "Non preferidu",
- "Remove from favorites" : "Boga dae preferidos",
- "Add to favorites" : "Agiunghe a preferidos",
- "An error occurred while trying to update the tags" : "B'at àpidu un'errore proende a agiornare is etichetas",
"Added to favorites" : "Agiuntu a preferidos",
"Removed from favorites" : "Bogadu dae preferidos",
"You added {file} to your favorites" : "As agiuntu {file} a preferidos",
"You removed {file} from your favorites" : "As bogadu {file} dae preferidos",
+ "Favorites" : "Preferidos",
"File changes" : "Modìficas de s'archìviu",
"Created by {user}" : "Creadu dae {user}",
"Changed by {user}" : "Modificadu dae {user}",
@@ -114,7 +11,6 @@
"Restored by {user}" : "Ripristinadu dae {user}",
"Renamed by {user}" : "Torradu a numenare dae {user}",
"Moved by {user}" : "Tramudadu dae {user}",
- "\"remote user\"" : "\"utèntzia remota\"",
"You created {file}" : "As creadu {file}",
"You created an encrypted file in {file}" : "As creadu un'archìviu tzifradu in {file}",
"{user} created {file}" : "{user} at creadu {file}",
@@ -141,11 +37,9 @@
"You moved {oldfile} to {newfile}" : "As tramudadu {oldfile} a {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} at tramudadu {oldfile} a {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Ant agiuntu o bogadu un'archìviu dae is <strong>preferidos</strong>",
+ "Files" : "Archìvios",
"A file or folder has been <strong>changed</strong>" : "Ant <strong>cambiadu</strong> un'archìviu o una cartella",
"A favorite file or folder has been <strong>changed</strong>" : "Ant <strong>cambiadu</strong>un'archìviu o una cartella preferida",
- "All files" : "Totu is archìvios",
- "Unlimited" : "Chene lìmites",
- "Upload (max. %s)" : "Càrriga (max. %s)",
"Accept" : "Atzeta",
"Reject" : "Refuda",
"Incoming ownership transfer from {user}" : "Tràmuda de propriedade in intrada dae {user}",
@@ -158,61 +52,245 @@
"The ownership transfer of {path} from {user} has completed." : "Tràmuda de propriedade de {path} dae {user} cumpletada.",
"in %s" : "in %s",
"File Management" : "Gestione archìvios",
- "Transfer ownership of a file or folder" : "Tràmuda propriedade de un'archìviu o una cartella",
- "Choose file or folder to transfer" : "Sèbera archìviu o cartella de tramudare",
- "Change" : "Càmbia",
- "New owner" : "Propriedade noa",
- "Search users" : "Chirca utentes",
+ "Home" : "Pàgina printzipale",
+ "Target folder does not exist any more" : "Sa cartella de destinatzione no esistit prus",
+ "Reload current directory" : "Torra a carrigare sa cartella atuale",
+ "Go to the \"{dir}\" directory" : "Bae a sa cartella \"{dir}\"",
+ "Drag and drop files here to upload" : "Traga archìvios inoghe pro ddos carrigare",
+ "Favorite" : "Preferidu",
+ "Back" : "In segus",
+ "Filename" : "Nùmene de s'archìviu",
+ "Folder name" : "Nùmene de sa cartella",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" s'est torradu a numenare comente \"{newName}\"",
+ "Rename file" : "Torra a numenare s'archìviu",
+ "Folder" : "Cartella",
+ "Pending" : "In suspesu",
+ "Clear filter" : "Lìmpia filtru",
+ "Modified" : "Modificadu",
+ "Type" : "Genia",
+ "Name" : "Nùmene",
+ "Size" : "Mannària",
+ "Actions" : "Atziones",
+ "(selected)" : "(seletzionados)",
+ "List of files and folders." : "Lista de archìvios e cartellas.",
+ "File not found" : "Archìviu no agatadu",
+ "{usedQuotaByte} used" : "{usedQuotaByte} impreadu",
+ "{used} of {quota} used" : "{used} de {quota} impreadu",
+ "{relative}% used" : "{relative}% impreadu",
+ "Could not refresh storage stats" : "Impossìbile atualizare is istatìsticas de archiviatzione",
+ "Your storage is full, files can not be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
+ "New folder" : "Cartella noa",
+ "Create new folder" : "Crea cartella noa",
+ "Create" : "Crea",
+ "Submit" : "Imbia",
"Choose a file or folder to transfer" : "Sèbera un'archìviu o una cartella de tramudare",
"Transfer" : "Tràmuda",
"Transfer {path} to {userid}" : "Tràmuda {path} a {userid}",
"Invalid path selected" : "Percursu seletzionadu non vàlidu",
+ "Unknown error" : "Errore disconnotu",
"Ownership transfer request sent" : "Dimanda de tràmuda de propriedade imbiada",
- "Cannot transfer ownership of a file or folder you don't own" : "Non faghet a tramudare sa propriedade de un'archìviu o cartella de is chi non ses mere",
- "Tags" : "Etichetas",
- "Unable to change the favourite state of the file" : "Non faghet a cambiare s'istadu de preferidu de s'archìviu",
+ "Cannot transfer ownership of a file or folder you do not own" : "Impossìbile tramudare sa propiedade de un'archìviu o de una cartella chi no sunt tuos",
+ "Transfer ownership of a file or folder" : "Tràmuda propriedade de un'archìviu o una cartella",
+ "Choose file or folder to transfer" : "Sèbera archìviu o cartella de tramudare",
+ "Change" : "Càmbia",
+ "New owner" : "Propriedade noa",
+ "Select file or folder to link to" : "Seletziona un'archìviu o una cartella de ligongiare",
+ "Choose {file}" : "Sèbera {file}",
+ "Share" : "Cumpartzidura",
+ "Shared by link" : "Cumpartzidu cun ligòngiu",
+ "Shared" : "Cumpartzidu",
+ "Switch to list view" : "Càmbia a sa vista de s'elencu",
+ "Switch to grid view" : "Càmbia a vista de mosàicu",
+ "Not enough free space" : "Non b'at logu lìberu",
+ "Operation is blocked by access control" : "S'operatzione est blocada dae su controllu de intrada",
+ "Error during upload: {message}" : "Errore in sa càrriga: {message}",
+ "Unknown error during upload" : "Errore disconnotu durante sa càrriga",
+ "Loading current folder" : "Carrighende sa cartella atuale",
+ "No files in here" : "Perunu archìviu",
+ "Upload some content or sync with your devices!" : "Càrriga cuntenutos o sincroniza cun is dispositivos tuos!",
+ "Go back" : "In segus",
+ "Views" : "Visualizatziones",
+ "Files settings" : "Cunfiguratziones de archìvios",
+ "File cannot be accessed" : "Impossìbile atzèdere a s'archìviu",
+ "All files" : "Totu is archìvios",
+ "Personal files" : "Archìvios personales",
+ "Sort favorites first" : "Assenta cun is preferidos in antis",
+ "Sort folders before files" : "Assenta cun is cartellas in antis de is archìvios",
+ "Appearance" : "Aspetu",
+ "Show hidden files" : "Mustra archìvios cuados",
+ "Crop image previews" : "Retàllia anteprimas de s'immàgine",
+ "Additional settings" : "Cunfiguratziones in agiunta",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL WebDAV",
+ "Copy" : "Còpia",
+ "Keyboard shortcuts" : "Curtziadòrgios de tecladu",
+ "Rename" : "Torra a numenare",
+ "Delete" : "Cantzella",
+ "Manage tags" : "Gesti etichetas",
+ "Selection" : "Seletzione",
+ "Deselect all" : "Deseletziona totu",
+ "Navigation" : "Navigatzione",
+ "View" : "Visualiza",
+ "Toggle grid view" : "Càmbia a visualizatzione in mosàicu",
+ "You" : "Tue",
"Error while loading the file data" : "Errore in su carrigamentu de is datos de s'archìviu",
+ "Remove from favorites" : "Boga dae preferidos",
+ "Add to favorites" : "Agiunghe a preferidos",
+ "Tags" : "Etichetas",
+ "Blank" : "Isbòidu",
+ "Unable to create new file from template" : "Non faghet a creare un'archìviu nou dae su modellu",
"Pick a template for {name}" : "Sèbera unu modellu pro {name}",
- "Cancel" : "Annulla",
- "Create" : "Crea",
"Create a new file with the selected template" : "Crea un'archìviu nou cun su modellu seletzionadu",
"Creating file" : "Creende s'archìviu",
- "Blank" : "Isbòidu",
- "Unable to create new file from template" : "Non faghet a creare un'archìviu nou dae su modellu",
- "Set up templates folder" : "Imposta cartella de is modellos",
- "Templates" : "Modellos",
+ "Disconnect storage" : "Disconnete archiviatzione",
+ "Delete permanently" : "Cantzella in manera definitiva",
+ "Delete and unshare" : "Cantzella e firma sa cumpartzidura",
+ "Delete file" : "Cantzella archìviu",
+ "Delete folder" : "Cantzella sa cartella",
+ "Cancel" : "Annulla",
+ "Download" : "Iscàrriga",
+ "Destination is not a folder" : "Sa destinatzione no est una cartella",
+ "This file/folder is already in that directory" : "Custu archìviu o cartella est giai in cussu diretòriu",
+ "The file does not exist anymore" : "S'archìviu no esistit prus",
+ "Choose destination" : "Sèbera unu destinu",
+ "Copy to {target}" : "Còpia a {target}",
+ "Move to {target}" : "Tràmuda a {target}",
+ "Move" : "Tràmuda",
+ "Move or copy operation failed" : "Errore in s'operatzione de tràmuda o de còpia",
+ "Move or copy" : "Tràmuda o còpia",
+ "Open folder {displayName}" : "Aberi sa cartella {displayName}",
+ "Open in Files" : "Aberi in Archìvios",
+ "Open locally" : "Aberi in locale",
+ "Open file locally" : "Aberi s'archìviu in locale",
+ "Details" : "Detàllios",
+ "View in folder" : "Visualiza in sa cartella",
+ "Today" : "Oe ",
+ "Last 7 days" : "Ùrtimas 7 dies",
+ "Last 30 days" : "Ùrtimas 30 dies",
+ "Documents" : "Documentos",
+ "Folders" : "Cartellas",
+ "Images" : "Immàgines",
+ "Videos" : "Vìdeos",
+ "Created new folder \"{name}\"" : "Cartella noa \"{name}\" creada",
"Unable to initialize the templates directory" : "Non faghet a initzializare sa cartella de is modellos",
- "%s used" : "%s impreadu",
- "%s%% of %s used" : "%s%% de %s impreadu",
- "%1$s of %2$s used" : "%1$s de %2$s impreadu",
- "Settings" : "Impostatziones",
- "Show hidden files" : "Mustra archìvios cuados",
- "Crop image previews" : "Retàllia anteprimas de s'imàgine",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
- "Toggle %1$s sublist" : "Passa a sa sutalista %1$s",
- "Toggle grid view" : "Càmbia a visualizatzione in mosàicu",
- "No files in here" : "Perunu archìviu",
- "Upload some content or sync with your devices!" : "Càrriga cuntenutos o sincroniza cun is dispositivos tuos!",
+ "Templates" : "Modellos",
+ "No files to upload" : "Perunu archìviu de carrigare",
+ "Some files could not be uploaded" : "No at fatu a carrigare unos cantos archìvios",
+ "Files uploaded successfully" : "Archìvios carrigados",
+ "Some files could not be moved" : "No at fatu a tramudare carchi archìviu",
+ "Upload cancelled" : "Carrigamentu annulladu",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Impossìbile torrare a numenare \"{oldName}\", dae chi no esistit prus",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Su nùmene \"{newName}\" est giai impreadu in sa cartella \"{dir}\". Sèbera unu nùmene diferente.",
+ "Could not rename \"{oldName}\"" : "Impossìbile torrare a numenare \"{oldName}\"",
+ "This operation is forbidden" : "Custa operatzione no est permìtida",
+ "Storage is temporarily not available" : "S'archiviatzione immoe no est a disponimentu",
+ "_%n file_::_%n files_" : ["%n archìviu","%n archìvios"],
+ "_%n folder_::_%n folders_" : ["%n cartella","%n cartellas"],
+ "No favorites yet" : "Ancora perunu preferidu",
+ "Files and folders you mark as favorite will show up here" : "Is archìvios e is cartellas chi marcas comente preferidos ant a aparèssere inoghe",
+ "List of your files and folders." : "Lista de is cartellas e is archìvios tuos.",
+ "No personal files found" : "Perunu archìviu personale agatadu",
+ "Recent" : "Reghente",
+ "List of recently modified files and folders." : "Lista de cartellas e archìvios modificados de reghente.",
+ "No recently modified files" : "Nissunu archìviu modificadu de reghente",
+ "Files and folders you recently modified will show up here." : "Is cartellas e is archìvios chi apas modificadu de reghente ant a èssere mustrados inoghe.",
+ "Search" : "Chirca",
"No entries found in this folder" : "Perunu elementu agatadu in custa cartella",
"Select all" : "Seletziona totu",
"Upload too large" : "Carrigamentu tropu mannu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Is archìvios chi boles carrigare passant sa mannària màssima de carrigamentu de archìvios in custu serbidore.",
- "No favorites yet" : "Ancora perunu preferidu",
- "Files and folders you mark as favorite will show up here" : "Is archìvios e is cartellas chi marcas comente preferidos ant a aparèssere inoghe",
- "Deleted files" : "Archìvios cantzellados",
- "Shares" : "Cumpartziduras",
- "Shared with others" : "Cumpartzidu cun àtere",
- "Shared with you" : "Cumpartzidu cun tegus",
- "Shared by link" : "Cumpartzidu cun ligòngiu",
- "Deleted shares" : "Cumpartziduras cantzelladas",
- "Pending shares" : "Cumpartziduras in suspesu",
+ "File could not be found" : "No at fatu a agatare s'archìviu",
+ "Show list view" : "Mustra sa visualizatzione de lista",
+ "Show grid view" : "Mustra sa visualizatzione de mosàicu",
+ "Close" : "Serra",
+ "Could not create folder \"{dir}\"" : "No at fatu a creare sa cartella \"{dir}\"",
+ "This will stop your current uploads." : "Custu at a firmare is carrigamentos tuos atuales.",
+ "Upload cancelled." : "Carrigamentu annulladu.",
+ "Processing files …" : "Elaborende is archìvios ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "No at fatu a carrigare {filename} ca est una cartella o tenet 0 bytes",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non b'at logu, ses carrighende {size1} ma est abarradu isceti {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Sa cartella de destinatzione \"{dir}\" no esistit prus",
+ "An unknown error has occurred" : "B'at àpidu un'errore disconnotu",
+ "File could not be uploaded" : "Impossìbile carrigare s'archìviu",
+ "Uploading …" : "Carrighende ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Carrighende ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Su carrigamentu de s'elementu no est suportadu.",
+ "Error when assembling chunks, status code {status}" : "Errore in s'assentada de is blocos, còdighe de istadu {status}",
+ "Choose target folder" : "Sèbera cartella de destinatzione",
+ "Set reminder" : "Cunfigura un'apuntu",
+ "Edit locally" : "Modìfica in locale",
+ "Open" : "Aberi",
+ "Could not load info for file \"{file}\"" : "No at fatu a carrigare informatziones de s'archìviu \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Seletziona eticheta(s) pro agiùnghere a sa seletzione",
+ "Apply tag(s) to selection" : "Àplica eticheta(s) a sa seletzione",
+ "Select directory \"{dirName}\"" : "Seletziona sa cartella \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Seletziona s'archìviu \"{fileName}\"",
+ "Unable to determine date" : "Non faghet a determinare sa data",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Custa cartella no est a disponimentu, controlla is informes o cuntata s'amministratzione",
+ "Could not move \"{file}\", target exists" : "No at fatu a tramudare \"{file}\", sa destinatzione esistit giai",
+ "Could not move \"{file}\"" : "No at fatu a tramudare \"{file}\"",
+ "copy" : "còpia",
+ "Could not copy \"{file}\", target exists" : "No at fatu a copiare \"{file}\", sa destinatzione esistit giai",
+ "Could not copy \"{file}\"" : "No at fatu a copiare \"{file}\"",
+ "Copied {origin} inside {destination}" : "{origin} copiadu a intro de {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Copiados {origin} e {nbfiles} àteros archìvios a intro de {destination}",
+ "{newName} already exists" : "{newName} esistit giai",
+ "Could not create file \"{file}\"" : "No at fatu a creare s'archìviu \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No at fatu a creare s'archìviu \"{file}\" ca esitit giai",
+ "Could not create folder \"{dir}\" because it already exists" : "No at fatu a creare sa cartella \"{dir}\" ca esistit giai",
+ "Could not fetch file details \"{file}\"" : "No at fatu a recuperare is detàllios de s'archìviu \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Errore cantzellende s'archìviu \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Perunu resurtadu de chirca in àteras cartellas pro {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Inserta prus de duos caràteres pro chircare in àteras cartellas",
+ "{dirs} and {files}" : "{dirs} e {files}",
+ "_including %n hidden_::_including %n hidden_" : ["inclùdidu %n cuadu","inclùdidos %n cuados"],
+ "You do not have permission to upload or create files here" : "Non tenes permissu pro carrigare o creare archìvios inoghe",
+ "_Uploading %n file_::_Uploading %n files_" : ["Carrighende %n archìviu","Carrighende %n archìvios"],
+ "New" : "Nou",
+ "New file/folder menu" : "Menù de cartella o archìviu nou",
+ "Select file range" : "Seletziona classe de archìviu",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} impreadu",
+ "\"{name}\" is an invalid file name." : "\"{name}\" est unu nùmene de archìviu non vàlidu.",
+ "File name cannot be empty." : "Su nùmene de s'archìviu non podet èssere bòidu.",
+ "\"/\" is not allowed inside a file name." : "\"/\" no est permìtidu in unu nùmene de archìviu.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" no est una genia de archìviu permìtida",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "S'archiviatzione de {owner} est giai prena ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Sa cartella de grupu \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "S'archiviatzione esterna \"{mountPoint}\" est giai prena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "S'archiviatzione tua est giai prena ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["currispondet '{filter}'","currispondent '{filter}'"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Ligòngiu diretu copiadu (funtzionat isceti pro gente chi tenet atzessu a custu archìviu o cartella)",
+ "Path" : "Percursu",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Copy direct link (only works for people who have access to this file/folder)" : "Còpia su ligòngiu diretu (funtzionat isceti pro gente chi tenet atzessu a custu archìviu o cartella)",
+ "Upload file" : "Càrriga archìviu",
+ "An error occurred while trying to update the tags" : "B'at àpidu un'errore proende a agiornare is etichetas",
+ "Upload (max. %s)" : "Càrriga (max. %s)",
+ "Filter filenames…" : "Filtra nùmenes de archìviu...",
+ "WebDAV URL copied to clipboard" : "URL WebDAV copiadu in punta de billete.",
+ "Enable the grid view" : "Ativa sa visualizatzione de mosàicu",
+ "Copy to clipboard" : "Còpia in is punta de billete",
+ "Use this address to access your Files via WebDAV" : "Imprea custu indiritzu pro intrare in archìvios tràmite WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si as ativadu 2FA, depes creare e impreare una crae de s'aplicatzione noa incarchende inoghe.",
+ "Cancelled move or copy of \"{filename}\"." : "Operatzione de tràmuda o de còpia annullada pro s'archìviu: \"{filename}\".",
+ "Cancelled move or copy operation" : "Operatzione de tràmuda o còpia annullada",
+ "Open details" : "Aberi is detàllios",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} cartella","{folderCount} cartellas"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} archìviu","{fileCount} archìvios"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 archìviu e {folderCount} cartella","1 archìviu e {folderCount} cartellas"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} archìviu e 1 cartella","{fileCount} archìvios e 1 cartella"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} archìvios e {folderCount} cartellas",
+ "All folders" : "Totu is cartellas",
+ "Personal Files" : "Archìvios personales",
"Text file" : "Archìviu de testu",
- "New text file.txt" : "Archìviu de testu .txt nou",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "S'archiviatzione de {owner} est prena, non podes prus carrigare o sincronizare archìvios!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Sa cartella de grupu \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "S'archiviatzione de foras \"{mountPoint}\" est prena, non podes prus carrigare o sincronizare archìvios!",
- "Your storage is full, files can not be updated or synced anymore!" : "S'archiviatzione est prena, non podes prus carrigare o sincronizare archìvios!",
- "_matches '{filter}'_::_match '{filter}'_" : ["currispondèntzias '{filter}'","currispondèntzia '{filter}'"]
+ "New text file.txt" : "Archìviu de testu .txt nou"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js
index 26d181c536f..6ab0806a099 100644
--- a/apps/files/l10n/sk.js
+++ b/apps/files/l10n/sk.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
- "Storage invalid" : "Úložisko nie je platné",
- "Unknown error" : "Neznáma chyba",
- "File could not be found" : "Súbor nie je možné nájsť",
- "Move or copy" : "Presunúť alebo kopírovať",
- "Download" : "Stiahnuť",
- "Delete" : "Zmazať",
- "Home" : "Domov",
- "Close" : "Zavrieť",
- "Favorites" : "Obľúbené",
- "Could not create folder \"{dir}\"" : "Nemožno vytvoriť priečinok \"{dir}\"",
- "This will stop your current uploads." : "Toto zastaví práve prebiehajúce nahrávania.",
- "Upload cancelled." : "Odosielanie je zrušené.",
- "Processing files …" : "Spracovávam súbory ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Cieľový priečinok \"{dir}\" už neexistuje",
- "Not enough free space" : "Nedostatok voľného miesta",
- "An unknown error has occurred" : "Vyskytla sa neznáma chyba",
- "Uploading …" : "Nahrávanie...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nahrávanie tejto položky nie je podporované",
- "Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
- "Operation is blocked by access control" : "Činnosť je blokovaná kontrolou prístupu",
- "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
- "Actions" : "Akcie",
- "Rename" : "Premenovať",
- "Copy" : "Kopírovať",
- "Choose target folder" : "Vyberte cieľový priečinok",
- "Open" : "Otvoriť",
- "Delete file" : "Zmazať súbor",
- "Delete folder" : "Zmazať priečinok",
- "Disconnect storage" : "Odpojiť úložisko",
- "Leave this share" : "Opustiť toto zdieľanie",
- "Could not load info for file \"{file}\"" : "Nebolo možné načítať informácie súboru \"{file}\"",
- "Files" : "Súbory",
- "Details" : "Podrobnosti",
- "Please select tag(s) to add to the selection" : "Prosím vyberte štítok(štítky) pre pridanie do výberu",
- "Apply tag(s) to selection" : "Aplikovať štítok(štítky) do výberu",
- "Select" : "Vybrať",
- "Pending" : "Čaká",
- "Unable to determine date" : "Nemožno určiť dátum",
- "This operation is forbidden" : "Táto operácia je zakázaná",
- "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
- "Could not move \"{file}\", target exists" : "Nie je možné presunúť \"{file}\", cieľ už existuje",
- "Could not move \"{file}\"" : "Nie je možné presunúť \"{file}\"",
- "copy" : "kópia",
- "Could not copy \"{file}\", target exists" : "Nie je možné kopírovať \"{file}\", cieľ už existuje",
- "Could not copy \"{file}\"" : "Nie je možné skopírovať \"{file}\"",
- "Copied {origin} inside {destination}" : "Skopírované {origin} do {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopírované {origin} a {nbfiles} ostatných súborov do {destination}",
- "{newName} already exists" : "{newName} už existuje",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nie je možné premenovať \"{fileName}\", cieľ už neexistuje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Názov \"{targetName}\" je už použitý v priečinku \"{dir}\". Zvoľte prosím iný názov.",
- "Could not rename \"{fileName}\"" : "Nie je možné premenovať \"{file}\"",
- "Could not create file \"{file}\"" : "Nie je možné vytvoriť súbor \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nie je možné vytvoriť súbor \"{file}\" lebo už existuje",
- "Could not create folder \"{dir}\" because it already exists" : "Nie je možné vytvoriť priečinok \"{dir}\" lebo už existuje",
- "Could not fetch file details \"{file}\"" : "Podrobnosti o súbore „{file}“ sa nepodarilo načítať",
- "Error deleting file \"{fileName}\"." : "Chyba pri mazaní súboru \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch pre {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ak chcete hľadať v iných priečinkoch, zadajte viac ako dva znaky",
- "Name" : "Názov",
- "Size" : "Veľkosť",
- "Modified" : "Upravené",
- "_%n folder_::_%n folders_" : ["%n priečinok","%n priečinky","%n priečinkov","%n priečinkov"],
- "_%n file_::_%n files_" : ["%n súbor","%n súbory","%n súborov","%n súborov"],
- "{dirs} and {files}" : "{dirs} a {files}",
- "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"],
- "You don’t have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory",
- "_Uploading %n file_::_Uploading %n files_" : ["Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov","Nahrávam %n súborov"],
- "New" : "Nový",
- "Select file range" : "Vybrať rozsah súborov",
- "{used} of {quota} used" : "použitých {used} z {quota}",
- "{used} used" : "{used} použitých",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
- "File name cannot be empty." : "Meno súboru nemôže byť prázdne",
- "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložisko je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Priečinok skupiny \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externé úložisko \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedajú \"{filter}\""],
- "View in folder" : "Zobraziť v priečinku",
- "Copied!" : "Skopírované!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopírovať priamy odkaz (funguje iba pre používateľov, ktorí majú prístup k tomuto súboru/priečinku)",
- "Path" : "Cesta",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov","%n bajtov"],
- "Favorited" : "Pridané k obľúbeným",
- "Favorite" : "Obľúbené",
- "You can only favorite a single file or folder at a time" : "Do obľúbených je možné zaradovať súbory a zložky len jednotlivo",
- "New folder" : "Nový priečinok",
- "Upload file" : "Nahrať súbor",
- "Recent" : "Nedávne",
- "Not favorited" : "Nie je obľúbený",
- "Remove from favorites" : "Odstrániť z obľúbených",
- "Add to favorites" : "Pridať do obľúbených",
- "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"Added to favorites" : "Pridané do obľúbených",
"Removed from favorites" : "Odstránené z obľúbených",
"You added {file} to your favorites" : "Pridali ste {file} do vašich obľúbených",
"You removed {file} from your favorites" : "Odstránili ste {file} z vašich obľúbených",
+ "Favorites" : "Obľúbené",
"File changes" : "Zmeny v súboroch",
"Created by {user}" : "Vytvorené užívateľom {user}",
"Changed by {user}" : "Zmenené užívateľom {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Obnovené užívateľom {user}",
"Renamed by {user}" : "Premenované užívateľom {user}",
"Moved by {user}" : "Presunuté užívateľom {user}",
- "\"remote user\"" : "\"vzdialený používateľ\"",
+ "\"remote account\"" : "\"vzdialený účet\"",
"You created {file}" : "Vytvorili ste súbor {file}",
"You created an encrypted file in {file}" : "Vytvorili ste zašifrovaný súbor {file}",
"{user} created {file}" : "{user} vytvoril súbor {file}",
@@ -126,8 +23,8 @@ OC.L10N.register(
"You changed an encrypted file in {file}" : "Zmenili ste šifrovaný súbor {file}",
"{user} changed {file}" : "{user} zmenil {file}",
"{user} changed an encrypted file in {file}" : "{user} zmenil šifrovaný súbor {file}",
- "You deleted {file}" : "Zmazali ste {file}",
- "You deleted an encrypted file in {file}" : "Zmazali ste šifrovaný súbor {file}",
+ "You deleted {file}" : "Odstránili ste {file}",
+ "You deleted an encrypted file in {file}" : "Odstránili ste šifrovaný súbor {file}",
"{user} deleted {file}" : "{user} zmazal {file}",
"{user} deleted an encrypted file in {file}" : "{user} zmazal šifrovaný súbor {file}",
"You restored {file}" : "Obnovili ste {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Presunuli ste {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} presunul {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Súbor bol pridaný alebo odstránený z vašich <strong>obľúbených</strong>",
+ "Files" : "Súbory",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Obľúbený súbor alebo priečinok bol <strong>zmenený</strong>",
- "All files" : "Všetky súbory",
- "Unlimited" : "Neobmedzené",
- "Upload (max. %s)" : "Nahrať (max. %s)",
+ "Failed to authorize" : "Autorizácia zlyhala",
+ "Invalid folder path" : "Neplatná cesta k priečinku",
+ "Folder not found" : "Priečinok nebol nájdený",
+ "The file cannot be found" : "Súbor sa nepodarilo nájisť",
+ "The destination path does not exist: %1$s" : "Cieľová cesta neexistuje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nemáte oprávnenie vytvoriť súbor v zadanom umiestnení",
+ "The file could not be converted." : "Súbor nemohol byť skonvertovaný.",
+ "Could not get relative path to converted file" : "Nepodarilo sa získať relatícnu cestu ku skonvertovanému súboru",
+ "Favorite files" : "Obľúbené súbory",
+ "No favorites" : "Žiadne obľúbené",
+ "More favorites" : "Viac obľúbených",
"Accept" : "Prijať",
"Reject" : "Odmietnuť",
"Incoming ownership transfer from {user}" : "Prichádzajúci prevod vlastníctva od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Chcete prijať {path}?\n\nPozn.: Proces pre prijatie môže trvať až hodinu.",
+ "Ownership transfer denied" : "Prevod vlastníctva bol odmietnutý",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} odmietol prevod vlastníctva {path}.",
"Ownership transfer failed" : "Prevod vlastníctva zlyhal",
"Your ownership transfer of {path} to {user} failed." : "Prevod vlastníctva {path} od vás na {user} zlyhal.",
"The ownership transfer of {path} from {user} failed." : "Prevod vlastníctva {path} od {user} zlyhal.",
@@ -159,62 +67,393 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Prevod vami vlastnenej položky {path} na {user} bol dokončený.",
"The ownership transfer of {path} from {user} has completed." : "Prevod vlastníctva položky {path} od {user} bol dokončený.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Prevedené z %1$s na %2$s",
+ "Files compatibility" : "Kompatibilita súborov",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Povoliť obmedzenie názvov súborov, aby sa zabezpečila synchronizácia súborov so všetkými klientmi. V predvolenom nastavení sú povolené všetky názvy súborov platné pre POSIX (napr. Linux alebo macOS).",
+ "Enforce Windows compatibility" : "Vynútiť kompatibilitu s Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Tým sa zablokujú názvy súborov, ktoré nie sú platné v systémoch Windows, ako napríklad používanie vyhradených názvov alebo špeciálnych znakov. To však nevynúti kompatibilitu rozlišovania malých a veľkých písmen.",
"File Management" : "Správa súborov",
- "Transfer ownership of a file or folder" : "Prevod vlastníctva súboru alebo priečinka",
- "Choose file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
- "Change" : "Zmeniť",
- "New owner" : "Nový vlastník",
- "Search users" : "Hľadať používateľov",
+ "Home" : "Domov",
+ "Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Reload current directory" : "Znova načítať súčasný adresár",
+ "Go to the \"{dir}\" directory" : "Ísť do \"{dir}\" adresára",
+ "Current directory path" : "Aktuálna cesta k adresáru",
+ "Your have used your space quota and cannot upload files anymore" : "Dosiahli ste limit vášho priestoru a už viac nemôžete nahrávať súbory",
+ "You do not have permission to upload or create files here." : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory.",
+ "Drag and drop files here to upload" : "Pre nahratie presuňte do tohto priestoru súbory ťahaním",
+ "Favorite" : "Obľúbené",
+ "Back" : "Späť",
+ "Toggle selection for file \"{displayName}\"" : "Prepnúť výber pre súbor \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Prepnúť výber pre adresár \"{displayName}\"",
+ "File is loading" : "Súbor sa nahráva",
+ "Folder is loading" : "Adresár sa nahráva",
+ "Filename" : "Názov súboru",
+ "Folder name" : "Názov priečinka",
+ "This node is unavailable" : "Uzol nie je k dispozícií",
+ "Another entry with the same name already exists." : "Iná položka s rovnakým menom už existuje.",
+ "Invalid filename." : "Chybný názov súboru.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Premenované z \"{oldName}\" na \"{newName}\"",
+ "Rename file" : "Premenovať súbor",
+ "Folder" : "Priečinok",
+ "Pending" : "Čaká",
+ "Unknown date" : "Neznámy dátum",
+ "Clear filter" : "Vyčistiť filter",
+ "Modified" : "Upravené",
+ "Search everywhere" : "Hľadať všade",
+ "Type" : "Typ",
+ "Active filters" : "Aktívne filtre",
+ "Remove filter" : "Odstrániť filter",
+ "Total rows summary" : "Súčet všetkých riadkov",
+ "Toggle selection for all files and folders" : "Prepnúť výber pre všetky súbory a adresáre",
+ "Name" : "Názov",
+ "Size" : "Veľkosť",
+ "Actions" : "Akcie",
+ "(selected)" : "(vybrané)",
+ "List of files and folders." : "Zoznam súborov a priečinkov.",
+ "You have used your space quota and cannot upload files anymore." : "Už ste využili kapacitu úložného priestoru a nie je možné nahrávať ďalšie súbory.",
+ "Column headers with buttons are sortable." : "Stĺpce hlavičiek s tlačidlami sú triediteľné.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzať zoznamom.",
+ "File not found" : "Súbor nenájdený",
+ "_{count} selected_::_{count} selected_" : ["{count} vybraný","{count} vybrané","{count} vybraných","{count} vybraných"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} použitých",
+ "{used} of {quota} used" : "použitých {used} z {quota}",
+ "{relative}% used" : "{relative}% použitých",
+ "Could not refresh storage stats" : "Nebolo možné obnoviť úložiskové štatistiky",
+ "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage information" : "Informácie o úložisku",
+ "Storage quota" : "Kvóta pre úložisko",
+ "New folder" : "Nový priečinok",
+ "Create new folder" : "Vytvoriť nový priečinok",
+ "This name is already in use." : "Toto meno je už používané.",
+ "Create" : "Vytvoriť",
+ "Fill template fields" : "Vyplňte položky šablóny",
+ "Submitting fields …" : "Položky sa odosielajú ...",
+ "Submit" : "Odoslať",
"Choose a file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
"Transfer" : "Prevod",
"Transfer {path} to {userid}" : "Previesť {path} na {userid}",
"Invalid path selected" : "Bola vybraná neplatná cesta",
+ "Unknown error" : "Neznáma chyba",
"Ownership transfer request sent" : "Žiadosť o prevod vlastníctva bola odoslaná",
- "Cannot transfer ownership of a file or folder you don't own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte",
- "Tags" : "Štítky",
- "Unable to change the favourite state of the file" : "Nie je možné zmeniť stav „obľúbené“ daného súboru",
- "Error while loading the file data" : "Chyba pri načítaní údajov súboru",
- "Pick a template for {name}" : "Vyberte šablónu pre {name}",
- "Cancel" : "Zrušiť",
- "Create" : "Vytvoriť",
- "Create a new file with the selected template" : "Vytvoriť nový súbor pomocou vybranej šablóny",
- "Creating file" : "Vyváram súbor",
- "Blank" : "Prázdne",
- "Unable to create new file from template" : "Nemôžem vytvoriť nový súbor zo šablóny",
- "Set up templates folder" : "Nastaviť priečinok pre šablóny",
- "Templates" : "Šablóny",
- "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami",
- "%s used" : "%s použitých",
- "%s%% of %s used" : "Využité %s%% z %s",
- "%1$s of %2$s used" : "Využité: %1$s z %2$s",
- "Settings" : "Nastavenia",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte",
+ "Transfer ownership of a file or folder" : "Prevod vlastníctva súboru alebo priečinka",
+ "Choose file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
+ "Change" : "Zmeniť",
+ "New owner" : "Nový vlastník",
+ "Keep {old}" : "Ponechať {old}",
+ "Keep without extension" : "Ponechať bez prípony",
+ "Use {new}" : "Použiť {new}",
+ "Remove extension" : "Odstrániť príponu",
+ "Change file extension" : "Zmeniť príponu súboru",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Zmena prípony súboru z „{old}“ na „{new}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odstránenie prípony súboru „{old}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Pridanie prípony súboru „{new}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Do not show this dialog again." : "Toto dialógové okno už nezobrazovať.",
+ "Select file or folder to link to" : "Vyberte súbor alebo priečinok na ktorý odkazovať",
+ "Choose {file}" : "Vyberte {file}",
+ "Share" : "Zdieľať",
+ "Shared by link" : "Sprístupnené odkazom",
+ "Shared" : "Sprístupnené",
+ "Switch to list view" : "Prepnúť na zobrazenie v zozname",
+ "Switch to grid view" : "Prepnúť na zobrazenie v mriežke",
+ "The file could not be found" : "Súbor nebol nájdený",
+ "Upload was cancelled by user" : "Nahrávanie bolo zrušené užívateľom",
+ "Not enough free space" : "Nedostatok voľného miesta",
+ "Operation is blocked by access control" : "Činnosť je blokovaná kontrolou prístupu",
+ "Error during upload: {message}" : "Chyba počas nahrávania: {message}",
+ "Error during upload, status code {status}" : "Chyba počas nahrávania, chybový kód {status}",
+ "Unknown error during upload" : "Neznáma chyba počas nahrávania",
+ "Loading current folder" : "Načítavanie súčasného priečinka",
+ "Retry" : "Zopakovať",
+ "No files in here" : "Nie sú tu žiadne súbory",
+ "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte dáta so svojimi zariadeniami!",
+ "Go back" : "Ísť späť",
+ "Views" : "Zobrazenia",
+ "Files settings" : "Nastavenia súborov",
+ "Your files" : "Vaše súbory",
+ "Open in files" : "Otvoriť v súboroch",
+ "File cannot be accessed" : "Súbor nie je možné sprístupniť",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Súbor sa nenašiel alebo nemáte oprávnenie na jeho zobrazenie. Požiadajte odosielateľa, aby ho sprístupnil.",
+ "Clipboard is not available" : "Schránka nie je prístupná",
+ "General" : "Všeobecné",
+ "All files" : "Všetky súbory",
+ "Personal files" : "Osobné súbory",
+ "Sort favorites first" : "Zoradiť od najobľúbenejších",
+ "Sort folders before files" : "Zoradiť adresáre pred súbormi",
+ "Appearance" : "Vzhľad",
"Show hidden files" : "Zobraziť skryté súbory",
"Crop image previews" : "Orezať náhľady obrázkov",
+ "Additional settings" : "Ďalšie nastavenia",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
- "Toggle %1$s sublist" : "Prepnúť %1$s podzoznam",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopírovať",
+ "Warnings" : "Upozornenia",
+ "Keyboard shortcuts" : "Klávesové skratky",
+ "File actions" : "Akcie súboru",
+ "Rename" : "Premenovať",
+ "Delete" : "Zmazať",
+ "Manage tags" : "Spravovať štítky",
+ "Selection" : "Výber",
+ "Select all files" : "Vybrať všetky súbory",
+ "Deselect all" : "Odznačiť všetko",
+ "Navigation" : "Navigácia",
+ "View" : "Zobraziť",
"Toggle grid view" : "Prepnúť zobrazenie mriežky",
- "No files in here" : "Nie sú tu žiadne súbory",
- "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
+ "Show those shortcuts" : "Zobraziť klávesové skratky",
+ "You" : "Vy",
+ "Shared multiple times with different people" : "Zdieľané viackrát rôznymi ľuďmi",
+ "Unable to change the favorite state of the file" : "Nie je možné zmeniť stav „obľúbené“ súboru",
+ "Error while loading the file data" : "Chyba pri načítaní údajov súboru",
+ "Owner" : "Vlastník",
+ "Remove from favorites" : "Odstrániť z obľúbených",
+ "Add to favorites" : "Pridať do obľúbených",
+ "Tags" : "Štítky",
+ "Blank" : "Prázdne",
+ "Unable to create new file from template" : "Nemôžem vytvoriť nový súbor zo šablóny",
+ "Pick a template for {name}" : "Vyberte šablónu pre {name}",
+ "Create a new file with the selected template" : "Vytvoriť nový súbor pomocou vybranej šablóny",
+ "Creating file" : "Vytvára sa súbor",
+ "Save as {displayName}" : "Uložiť ako {displayName}",
+ "Save as …" : "Uložiť ako ...",
+ "Converting files …" : "Konverzia súborov ...",
+ "Failed to convert files: {message}" : "Nepodarilo sa skonvertovať súbory: {message}",
+ "All files failed to be converted" : "Nepodarilo sa skonvertovať žiadne súbory",
+ "One file could not be converted: {message}" : "Jeden súbor sa nepodarilo skonvertovať: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Jeden súbor sa nepodarilo skonvertovať","%n súbory sa nepodarilo skonvertovať","%n súborov sa nepodarilo skonvertovať","%n súborov sa nepodarilo skonvertovať"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Jeden súbor bol úspešne skonvertovaný","%n súbory boli úspešne skonvertované","%n súborov bolo úspešne skonvertovaných","%n súborov bolo úspešne skonvertovaných"],
+ "Files successfully converted" : "Súbory boli úspešne skonvertované",
+ "Failed to convert files" : "Konverzia súborov zlyhala",
+ "Converting file …" : "Konverzia súborov ...",
+ "File successfully converted" : "Súbor bol úspešne skonvertovaný",
+ "Failed to convert file: {message}" : "Nepodarilo sa skonvertovať súbor: {message}",
+ "Failed to convert file" : "Konverzia súboru zlyhala",
+ "Leave this share" : "Opustiť toto zdieľanie.",
+ "Leave these shares" : "Opustiť tieto zdieľania.",
+ "Disconnect storage" : "Odpojiť úložisko",
+ "Disconnect storages" : "Odpojiť úložiská",
+ "Delete permanently" : "Zmazať natrvalo",
+ "Delete and unshare" : "Vymazať a zrušiť zdieľanie",
+ "Delete file" : "Zmazať súbor",
+ "Delete files" : "Zmazať súbory",
+ "Delete folder" : "Zmazať priečinok",
+ "Delete folders" : "Zmazať priečinky",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Chystáte sa permanentne vymazať {count} položku","Chystáte sa permanentne vymazať {count} položky","Chystáte sa permanentne vymazať {count} položiek","Chystáte sa permanentne vymazať {count} položiek"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Chystáte sa vymazať {count} položku","Chystáte sa vymazať {count} položky","Chystáte sa vymazať {count} položiek","Chystáte sa vymazať {count} položiek"],
+ "Confirm deletion" : "Potvrdiť vymazanie",
+ "Cancel" : "Zrušiť",
+ "Download" : "Stiahnuť",
+ "Moving \"{source}\" to \"{destination}\" …" : "Presúvanie \"{source}\" do \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopírovanie \"{source}\" do \"{destination}\" …",
+ "Destination is not a folder" : "Cieľ nie je priečinok",
+ "This file/folder is already in that directory" : "Tento súbor/priečinok sa už v danom adresári nachádza",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nemôžete presunúť súbor/priečinok do seba alebo do jeho podpriečinka.",
+ "(copy)" : "(kopírovať)",
+ "(copy %n)" : "(kopírovať %n)",
+ "A file or folder with that name already exists in this folder" : "Súbor alebo priečinok s týmto názvom už existuje v tomto priečinku",
+ "The files are locked" : "Súbory sú uzamknuté.",
+ "The file does not exist anymore" : "Súbor už neexistuje",
+ "Choose destination" : "Vyberte cieľ",
+ "Copy to {target}" : "Kopírovať do {target}",
+ "Move to {target}" : "Presunúť do {target}",
+ "Move" : "Presunúť",
+ "Move or copy operation failed" : "Operácia presunu alebo kopírovania zlyhala",
+ "Move or copy" : "Presunúť alebo kopírovať",
+ "Open folder {displayName}" : "Otvoriť priečinok {displayName}",
+ "Open in Files" : "Otvoriť v súboroch",
+ "Open locally" : "Otvoriť lokálne",
+ "Failed to redirect to client" : "Nepodarilo sa presmerovať na klienta",
+ "Open file locally" : "Otvoriť súbor lokálne",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Súbor by sa mal teraz otvoriť v zariadení. Ak sa tak nestane, skontrolujte, či máte nainštalovanú aplikáciu pre počítače.",
+ "Retry and close" : "Skúsiť znova a zatvoriť",
+ "Open online" : "Otvoriť online",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Zobraziť v priečinku",
+ "Today" : "Dnes",
+ "Last 7 days" : "Posledných 7 dní",
+ "Last 30 days" : "Posledných 30 dní",
+ "This year ({year})" : "Tento rok ({year})",
+ "Last year ({year})" : "Minulý rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Tabuľky",
+ "Presentations" : "Prezentácie",
+ "PDFs" : "PDFká",
+ "Folders" : "Priečinky",
+ "Audio" : "Zvuk",
+ "Images" : "Obrázky",
+ "Videos" : "Videá",
+ "Created new folder \"{name}\"" : "Vytvorený nový priečinok \"{name}\"",
+ "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami",
+ "Create templates folder" : "Vytvoriť adresár pre šablóny",
+ "Templates" : "Šablóny",
+ "New template folder" : "Nový adresár šablóny",
+ "In folder" : "V adresári",
+ "Search in folder: {folder}" : "Hľadať v adresári: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z vložených súborov nemohol byť spracovaný.",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Váš prehliadač nepodporuje Filesystem API. Adresáre nebudú nahrané",
+ "No files to upload" : "Žiadne súbory pre nahratie",
+ "Unable to create the directory {directory}" : "Nie je možné vytvoriť adresár {directory}",
+ "Some files could not be uploaded" : "Niektoré súbory nebolo možné nahrať.",
+ "Files uploaded successfully" : "Súbory boli úspešne nahrané.",
+ "No files to process" : "Žiadne súbory pre spracovanie",
+ "Some files could not be copied" : "Niektoré súbory nebolo možné skopírovať",
+ "Some files could not be moved" : "Niektoré súbory nebolo možné presunúť",
+ "Files copied successfully" : "Súbory boli úspešne skopírované",
+ "Files moved successfully" : "Súbory boli úspešne presunuté",
+ "Conflicts resolution skipped" : "Riešenie konfliktov bolo preskočené",
+ "Upload cancelled" : "Odosielanie bolo zrušené",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nebolo možné premenovať \"{oldName}\". Položka už neexistuje.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Názov \"{newName}\" sa už používa v priečinku \"{dir}\". Vyberte prosím iný názov.",
+ "Could not rename \"{oldName}\"" : "Nebolo možné premenovať \"{oldName}\"",
+ "This operation is forbidden" : "Táto operácia je zakázaná",
+ "Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
+ "Unexpected error: {error}" : "Neočakávaná chyba: {error}",
+ "_%n file_::_%n files_" : ["%n súbor","%n súbory","%n súborov","%n súborov"],
+ "_%n folder_::_%n folders_" : ["%n priečinok","%n priečinky","%n priečinkov","%n priečinkov"],
+ "Filename must not be empty." : "Názov súboru nesmie byť prázdny.",
+ "\"{char}\" is not allowed inside a filename." : "Znak \"{char}\" nie je povolený v názve súboru.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" je rezervované slovo a nie je možné ho použiť v názvoch súborov.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" nie je povolená prípona súboru.",
+ "Filenames must not end with \"{extension}\"." : "Názvy súborov nesmú končiť s \"{extension}\"",
+ "List of favorite files and folders." : "Zoznam obľúbených súborov a priečinkov.",
+ "No favorites yet" : "Zatiaľ žiadne obľúbené",
+ "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
+ "List of your files and folders." : "Zoznam vašich súborov a priečinkov.",
+ "List of your files and folders that are not shared." : "Zoznam vašich súborov a priečinkov, ktoré nie sú zdieľané.",
+ "No personal files found" : "Žiadne osobné súbory nenájdené",
+ "Files that are not shared will show up here." : "Súbory, ktoré nie sú zdieľané, sa tu nezobrazia.",
+ "Recent" : "Nedávne",
+ "List of recently modified files and folders." : "Zoznam nedávno upravených súborov a priečinkov.",
+ "No recently modified files" : "Žiadne nedávno upravené súbory",
+ "Files and folders you recently modified will show up here." : "Súbory a priečinky, ktoré ste nedávno upravili sa zobrazia tu",
+ "Search" : "Hľadať",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
"Upload too large" : "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
- "No favorites yet" : "Zatiaľ žiadne obľúbené",
- "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
- "Deleted files" : "Zmazané súbory",
- "Shares" : "Zdieľania",
- "Shared with others" : "Sprístupnené ostatným",
- "Shared with you" : "Vám sprístupnené",
- "Shared by link" : "Sprístupnené prostredníctvom odkazu",
- "Deleted shares" : "Vymazané zdieľania",
- "Pending shares" : "Čakajúce prístupy",
+ "File could not be found" : "Súbor nie je možné nájsť",
+ "Show list view" : "Zobraziť ako zoznam",
+ "Show grid view" : "Zobraziť v mriežke",
+ "Close" : "Zavrieť",
+ "Could not create folder \"{dir}\"" : "Nemožno vytvoriť priečinok \"{dir}\"",
+ "This will stop your current uploads." : "Toto zastaví práve prebiehajúce nahrávania.",
+ "Upload cancelled." : "Odosielanie je zrušené.",
+ "Processing files …" : "Spracovávam súbory ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Cieľový priečinok \"{dir}\" už neexistuje",
+ "An unknown error has occurred" : "Vyskytla sa neznáma chyba",
+ "File could not be uploaded" : "Súbor nemôže byť nahraný",
+ "Uploading …" : "Nahrávanie...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Nahrávanie... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Nahrávanie tejto položky nie je podporované",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
+ "Choose target folder" : "Vyberte cieľový priečinok",
+ "Set reminder" : "Nastaviť pripomienku",
+ "Edit locally" : "Editovať lokálne",
+ "Open" : "Otvoriť",
+ "Could not load info for file \"{file}\"" : "Nebolo možné načítať informácie súboru \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Prosím vyberte štítok (štítky) pre pridanie do výberu",
+ "Apply tag(s) to selection" : "Aplikovať štítok(štítky) do výberu",
+ "Select directory \"{dirName}\"" : "Vybrať priečinok \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Vybrať súbor \"{fileName}\"",
+ "Unable to determine date" : "Nemožno určiť dátum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
+ "Could not move \"{file}\", target exists" : "Nie je možné presunúť \"{file}\", cieľ už existuje",
+ "Could not move \"{file}\"" : "Nie je možné presunúť \"{file}\"",
+ "copy" : "kópia",
+ "Could not copy \"{file}\", target exists" : "Nie je možné kopírovať \"{file}\", cieľ už existuje",
+ "Could not copy \"{file}\"" : "Nie je možné skopírovať \"{file}\"",
+ "Copied {origin} inside {destination}" : "Skopírované {origin} do {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopírované {origin} a {nbfiles} ostatných súborov do {destination}",
+ "{newName} already exists" : "{newName} už existuje",
+ "Could not create file \"{file}\"" : "Nie je možné vytvoriť súbor \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nie je možné vytvoriť súbor \"{file}\" lebo už existuje",
+ "Could not create folder \"{dir}\" because it already exists" : "Nie je možné vytvoriť priečinok \"{dir}\" lebo už existuje",
+ "Could not fetch file details \"{file}\"" : "Podrobnosti o súbore „{file}“ sa nepodarilo načítať",
+ "Error deleting file \"{fileName}\"." : "Chyba pri mazaní súboru \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch pre {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ak chcete hľadať v iných priečinkoch, zadajte viac ako dva znaky",
+ "{dirs} and {files}" : "{dirs} a {files}",
+ "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"],
+ "You do not have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory",
+ "_Uploading %n file_::_Uploading %n files_" : ["Nahráva sa %n súbor","Nahrávajú sa %n súbory","Nahráva sa %n súborov","Nahráva sa %n súborov"],
+ "New" : "Nový",
+ "New file/folder menu" : "Ponuka nového súboru/priečinka",
+ "Select file range" : "Vybrať rozsah súborov",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} použitých",
+ "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
+ "File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložisko je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Priečinok skupiny \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externé úložisko \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedajú \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Priamy odkaz bol skopirovaný (funguje iba pre užívateľov, ktorí majú prístup k danému súboru/adresáru)",
+ "Path" : "Cesta",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov","%n bajtov"],
+ "Favored" : "Zaradiť medzi obľúbené",
+ "Favor" : "Zaradené medzi obľúbené",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopírovať priamy odkaz (funguje iba pre užívateľov, ktorí majú prístup k tomuto súboru/priečinku)",
+ "Upload file" : "Nahrať súbor",
+ "Not favored" : "Nie je v obľúbených",
+ "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
+ "Upload (max. %s)" : "Nahrať (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" akcia vykonaná úspešne",
+ "\"{displayName}\" action failed" : "\"{displayName}\" akcia zlýhala",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" zlyhalo na niektorých prvkoch.",
+ "\"{displayName}\" batch action executed successfully" : "Hromadná operácia \"{displayName}\" bola úspešne vykonaná",
+ "Submitting fields…" : "Položky sa odosielajú ...",
+ "Filter filenames…" : "Filtrovať názvy súborov...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL skopirovaná do schránky",
+ "Enable the grid view" : "Povoliť zobrazenie v mriežke",
+ "Enable folder tree" : "Povoliť adresárový strom",
+ "Copy to clipboard" : "Skopírovať do schránky",
+ "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
+ "Deletion cancelled" : "Zmazanie zrušené",
+ "Move cancelled" : "Presun zrušený",
+ "Cancelled move or copy of \"{filename}\"." : "Zrušené kopírovanie alebo presun \"{filename}\".",
+ "Cancelled move or copy operation" : "Zrušená operácia kopírovania alebo presunu",
+ "Open details" : "Otvoriť detaily",
+ "Photos and images" : "Fotky a obrázky",
+ "New folder creation cancelled" : "Vytvorenie adresára bolo zrušené",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} priečinok","{folderCount} priečinky","{folderCount} priečinkov","{folderCount} priečinkov"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} súbor","{fileCount} súbory","{fileCount} súborov","{fileCount} súborov"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 súbor a {folderCount} priečinok","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} súbor a 1 priečinok","{fileCount} súborov a 1 priečinok","{fileCount} súborov a 1 priečinok","{fileCount} súborov a 1 priečinok"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} súborov a {folderCount} priečinkov",
+ "All folders" : "Všetky adresáre",
+ "Personal Files" : "Osobné Súbory",
"Text file" : "Textový súbor",
"New text file.txt" : "Nový text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plný, súbory nemožno aktualizovať ani synchronizovať!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
- "_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"]
+ "Filter file names …" : "Filtrovať názvy súborov ...",
+ "Prevent warning dialogs from open or reenable them." : "Zabrániť otváraniu varovných dialógov alebo ich znova povoliť.",
+ "Show a warning dialog when changing a file extension." : "Pri zmene prípony súboru zobraziť dialógové okno s upozornením.",
+ "Speed up your Files experience with these quick shortcuts." : "Zrýchlite používanie Súborov využitím klávesových skratiek.",
+ "Open the actions menu for a file" : "Otvoriť menu akcií pre súbor",
+ "Rename a file" : "Premenovať súbor",
+ "Delete a file" : "Zmazať súbor",
+ "Favorite or remove a file from favorites" : "Pridať alebo odobrať súbor z obľúbených",
+ "Manage tags for a file" : "Spravovať štítky súborov",
+ "Deselect all files" : "Zrušiť výber všetkých súborov",
+ "Select or deselect a file" : "Vybrať alebo zrušiť výber súboru",
+ "Select a range of files" : "Vybrať viacero súborov",
+ "Navigate to the parent folder" : "Navigovať do nadradeného adresára",
+ "Navigate to the file above" : "Navigovať na predošlý súbor",
+ "Navigate to the file below" : "Navigovať na ďalší súbor",
+ "Navigate to the file on the left (in grid mode)" : "Navigovať na súbor vľavo (v režime zobrazenia v mriežke)",
+ "Navigate to the file on the right (in grid mode)" : "Navigovať na súbor vpravo (v režime zobrazenia v mriežke)",
+ "Toggle the grid view" : "Prepnúť na zobrazenie v mriežke",
+ "Open the sidebar for a file" : "Otvoriť bočný panel pre súbor"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");
diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json
index b065732e1f9..0a7e3e5d442 100644
--- a/apps/files/l10n/sk.json
+++ b/apps/files/l10n/sk.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
- "Storage invalid" : "Úložisko nie je platné",
- "Unknown error" : "Neznáma chyba",
- "File could not be found" : "Súbor nie je možné nájsť",
- "Move or copy" : "Presunúť alebo kopírovať",
- "Download" : "Stiahnuť",
- "Delete" : "Zmazať",
- "Home" : "Domov",
- "Close" : "Zavrieť",
- "Favorites" : "Obľúbené",
- "Could not create folder \"{dir}\"" : "Nemožno vytvoriť priečinok \"{dir}\"",
- "This will stop your current uploads." : "Toto zastaví práve prebiehajúce nahrávania.",
- "Upload cancelled." : "Odosielanie je zrušené.",
- "Processing files …" : "Spracovávam súbory ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Cieľový priečinok \"{dir}\" už neexistuje",
- "Not enough free space" : "Nedostatok voľného miesta",
- "An unknown error has occurred" : "Vyskytla sa neznáma chyba",
- "Uploading …" : "Nahrávanie...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Nahrávanie tejto položky nie je podporované",
- "Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
- "Operation is blocked by access control" : "Činnosť je blokovaná kontrolou prístupu",
- "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
- "Actions" : "Akcie",
- "Rename" : "Premenovať",
- "Copy" : "Kopírovať",
- "Choose target folder" : "Vyberte cieľový priečinok",
- "Open" : "Otvoriť",
- "Delete file" : "Zmazať súbor",
- "Delete folder" : "Zmazať priečinok",
- "Disconnect storage" : "Odpojiť úložisko",
- "Leave this share" : "Opustiť toto zdieľanie",
- "Could not load info for file \"{file}\"" : "Nebolo možné načítať informácie súboru \"{file}\"",
- "Files" : "Súbory",
- "Details" : "Podrobnosti",
- "Please select tag(s) to add to the selection" : "Prosím vyberte štítok(štítky) pre pridanie do výberu",
- "Apply tag(s) to selection" : "Aplikovať štítok(štítky) do výberu",
- "Select" : "Vybrať",
- "Pending" : "Čaká",
- "Unable to determine date" : "Nemožno určiť dátum",
- "This operation is forbidden" : "Táto operácia je zakázaná",
- "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
- "Could not move \"{file}\", target exists" : "Nie je možné presunúť \"{file}\", cieľ už existuje",
- "Could not move \"{file}\"" : "Nie je možné presunúť \"{file}\"",
- "copy" : "kópia",
- "Could not copy \"{file}\", target exists" : "Nie je možné kopírovať \"{file}\", cieľ už existuje",
- "Could not copy \"{file}\"" : "Nie je možné skopírovať \"{file}\"",
- "Copied {origin} inside {destination}" : "Skopírované {origin} do {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopírované {origin} a {nbfiles} ostatných súborov do {destination}",
- "{newName} already exists" : "{newName} už existuje",
- "Could not rename \"{fileName}\", it does not exist any more" : "Nie je možné premenovať \"{fileName}\", cieľ už neexistuje",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Názov \"{targetName}\" je už použitý v priečinku \"{dir}\". Zvoľte prosím iný názov.",
- "Could not rename \"{fileName}\"" : "Nie je možné premenovať \"{file}\"",
- "Could not create file \"{file}\"" : "Nie je možné vytvoriť súbor \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Nie je možné vytvoriť súbor \"{file}\" lebo už existuje",
- "Could not create folder \"{dir}\" because it already exists" : "Nie je možné vytvoriť priečinok \"{dir}\" lebo už existuje",
- "Could not fetch file details \"{file}\"" : "Podrobnosti o súbore „{file}“ sa nepodarilo načítať",
- "Error deleting file \"{fileName}\"." : "Chyba pri mazaní súboru \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch pre {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ak chcete hľadať v iných priečinkoch, zadajte viac ako dva znaky",
- "Name" : "Názov",
- "Size" : "Veľkosť",
- "Modified" : "Upravené",
- "_%n folder_::_%n folders_" : ["%n priečinok","%n priečinky","%n priečinkov","%n priečinkov"],
- "_%n file_::_%n files_" : ["%n súbor","%n súbory","%n súborov","%n súborov"],
- "{dirs} and {files}" : "{dirs} a {files}",
- "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"],
- "You don’t have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory",
- "_Uploading %n file_::_Uploading %n files_" : ["Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov","Nahrávam %n súborov"],
- "New" : "Nový",
- "Select file range" : "Vybrať rozsah súborov",
- "{used} of {quota} used" : "použitých {used} z {quota}",
- "{used} used" : "{used} použitých",
- "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
- "File name cannot be empty." : "Meno súboru nemôže byť prázdne",
- "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložisko je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Priečinok skupiny \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externé úložisko \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedajú \"{filter}\""],
- "View in folder" : "Zobraziť v priečinku",
- "Copied!" : "Skopírované!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopírovať priamy odkaz (funguje iba pre používateľov, ktorí majú prístup k tomuto súboru/priečinku)",
- "Path" : "Cesta",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov","%n bajtov"],
- "Favorited" : "Pridané k obľúbeným",
- "Favorite" : "Obľúbené",
- "You can only favorite a single file or folder at a time" : "Do obľúbených je možné zaradovať súbory a zložky len jednotlivo",
- "New folder" : "Nový priečinok",
- "Upload file" : "Nahrať súbor",
- "Recent" : "Nedávne",
- "Not favorited" : "Nie je obľúbený",
- "Remove from favorites" : "Odstrániť z obľúbených",
- "Add to favorites" : "Pridať do obľúbených",
- "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"Added to favorites" : "Pridané do obľúbených",
"Removed from favorites" : "Odstránené z obľúbených",
"You added {file} to your favorites" : "Pridali ste {file} do vašich obľúbených",
"You removed {file} from your favorites" : "Odstránili ste {file} z vašich obľúbených",
+ "Favorites" : "Obľúbené",
"File changes" : "Zmeny v súboroch",
"Created by {user}" : "Vytvorené užívateľom {user}",
"Changed by {user}" : "Zmenené užívateľom {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Obnovené užívateľom {user}",
"Renamed by {user}" : "Premenované užívateľom {user}",
"Moved by {user}" : "Presunuté užívateľom {user}",
- "\"remote user\"" : "\"vzdialený používateľ\"",
+ "\"remote account\"" : "\"vzdialený účet\"",
"You created {file}" : "Vytvorili ste súbor {file}",
"You created an encrypted file in {file}" : "Vytvorili ste zašifrovaný súbor {file}",
"{user} created {file}" : "{user} vytvoril súbor {file}",
@@ -124,8 +21,8 @@
"You changed an encrypted file in {file}" : "Zmenili ste šifrovaný súbor {file}",
"{user} changed {file}" : "{user} zmenil {file}",
"{user} changed an encrypted file in {file}" : "{user} zmenil šifrovaný súbor {file}",
- "You deleted {file}" : "Zmazali ste {file}",
- "You deleted an encrypted file in {file}" : "Zmazali ste šifrovaný súbor {file}",
+ "You deleted {file}" : "Odstránili ste {file}",
+ "You deleted an encrypted file in {file}" : "Odstránili ste šifrovaný súbor {file}",
"{user} deleted {file}" : "{user} zmazal {file}",
"{user} deleted an encrypted file in {file}" : "{user} zmazal šifrovaný súbor {file}",
"You restored {file}" : "Obnovili ste {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Presunuli ste {oldfile} do {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} presunul {oldfile} do {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Súbor bol pridaný alebo odstránený z vašich <strong>obľúbených</strong>",
+ "Files" : "Súbory",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Obľúbený súbor alebo priečinok bol <strong>zmenený</strong>",
- "All files" : "Všetky súbory",
- "Unlimited" : "Neobmedzené",
- "Upload (max. %s)" : "Nahrať (max. %s)",
+ "Failed to authorize" : "Autorizácia zlyhala",
+ "Invalid folder path" : "Neplatná cesta k priečinku",
+ "Folder not found" : "Priečinok nebol nájdený",
+ "The file cannot be found" : "Súbor sa nepodarilo nájisť",
+ "The destination path does not exist: %1$s" : "Cieľová cesta neexistuje: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nemáte oprávnenie vytvoriť súbor v zadanom umiestnení",
+ "The file could not be converted." : "Súbor nemohol byť skonvertovaný.",
+ "Could not get relative path to converted file" : "Nepodarilo sa získať relatícnu cestu ku skonvertovanému súboru",
+ "Favorite files" : "Obľúbené súbory",
+ "No favorites" : "Žiadne obľúbené",
+ "More favorites" : "Viac obľúbených",
"Accept" : "Prijať",
"Reject" : "Odmietnuť",
"Incoming ownership transfer from {user}" : "Prichádzajúci prevod vlastníctva od {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Chcete prijať {path}?\n\nPozn.: Proces pre prijatie môže trvať až hodinu.",
+ "Ownership transfer denied" : "Prevod vlastníctva bol odmietnutý",
+ "Your ownership transfer of {path} was denied by {user}." : "{user} odmietol prevod vlastníctva {path}.",
"Ownership transfer failed" : "Prevod vlastníctva zlyhal",
"Your ownership transfer of {path} to {user} failed." : "Prevod vlastníctva {path} od vás na {user} zlyhal.",
"The ownership transfer of {path} from {user} failed." : "Prevod vlastníctva {path} od {user} zlyhal.",
@@ -157,62 +65,393 @@
"Your ownership transfer of {path} to {user} has completed." : "Prevod vami vlastnenej položky {path} na {user} bol dokončený.",
"The ownership transfer of {path} from {user} has completed." : "Prevod vlastníctva položky {path} od {user} bol dokončený.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Prevedené z %1$s na %2$s",
+ "Files compatibility" : "Kompatibilita súborov",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Povoliť obmedzenie názvov súborov, aby sa zabezpečila synchronizácia súborov so všetkými klientmi. V predvolenom nastavení sú povolené všetky názvy súborov platné pre POSIX (napr. Linux alebo macOS).",
+ "Enforce Windows compatibility" : "Vynútiť kompatibilitu s Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Tým sa zablokujú názvy súborov, ktoré nie sú platné v systémoch Windows, ako napríklad používanie vyhradených názvov alebo špeciálnych znakov. To však nevynúti kompatibilitu rozlišovania malých a veľkých písmen.",
"File Management" : "Správa súborov",
- "Transfer ownership of a file or folder" : "Prevod vlastníctva súboru alebo priečinka",
- "Choose file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
- "Change" : "Zmeniť",
- "New owner" : "Nový vlastník",
- "Search users" : "Hľadať používateľov",
+ "Home" : "Domov",
+ "Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Reload current directory" : "Znova načítať súčasný adresár",
+ "Go to the \"{dir}\" directory" : "Ísť do \"{dir}\" adresára",
+ "Current directory path" : "Aktuálna cesta k adresáru",
+ "Your have used your space quota and cannot upload files anymore" : "Dosiahli ste limit vášho priestoru a už viac nemôžete nahrávať súbory",
+ "You do not have permission to upload or create files here." : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory.",
+ "Drag and drop files here to upload" : "Pre nahratie presuňte do tohto priestoru súbory ťahaním",
+ "Favorite" : "Obľúbené",
+ "Back" : "Späť",
+ "Toggle selection for file \"{displayName}\"" : "Prepnúť výber pre súbor \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Prepnúť výber pre adresár \"{displayName}\"",
+ "File is loading" : "Súbor sa nahráva",
+ "Folder is loading" : "Adresár sa nahráva",
+ "Filename" : "Názov súboru",
+ "Folder name" : "Názov priečinka",
+ "This node is unavailable" : "Uzol nie je k dispozícií",
+ "Another entry with the same name already exists." : "Iná položka s rovnakým menom už existuje.",
+ "Invalid filename." : "Chybný názov súboru.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Premenované z \"{oldName}\" na \"{newName}\"",
+ "Rename file" : "Premenovať súbor",
+ "Folder" : "Priečinok",
+ "Pending" : "Čaká",
+ "Unknown date" : "Neznámy dátum",
+ "Clear filter" : "Vyčistiť filter",
+ "Modified" : "Upravené",
+ "Search everywhere" : "Hľadať všade",
+ "Type" : "Typ",
+ "Active filters" : "Aktívne filtre",
+ "Remove filter" : "Odstrániť filter",
+ "Total rows summary" : "Súčet všetkých riadkov",
+ "Toggle selection for all files and folders" : "Prepnúť výber pre všetky súbory a adresáre",
+ "Name" : "Názov",
+ "Size" : "Veľkosť",
+ "Actions" : "Akcie",
+ "(selected)" : "(vybrané)",
+ "List of files and folders." : "Zoznam súborov a priečinkov.",
+ "You have used your space quota and cannot upload files anymore." : "Už ste využili kapacitu úložného priestoru a nie je možné nahrávať ďalšie súbory.",
+ "Column headers with buttons are sortable." : "Stĺpce hlavičiek s tlačidlami sú triediteľné.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzať zoznamom.",
+ "File not found" : "Súbor nenájdený",
+ "_{count} selected_::_{count} selected_" : ["{count} vybraný","{count} vybrané","{count} vybraných","{count} vybraných"],
+ "{usedQuotaByte} used" : "{usedQuotaByte} použitých",
+ "{used} of {quota} used" : "použitých {used} z {quota}",
+ "{relative}% used" : "{relative}% použitých",
+ "Could not refresh storage stats" : "Nebolo možné obnoviť úložiskové štatistiky",
+ "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage information" : "Informácie o úložisku",
+ "Storage quota" : "Kvóta pre úložisko",
+ "New folder" : "Nový priečinok",
+ "Create new folder" : "Vytvoriť nový priečinok",
+ "This name is already in use." : "Toto meno je už používané.",
+ "Create" : "Vytvoriť",
+ "Fill template fields" : "Vyplňte položky šablóny",
+ "Submitting fields …" : "Položky sa odosielajú ...",
+ "Submit" : "Odoslať",
"Choose a file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
"Transfer" : "Prevod",
"Transfer {path} to {userid}" : "Previesť {path} na {userid}",
"Invalid path selected" : "Bola vybraná neplatná cesta",
+ "Unknown error" : "Neznáma chyba",
"Ownership transfer request sent" : "Žiadosť o prevod vlastníctva bola odoslaná",
- "Cannot transfer ownership of a file or folder you don't own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte",
- "Tags" : "Štítky",
- "Unable to change the favourite state of the file" : "Nie je možné zmeniť stav „obľúbené“ daného súboru",
- "Error while loading the file data" : "Chyba pri načítaní údajov súboru",
- "Pick a template for {name}" : "Vyberte šablónu pre {name}",
- "Cancel" : "Zrušiť",
- "Create" : "Vytvoriť",
- "Create a new file with the selected template" : "Vytvoriť nový súbor pomocou vybranej šablóny",
- "Creating file" : "Vyváram súbor",
- "Blank" : "Prázdne",
- "Unable to create new file from template" : "Nemôžem vytvoriť nový súbor zo šablóny",
- "Set up templates folder" : "Nastaviť priečinok pre šablóny",
- "Templates" : "Šablóny",
- "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami",
- "%s used" : "%s použitých",
- "%s%% of %s used" : "Využité %s%% z %s",
- "%1$s of %2$s used" : "Využité: %1$s z %2$s",
- "Settings" : "Nastavenia",
+ "Cannot transfer ownership of a file or folder you do not own" : "Nie je možné preniesť vlastníctvo súboru alebo priečinka, ktorý nevlastníte",
+ "Transfer ownership of a file or folder" : "Prevod vlastníctva súboru alebo priečinka",
+ "Choose file or folder to transfer" : "Vyberte súbor alebo priečinok na prevod",
+ "Change" : "Zmeniť",
+ "New owner" : "Nový vlastník",
+ "Keep {old}" : "Ponechať {old}",
+ "Keep without extension" : "Ponechať bez prípony",
+ "Use {new}" : "Použiť {new}",
+ "Remove extension" : "Odstrániť príponu",
+ "Change file extension" : "Zmeniť príponu súboru",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Zmena prípony súboru z „{old}“ na „{new}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odstránenie prípony súboru „{old}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Pridanie prípony súboru „{new}“ môže spôsobiť, že súbor bude nečitateľný.",
+ "Do not show this dialog again." : "Toto dialógové okno už nezobrazovať.",
+ "Select file or folder to link to" : "Vyberte súbor alebo priečinok na ktorý odkazovať",
+ "Choose {file}" : "Vyberte {file}",
+ "Share" : "Zdieľať",
+ "Shared by link" : "Sprístupnené odkazom",
+ "Shared" : "Sprístupnené",
+ "Switch to list view" : "Prepnúť na zobrazenie v zozname",
+ "Switch to grid view" : "Prepnúť na zobrazenie v mriežke",
+ "The file could not be found" : "Súbor nebol nájdený",
+ "Upload was cancelled by user" : "Nahrávanie bolo zrušené užívateľom",
+ "Not enough free space" : "Nedostatok voľného miesta",
+ "Operation is blocked by access control" : "Činnosť je blokovaná kontrolou prístupu",
+ "Error during upload: {message}" : "Chyba počas nahrávania: {message}",
+ "Error during upload, status code {status}" : "Chyba počas nahrávania, chybový kód {status}",
+ "Unknown error during upload" : "Neznáma chyba počas nahrávania",
+ "Loading current folder" : "Načítavanie súčasného priečinka",
+ "Retry" : "Zopakovať",
+ "No files in here" : "Nie sú tu žiadne súbory",
+ "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte dáta so svojimi zariadeniami!",
+ "Go back" : "Ísť späť",
+ "Views" : "Zobrazenia",
+ "Files settings" : "Nastavenia súborov",
+ "Your files" : "Vaše súbory",
+ "Open in files" : "Otvoriť v súboroch",
+ "File cannot be accessed" : "Súbor nie je možné sprístupniť",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Súbor sa nenašiel alebo nemáte oprávnenie na jeho zobrazenie. Požiadajte odosielateľa, aby ho sprístupnil.",
+ "Clipboard is not available" : "Schránka nie je prístupná",
+ "General" : "Všeobecné",
+ "All files" : "Všetky súbory",
+ "Personal files" : "Osobné súbory",
+ "Sort favorites first" : "Zoradiť od najobľúbenejších",
+ "Sort folders before files" : "Zoradiť adresáre pred súbormi",
+ "Appearance" : "Vzhľad",
"Show hidden files" : "Zobraziť skryté súbory",
"Crop image previews" : "Orezať náhľady obrázkov",
+ "Additional settings" : "Ďalšie nastavenia",
"WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
- "Toggle %1$s sublist" : "Prepnúť %1$s podzoznam",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopírovať",
+ "Warnings" : "Upozornenia",
+ "Keyboard shortcuts" : "Klávesové skratky",
+ "File actions" : "Akcie súboru",
+ "Rename" : "Premenovať",
+ "Delete" : "Zmazať",
+ "Manage tags" : "Spravovať štítky",
+ "Selection" : "Výber",
+ "Select all files" : "Vybrať všetky súbory",
+ "Deselect all" : "Odznačiť všetko",
+ "Navigation" : "Navigácia",
+ "View" : "Zobraziť",
"Toggle grid view" : "Prepnúť zobrazenie mriežky",
- "No files in here" : "Nie sú tu žiadne súbory",
- "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
+ "Show those shortcuts" : "Zobraziť klávesové skratky",
+ "You" : "Vy",
+ "Shared multiple times with different people" : "Zdieľané viackrát rôznymi ľuďmi",
+ "Unable to change the favorite state of the file" : "Nie je možné zmeniť stav „obľúbené“ súboru",
+ "Error while loading the file data" : "Chyba pri načítaní údajov súboru",
+ "Owner" : "Vlastník",
+ "Remove from favorites" : "Odstrániť z obľúbených",
+ "Add to favorites" : "Pridať do obľúbených",
+ "Tags" : "Štítky",
+ "Blank" : "Prázdne",
+ "Unable to create new file from template" : "Nemôžem vytvoriť nový súbor zo šablóny",
+ "Pick a template for {name}" : "Vyberte šablónu pre {name}",
+ "Create a new file with the selected template" : "Vytvoriť nový súbor pomocou vybranej šablóny",
+ "Creating file" : "Vytvára sa súbor",
+ "Save as {displayName}" : "Uložiť ako {displayName}",
+ "Save as …" : "Uložiť ako ...",
+ "Converting files …" : "Konverzia súborov ...",
+ "Failed to convert files: {message}" : "Nepodarilo sa skonvertovať súbory: {message}",
+ "All files failed to be converted" : "Nepodarilo sa skonvertovať žiadne súbory",
+ "One file could not be converted: {message}" : "Jeden súbor sa nepodarilo skonvertovať: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Jeden súbor sa nepodarilo skonvertovať","%n súbory sa nepodarilo skonvertovať","%n súborov sa nepodarilo skonvertovať","%n súborov sa nepodarilo skonvertovať"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Jeden súbor bol úspešne skonvertovaný","%n súbory boli úspešne skonvertované","%n súborov bolo úspešne skonvertovaných","%n súborov bolo úspešne skonvertovaných"],
+ "Files successfully converted" : "Súbory boli úspešne skonvertované",
+ "Failed to convert files" : "Konverzia súborov zlyhala",
+ "Converting file …" : "Konverzia súborov ...",
+ "File successfully converted" : "Súbor bol úspešne skonvertovaný",
+ "Failed to convert file: {message}" : "Nepodarilo sa skonvertovať súbor: {message}",
+ "Failed to convert file" : "Konverzia súboru zlyhala",
+ "Leave this share" : "Opustiť toto zdieľanie.",
+ "Leave these shares" : "Opustiť tieto zdieľania.",
+ "Disconnect storage" : "Odpojiť úložisko",
+ "Disconnect storages" : "Odpojiť úložiská",
+ "Delete permanently" : "Zmazať natrvalo",
+ "Delete and unshare" : "Vymazať a zrušiť zdieľanie",
+ "Delete file" : "Zmazať súbor",
+ "Delete files" : "Zmazať súbory",
+ "Delete folder" : "Zmazať priečinok",
+ "Delete folders" : "Zmazať priečinky",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Chystáte sa permanentne vymazať {count} položku","Chystáte sa permanentne vymazať {count} položky","Chystáte sa permanentne vymazať {count} položiek","Chystáte sa permanentne vymazať {count} položiek"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Chystáte sa vymazať {count} položku","Chystáte sa vymazať {count} položky","Chystáte sa vymazať {count} položiek","Chystáte sa vymazať {count} položiek"],
+ "Confirm deletion" : "Potvrdiť vymazanie",
+ "Cancel" : "Zrušiť",
+ "Download" : "Stiahnuť",
+ "Moving \"{source}\" to \"{destination}\" …" : "Presúvanie \"{source}\" do \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopírovanie \"{source}\" do \"{destination}\" …",
+ "Destination is not a folder" : "Cieľ nie je priečinok",
+ "This file/folder is already in that directory" : "Tento súbor/priečinok sa už v danom adresári nachádza",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Nemôžete presunúť súbor/priečinok do seba alebo do jeho podpriečinka.",
+ "(copy)" : "(kopírovať)",
+ "(copy %n)" : "(kopírovať %n)",
+ "A file or folder with that name already exists in this folder" : "Súbor alebo priečinok s týmto názvom už existuje v tomto priečinku",
+ "The files are locked" : "Súbory sú uzamknuté.",
+ "The file does not exist anymore" : "Súbor už neexistuje",
+ "Choose destination" : "Vyberte cieľ",
+ "Copy to {target}" : "Kopírovať do {target}",
+ "Move to {target}" : "Presunúť do {target}",
+ "Move" : "Presunúť",
+ "Move or copy operation failed" : "Operácia presunu alebo kopírovania zlyhala",
+ "Move or copy" : "Presunúť alebo kopírovať",
+ "Open folder {displayName}" : "Otvoriť priečinok {displayName}",
+ "Open in Files" : "Otvoriť v súboroch",
+ "Open locally" : "Otvoriť lokálne",
+ "Failed to redirect to client" : "Nepodarilo sa presmerovať na klienta",
+ "Open file locally" : "Otvoriť súbor lokálne",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Súbor by sa mal teraz otvoriť v zariadení. Ak sa tak nestane, skontrolujte, či máte nainštalovanú aplikáciu pre počítače.",
+ "Retry and close" : "Skúsiť znova a zatvoriť",
+ "Open online" : "Otvoriť online",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Zobraziť v priečinku",
+ "Today" : "Dnes",
+ "Last 7 days" : "Posledných 7 dní",
+ "Last 30 days" : "Posledných 30 dní",
+ "This year ({year})" : "Tento rok ({year})",
+ "Last year ({year})" : "Minulý rok ({year})",
+ "Documents" : "Dokumenty",
+ "Spreadsheets" : "Tabuľky",
+ "Presentations" : "Prezentácie",
+ "PDFs" : "PDFká",
+ "Folders" : "Priečinky",
+ "Audio" : "Zvuk",
+ "Images" : "Obrázky",
+ "Videos" : "Videá",
+ "Created new folder \"{name}\"" : "Vytvorený nový priečinok \"{name}\"",
+ "Unable to initialize the templates directory" : "Nemôžem inicializovať priečinok so šablónami",
+ "Create templates folder" : "Vytvoriť adresár pre šablóny",
+ "Templates" : "Šablóny",
+ "New template folder" : "Nový adresár šablóny",
+ "In folder" : "V adresári",
+ "Search in folder: {folder}" : "Hľadať v adresári: {folder}",
+ "One of the dropped files could not be processed" : "Jeden z vložených súborov nemohol byť spracovaný.",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Váš prehliadač nepodporuje Filesystem API. Adresáre nebudú nahrané",
+ "No files to upload" : "Žiadne súbory pre nahratie",
+ "Unable to create the directory {directory}" : "Nie je možné vytvoriť adresár {directory}",
+ "Some files could not be uploaded" : "Niektoré súbory nebolo možné nahrať.",
+ "Files uploaded successfully" : "Súbory boli úspešne nahrané.",
+ "No files to process" : "Žiadne súbory pre spracovanie",
+ "Some files could not be copied" : "Niektoré súbory nebolo možné skopírovať",
+ "Some files could not be moved" : "Niektoré súbory nebolo možné presunúť",
+ "Files copied successfully" : "Súbory boli úspešne skopírované",
+ "Files moved successfully" : "Súbory boli úspešne presunuté",
+ "Conflicts resolution skipped" : "Riešenie konfliktov bolo preskočené",
+ "Upload cancelled" : "Odosielanie bolo zrušené",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Nebolo možné premenovať \"{oldName}\". Položka už neexistuje.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Názov \"{newName}\" sa už používa v priečinku \"{dir}\". Vyberte prosím iný názov.",
+ "Could not rename \"{oldName}\"" : "Nebolo možné premenovať \"{oldName}\"",
+ "This operation is forbidden" : "Táto operácia je zakázaná",
+ "Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
+ "Unexpected error: {error}" : "Neočakávaná chyba: {error}",
+ "_%n file_::_%n files_" : ["%n súbor","%n súbory","%n súborov","%n súborov"],
+ "_%n folder_::_%n folders_" : ["%n priečinok","%n priečinky","%n priečinkov","%n priečinkov"],
+ "Filename must not be empty." : "Názov súboru nesmie byť prázdny.",
+ "\"{char}\" is not allowed inside a filename." : "Znak \"{char}\" nie je povolený v názve súboru.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" je rezervované slovo a nie je možné ho použiť v názvoch súborov.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" nie je povolená prípona súboru.",
+ "Filenames must not end with \"{extension}\"." : "Názvy súborov nesmú končiť s \"{extension}\"",
+ "List of favorite files and folders." : "Zoznam obľúbených súborov a priečinkov.",
+ "No favorites yet" : "Zatiaľ žiadne obľúbené",
+ "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
+ "List of your files and folders." : "Zoznam vašich súborov a priečinkov.",
+ "List of your files and folders that are not shared." : "Zoznam vašich súborov a priečinkov, ktoré nie sú zdieľané.",
+ "No personal files found" : "Žiadne osobné súbory nenájdené",
+ "Files that are not shared will show up here." : "Súbory, ktoré nie sú zdieľané, sa tu nezobrazia.",
+ "Recent" : "Nedávne",
+ "List of recently modified files and folders." : "Zoznam nedávno upravených súborov a priečinkov.",
+ "No recently modified files" : "Žiadne nedávno upravené súbory",
+ "Files and folders you recently modified will show up here." : "Súbory a priečinky, ktoré ste nedávno upravili sa zobrazia tu",
+ "Search" : "Hľadať",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
"Upload too large" : "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
- "No favorites yet" : "Zatiaľ žiadne obľúbené",
- "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu",
- "Deleted files" : "Zmazané súbory",
- "Shares" : "Zdieľania",
- "Shared with others" : "Sprístupnené ostatným",
- "Shared with you" : "Vám sprístupnené",
- "Shared by link" : "Sprístupnené prostredníctvom odkazu",
- "Deleted shares" : "Vymazané zdieľania",
- "Pending shares" : "Čakajúce prístupy",
+ "File could not be found" : "Súbor nie je možné nájsť",
+ "Show list view" : "Zobraziť ako zoznam",
+ "Show grid view" : "Zobraziť v mriežke",
+ "Close" : "Zavrieť",
+ "Could not create folder \"{dir}\"" : "Nemožno vytvoriť priečinok \"{dir}\"",
+ "This will stop your current uploads." : "Toto zastaví práve prebiehajúce nahrávania.",
+ "Upload cancelled." : "Odosielanie je zrušené.",
+ "Processing files …" : "Spracovávam súbory ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "Cieľový priečinok \"{dir}\" už neexistuje",
+ "An unknown error has occurred" : "Vyskytla sa neznáma chyba",
+ "File could not be uploaded" : "Súbor nemôže byť nahraný",
+ "Uploading …" : "Nahrávanie...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Nahrávanie... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Nahrávanie tejto položky nie je podporované",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
+ "Choose target folder" : "Vyberte cieľový priečinok",
+ "Set reminder" : "Nastaviť pripomienku",
+ "Edit locally" : "Editovať lokálne",
+ "Open" : "Otvoriť",
+ "Could not load info for file \"{file}\"" : "Nebolo možné načítať informácie súboru \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Prosím vyberte štítok (štítky) pre pridanie do výberu",
+ "Apply tag(s) to selection" : "Aplikovať štítok(štítky) do výberu",
+ "Select directory \"{dirName}\"" : "Vybrať priečinok \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Vybrať súbor \"{fileName}\"",
+ "Unable to determine date" : "Nemožno určiť dátum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
+ "Could not move \"{file}\", target exists" : "Nie je možné presunúť \"{file}\", cieľ už existuje",
+ "Could not move \"{file}\"" : "Nie je možné presunúť \"{file}\"",
+ "copy" : "kópia",
+ "Could not copy \"{file}\", target exists" : "Nie je možné kopírovať \"{file}\", cieľ už existuje",
+ "Could not copy \"{file}\"" : "Nie je možné skopírovať \"{file}\"",
+ "Copied {origin} inside {destination}" : "Skopírované {origin} do {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Skopírované {origin} a {nbfiles} ostatných súborov do {destination}",
+ "{newName} already exists" : "{newName} už existuje",
+ "Could not create file \"{file}\"" : "Nie je možné vytvoriť súbor \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Nie je možné vytvoriť súbor \"{file}\" lebo už existuje",
+ "Could not create folder \"{dir}\" because it already exists" : "Nie je možné vytvoriť priečinok \"{dir}\" lebo už existuje",
+ "Could not fetch file details \"{file}\"" : "Podrobnosti o súbore „{file}“ sa nepodarilo načítať",
+ "Error deleting file \"{fileName}\"." : "Chyba pri mazaní súboru \"{fileName}\".",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch pre {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ak chcete hľadať v iných priečinkoch, zadajte viac ako dva znaky",
+ "{dirs} and {files}" : "{dirs} a {files}",
+ "_including %n hidden_::_including %n hidden_" : ["vrátane %n skytého","vrátane %n skrytých","vrátane %n skrytých","vrátane %n skrytých"],
+ "You do not have permission to upload or create files here" : "Nemáte oprávnenie sem nahrávať alebo vytvárať súbory",
+ "_Uploading %n file_::_Uploading %n files_" : ["Nahráva sa %n súbor","Nahrávajú sa %n súbory","Nahráva sa %n súborov","Nahráva sa %n súborov"],
+ "New" : "Nový",
+ "New file/folder menu" : "Ponuka nového súboru/priečinka",
+ "Select file range" : "Vybrať rozsah súborov",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} použitých",
+ "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
+ "File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Vaše úložisko je plné, súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Priečinok skupiny \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Externé úložisko \"{mountPoint}\" je takmer plné ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedá \"{filter}\"","odpovedajú \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Priamy odkaz bol skopirovaný (funguje iba pre užívateľov, ktorí majú prístup k danému súboru/adresáru)",
+ "Path" : "Cesta",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov","%n bajtov"],
+ "Favored" : "Zaradiť medzi obľúbené",
+ "Favor" : "Zaradené medzi obľúbené",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopírovať priamy odkaz (funguje iba pre užívateľov, ktorí majú prístup k tomuto súboru/priečinku)",
+ "Upload file" : "Nahrať súbor",
+ "Not favored" : "Nie je v obľúbených",
+ "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
+ "Upload (max. %s)" : "Nahrať (max. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" akcia vykonaná úspešne",
+ "\"{displayName}\" action failed" : "\"{displayName}\" akcia zlýhala",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" zlyhalo na niektorých prvkoch.",
+ "\"{displayName}\" batch action executed successfully" : "Hromadná operácia \"{displayName}\" bola úspešne vykonaná",
+ "Submitting fields…" : "Položky sa odosielajú ...",
+ "Filter filenames…" : "Filtrovať názvy súborov...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL skopirovaná do schránky",
+ "Enable the grid view" : "Povoliť zobrazenie v mriežke",
+ "Enable folder tree" : "Povoliť adresárový strom",
+ "Copy to clipboard" : "Skopírovať do schránky",
+ "Use this address to access your Files via WebDAV" : "Táto adresa sa používa na prístup k vašim súborom prostredníctvom WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ak ste povolili 2FA, musíte kliknutím sem vytvoriť a použiť nové heslo pre aplikáciu.",
+ "Deletion cancelled" : "Zmazanie zrušené",
+ "Move cancelled" : "Presun zrušený",
+ "Cancelled move or copy of \"{filename}\"." : "Zrušené kopírovanie alebo presun \"{filename}\".",
+ "Cancelled move or copy operation" : "Zrušená operácia kopírovania alebo presunu",
+ "Open details" : "Otvoriť detaily",
+ "Photos and images" : "Fotky a obrázky",
+ "New folder creation cancelled" : "Vytvorenie adresára bolo zrušené",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} priečinok","{folderCount} priečinky","{folderCount} priečinkov","{folderCount} priečinkov"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} súbor","{fileCount} súbory","{fileCount} súborov","{fileCount} súborov"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 súbor a {folderCount} priečinok","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky","1 súbor a {folderCount} priečinky"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} súbor a 1 priečinok","{fileCount} súborov a 1 priečinok","{fileCount} súborov a 1 priečinok","{fileCount} súborov a 1 priečinok"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} súborov a {folderCount} priečinkov",
+ "All folders" : "Všetky adresáre",
+ "Personal Files" : "Osobné Súbory",
"Text file" : "Textový súbor",
"New text file.txt" : "Nový text file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Priečinok skupiny \"{mountPoint}\" je plný, súbory nemožno aktualizovať ani synchronizovať!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Externé úložisko \"{mountPoint}\" je plné, súbory nemožno aktualizovať ani synchronizovať!",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
- "_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"]
+ "Filter file names …" : "Filtrovať názvy súborov ...",
+ "Prevent warning dialogs from open or reenable them." : "Zabrániť otváraniu varovných dialógov alebo ich znova povoliť.",
+ "Show a warning dialog when changing a file extension." : "Pri zmene prípony súboru zobraziť dialógové okno s upozornením.",
+ "Speed up your Files experience with these quick shortcuts." : "Zrýchlite používanie Súborov využitím klávesových skratiek.",
+ "Open the actions menu for a file" : "Otvoriť menu akcií pre súbor",
+ "Rename a file" : "Premenovať súbor",
+ "Delete a file" : "Zmazať súbor",
+ "Favorite or remove a file from favorites" : "Pridať alebo odobrať súbor z obľúbených",
+ "Manage tags for a file" : "Spravovať štítky súborov",
+ "Deselect all files" : "Zrušiť výber všetkých súborov",
+ "Select or deselect a file" : "Vybrať alebo zrušiť výber súboru",
+ "Select a range of files" : "Vybrať viacero súborov",
+ "Navigate to the parent folder" : "Navigovať do nadradeného adresára",
+ "Navigate to the file above" : "Navigovať na predošlý súbor",
+ "Navigate to the file below" : "Navigovať na ďalší súbor",
+ "Navigate to the file on the left (in grid mode)" : "Navigovať na súbor vľavo (v režime zobrazenia v mriežke)",
+ "Navigate to the file on the right (in grid mode)" : "Navigovať na súbor vpravo (v režime zobrazenia v mriežke)",
+ "Toggle the grid view" : "Prepnúť na zobrazenie v mriežke",
+ "Open the sidebar for a file" : "Otvoriť bočný panel pre súbor"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index d0e93c25491..fb06e6cb234 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -1,112 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Shramba trenutno ni na voljo",
- "Storage invalid" : "Mesto shrambe ni veljavno",
- "Unknown error" : "Neznana napaka",
- "File could not be found" : "Datoteke ni mogoče najti",
- "Move or copy" : "Premakni ali kopiraj",
- "Download" : "Prejmi",
- "Delete" : "Izbriši",
- "Home" : "Začetni pogled",
- "Close" : "Zapri",
- "Favorites" : "Priljubljene",
- "Could not create folder \"{dir}\"" : "Mape »{dir}« ni mogoče ustvariti.",
- "This will stop your current uploads." : "S tem bodo zaustavljena vsa pošiljanja v oblak.",
- "Upload cancelled." : "Pošiljanje je preklicano.",
- "Processing files …" : "Poteka obdelava datotek ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Datoteke {filename} ni mogoče poslati, saj je to mapa, ali pa je velikost datoteke 0 bajtov.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je le {size2}.",
- "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa »{dir}« ne obstaja več.",
- "Not enough free space" : "Ni dovolj prostora",
- "An unknown error has occurred" : "Prišlo je do neznane napake!",
- "Uploading …" : "Poteka pošiljanje ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Pošiljate te vrste predmeta ni podprto.",
- "Target folder does not exist any more" : "Ciljna mapa ne obstaja več",
- "Operation is blocked by access control" : "Opravilo je zaustavljeno prek nadzora dostopa",
- "Error when assembling chunks, status code {status}" : "Napaka pri sestavljanju kosov datoteke, koda stanja je {status}",
- "Actions" : "Dejanja",
- "Rename" : "Preimenuj",
- "Copy" : "Kopiraj",
- "Choose target folder" : "Izbor ciljne mape",
- "Open" : "Odpri",
- "Delete file" : "Izbriši datoteko",
- "Delete folder" : "Izbriši mapo",
- "Disconnect storage" : "Odklopi shrambo",
- "Leave this share" : "Zapusti to mesto souporabe",
- "Could not load info for file \"{file}\"" : "Ni mogoče naložiti podatkov za datoteko »{file}«.",
- "Files" : "Datoteke",
- "Details" : "Podrobnosti",
- "Select" : "Izbor",
- "Pending" : "Na čakanju ...",
- "Unable to determine date" : "Ni mogoče določiti datuma",
- "This operation is forbidden" : "To dejanje ni dovoljeno!",
- "This directory is unavailable, please check the logs or contact the administrator" : "Mapa ni na voljo. Preverite dnevnik in stopite v stik s skrbnikom sistema.",
- "Could not move \"{file}\", target exists" : "Datoteke »{file}« ni mogoče premakniti, ker na ciljnem mestu z istim imenom že obstaja.",
- "Could not move \"{file}\"" : "Datoteke »{file}« ni mogoče premakniti",
- "copy" : "kopija",
- "Could not copy \"{file}\", target exists" : "Datoteke »{file}« ni mogoče kopirati, ker ta že obstaja.",
- "Could not copy \"{file}\"" : "Datoteke »{file}« ni mogoče kopirati.",
- "Copied {origin} inside {destination}" : "Kopirano {origin} v {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} in {nbfiles} ostale datoteke v {destination}",
- "{newName} already exists" : "Ime {newName} že obstaja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Datoteke »{fileName}« ni mogoče preimenovati, ker ne obstaja več",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime \"{targetName}\" je že v uporabi v mapi \"{dir}\". Izberati je treba drugačno ime.",
- "Could not rename \"{fileName}\"" : "Datoteke »{fileName}« ni mogoče preimenovati",
- "Could not create file \"{file}\"" : "Datoteke »{file}« ni mogoče ustvariti.",
- "Could not create file \"{file}\" because it already exists" : "Datoteke »{file}« ni mogoče ustvariti, ker datoteka z istim imenom že obstaja.",
- "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape »{dir}«, ker ta že obstaja",
- "Could not fetch file details \"{file}\"" : "Ni mogoče pridobiti podrobnosti datoteke »{file}«.",
- "Error deleting file \"{fileName}\"." : "Prišli je do napake med brisanjem datoteke »{fileName}«.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Za iskalni niz {tag}{filter}{endtag} ni zadetkov v nobeni mapi",
- "Enter more than two characters to search in other folders" : "Vpišite več kot dva znaka za iskanje po drugih mapah",
- "Name" : "Ime",
- "Size" : "Velikost",
- "Modified" : "Spremenjeno",
- "_%n folder_::_%n folders_" : ["%n mapa","%n mapi","%n mape","%n mape"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteki","%n datoteke","%n datotek"],
- "{dirs} and {files}" : "{dirs} in {files}",
- "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"],
- "You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.",
- "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"],
- "New" : "Novo",
- "Select file range" : "Izbor obsega datotek",
- "{used} of {quota} used" : "v uporabi je {used} od {quota}",
- "{used} used" : "v uporabi: {used}·",
- "\"{name}\" is an invalid file name." : "Ime »{name}« ni veljavno ime datoteke.",
- "File name cannot be empty." : "Ime datoteke ne sme biti prazno polje.",
- "\"/\" is not allowed inside a file name." : "znak » / « v imenu datoteke ni dovoljen.",
- "\"{name}\" is not an allowed filetype" : "Ime »{name}« ni dovoljena vrsta datoteke.",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Shramba uporabnika {owner} je do konca zasedena ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinska mapa »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Zunanja shramba »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaša shramba je skoraj do konca zasedena ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["se skladajo s filtrom »{filter}«","se skladajo s filtroma »{filter}«","se skladajo s filtri »{filter}«","se skladajo s filtri »{filter}«"],
- "View in folder" : "Pokaži v mapi",
- "Copied!" : "Kopirano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiraj neposredno povezavo (za uporabnike, ki imajo dostop do datoteke ali mape)",
- "Path" : "Pot",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
- "Favorited" : "Označeno kot priljubljeno",
- "Favorite" : "Priljubljene",
- "You can only favorite a single file or folder at a time" : "Kot priljubljeno je mogoče naenkrat označiti le eno datoteko ali mapo.",
- "New folder" : "Nova mapa",
- "Upload file" : "Pošlji datoteko",
- "Recent" : "Nedavne",
- "Not favorited" : "Ni priljubljeno",
- "Remove from favorites" : "Odstrani iz priljubljenih",
- "Add to favorites" : "Dodaj med priljubljene",
- "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
"Added to favorites" : "Dodano med priljubljene",
"Removed from favorites" : "Odstranjeno iz priljubljenih",
"You added {file} to your favorites" : "Med priljubljene dodate datoteko {file}",
"You removed {file} from your favorites" : "Odstranite datoteko {file} od priljubljenih",
+ "Favorites" : "Priljubljene",
"File changes" : "Spremembe datoteke",
"Created by {user}" : "{user} ustvari predmet",
"Changed by {user}" : "{user} spremeni predmet",
@@ -114,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "{user} obnovi predmet",
"Renamed by {user}" : "{user} preimenuje predmet",
"Moved by {user}" : "{user} premakne predmet",
- "\"remote user\"" : "»Oddaljen uporabnik«",
+ "\"remote account\"" : "»oddaljeni račun«",
"You created {file}" : "Ustvarite datoteko ali mapo {file}",
"You created an encrypted file in {file}" : "Ustvarite šifrirano datoteko v {file}",
"{user} created {file}" : "{user} ustvari datoteko {file}",
@@ -141,78 +40,418 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Premaknete datoteko {oldfile} v {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} premakne datoteko {oldfile} v {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je bila, ali dodana ali umaknjena iz <strong>priljubljenih</strong>",
+ "Files" : "Datoteke",
"A file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila datoteka ali mapa",
"A favorite file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila priljubljena datoteka ali mapa",
- "All files" : "Vse datoteke",
- "Unlimited" : "Neomejeno",
- "Upload (max. %s)" : "Pošiljanje (omejitev %s)",
+ "Failed to authorize" : "Overitev je spodletela",
+ "Invalid folder path" : "Neveljavna pot mape",
+ "Folder not found" : "Mape ni mogoče najti",
+ "The file cannot be found" : "Datoteke ni mogoče najti.",
+ "The destination path does not exist: %1$s" : "Cilja pot ne obstaja: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nimate pravice za stvarjenje datoteke na podani lokaciji",
+ "The file could not be converted." : "Datoteke ni mogoče pretvoriti.",
+ "Could not get relative path to converted file" : "Ni mogoče pridobiti relativne poti do pretvorjene datoteke.",
+ "Favorite files" : "Priljubljene datoteke",
+ "No favorites" : "Ni priljubljenih datotek",
+ "More favorites" : "Več priljubljenih",
"Accept" : "Sprejmi",
"Reject" : "Zavrni",
"Incoming ownership transfer from {user}" : "Vpisana je zahteva za prenos lastništva uporabnika {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ali želite sprejeti pot {path}?\n\nOpomba: po sprejetju lahko prenos traja tudi več kot 1 uro.",
+ "Ownership transfer denied" : "Prenos lastništva je spodletel",
+ "Your ownership transfer of {path} was denied by {user}." : "Prenos lastništva za {path} je onemogočil {user}.",
"Ownership transfer failed" : "Prenos lastništva je spodletel",
- "Your ownership transfer of {path} to {user} failed." : "Prenos vašega lastništva {path} na {user} je spodletelo",
- "The ownership transfer of {path} from {user} failed." : "Prenos lastništva {path} na {user} je spodletelo",
+ "Your ownership transfer of {path} to {user} failed." : "Prenos lastništva mesta {path} na uporabnika {user} je spodletel.",
+ "The ownership transfer of {path} from {user} failed." : "Prenos lastništva mesta {path} na uporabnika {user} je spodletel.",
"Ownership transfer done" : "Prenos lastništva je uspešno končan",
- "Your ownership transfer of {path} to {user} has completed." : "Prenos vašega lastništva {path} na uporabnika {user} je končan.",
- "The ownership transfer of {path} from {user} has completed." : "Prenos lastništva {path} z uporabnika {user} je končan.",
+ "Your ownership transfer of {path} to {user} has completed." : "Prenos lastništva poti {path} na uporabnika {user} je končan.",
+ "The ownership transfer of {path} from {user} has completed." : "Prenos lastništva poti {path} z uporabnika {user} je končan.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Preneseno iz %1$s na %2$s",
+ "Files compatibility" : "Skladnost datotek",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Dovoli omejitev imen datotek za zagotovitev sinhronizacije datotek z vsemi odjemalci. Privzeto je dovoljenje za vsa imena datotek na POSIX (tj. Linux ali macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po vklopu imen, ki so združljiva z WIndows, obstoječih datotek ni več mogoče spreminjati, jih pa lahko lastnik preimenuje v ustrezno ime.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Datoteke lahko po vklopu te možnosti tudi same migrirajo. Preverite dokumentacijo o ukazu occ.",
+ "Enforce Windows compatibility" : "Vsili skladnost s sistemom Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "To bo blokiralo imena datotek, ki niso ustrezna za Windows sisteme, kot so rezervirana imena ali posebni znaki, ne bo pa to vsililo združljivosti pri razlikovanju velikih in malih črk imena.",
"File Management" : "Upravljanje datotek",
- "Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
- "Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
- "Change" : "Spremeni",
- "New owner" : "Nov lastnik",
- "Search users" : "Iskanje uporabnikov",
+ "Home" : "Začetni pogled",
+ "Target folder does not exist any more" : "Ciljna mapa ne obstaja več",
+ "Reload current directory" : "Ponovno naloži trenutno mapo",
+ "Go to the \"{dir}\" directory" : "Pojdi v mapo »{dir}«",
+ "Current directory path" : "Trenutna pot mape",
+ "Your have used your space quota and cannot upload files anymore" : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
+ "You do not have permission to upload or create files here." : "Nimate pravic za ustvarjanje ali nalaganje datotek na to mesto.",
+ "Drag and drop files here to upload" : "Za pošiljanje potegnite in spustite datoteke na to mesto",
+ "Favorite" : "Priljubljene",
+ "Back" : "Nazaj",
+ "Toggle selection for file \"{displayName}\"" : "Preklopi izbor za datoteko \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Preklopi izbor za mapo \"{displayName}\"",
+ "File is loading" : "Poteka nalaganje datoteke",
+ "Folder is loading" : "mape",
+ "Filename" : "Ime datoteke",
+ "Folder name" : "Ime mape",
+ "This node is unavailable" : "To vozlišče ni na voljo.",
+ "Another entry with the same name already exists." : "Vpis z istim imenom že obstaja.",
+ "Invalid filename." : "Neveljavno ime datoteke",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Preimenuj »{oldName}« to »{newName}«",
+ "Rename file" : "Preimenuj datoteke",
+ "Folder" : "Mapa",
+ "Pending" : "Na čakanju ...",
+ "Unknown date" : "Neznani datum",
+ "Clear filter" : "Počisti filter",
+ "Modified" : "Spremenjeno",
+ "Search everywhere" : "Išči povsod",
+ "Type" : "Vrsta",
+ "Active filters" : "Dejavni filtri",
+ "Remove filter" : "Odstrani filter",
+ "Total rows summary" : "Skupni povzetek vrstic",
+ "Toggle selection for all files and folders" : "Preklopi izbor za vse datoteke in mape",
+ "Name" : "Ime",
+ "Size" : "Velikost",
+ "Actions" : "Dejanja",
+ "(selected)" : "(izbrano)",
+ "List of files and folders." : "Seznam datotek in map",
+ "You have used your space quota and cannot upload files anymore." : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
+ "Column headers with buttons are sortable." : "Naslove stolpcev z gumbi je mogoče sortirati.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali med brskanjem.",
+ "File not found" : "Datoteke ni mogoče najti",
+ "{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
+ "{used} of {quota} used" : "V uporabi je {used} od {quota}",
+ "{relative}% used" : "Zasedeno {relative} %",
+ "Could not refresh storage stats" : "Ni mogoče osvežiti podatkov shrambe",
+ "Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
+ "Storage information" : "Podrobnosti shrambe",
+ "Storage quota" : "Omejitev shrambe",
+ "New folder" : "Nova mapa",
+ "Create new folder" : "Ustvari novo mapo",
+ "This name is already in use." : "Vpisano uporabniško ime je že v uporabi",
+ "Create" : "Ustvari",
+ "Fill template fields" : "Zapolni polja predloge",
+ "Submitting fields …" : "Pošiljanje polj ...",
+ "Submit" : "Pošlji",
"Choose a file or folder to transfer" : "Izbor datoteke ali mape za prenos",
"Transfer" : "Prenos",
"Transfer {path} to {userid}" : "Prenesi pot {path} k uporabniku {userid}",
"Invalid path selected" : "Izbrana je neveljavna pot",
+ "Unknown error" : "Neznana napaka",
"Ownership transfer request sent" : "Zahteva za prenos lastništva je poslana",
- "Cannot transfer ownership of a file or folder you don't own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik",
- "Tags" : "Oznake",
- "Unable to change the favourite state of the file" : "Ni mogoče spremeniti stanja priljubljenosti datoteke",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik",
+ "Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
+ "Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
+ "Change" : "Spremeni",
+ "New owner" : "Nov lastnik",
+ "Keep {old}" : "Ohrani {old}",
+ "Keep without extension" : "Ohrani brez pripone",
+ "Use {new}" : "Uporabi {new}",
+ "Remove extension" : "Odstrani pripono",
+ "Change file extension" : "Spremeni pripono datoteke",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Sprememba končnice datoteke iz \"{old}\" v \"{new}\" lahko naredi datoteko neberljivo.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odstranitev končnice datoteke \"{old}\" lahko naredi datoteko neberljivo.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Dadajanje končnice datoteke \"{new}\" lahko naredi datoteko neberljivo.",
+ "Do not show this dialog again." : "Pogovornega okna ne pokaži več.",
+ "Select file or folder to link to" : "Izbor datoteke ali mape za povezavo",
+ "Choose {file}" : "Izberite datoteko {file}",
+ "Share" : "·Souporaba·",
+ "Shared by link" : "V souporabi sk povezavo",
+ "Shared" : "V souporabi",
+ "Switch to list view" : "Preklopi na seznamski pogled",
+ "Switch to grid view" : "Preklopi na mrežni pogled",
+ "The file could not be found" : "Datoteke ni mogoče najti.",
+ "Upload was cancelled by user" : "Uporabnik je pošiljanje preklical",
+ "Not enough free space" : "Ni dovolj prostora",
+ "Operation is blocked by access control" : "Opravilo je zaustavljeno prek nadzora dostopa",
+ "Error during upload: {message}" : "Napaka med nalaganjem: {message}",
+ "Error during upload, status code {status}" : "Napaka med nalaganje s kodo stanja {status}",
+ "Unknown error during upload" : "Med pošiljanjem je prišlo do neznane napake",
+ "Loading current folder" : "Poteka nalaganje trenutne mape",
+ "Retry" : "Poskusi znova ",
+ "No files in here" : "V mapi ni datotek",
+ "Upload some content or sync with your devices!" : "Uvozite vsebino, ali pa omogočite usklajevanje z napravami!",
+ "Go back" : "Skoči nazaj",
+ "Views" : "Pogledi",
+ "Files settings" : "Nastavitve datotek",
+ "Your files" : "Osebne datoteke",
+ "Open in files" : "Odpri datoteko v mapi",
+ "File cannot be accessed" : "Do datoteke dostop ni mogoč",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Datoteke ni bilo mogoče najti ali pa nimate ustreznih dovoljenj za ogled. Prosite pošiljatelja, da jo deli.",
+ "Clipboard is not available" : "Odložišče ni na voljo",
+ "General" : "Splošno",
+ "All files" : "Vse datoteke",
+ "Personal files" : "Osebne datoteke",
+ "Sort favorites first" : "Razvrsti najprej priljubljene",
+ "Sort folders before files" : "Razvrsti mape pred datotekami",
+ "Appearance" : "Videz",
+ "Show hidden files" : "Pokaži skrite datoteke",
+ "Crop image previews" : "Obreži slike predogleda",
+ "Additional settings" : "Dodatne nastavitve",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "Naslov URL WebDAV",
+ "Copy" : "Kopiraj",
+ "Warnings" : "Opozorila",
+ "Keyboard shortcuts" : "Tipkovne bližnjice",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
+ "Manage tags" : "Upravljanje oznak",
+ "Selection" : "Izbor",
+ "Select all files" : "Izberi vse datoteke",
+ "Deselect all" : "Odstrani celoten izbor",
+ "Navigation" : "Krmarjenje",
+ "View" : "Pogled",
+ "Toggle grid view" : "Preklopi mrežni pogled",
+ "Show those shortcuts" : "Pokaži tipkovne bližnjice",
+ "You" : "Jaz",
+ "Shared multiple times with different people" : "V več souporabah z različnimi uporabniki",
"Error while loading the file data" : "Prišlo je do napake med nalaganjem podatkov računa",
+ "Owner" : "Lastnik",
+ "Remove from favorites" : "Odstrani iz priljubljenih",
+ "Add to favorites" : "Dodaj med priljubljene",
+ "Tags" : "Oznake",
+ "Blank" : "Prazno",
+ "Unable to create new file from template" : "Nove datoteke iz predloge ni mogoče ustvariti",
"Pick a template for {name}" : "Izbor predloge za {name}",
- "Cancel" : "Prekliči",
- "Create" : "Ustvari",
"Create a new file with the selected template" : "Ustvari novo datoteko z izbrano predlogo",
"Creating file" : "Poteka ustvarjanje datoteke",
- "Blank" : "Prazno",
- "Unable to create new file from template" : "Nove datoteke iz predloge ni mogoče ustvariti",
- "Set up templates folder" : "Nastavitev mape predlog",
- "Templates" : "Predloge",
+ "Save as {displayName}" : "Shrani kot {displayName}",
+ "Save as …" : "Shrani kot ...",
+ "Converting files …" : "Poteka pretvarjanje datotek ...",
+ "Failed to convert files: {message}" : "Pretvarjanje datotek je spodletelo: {message}",
+ "All files failed to be converted" : "Spodletelo je pretvarjanje vseh datotek.",
+ "One file could not be converted: {message}" : "Ene datoteke ni mogoče pretvoriti: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n datoteke ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n datoteka je uspešno pretvorjena","%n datoteki sta uspešno pretvorjeni","%n datoteke so uspešno pretvorjene","%n datotek je uspešno pretvorjenih"],
+ "Files successfully converted" : "Datoteke so uspešno pretvorjene",
+ "Failed to convert files" : "Pretvarjanje datotek je spodletelo",
+ "Converting file …" : "Poteka pretvarjanje datoteke ...",
+ "File successfully converted" : "Datoteka je uspešno pretvorjena",
+ "Failed to convert file: {message}" : "Pretvarjanje datoteek je spodletelo: {message}",
+ "Failed to convert file" : "Pretvarjanje datoteke je spodletelo",
+ "Leave this share" : "Prekini to souporabo",
+ "Leave these shares" : "Prekini to souporabo",
+ "Disconnect storage" : "Odklopi shrambo",
+ "Disconnect storages" : "Odklopi shrambo",
+ "Delete permanently" : "Izbriši trajno",
+ "Delete and unshare" : "Izbriši in prekini souporabo",
+ "Delete file" : "Izbriši datoteko",
+ "Delete files" : "Izbriši datoteke",
+ "Delete folder" : "Izbriši mapo",
+ "Delete folders" : "Izbriši mape",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Za stalno boste izbrisali {count} predmet","Za stalno boste izbrisali {count} predmeta","Za stalno boste izbrisali {count} predmete","Za stalno boste izbrisali {count} predmetov"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Izbrisali boste {count} predmet","Izbrisali boste {count} predmeta","Izbrisali boste {count} predmete","Izbrisali boste {count} predmetov"],
+ "Confirm deletion" : "Potrdi brisanje",
+ "Cancel" : "Prekliči",
+ "Download" : "Prejmi",
+ "Moving \"{source}\" to \"{destination}\" …" : "Premik \"{source}\" v \"{destination}\"...",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiranje \"{source}\" v \"{destination}\"...",
+ "Destination is not a folder" : "Ciljno mesto ni mapa",
+ "This file/folder is already in that directory" : "Ta datoteka oziroma mapa je že v določeni mapi",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Mape ali datoteke ni mogoče premakniti samo vase oziroma v podmapo same sebe",
+ "(copy)" : "(kopija)",
+ "(copy %n)" : "(kopija %n)",
+ "A file or folder with that name already exists in this folder" : "Datoteka oziroma mapa s tem imenom v tej mapi že obstaja",
+ "The files are locked" : "Datoteke so zaklenjene",
+ "The file does not exist anymore" : "Datoteka ne obstaja več",
+ "Choose destination" : "Izbor ciljnega mesta",
+ "Copy to {target}" : "Kopiraj na {target}",
+ "Move to {target}" : "Premakni na {target}",
+ "Move" : "Premakni",
+ "Move or copy operation failed" : "Opravilo kopiranja oziroma premikanja je spodletelo",
+ "Move or copy" : "Premakni ali kopiraj",
+ "Open folder {displayName}" : "Odpri mapo {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Odpri krajevno",
+ "Failed to redirect to client" : "Preusmerjanje odjemalca je spodletelo",
+ "Open file locally" : "Odpri datoteko krajevno",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Datoteka bi se sedaj morala odpreti z vaše naprave. Če se to ne zgodi, preverite namestitev namizne aplikacije.",
+ "Retry and close" : "Ponovno poskusi in zapri",
+ "Open online" : "Odpri v brskalniku",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Pokaži v mapi",
+ "Today" : "Danes",
+ "Last 7 days" : "Zadnjih 7 dni",
+ "Last 30 days" : "Zadnjih 30 dni",
+ "This year ({year})" : "Letos ({year})",
+ "Last year ({year})" : "Lansko leto ({year})",
+ "Documents" : "Dokumenti",
+ "Spreadsheets" : "Preglednice",
+ "Presentations" : "Predstavitve",
+ "PDFs" : "Dokumenti PDF",
+ "Folders" : "Mape",
+ "Audio" : "Zvočni posnetek",
+ "Images" : "Slike",
+ "Videos" : "Video posnetki",
+ "Created new folder \"{name}\"" : "Ustvarjena je nova mapa »{name}«.",
"Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog",
- "%s used" : "Uporabljeno %s",
- "%s%% of %s used" : "Uporabljeno %s%% od %s",
- "%1$s of %2$s used" : "Uporabljeno %1$s od %2$s",
- "Settings" : "Nastavitve",
- "Show hidden files" : "Pokaži skrite datoteke",
- "Crop image previews" : "Obreži slike predogleda",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek prek WebDAV",
- "Toggle %1$s sublist" : "Preklopi podseznam %1$s",
- "Toggle grid view" : "Preklopi mrežni pogled",
- "No files in here" : "V mapi ni datotek",
- "Upload some content or sync with your devices!" : "Uvozite vsebino, ali pa omogočite usklajevanje z napravami!",
+ "Create templates folder" : "Ustvari mapo predlog",
+ "Templates" : "Predloge",
+ "New template folder" : "Nova mapa predlog",
+ "In folder" : "V mapi",
+ "Search in folder: {folder}" : "Išči v mapi: {folder}",
+ "One of the dropped files could not be processed" : "Eno od podanih datotek ni bilo mogoče obdelati",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Brskalnik ne podpira API datotečnega sistema. Mape ne bodo naložene",
+ "No files to upload" : "Ni datotek za pošiljanje",
+ "Unable to create the directory {directory}" : "Mape {directory} ni mogoče ustvariti",
+ "Some files could not be uploaded" : "Nekaterih datotek ni bilo mogoče poslati",
+ "Files uploaded successfully" : "Datoteke so uspešno poslane v oblak",
+ "No files to process" : "Ni datotek za obdelavo",
+ "Some files could not be copied" : "Nekaterih datotek ni bilo mogoče kopirati",
+ "Some files could not be moved" : "Nekaterih datotek ni mogoče premakniti",
+ "Files copied successfully" : "Datoteke so uspešno kopirane",
+ "Files moved successfully" : "Datoteke so uspešno premaknjene",
+ "Conflicts resolution skipped" : "Razreševanje sporov je preklicano",
+ "Upload cancelled" : "Pošiljanje je bilo preklicano",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Datoteke »{oldName}« ni mogoče preimenovati, ker ne obstaja več.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime »{newName}« je v mapi »{dir}« že v uporabi. Izbrati je treba drugačno ime.",
+ "Could not rename \"{oldName}\"" : "Datoteke »{oldName}« ni mogoče preimenovati",
+ "This operation is forbidden" : "To dejanje ni dovoljeno!",
+ "Storage is temporarily not available" : "Shramba trenutno ni na voljo",
+ "Unexpected error: {error}" : "Nepričakovana napaka: {error}",
+ "_%n file_::_%n files_" : ["%n datoteka","%n datoteki","%n datoteke","%n datotek"],
+ "_%n folder_::_%n folders_" : ["%n mapa","%n mapi","%n mape","%n mape"],
+ "_%n hidden_::_%n hidden_" : ["%n skrita","%n skriti","%n skrite","%n skritih"],
+ "Filename must not be empty." : "Ime datoteke ne sme biti prazno.",
+ "\"{char}\" is not allowed inside a filename." : "Znak \"{char}\" ni dovoljen v imenu datotek.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" je rezervirano ime in ni dovoljeno za ime datoteke.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ni dovoljena vrsta končnice.",
+ "Filenames must not end with \"{extension}\"." : "Imena datotek naj nimajo končnice \"{extension}\".",
+ "List of favorite files and folders." : "Seznam priljubljenih datotek in map.",
+ "No favorites yet" : "Ni še dodanih priljubljenih predmetov",
+ "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo zbrane na tem mestu.",
+ "List of your files and folders." : "Seznam datotek in map.",
+ "List of your files and folders that are not shared." : "Seznam datotek in map, ki niso v skupni rabi.",
+ "No personal files found" : "Ni najdenih zasebnih datotek",
+ "Files that are not shared will show up here." : "Datoteke, ki niso v skupni rabi, bodo prikazane tukaj.",
+ "Recent" : "Nedavne",
+ "List of recently modified files and folders." : "Seznam nedavno spremenjenih datotek in map.",
+ "No recently modified files" : "Ni nedavno spremenjenih datotek",
+ "Files and folders you recently modified will show up here." : "Nedavno spremenjene datoteke ali mape, bodo zbrane na tem mestu.",
+ "Search" : "Poišči",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
"Upload too large" : "Prekoračena je omejitev dovoljene velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
- "No favorites yet" : "Ni še dodanih priljubljenih predmetov",
- "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo zbrane na tem mestu.",
- "Deleted files" : "Izbrisane datoteke",
- "Shares" : "Souporaba",
- "Shared with others" : "V souporabi z drugimi",
- "Shared with you" : "V skupni rabi z vami",
- "Shared by link" : "V souporabi sk povezavo",
- "Deleted shares" : "Izbrisana mesta souporabe",
- "Pending shares" : "Predmeti za souporabo na čakanju",
+ "File could not be found" : "Datoteke ni mogoče najti",
+ "Show list view" : "Pokaži seznamski pogled",
+ "Show grid view" : "Pokaži mrežni pogled",
+ "Close" : "Zapri",
+ "Could not create folder \"{dir}\"" : "Mape »{dir}« ni mogoče ustvariti.",
+ "This will stop your current uploads." : "S tem bodo zaustavljena vsa pošiljanja v oblak.",
+ "Upload cancelled." : "Pošiljanje je preklicano.",
+ "Processing files …" : "Poteka obdelava datotek ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Datoteke {filename} ni mogoče poslati, saj je to mapa, ali pa je velikost datoteke 0 bajtov.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je le {size2}.",
+ "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa »{dir}« ne obstaja več.",
+ "An unknown error has occurred" : "Prišlo je do neznane napake!",
+ "File could not be uploaded" : "Datoteke ni mogoče poslati",
+ "Uploading …" : "Poteka pošiljanje ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Pošiljanje … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Pošiljate te vrste predmeta ni podprto.",
+ "Error when assembling chunks, status code {status}" : "Napaka pri sestavljanju kosov datoteke, koda stanja je {status}",
+ "Choose target folder" : "Izbor ciljne mape",
+ "Set reminder" : "Nastavi opomnik",
+ "Edit locally" : "Uredi krajevno",
+ "Open" : "Odpri",
+ "Could not load info for file \"{file}\"" : "Ni mogoče naložiti podatkov za datoteko »{file}«.",
+ "Please select tag(s) to add to the selection" : "Izbrati je treba oznake za dodajanje k izbiri",
+ "Apply tag(s) to selection" : "Poteka uveljavljanje oznak za izbiro",
+ "Select directory \"{dirName}\"" : "Izberi mapo »{dirName}«",
+ "Select file \"{fileName}\"" : "Izberi datoteko »{fileName}«.",
+ "Unable to determine date" : "Ni mogoče določiti datuma",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Mapa ni na voljo. Preverite dnevnik in stopite v stik s skrbnikom sistema.",
+ "Could not move \"{file}\", target exists" : "Datoteke »{file}« ni mogoče premakniti, ker na ciljnem mestu z istim imenom že obstaja.",
+ "Could not move \"{file}\"" : "Datoteke »{file}« ni mogoče premakniti",
+ "copy" : "kopija",
+ "Could not copy \"{file}\", target exists" : "Datoteke »{file}« ni mogoče kopirati, ker ta že obstaja.",
+ "Could not copy \"{file}\"" : "Datoteke »{file}« ni mogoče kopirati.",
+ "Copied {origin} inside {destination}" : "Kopirano {origin} v {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} in {nbfiles} ostale datoteke v {destination}",
+ "{newName} already exists" : "Ime {newName} že obstaja",
+ "Could not create file \"{file}\"" : "Datoteke »{file}« ni mogoče ustvariti.",
+ "Could not create file \"{file}\" because it already exists" : "Datoteke »{file}« ni mogoče ustvariti, ker datoteka z istim imenom že obstaja.",
+ "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape »{dir}«, ker ta že obstaja",
+ "Could not fetch file details \"{file}\"" : "Ni mogoče pridobiti podrobnosti datoteke »{file}«.",
+ "Error deleting file \"{fileName}\"." : "Prišli je do napake med brisanjem datoteke »{fileName}«.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Za iskalni niz {tag}{filter}{endtag} ni zadetkov v nobeni mapi",
+ "Enter more than two characters to search in other folders" : "Vpišite več kot dva znaka za iskanje po drugih mapah",
+ "{dirs} and {files}" : "{dirs} in {files}",
+ "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"],
+ "You do not have permission to upload or create files here" : "Ni ustreznih dovoljenja za pošiljanje ali ustvarjanje novih datotek",
+ "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"],
+ "New" : "Novo",
+ "New file/folder menu" : "Nov meni datoteke/mape",
+ "Select file range" : "Izbor obsega datotek",
+ "{used}%" : "{used} %",
+ "{used} used" : "V uporabi je {used}",
+ "\"{name}\" is an invalid file name." : "Ime »{name}« ni veljavno ime datoteke.",
+ "File name cannot be empty." : "Ime datoteke ne sme biti prazno polje.",
+ "\"/\" is not allowed inside a file name." : "znak » / « v imenu datoteke ni dovoljen.",
+ "\"{name}\" is not an allowed filetype" : "Ime »{name}« ni dovoljena vrsta datoteke.",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Shramba uporabnika {owner} je do konca zasedena ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinska mapa »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Zunanja shramba »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaša shramba je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["se skladajo s filtrom »{filter}«","se skladajo s filtroma »{filter}«","se skladajo s filtri »{filter}«","se skladajo s filtri »{filter}«"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kopirana je neposredna povezava (za uporabnike, ki imajo dostop do datoteke ali mape)",
+ "Path" : "Pot",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
+ "Favored" : "Priljubljeno",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiraj neposredno povezavo (za uporabnike, ki imajo dostop do datoteke ali mape)",
+ "Upload file" : "Pošlji datoteko",
+ "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
+ "Upload (max. %s)" : "Pošiljanje (omejitev %s)",
+ "\"{displayName}\" action executed successfully" : "Dejanje »{displayName}« je uspešno izvedeno",
+ "\"{displayName}\" action failed" : "Dejanje »{displayName}« je spodletelo",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ni uspel za nekatere elemente",
+ "\"{displayName}\" batch action executed successfully" : "Paketno dejanje »{displayName}« je uspešno izvedeno",
+ "Submitting fields…" : "Poteka objavljanje vsebine polj ...",
+ "Filter filenames…" : "Filtriraj imena datotek ...",
+ "WebDAV URL copied to clipboard" : "Naslov URL WebDAV je kopiran v odložišče",
+ "Enable the grid view" : "Omogoči mrežni pogled",
+ "Enable folder tree" : "Omogoči drevesno strukturo map",
+ "Copy to clipboard" : "Kopiraj v odložišče",
+ "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
+ "Deletion cancelled" : "Brisanje je bilo preklicano",
+ "Move cancelled" : "Premikanje je bilo preklicano",
+ "Cancelled move or copy of \"{filename}\"." : "Prekinjeno premikanje ali kopiranje za \"{filename}\".",
+ "Cancelled move or copy operation" : "Opravilo kopiranje in premikanja je preklicano",
+ "Open details" : "Odpri podrobnosti",
+ "Photos and images" : "Slike in fotografije",
+ "New folder creation cancelled" : "Ustvarjanje nove mape je bilo preklicano",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapa","{folderCount} mapi","{folderCount} mape","{folderCount} map"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} datoteka","{fileCount} datoteki","{fileCount} datoteke","{fileCount} datotek"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 datoteka in {folderCount} mapa","1 datoteka in {folderCount} mapi","1 datoteka in {folderCount} mape","1 datoteka in {folderCount} map"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} datoteka in 1 mapa","{fileCount} datoteki in 1 mapa","{fileCount} datoteke in 1 mapa","{fileCount} datotek in 1 mapa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} datotek in {folderCount} map",
+ "All folders" : "Vse mape",
+ "Personal Files" : "Osebne datoteke",
"Text file" : "Besedilna datoteka",
"New text file.txt" : "nova_datoteka.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom »{filter}«","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"]
+ "Filter file names …" : "Filtriraj imena datotek...",
+ "Prevent warning dialogs from open or reenable them." : "Preprečite odpiranje dialogov z opozorili ali jih ponovno omogočite.",
+ "Show a warning dialog when changing a file extension." : "Prikaži opozorilo ob spreminjanju končnice datoteke.",
+ "Speed up your Files experience with these quick shortcuts." : "Pospešite uporabo upravljalnika Files s temi bližnjicami.",
+ "Open the actions menu for a file" : "Odpri meni dejanj za datoteko",
+ "Rename a file" : "Preimenuj datoteko",
+ "Delete a file" : "Izbriši datoteko",
+ "Favorite or remove a file from favorites" : "Označi ali odstrani koz priljubljeno",
+ "Manage tags for a file" : "Upravljanje oznak datoteke",
+ "Deselect all files" : "Ostrani izbor vseh datotek",
+ "Select or deselect a file" : "Izberi ali odstrani izbor datoteke",
+ "Select a range of files" : "Izbor obsega datotek",
+ "Navigate to the parent folder" : "Pojdi na nadrejeni imenik",
+ "Navigate to the file above" : "Pojdi na datoteko zgoraj",
+ "Navigate to the file below" : "Pojdi na doatoteko spodaj",
+ "Navigate to the file on the left (in grid mode)" : "Pojdi na datoteko na levi (v mrežnem načinu)",
+ "Navigate to the file on the right (in grid mode)" : "Pojdi na datoteko na desni (v mrežnem načinu)",
+ "Toggle the grid view" : "Preklopi mrežni način",
+ "Open the sidebar for a file" : "Odpri stranski pano datoteke"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 6e4c7f76744..13547704207 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -1,110 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Shramba trenutno ni na voljo",
- "Storage invalid" : "Mesto shrambe ni veljavno",
- "Unknown error" : "Neznana napaka",
- "File could not be found" : "Datoteke ni mogoče najti",
- "Move or copy" : "Premakni ali kopiraj",
- "Download" : "Prejmi",
- "Delete" : "Izbriši",
- "Home" : "Začetni pogled",
- "Close" : "Zapri",
- "Favorites" : "Priljubljene",
- "Could not create folder \"{dir}\"" : "Mape »{dir}« ni mogoče ustvariti.",
- "This will stop your current uploads." : "S tem bodo zaustavljena vsa pošiljanja v oblak.",
- "Upload cancelled." : "Pošiljanje je preklicano.",
- "Processing files …" : "Poteka obdelava datotek ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Datoteke {filename} ni mogoče poslati, saj je to mapa, ali pa je velikost datoteke 0 bajtov.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je le {size2}.",
- "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa »{dir}« ne obstaja več.",
- "Not enough free space" : "Ni dovolj prostora",
- "An unknown error has occurred" : "Prišlo je do neznane napake!",
- "Uploading …" : "Poteka pošiljanje ...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Pošiljate te vrste predmeta ni podprto.",
- "Target folder does not exist any more" : "Ciljna mapa ne obstaja več",
- "Operation is blocked by access control" : "Opravilo je zaustavljeno prek nadzora dostopa",
- "Error when assembling chunks, status code {status}" : "Napaka pri sestavljanju kosov datoteke, koda stanja je {status}",
- "Actions" : "Dejanja",
- "Rename" : "Preimenuj",
- "Copy" : "Kopiraj",
- "Choose target folder" : "Izbor ciljne mape",
- "Open" : "Odpri",
- "Delete file" : "Izbriši datoteko",
- "Delete folder" : "Izbriši mapo",
- "Disconnect storage" : "Odklopi shrambo",
- "Leave this share" : "Zapusti to mesto souporabe",
- "Could not load info for file \"{file}\"" : "Ni mogoče naložiti podatkov za datoteko »{file}«.",
- "Files" : "Datoteke",
- "Details" : "Podrobnosti",
- "Select" : "Izbor",
- "Pending" : "Na čakanju ...",
- "Unable to determine date" : "Ni mogoče določiti datuma",
- "This operation is forbidden" : "To dejanje ni dovoljeno!",
- "This directory is unavailable, please check the logs or contact the administrator" : "Mapa ni na voljo. Preverite dnevnik in stopite v stik s skrbnikom sistema.",
- "Could not move \"{file}\", target exists" : "Datoteke »{file}« ni mogoče premakniti, ker na ciljnem mestu z istim imenom že obstaja.",
- "Could not move \"{file}\"" : "Datoteke »{file}« ni mogoče premakniti",
- "copy" : "kopija",
- "Could not copy \"{file}\", target exists" : "Datoteke »{file}« ni mogoče kopirati, ker ta že obstaja.",
- "Could not copy \"{file}\"" : "Datoteke »{file}« ni mogoče kopirati.",
- "Copied {origin} inside {destination}" : "Kopirano {origin} v {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} in {nbfiles} ostale datoteke v {destination}",
- "{newName} already exists" : "Ime {newName} že obstaja",
- "Could not rename \"{fileName}\", it does not exist any more" : "Datoteke »{fileName}« ni mogoče preimenovati, ker ne obstaja več",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime \"{targetName}\" je že v uporabi v mapi \"{dir}\". Izberati je treba drugačno ime.",
- "Could not rename \"{fileName}\"" : "Datoteke »{fileName}« ni mogoče preimenovati",
- "Could not create file \"{file}\"" : "Datoteke »{file}« ni mogoče ustvariti.",
- "Could not create file \"{file}\" because it already exists" : "Datoteke »{file}« ni mogoče ustvariti, ker datoteka z istim imenom že obstaja.",
- "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape »{dir}«, ker ta že obstaja",
- "Could not fetch file details \"{file}\"" : "Ni mogoče pridobiti podrobnosti datoteke »{file}«.",
- "Error deleting file \"{fileName}\"." : "Prišli je do napake med brisanjem datoteke »{fileName}«.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Za iskalni niz {tag}{filter}{endtag} ni zadetkov v nobeni mapi",
- "Enter more than two characters to search in other folders" : "Vpišite več kot dva znaka za iskanje po drugih mapah",
- "Name" : "Ime",
- "Size" : "Velikost",
- "Modified" : "Spremenjeno",
- "_%n folder_::_%n folders_" : ["%n mapa","%n mapi","%n mape","%n mape"],
- "_%n file_::_%n files_" : ["%n datoteka","%n datoteki","%n datoteke","%n datotek"],
- "{dirs} and {files}" : "{dirs} in {files}",
- "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"],
- "You don’t have permission to upload or create files here" : "Ni ustreznih dovoljenj za pošiljanje in ustvarjanje datotek na tem mestu.",
- "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"],
- "New" : "Novo",
- "Select file range" : "Izbor obsega datotek",
- "{used} of {quota} used" : "v uporabi je {used} od {quota}",
- "{used} used" : "v uporabi: {used}·",
- "\"{name}\" is an invalid file name." : "Ime »{name}« ni veljavno ime datoteke.",
- "File name cannot be empty." : "Ime datoteke ne sme biti prazno polje.",
- "\"/\" is not allowed inside a file name." : "znak » / « v imenu datoteke ni dovoljen.",
- "\"{name}\" is not an allowed filetype" : "Ime »{name}« ni dovoljena vrsta datoteke.",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Shramba uporabnika {owner} je do konca zasedena ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinska mapa »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Zunanja shramba »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Vaša shramba je skoraj do konca zasedena ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["se skladajo s filtrom »{filter}«","se skladajo s filtroma »{filter}«","se skladajo s filtri »{filter}«","se skladajo s filtri »{filter}«"],
- "View in folder" : "Pokaži v mapi",
- "Copied!" : "Kopirano!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiraj neposredno povezavo (za uporabnike, ki imajo dostop do datoteke ali mape)",
- "Path" : "Pot",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
- "Favorited" : "Označeno kot priljubljeno",
- "Favorite" : "Priljubljene",
- "You can only favorite a single file or folder at a time" : "Kot priljubljeno je mogoče naenkrat označiti le eno datoteko ali mapo.",
- "New folder" : "Nova mapa",
- "Upload file" : "Pošlji datoteko",
- "Recent" : "Nedavne",
- "Not favorited" : "Ni priljubljeno",
- "Remove from favorites" : "Odstrani iz priljubljenih",
- "Add to favorites" : "Dodaj med priljubljene",
- "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
"Added to favorites" : "Dodano med priljubljene",
"Removed from favorites" : "Odstranjeno iz priljubljenih",
"You added {file} to your favorites" : "Med priljubljene dodate datoteko {file}",
"You removed {file} from your favorites" : "Odstranite datoteko {file} od priljubljenih",
+ "Favorites" : "Priljubljene",
"File changes" : "Spremembe datoteke",
"Created by {user}" : "{user} ustvari predmet",
"Changed by {user}" : "{user} spremeni predmet",
@@ -112,7 +11,7 @@
"Restored by {user}" : "{user} obnovi predmet",
"Renamed by {user}" : "{user} preimenuje predmet",
"Moved by {user}" : "{user} premakne predmet",
- "\"remote user\"" : "»Oddaljen uporabnik«",
+ "\"remote account\"" : "»oddaljeni račun«",
"You created {file}" : "Ustvarite datoteko ali mapo {file}",
"You created an encrypted file in {file}" : "Ustvarite šifrirano datoteko v {file}",
"{user} created {file}" : "{user} ustvari datoteko {file}",
@@ -139,78 +38,418 @@
"You moved {oldfile} to {newfile}" : "Premaknete datoteko {oldfile} v {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} premakne datoteko {oldfile} v {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Datoteka je bila, ali dodana ali umaknjena iz <strong>priljubljenih</strong>",
+ "Files" : "Datoteke",
"A file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila datoteka ali mapa",
"A favorite file or folder has been <strong>changed</strong>" : "<strong>Spremenjena</strong> je bila priljubljena datoteka ali mapa",
- "All files" : "Vse datoteke",
- "Unlimited" : "Neomejeno",
- "Upload (max. %s)" : "Pošiljanje (omejitev %s)",
+ "Failed to authorize" : "Overitev je spodletela",
+ "Invalid folder path" : "Neveljavna pot mape",
+ "Folder not found" : "Mape ni mogoče najti",
+ "The file cannot be found" : "Datoteke ni mogoče najti.",
+ "The destination path does not exist: %1$s" : "Cilja pot ne obstaja: %1$s",
+ "You do not have permission to create a file at the specified location" : "Nimate pravice za stvarjenje datoteke na podani lokaciji",
+ "The file could not be converted." : "Datoteke ni mogoče pretvoriti.",
+ "Could not get relative path to converted file" : "Ni mogoče pridobiti relativne poti do pretvorjene datoteke.",
+ "Favorite files" : "Priljubljene datoteke",
+ "No favorites" : "Ni priljubljenih datotek",
+ "More favorites" : "Več priljubljenih",
"Accept" : "Sprejmi",
"Reject" : "Zavrni",
"Incoming ownership transfer from {user}" : "Vpisana je zahteva za prenos lastništva uporabnika {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Ali želite sprejeti pot {path}?\n\nOpomba: po sprejetju lahko prenos traja tudi več kot 1 uro.",
+ "Ownership transfer denied" : "Prenos lastništva je spodletel",
+ "Your ownership transfer of {path} was denied by {user}." : "Prenos lastništva za {path} je onemogočil {user}.",
"Ownership transfer failed" : "Prenos lastništva je spodletel",
- "Your ownership transfer of {path} to {user} failed." : "Prenos vašega lastništva {path} na {user} je spodletelo",
- "The ownership transfer of {path} from {user} failed." : "Prenos lastništva {path} na {user} je spodletelo",
+ "Your ownership transfer of {path} to {user} failed." : "Prenos lastništva mesta {path} na uporabnika {user} je spodletel.",
+ "The ownership transfer of {path} from {user} failed." : "Prenos lastništva mesta {path} na uporabnika {user} je spodletel.",
"Ownership transfer done" : "Prenos lastništva je uspešno končan",
- "Your ownership transfer of {path} to {user} has completed." : "Prenos vašega lastništva {path} na uporabnika {user} je končan.",
- "The ownership transfer of {path} from {user} has completed." : "Prenos lastništva {path} z uporabnika {user} je končan.",
+ "Your ownership transfer of {path} to {user} has completed." : "Prenos lastništva poti {path} na uporabnika {user} je končan.",
+ "The ownership transfer of {path} from {user} has completed." : "Prenos lastništva poti {path} z uporabnika {user} je končan.",
"in %s" : "v %s",
+ "Transferred from %1$s on %2$s" : "Preneseno iz %1$s na %2$s",
+ "Files compatibility" : "Skladnost datotek",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Dovoli omejitev imen datotek za zagotovitev sinhronizacije datotek z vsemi odjemalci. Privzeto je dovoljenje za vsa imena datotek na POSIX (tj. Linux ali macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Po vklopu imen, ki so združljiva z WIndows, obstoječih datotek ni več mogoče spreminjati, jih pa lahko lastnik preimenuje v ustrezno ime.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Datoteke lahko po vklopu te možnosti tudi same migrirajo. Preverite dokumentacijo o ukazu occ.",
+ "Enforce Windows compatibility" : "Vsili skladnost s sistemom Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "To bo blokiralo imena datotek, ki niso ustrezna za Windows sisteme, kot so rezervirana imena ali posebni znaki, ne bo pa to vsililo združljivosti pri razlikovanju velikih in malih črk imena.",
"File Management" : "Upravljanje datotek",
- "Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
- "Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
- "Change" : "Spremeni",
- "New owner" : "Nov lastnik",
- "Search users" : "Iskanje uporabnikov",
+ "Home" : "Začetni pogled",
+ "Target folder does not exist any more" : "Ciljna mapa ne obstaja več",
+ "Reload current directory" : "Ponovno naloži trenutno mapo",
+ "Go to the \"{dir}\" directory" : "Pojdi v mapo »{dir}«",
+ "Current directory path" : "Trenutna pot mape",
+ "Your have used your space quota and cannot upload files anymore" : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
+ "You do not have permission to upload or create files here." : "Nimate pravic za ustvarjanje ali nalaganje datotek na to mesto.",
+ "Drag and drop files here to upload" : "Za pošiljanje potegnite in spustite datoteke na to mesto",
+ "Favorite" : "Priljubljene",
+ "Back" : "Nazaj",
+ "Toggle selection for file \"{displayName}\"" : "Preklopi izbor za datoteko \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Preklopi izbor za mapo \"{displayName}\"",
+ "File is loading" : "Poteka nalaganje datoteke",
+ "Folder is loading" : "mape",
+ "Filename" : "Ime datoteke",
+ "Folder name" : "Ime mape",
+ "This node is unavailable" : "To vozlišče ni na voljo.",
+ "Another entry with the same name already exists." : "Vpis z istim imenom že obstaja.",
+ "Invalid filename." : "Neveljavno ime datoteke",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Preimenuj »{oldName}« to »{newName}«",
+ "Rename file" : "Preimenuj datoteke",
+ "Folder" : "Mapa",
+ "Pending" : "Na čakanju ...",
+ "Unknown date" : "Neznani datum",
+ "Clear filter" : "Počisti filter",
+ "Modified" : "Spremenjeno",
+ "Search everywhere" : "Išči povsod",
+ "Type" : "Vrsta",
+ "Active filters" : "Dejavni filtri",
+ "Remove filter" : "Odstrani filter",
+ "Total rows summary" : "Skupni povzetek vrstic",
+ "Toggle selection for all files and folders" : "Preklopi izbor za vse datoteke in mape",
+ "Name" : "Ime",
+ "Size" : "Velikost",
+ "Actions" : "Dejanja",
+ "(selected)" : "(izbrano)",
+ "List of files and folders." : "Seznam datotek in map",
+ "You have used your space quota and cannot upload files anymore." : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
+ "Column headers with buttons are sortable." : "Naslove stolpcev z gumbi je mogoče sortirati.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali med brskanjem.",
+ "File not found" : "Datoteke ni mogoče najti",
+ "{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
+ "{used} of {quota} used" : "V uporabi je {used} od {quota}",
+ "{relative}% used" : "Zasedeno {relative} %",
+ "Could not refresh storage stats" : "Ni mogoče osvežiti podatkov shrambe",
+ "Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
+ "Storage information" : "Podrobnosti shrambe",
+ "Storage quota" : "Omejitev shrambe",
+ "New folder" : "Nova mapa",
+ "Create new folder" : "Ustvari novo mapo",
+ "This name is already in use." : "Vpisano uporabniško ime je že v uporabi",
+ "Create" : "Ustvari",
+ "Fill template fields" : "Zapolni polja predloge",
+ "Submitting fields …" : "Pošiljanje polj ...",
+ "Submit" : "Pošlji",
"Choose a file or folder to transfer" : "Izbor datoteke ali mape za prenos",
"Transfer" : "Prenos",
"Transfer {path} to {userid}" : "Prenesi pot {path} k uporabniku {userid}",
"Invalid path selected" : "Izbrana je neveljavna pot",
+ "Unknown error" : "Neznana napaka",
"Ownership transfer request sent" : "Zahteva za prenos lastništva je poslana",
- "Cannot transfer ownership of a file or folder you don't own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik",
- "Tags" : "Oznake",
- "Unable to change the favourite state of the file" : "Ni mogoče spremeniti stanja priljubljenosti datoteke",
+ "Cannot transfer ownership of a file or folder you do not own" : "Ni mogoče prenesti lastništva datotek in map, katerih niste lastnik",
+ "Transfer ownership of a file or folder" : "Prenos lastništva datoteke ali mape",
+ "Choose file or folder to transfer" : "Izbor datoteke ali mape za prenos",
+ "Change" : "Spremeni",
+ "New owner" : "Nov lastnik",
+ "Keep {old}" : "Ohrani {old}",
+ "Keep without extension" : "Ohrani brez pripone",
+ "Use {new}" : "Uporabi {new}",
+ "Remove extension" : "Odstrani pripono",
+ "Change file extension" : "Spremeni pripono datoteke",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Sprememba končnice datoteke iz \"{old}\" v \"{new}\" lahko naredi datoteko neberljivo.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Odstranitev končnice datoteke \"{old}\" lahko naredi datoteko neberljivo.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Dadajanje končnice datoteke \"{new}\" lahko naredi datoteko neberljivo.",
+ "Do not show this dialog again." : "Pogovornega okna ne pokaži več.",
+ "Select file or folder to link to" : "Izbor datoteke ali mape za povezavo",
+ "Choose {file}" : "Izberite datoteko {file}",
+ "Share" : "·Souporaba·",
+ "Shared by link" : "V souporabi sk povezavo",
+ "Shared" : "V souporabi",
+ "Switch to list view" : "Preklopi na seznamski pogled",
+ "Switch to grid view" : "Preklopi na mrežni pogled",
+ "The file could not be found" : "Datoteke ni mogoče najti.",
+ "Upload was cancelled by user" : "Uporabnik je pošiljanje preklical",
+ "Not enough free space" : "Ni dovolj prostora",
+ "Operation is blocked by access control" : "Opravilo je zaustavljeno prek nadzora dostopa",
+ "Error during upload: {message}" : "Napaka med nalaganjem: {message}",
+ "Error during upload, status code {status}" : "Napaka med nalaganje s kodo stanja {status}",
+ "Unknown error during upload" : "Med pošiljanjem je prišlo do neznane napake",
+ "Loading current folder" : "Poteka nalaganje trenutne mape",
+ "Retry" : "Poskusi znova ",
+ "No files in here" : "V mapi ni datotek",
+ "Upload some content or sync with your devices!" : "Uvozite vsebino, ali pa omogočite usklajevanje z napravami!",
+ "Go back" : "Skoči nazaj",
+ "Views" : "Pogledi",
+ "Files settings" : "Nastavitve datotek",
+ "Your files" : "Osebne datoteke",
+ "Open in files" : "Odpri datoteko v mapi",
+ "File cannot be accessed" : "Do datoteke dostop ni mogoč",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Datoteke ni bilo mogoče najti ali pa nimate ustreznih dovoljenj za ogled. Prosite pošiljatelja, da jo deli.",
+ "Clipboard is not available" : "Odložišče ni na voljo",
+ "General" : "Splošno",
+ "All files" : "Vse datoteke",
+ "Personal files" : "Osebne datoteke",
+ "Sort favorites first" : "Razvrsti najprej priljubljene",
+ "Sort folders before files" : "Razvrsti mape pred datotekami",
+ "Appearance" : "Videz",
+ "Show hidden files" : "Pokaži skrite datoteke",
+ "Crop image previews" : "Obreži slike predogleda",
+ "Additional settings" : "Dodatne nastavitve",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "Naslov URL WebDAV",
+ "Copy" : "Kopiraj",
+ "Warnings" : "Opozorila",
+ "Keyboard shortcuts" : "Tipkovne bližnjice",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
+ "Manage tags" : "Upravljanje oznak",
+ "Selection" : "Izbor",
+ "Select all files" : "Izberi vse datoteke",
+ "Deselect all" : "Odstrani celoten izbor",
+ "Navigation" : "Krmarjenje",
+ "View" : "Pogled",
+ "Toggle grid view" : "Preklopi mrežni pogled",
+ "Show those shortcuts" : "Pokaži tipkovne bližnjice",
+ "You" : "Jaz",
+ "Shared multiple times with different people" : "V več souporabah z različnimi uporabniki",
"Error while loading the file data" : "Prišlo je do napake med nalaganjem podatkov računa",
+ "Owner" : "Lastnik",
+ "Remove from favorites" : "Odstrani iz priljubljenih",
+ "Add to favorites" : "Dodaj med priljubljene",
+ "Tags" : "Oznake",
+ "Blank" : "Prazno",
+ "Unable to create new file from template" : "Nove datoteke iz predloge ni mogoče ustvariti",
"Pick a template for {name}" : "Izbor predloge za {name}",
- "Cancel" : "Prekliči",
- "Create" : "Ustvari",
"Create a new file with the selected template" : "Ustvari novo datoteko z izbrano predlogo",
"Creating file" : "Poteka ustvarjanje datoteke",
- "Blank" : "Prazno",
- "Unable to create new file from template" : "Nove datoteke iz predloge ni mogoče ustvariti",
- "Set up templates folder" : "Nastavitev mape predlog",
- "Templates" : "Predloge",
+ "Save as {displayName}" : "Shrani kot {displayName}",
+ "Save as …" : "Shrani kot ...",
+ "Converting files …" : "Poteka pretvarjanje datotek ...",
+ "Failed to convert files: {message}" : "Pretvarjanje datotek je spodletelo: {message}",
+ "All files failed to be converted" : "Spodletelo je pretvarjanje vseh datotek.",
+ "One file could not be converted: {message}" : "Ene datoteke ni mogoče pretvoriti: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n datoteke ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti","%n datotek ni mogoče pretvoriti"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n datoteka je uspešno pretvorjena","%n datoteki sta uspešno pretvorjeni","%n datoteke so uspešno pretvorjene","%n datotek je uspešno pretvorjenih"],
+ "Files successfully converted" : "Datoteke so uspešno pretvorjene",
+ "Failed to convert files" : "Pretvarjanje datotek je spodletelo",
+ "Converting file …" : "Poteka pretvarjanje datoteke ...",
+ "File successfully converted" : "Datoteka je uspešno pretvorjena",
+ "Failed to convert file: {message}" : "Pretvarjanje datoteek je spodletelo: {message}",
+ "Failed to convert file" : "Pretvarjanje datoteke je spodletelo",
+ "Leave this share" : "Prekini to souporabo",
+ "Leave these shares" : "Prekini to souporabo",
+ "Disconnect storage" : "Odklopi shrambo",
+ "Disconnect storages" : "Odklopi shrambo",
+ "Delete permanently" : "Izbriši trajno",
+ "Delete and unshare" : "Izbriši in prekini souporabo",
+ "Delete file" : "Izbriši datoteko",
+ "Delete files" : "Izbriši datoteke",
+ "Delete folder" : "Izbriši mapo",
+ "Delete folders" : "Izbriši mape",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Za stalno boste izbrisali {count} predmet","Za stalno boste izbrisali {count} predmeta","Za stalno boste izbrisali {count} predmete","Za stalno boste izbrisali {count} predmetov"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Izbrisali boste {count} predmet","Izbrisali boste {count} predmeta","Izbrisali boste {count} predmete","Izbrisali boste {count} predmetov"],
+ "Confirm deletion" : "Potrdi brisanje",
+ "Cancel" : "Prekliči",
+ "Download" : "Prejmi",
+ "Moving \"{source}\" to \"{destination}\" …" : "Premik \"{source}\" v \"{destination}\"...",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiranje \"{source}\" v \"{destination}\"...",
+ "Destination is not a folder" : "Ciljno mesto ni mapa",
+ "This file/folder is already in that directory" : "Ta datoteka oziroma mapa je že v določeni mapi",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Mape ali datoteke ni mogoče premakniti samo vase oziroma v podmapo same sebe",
+ "(copy)" : "(kopija)",
+ "(copy %n)" : "(kopija %n)",
+ "A file or folder with that name already exists in this folder" : "Datoteka oziroma mapa s tem imenom v tej mapi že obstaja",
+ "The files are locked" : "Datoteke so zaklenjene",
+ "The file does not exist anymore" : "Datoteka ne obstaja več",
+ "Choose destination" : "Izbor ciljnega mesta",
+ "Copy to {target}" : "Kopiraj na {target}",
+ "Move to {target}" : "Premakni na {target}",
+ "Move" : "Premakni",
+ "Move or copy operation failed" : "Opravilo kopiranja oziroma premikanja je spodletelo",
+ "Move or copy" : "Premakni ali kopiraj",
+ "Open folder {displayName}" : "Odpri mapo {displayName}",
+ "Open in Files" : "Open in Files",
+ "Open locally" : "Odpri krajevno",
+ "Failed to redirect to client" : "Preusmerjanje odjemalca je spodletelo",
+ "Open file locally" : "Odpri datoteko krajevno",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Datoteka bi se sedaj morala odpreti z vaše naprave. Če se to ne zgodi, preverite namestitev namizne aplikacije.",
+ "Retry and close" : "Ponovno poskusi in zapri",
+ "Open online" : "Odpri v brskalniku",
+ "Details" : "Podrobnosti",
+ "View in folder" : "Pokaži v mapi",
+ "Today" : "Danes",
+ "Last 7 days" : "Zadnjih 7 dni",
+ "Last 30 days" : "Zadnjih 30 dni",
+ "This year ({year})" : "Letos ({year})",
+ "Last year ({year})" : "Lansko leto ({year})",
+ "Documents" : "Dokumenti",
+ "Spreadsheets" : "Preglednice",
+ "Presentations" : "Predstavitve",
+ "PDFs" : "Dokumenti PDF",
+ "Folders" : "Mape",
+ "Audio" : "Zvočni posnetek",
+ "Images" : "Slike",
+ "Videos" : "Video posnetki",
+ "Created new folder \"{name}\"" : "Ustvarjena je nova mapa »{name}«.",
"Unable to initialize the templates directory" : "Ni mogoče začeti mape predlog",
- "%s used" : "Uporabljeno %s",
- "%s%% of %s used" : "Uporabljeno %s%% od %s",
- "%1$s of %2$s used" : "Uporabljeno %1$s od %2$s",
- "Settings" : "Nastavitve",
- "Show hidden files" : "Pokaži skrite datoteke",
- "Crop image previews" : "Obreži slike predogleda",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek prek WebDAV",
- "Toggle %1$s sublist" : "Preklopi podseznam %1$s",
- "Toggle grid view" : "Preklopi mrežni pogled",
- "No files in here" : "V mapi ni datotek",
- "Upload some content or sync with your devices!" : "Uvozite vsebino, ali pa omogočite usklajevanje z napravami!",
+ "Create templates folder" : "Ustvari mapo predlog",
+ "Templates" : "Predloge",
+ "New template folder" : "Nova mapa predlog",
+ "In folder" : "V mapi",
+ "Search in folder: {folder}" : "Išči v mapi: {folder}",
+ "One of the dropped files could not be processed" : "Eno od podanih datotek ni bilo mogoče obdelati",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Brskalnik ne podpira API datotečnega sistema. Mape ne bodo naložene",
+ "No files to upload" : "Ni datotek za pošiljanje",
+ "Unable to create the directory {directory}" : "Mape {directory} ni mogoče ustvariti",
+ "Some files could not be uploaded" : "Nekaterih datotek ni bilo mogoče poslati",
+ "Files uploaded successfully" : "Datoteke so uspešno poslane v oblak",
+ "No files to process" : "Ni datotek za obdelavo",
+ "Some files could not be copied" : "Nekaterih datotek ni bilo mogoče kopirati",
+ "Some files could not be moved" : "Nekaterih datotek ni mogoče premakniti",
+ "Files copied successfully" : "Datoteke so uspešno kopirane",
+ "Files moved successfully" : "Datoteke so uspešno premaknjene",
+ "Conflicts resolution skipped" : "Razreševanje sporov je preklicano",
+ "Upload cancelled" : "Pošiljanje je bilo preklicano",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Datoteke »{oldName}« ni mogoče preimenovati, ker ne obstaja več.",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ime »{newName}« je v mapi »{dir}« že v uporabi. Izbrati je treba drugačno ime.",
+ "Could not rename \"{oldName}\"" : "Datoteke »{oldName}« ni mogoče preimenovati",
+ "This operation is forbidden" : "To dejanje ni dovoljeno!",
+ "Storage is temporarily not available" : "Shramba trenutno ni na voljo",
+ "Unexpected error: {error}" : "Nepričakovana napaka: {error}",
+ "_%n file_::_%n files_" : ["%n datoteka","%n datoteki","%n datoteke","%n datotek"],
+ "_%n folder_::_%n folders_" : ["%n mapa","%n mapi","%n mape","%n mape"],
+ "_%n hidden_::_%n hidden_" : ["%n skrita","%n skriti","%n skrite","%n skritih"],
+ "Filename must not be empty." : "Ime datoteke ne sme biti prazno.",
+ "\"{char}\" is not allowed inside a filename." : "Znak \"{char}\" ni dovoljen v imenu datotek.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" je rezervirano ime in ni dovoljeno za ime datoteke.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ni dovoljena vrsta končnice.",
+ "Filenames must not end with \"{extension}\"." : "Imena datotek naj nimajo končnice \"{extension}\".",
+ "List of favorite files and folders." : "Seznam priljubljenih datotek in map.",
+ "No favorites yet" : "Ni še dodanih priljubljenih predmetov",
+ "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo zbrane na tem mestu.",
+ "List of your files and folders." : "Seznam datotek in map.",
+ "List of your files and folders that are not shared." : "Seznam datotek in map, ki niso v skupni rabi.",
+ "No personal files found" : "Ni najdenih zasebnih datotek",
+ "Files that are not shared will show up here." : "Datoteke, ki niso v skupni rabi, bodo prikazane tukaj.",
+ "Recent" : "Nedavne",
+ "List of recently modified files and folders." : "Seznam nedavno spremenjenih datotek in map.",
+ "No recently modified files" : "Ni nedavno spremenjenih datotek",
+ "Files and folders you recently modified will show up here." : "Nedavno spremenjene datoteke ali mape, bodo zbrane na tem mestu.",
+ "Search" : "Poišči",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
"Upload too large" : "Prekoračena je omejitev dovoljene velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
- "No favorites yet" : "Ni še dodanih priljubljenih predmetov",
- "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo zbrane na tem mestu.",
- "Deleted files" : "Izbrisane datoteke",
- "Shares" : "Souporaba",
- "Shared with others" : "V souporabi z drugimi",
- "Shared with you" : "V skupni rabi z vami",
- "Shared by link" : "V souporabi sk povezavo",
- "Deleted shares" : "Izbrisana mesta souporabe",
- "Pending shares" : "Predmeti za souporabo na čakanju",
+ "File could not be found" : "Datoteke ni mogoče najti",
+ "Show list view" : "Pokaži seznamski pogled",
+ "Show grid view" : "Pokaži mrežni pogled",
+ "Close" : "Zapri",
+ "Could not create folder \"{dir}\"" : "Mape »{dir}« ni mogoče ustvariti.",
+ "This will stop your current uploads." : "S tem bodo zaustavljena vsa pošiljanja v oblak.",
+ "Upload cancelled." : "Pošiljanje je preklicano.",
+ "Processing files …" : "Poteka obdelava datotek ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Datoteke {filename} ni mogoče poslati, saj je to mapa, ali pa je velikost datoteke 0 bajtov.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je le {size2}.",
+ "Target folder \"{dir}\" does not exist any more" : "Ciljna mapa »{dir}« ne obstaja več.",
+ "An unknown error has occurred" : "Prišlo je do neznane napake!",
+ "File could not be uploaded" : "Datoteke ni mogoče poslati",
+ "Uploading …" : "Poteka pošiljanje ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Pošiljanje … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} od {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Pošiljate te vrste predmeta ni podprto.",
+ "Error when assembling chunks, status code {status}" : "Napaka pri sestavljanju kosov datoteke, koda stanja je {status}",
+ "Choose target folder" : "Izbor ciljne mape",
+ "Set reminder" : "Nastavi opomnik",
+ "Edit locally" : "Uredi krajevno",
+ "Open" : "Odpri",
+ "Could not load info for file \"{file}\"" : "Ni mogoče naložiti podatkov za datoteko »{file}«.",
+ "Please select tag(s) to add to the selection" : "Izbrati je treba oznake za dodajanje k izbiri",
+ "Apply tag(s) to selection" : "Poteka uveljavljanje oznak za izbiro",
+ "Select directory \"{dirName}\"" : "Izberi mapo »{dirName}«",
+ "Select file \"{fileName}\"" : "Izberi datoteko »{fileName}«.",
+ "Unable to determine date" : "Ni mogoče določiti datuma",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Mapa ni na voljo. Preverite dnevnik in stopite v stik s skrbnikom sistema.",
+ "Could not move \"{file}\", target exists" : "Datoteke »{file}« ni mogoče premakniti, ker na ciljnem mestu z istim imenom že obstaja.",
+ "Could not move \"{file}\"" : "Datoteke »{file}« ni mogoče premakniti",
+ "copy" : "kopija",
+ "Could not copy \"{file}\", target exists" : "Datoteke »{file}« ni mogoče kopirati, ker ta že obstaja.",
+ "Could not copy \"{file}\"" : "Datoteke »{file}« ni mogoče kopirati.",
+ "Copied {origin} inside {destination}" : "Kopirano {origin} v {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopirano {origin} in {nbfiles} ostale datoteke v {destination}",
+ "{newName} already exists" : "Ime {newName} že obstaja",
+ "Could not create file \"{file}\"" : "Datoteke »{file}« ni mogoče ustvariti.",
+ "Could not create file \"{file}\" because it already exists" : "Datoteke »{file}« ni mogoče ustvariti, ker datoteka z istim imenom že obstaja.",
+ "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape »{dir}«, ker ta že obstaja",
+ "Could not fetch file details \"{file}\"" : "Ni mogoče pridobiti podrobnosti datoteke »{file}«.",
+ "Error deleting file \"{fileName}\"." : "Prišli je do napake med brisanjem datoteke »{fileName}«.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Za iskalni niz {tag}{filter}{endtag} ni zadetkov v nobeni mapi",
+ "Enter more than two characters to search in other folders" : "Vpišite več kot dva znaka za iskanje po drugih mapah",
+ "{dirs} and {files}" : "{dirs} in {files}",
+ "_including %n hidden_::_including %n hidden_" : ["vključujoč %n skrito","vključujoč %n skriti","vključujoč %n skrite","vključujoč %n skritih"],
+ "You do not have permission to upload or create files here" : "Ni ustreznih dovoljenja za pošiljanje ali ustvarjanje novih datotek",
+ "_Uploading %n file_::_Uploading %n files_" : ["Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Poteka posodabljanje %n datotek"],
+ "New" : "Novo",
+ "New file/folder menu" : "Nov meni datoteke/mape",
+ "Select file range" : "Izbor obsega datotek",
+ "{used}%" : "{used} %",
+ "{used} used" : "V uporabi je {used}",
+ "\"{name}\" is an invalid file name." : "Ime »{name}« ni veljavno ime datoteke.",
+ "File name cannot be empty." : "Ime datoteke ne sme biti prazno polje.",
+ "\"/\" is not allowed inside a file name." : "znak » / « v imenu datoteke ni dovoljen.",
+ "\"{name}\" is not an allowed filetype" : "Ime »{name}« ni dovoljena vrsta datoteke.",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Shramba uporabnika {owner} je do konca zasedena ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Skupinska mapa »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Zunanja shramba »{mountPoint}« je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Vaša shramba je skoraj do konca zasedena ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["se skladajo s filtrom »{filter}«","se skladajo s filtroma »{filter}«","se skladajo s filtri »{filter}«","se skladajo s filtri »{filter}«"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kopirana je neposredna povezava (za uporabnike, ki imajo dostop do datoteke ali mape)",
+ "Path" : "Pot",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"],
+ "Favored" : "Priljubljeno",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiraj neposredno povezavo (za uporabnike, ki imajo dostop do datoteke ali mape)",
+ "Upload file" : "Pošlji datoteko",
+ "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak",
+ "Upload (max. %s)" : "Pošiljanje (omejitev %s)",
+ "\"{displayName}\" action executed successfully" : "Dejanje »{displayName}« je uspešno izvedeno",
+ "\"{displayName}\" action failed" : "Dejanje »{displayName}« je spodletelo",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" ni uspel za nekatere elemente",
+ "\"{displayName}\" batch action executed successfully" : "Paketno dejanje »{displayName}« je uspešno izvedeno",
+ "Submitting fields…" : "Poteka objavljanje vsebine polj ...",
+ "Filter filenames…" : "Filtriraj imena datotek ...",
+ "WebDAV URL copied to clipboard" : "Naslov URL WebDAV je kopiran v odložišče",
+ "Enable the grid view" : "Omogoči mrežni pogled",
+ "Enable folder tree" : "Omogoči drevesno strukturo map",
+ "Copy to clipboard" : "Kopiraj v odložišče",
+ "Use this address to access your Files via WebDAV" : "Uporabite ta naslov za dostop do datotek z uporabo WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Če je omogočen sistem dvostopenjskega overjanja 2FA, je treba ustvariti in uporabiti novo geslo programa s klikom na to mesto.",
+ "Deletion cancelled" : "Brisanje je bilo preklicano",
+ "Move cancelled" : "Premikanje je bilo preklicano",
+ "Cancelled move or copy of \"{filename}\"." : "Prekinjeno premikanje ali kopiranje za \"{filename}\".",
+ "Cancelled move or copy operation" : "Opravilo kopiranje in premikanja je preklicano",
+ "Open details" : "Odpri podrobnosti",
+ "Photos and images" : "Slike in fotografije",
+ "New folder creation cancelled" : "Ustvarjanje nove mape je bilo preklicano",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapa","{folderCount} mapi","{folderCount} mape","{folderCount} map"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} datoteka","{fileCount} datoteki","{fileCount} datoteke","{fileCount} datotek"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 datoteka in {folderCount} mapa","1 datoteka in {folderCount} mapi","1 datoteka in {folderCount} mape","1 datoteka in {folderCount} map"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} datoteka in 1 mapa","{fileCount} datoteki in 1 mapa","{fileCount} datoteke in 1 mapa","{fileCount} datotek in 1 mapa"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} datotek in {folderCount} map",
+ "All folders" : "Vse mape",
+ "Personal Files" : "Osebne datoteke",
"Text file" : "Besedilna datoteka",
"New text file.txt" : "nova_datoteka.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Shramba uporabnika {owner} je polna, zato datotek ni več mogoče posodabljati in usklajevati!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Skupinska mapa »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Zunanja shramba »{mountPoint}« je do konca zasedena, zato datotek ni mogoče več posodobiti in usklajevati!",
- "Your storage is full, files can not be updated or synced anymore!" : "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
- "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom »{filter}«","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"]
+ "Filter file names …" : "Filtriraj imena datotek...",
+ "Prevent warning dialogs from open or reenable them." : "Preprečite odpiranje dialogov z opozorili ali jih ponovno omogočite.",
+ "Show a warning dialog when changing a file extension." : "Prikaži opozorilo ob spreminjanju končnice datoteke.",
+ "Speed up your Files experience with these quick shortcuts." : "Pospešite uporabo upravljalnika Files s temi bližnjicami.",
+ "Open the actions menu for a file" : "Odpri meni dejanj za datoteko",
+ "Rename a file" : "Preimenuj datoteko",
+ "Delete a file" : "Izbriši datoteko",
+ "Favorite or remove a file from favorites" : "Označi ali odstrani koz priljubljeno",
+ "Manage tags for a file" : "Upravljanje oznak datoteke",
+ "Deselect all files" : "Ostrani izbor vseh datotek",
+ "Select or deselect a file" : "Izberi ali odstrani izbor datoteke",
+ "Select a range of files" : "Izbor obsega datotek",
+ "Navigate to the parent folder" : "Pojdi na nadrejeni imenik",
+ "Navigate to the file above" : "Pojdi na datoteko zgoraj",
+ "Navigate to the file below" : "Pojdi na doatoteko spodaj",
+ "Navigate to the file on the left (in grid mode)" : "Pojdi na datoteko na levi (v mrežnem načinu)",
+ "Navigate to the file on the right (in grid mode)" : "Pojdi na datoteko na desni (v mrežnem načinu)",
+ "Toggle the grid view" : "Preklopi mrežni način",
+ "Open the sidebar for a file" : "Odpri stranski pano datoteke"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
deleted file mode 100644
index 8e5ecc00c28..00000000000
--- a/apps/files/l10n/sq.js
+++ /dev/null
@@ -1,133 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "Depozita përkohësisht nuk është në dispozicion",
- "Storage invalid" : "Depozitë e pavlefshme",
- "Unknown error" : "Gabim i panjohur",
- "File could not be found" : "Skedari s’u gjet dot",
- "Download" : "Shkarkoje",
- "Delete" : "Fshije",
- "Home" : "Kreu",
- "Close" : "Mbylle",
- "Favorites" : "Të parapëlqyera",
- "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"",
- "Upload cancelled." : "Ngarkimi u anulua.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "S’arrihet të ngarkohet {filename}, ngaqë është drejtori ose ka 0 bajte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, po ngarkoni {size1}, por ka vetëm {size2} të lira",
- "Target folder \"{dir}\" does not exist any more" : "Dosja e synuar \"{dir}\" nuk ekziston më",
- "Not enough free space" : "Nuk ka hapsirë të mjaftueshme të lirë",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} nga {totalSize} ({bitrate})",
- "Actions" : "Veprime",
- "Rename" : "Riemërtojeni",
- "Copy" : "Kopjo",
- "Delete file" : "Fshi skedarin",
- "Delete folder" : "Fshini dosjen",
- "Disconnect storage" : "Shkëpute depozitën",
- "Could not load info for file \"{file}\"" : "Nuk mund të ngarkohet informacioni për skedarin \"{file}\"",
- "Files" : "Skedar",
- "Details" : "Hollësi",
- "Select" : "Përzgjidhe",
- "Pending" : "Në pritje",
- "Unable to determine date" : "S’arrihet të përcaktohet data",
- "This operation is forbidden" : "Ky veprim është i ndaluar",
- "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
- "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston",
- "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"",
- "copy" : "kopjo",
- "{newName} already exists" : "{newName} ekziston tashmë",
- "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.",
- "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"",
- "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë",
- "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë",
- "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Asnjë rezultat i kërkimit në dosjet e tjera për {tag} {filter} {endtag}",
- "Name" : "Emër",
- "Size" : "Madhësi",
- "Modified" : "Ndryshuar më",
- "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"],
- "_%n file_::_%n files_" : ["%n kartelë","%n skedar"],
- "{dirs} and {files}" : "{dirs} dhe {files}",
- "_including %n hidden_::_including %n hidden_" : ["Përfshirë %n të fshehura","Përfshirë %n të fshehura"],
- "You don’t have permission to upload or create files here" : "S’keni leje për të ngarkuar apo krijuar kartela këtu",
- "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkohet %n kartelë","Po ngarkohen %n skedar"],
- "New" : "E re",
- "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm kartele.",
- "File name cannot be empty." : "Emri i kartelës s’mund të jetë i zbrazët.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nuk është një lloj skedari i lejuar",
- "View in folder" : "Shikoje në dosje",
- "Copied!" : "E kopjuar!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopjo lidhjen e drejtpërdrejtë (funksionon vetëm për përdoruesit që kanë qasje në këtë skedar/dosje)",
- "Path" : "Rrugë",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"],
- "Favorited" : "U kalua e parapëlqyer",
- "Favorite" : "E parapëlqyer",
- "New folder" : "Dosje e re",
- "Upload file" : "Ngarko skedar",
- "Recent" : "Të fundit",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Shtoje tek të parapëlqyerat",
- "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat",
- "Added to favorites" : "U shtua te të parapëlqyerat",
- "Removed from favorites" : "U hoq nga të parapëlqyerat",
- "You added {file} to your favorites" : "Ju shtuat {file} te të parapëlqyerat",
- "You removed {file} from your favorites" : "Ju hoqët {file} nga të parapëlqyerat",
- "File changes" : "Ndryshimet në skedar",
- "Created by {user}" : "U krijua nga {user}",
- "Changed by {user}" : "U ndryshua nga {user}",
- "Deleted by {user}" : "U fshi nga {user}",
- "Restored by {user}" : "U rikthye nga {user}",
- "Renamed by {user}" : "U riemërua nga {user}",
- "Moved by {user}" : "U ndryshua nga {user}",
- "\"remote user\"" : "\"përdorues i largët\"",
- "You created {file}" : "Ju krijuat {file}",
- "{user} created {file}" : "{user} krijoj {file}",
- "{file} was created in a public folder" : "{file} u krijua në një folder publik",
- "You changed {file}" : "Ju ndryshuat {file}",
- "{user} changed {file}" : "{user} ndryshoj {file}",
- "You deleted {file}" : "Ju fshit {file}",
- "{user} deleted {file}" : "{user} fshiu {file}",
- "You restored {file}" : "Ju rikthyet {file}",
- "{user} restored {file}" : "{user} riktheu {file}",
- "You renamed {oldfile} to {newfile}" : "Ju riemëruat {oldfile} në {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} riemëruat {oldfile} në {newfile}",
- "You moved {oldfile} to {newfile}" : "Ju lëvizët {oldfile} në {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} lëvizi {oldfile} në {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Një skedar është shtuar ose është hequr nga <strong>të preferuarat</strong> tuaja",
- "A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje",
- "All files" : "Të gjithë skedarët",
- "Unlimited" : "E palimituar",
- "Upload (max. %s)" : "Ngarkim (max. %s)",
- "Accept" : "Prano",
- "in %s" : "në %s",
- "Change" : "Ndrysho",
- "Tags" : "Etiketë",
- "Cancel" : "Anullo",
- "Create" : "Krijo",
- "%s used" : "%s të përdorura",
- "%1$s of %2$s used" : "%1$s e %2$s përdorur",
- "Settings" : "Rregullime",
- "Show hidden files" : "Shfaq kartela të fshehura",
- "WebDAV" : "WebDAV",
- "No files in here" : "S’ka kartela këtu",
- "Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!",
- "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra",
- "Select all" : "Përzgjidhe krejt",
- "Upload too large" : "Ngarkim shumë i madh",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.",
- "No favorites yet" : "Asnjë preferencë akoma",
- "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera",
- "Deleted files" : "Skedar të fshirë",
- "Shares" : "Shpërndarjet",
- "Shared with others" : "E ndarë me të tjerët",
- "Shared with you" : "E ndarë me ju",
- "Shared by link" : "E ndarë me lidhje",
- "Deleted shares" : "Fshi shpërndarjet",
- "Text file" : "Kartelë tekst",
- "New text file.txt" : "Kartelë e re file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Depozita e {owner} është plot, kartelat s’mund të përditësohen ose sinkronizohet më!",
- "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose sinkronizohet më!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
deleted file mode 100644
index dc3b1edfc03..00000000000
--- a/apps/files/l10n/sq.json
+++ /dev/null
@@ -1,131 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "Depozita përkohësisht nuk është në dispozicion",
- "Storage invalid" : "Depozitë e pavlefshme",
- "Unknown error" : "Gabim i panjohur",
- "File could not be found" : "Skedari s’u gjet dot",
- "Download" : "Shkarkoje",
- "Delete" : "Fshije",
- "Home" : "Kreu",
- "Close" : "Mbylle",
- "Favorites" : "Të parapëlqyera",
- "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"",
- "Upload cancelled." : "Ngarkimi u anulua.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "S’arrihet të ngarkohet {filename}, ngaqë është drejtori ose ka 0 bajte",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, po ngarkoni {size1}, por ka vetëm {size2} të lira",
- "Target folder \"{dir}\" does not exist any more" : "Dosja e synuar \"{dir}\" nuk ekziston më",
- "Not enough free space" : "Nuk ka hapsirë të mjaftueshme të lirë",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} nga {totalSize} ({bitrate})",
- "Actions" : "Veprime",
- "Rename" : "Riemërtojeni",
- "Copy" : "Kopjo",
- "Delete file" : "Fshi skedarin",
- "Delete folder" : "Fshini dosjen",
- "Disconnect storage" : "Shkëpute depozitën",
- "Could not load info for file \"{file}\"" : "Nuk mund të ngarkohet informacioni për skedarin \"{file}\"",
- "Files" : "Skedar",
- "Details" : "Hollësi",
- "Select" : "Përzgjidhe",
- "Pending" : "Në pritje",
- "Unable to determine date" : "S’arrihet të përcaktohet data",
- "This operation is forbidden" : "Ky veprim është i ndaluar",
- "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin",
- "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston",
- "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"",
- "copy" : "kopjo",
- "{newName} already exists" : "{newName} ekziston tashmë",
- "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.",
- "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"",
- "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë",
- "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë",
- "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Asnjë rezultat i kërkimit në dosjet e tjera për {tag} {filter} {endtag}",
- "Name" : "Emër",
- "Size" : "Madhësi",
- "Modified" : "Ndryshuar më",
- "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"],
- "_%n file_::_%n files_" : ["%n kartelë","%n skedar"],
- "{dirs} and {files}" : "{dirs} dhe {files}",
- "_including %n hidden_::_including %n hidden_" : ["Përfshirë %n të fshehura","Përfshirë %n të fshehura"],
- "You don’t have permission to upload or create files here" : "S’keni leje për të ngarkuar apo krijuar kartela këtu",
- "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkohet %n kartelë","Po ngarkohen %n skedar"],
- "New" : "E re",
- "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm kartele.",
- "File name cannot be empty." : "Emri i kartelës s’mund të jetë i zbrazët.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" nuk është një lloj skedari i lejuar",
- "View in folder" : "Shikoje në dosje",
- "Copied!" : "E kopjuar!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopjo lidhjen e drejtpërdrejtë (funksionon vetëm për përdoruesit që kanë qasje në këtë skedar/dosje)",
- "Path" : "Rrugë",
- "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"],
- "Favorited" : "U kalua e parapëlqyer",
- "Favorite" : "E parapëlqyer",
- "New folder" : "Dosje e re",
- "Upload file" : "Ngarko skedar",
- "Recent" : "Të fundit",
- "Remove from favorites" : "Remove from favorites",
- "Add to favorites" : "Shtoje tek të parapëlqyerat",
- "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat",
- "Added to favorites" : "U shtua te të parapëlqyerat",
- "Removed from favorites" : "U hoq nga të parapëlqyerat",
- "You added {file} to your favorites" : "Ju shtuat {file} te të parapëlqyerat",
- "You removed {file} from your favorites" : "Ju hoqët {file} nga të parapëlqyerat",
- "File changes" : "Ndryshimet në skedar",
- "Created by {user}" : "U krijua nga {user}",
- "Changed by {user}" : "U ndryshua nga {user}",
- "Deleted by {user}" : "U fshi nga {user}",
- "Restored by {user}" : "U rikthye nga {user}",
- "Renamed by {user}" : "U riemërua nga {user}",
- "Moved by {user}" : "U ndryshua nga {user}",
- "\"remote user\"" : "\"përdorues i largët\"",
- "You created {file}" : "Ju krijuat {file}",
- "{user} created {file}" : "{user} krijoj {file}",
- "{file} was created in a public folder" : "{file} u krijua në një folder publik",
- "You changed {file}" : "Ju ndryshuat {file}",
- "{user} changed {file}" : "{user} ndryshoj {file}",
- "You deleted {file}" : "Ju fshit {file}",
- "{user} deleted {file}" : "{user} fshiu {file}",
- "You restored {file}" : "Ju rikthyet {file}",
- "{user} restored {file}" : "{user} riktheu {file}",
- "You renamed {oldfile} to {newfile}" : "Ju riemëruat {oldfile} në {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "{user} riemëruat {oldfile} në {newfile}",
- "You moved {oldfile} to {newfile}" : "Ju lëvizët {oldfile} në {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} lëvizi {oldfile} në {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Një skedar është shtuar ose është hequr nga <strong>të preferuarat</strong> tuaja",
- "A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje",
- "All files" : "Të gjithë skedarët",
- "Unlimited" : "E palimituar",
- "Upload (max. %s)" : "Ngarkim (max. %s)",
- "Accept" : "Prano",
- "in %s" : "në %s",
- "Change" : "Ndrysho",
- "Tags" : "Etiketë",
- "Cancel" : "Anullo",
- "Create" : "Krijo",
- "%s used" : "%s të përdorura",
- "%1$s of %2$s used" : "%1$s e %2$s përdorur",
- "Settings" : "Rregullime",
- "Show hidden files" : "Shfaq kartela të fshehura",
- "WebDAV" : "WebDAV",
- "No files in here" : "S’ka kartela këtu",
- "Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!",
- "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra",
- "Select all" : "Përzgjidhe krejt",
- "Upload too large" : "Ngarkim shumë i madh",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.",
- "No favorites yet" : "Asnjë preferencë akoma",
- "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera",
- "Deleted files" : "Skedar të fshirë",
- "Shares" : "Shpërndarjet",
- "Shared with others" : "E ndarë me të tjerët",
- "Shared with you" : "E ndarë me ju",
- "Shared by link" : "E ndarë me lidhje",
- "Deleted shares" : "Fshi shpërndarjet",
- "Text file" : "Kartelë tekst",
- "New text file.txt" : "Kartelë e re file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Depozita e {owner} është plot, kartelat s’mund të përditësohen ose sinkronizohet më!",
- "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose sinkronizohet më!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 308f95c1407..50b07bbe6ca 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -1,107 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Складиште привремено није доступно",
- "Storage invalid" : "Неисправно складиште",
- "Unknown error" : "Непозната грешка",
- "File could not be found" : "Фајл није нађен",
- "Move or copy" : "Помери или копирај",
- "Download" : "Преузми",
- "Delete" : "Обриши",
- "Home" : "Почетна",
- "Close" : "Затвори",
- "Favorites" : "Омиљени",
- "Could not create folder \"{dir}\"" : "Не могу да направим фасциклу „{dir}“",
- "This will stop your current uploads." : "Ово ће да прекине тренутна отпремања.",
- "Upload cancelled." : "Отпремање је отказано.",
- "Processing files …" : "Обрађујем фајлове…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то или директоријум или има 0 бајтова",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало",
- "Target folder \"{dir}\" does not exist any more" : "Одредишна фасцикла „{dir}“ више не постоји",
- "Not enough free space" : "Нема довољно слободног места",
- "An unknown error has occurred" : "Десила се непозната грешка",
- "Uploading …" : "Отпремам…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Отпремање те ставке није подржано",
- "Target folder does not exist any more" : "Одредишна фасцикла више не постоји",
- "Operation is blocked by access control" : "Контрола приступа је блокирала операцију",
- "Error when assembling chunks, status code {status}" : "Грешки при прикупљању делова фајла, статус код {status}",
- "Actions" : "Радње",
- "Rename" : "Преименуј",
- "Copy" : "Копирај",
- "Choose target folder" : "Одаберите одредишну фасциклу",
- "Open" : "Отвори",
- "Delete file" : "Обриши фајл",
- "Delete folder" : "Обриши фасциклу",
- "Disconnect storage" : "Искључи складиште",
- "Leave this share" : "Напусти ово дељење",
- "Could not load info for file \"{file}\"" : "Не могу да учитам информације фајла „{file}“",
- "Files" : "Фајлови",
- "Details" : "Детаљи",
- "Select" : "Изабери",
- "Pending" : "На чекању",
- "Unable to determine date" : "Не могу да одредим датум",
- "This operation is forbidden" : "Ова радња је забрањена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
- "Could not move \"{file}\", target exists" : "Не могу да померим „{file}“, одредиште већ постоји",
- "Could not move \"{file}\"" : "Не могу да померим „{file}“",
- "copy" : "копиран",
- "Could not copy \"{file}\", target exists" : "Не могу да копирам „{file}“, одредиште већ постоји",
- "Could not copy \"{file}\"" : "Не могу да копирам „{file}“",
- "Copied {origin} inside {destination}" : "Копиран {origin} у {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копиран{origin} и још {nbfiles} других фајлова у {destination}",
- "{newName} already exists" : "{newName} већ постоји",
- "Could not rename \"{fileName}\", it does not exist any more" : "Не могу да преименујем „{fileName}“, фајл више не постоји",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Име „{targetName}“ се већ користи за фасциклу „{dir}“. Одаберите неко друго име.",
- "Could not rename \"{fileName}\"" : "Не могу да преименујем „{fileName}“",
- "Could not create file \"{file}\"" : "Не могу да направим фајл „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Не могу да направим фајл „{file}“ јер већ постоји",
- "Could not create folder \"{dir}\" because it already exists" : "Не могу да направим фасциклу „{dir}“ јер већ постоји",
- "Could not fetch file details \"{file}\"" : "Не могу да дохватим детаље за „{file}“",
- "Error deleting file \"{fileName}\"." : "Грешка при брисању фајла „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултата претраге у осталим фасциклама за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Унесите више од два карактера да претражујете у другим фасциклама",
- "Name" : "Назив",
- "Size" : "Величина",
- "Modified" : "Измењен",
- "_%n folder_::_%n folders_" : ["%n фасцикла","%n фасцикле","%n фасцикли"],
- "_%n file_::_%n files_" : ["%n фајл","%n фајла","%n фајлова"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"],
- "You don’t have permission to upload or create files here" : "Немате дозволе да овде отпремате или стварате фајлове",
- "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"],
- "New" : "Ново",
- "Select file range" : "Одаберите опсег фајлова",
- "{used} of {quota} used" : "{used} од {quota} искоришћено",
- "{used} used" : "{used} искоришћено",
- "\"{name}\" is an invalid file name." : "„{name}“ није исправан назив фајла.",
- "File name cannot be empty." : "Назив фајла не може бити празан.",
- "\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
- "View in folder" : "Види у фасцикли",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирај директну везу (ради само за кориснике који имају приступ овом фајлу/фасциклу)",
- "Path" : "Путања",
- "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
- "Favorited" : "Омиљено",
- "Favorite" : "Омиљени",
- "You can only favorite a single file or folder at a time" : "Можете поставити као омиљени само један фајл или фасциклу одједном",
- "New folder" : "Нова фасцикла",
- "Upload file" : "Отпреми фајл",
- "Recent" : "Скорашњи",
- "Not favorited" : "Није омиљено",
- "Remove from favorites" : "Избаци из омиљених",
- "Add to favorites" : "Додај у омиљене",
- "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
"Added to favorites" : "Додато у омиљено",
"Removed from favorites" : "Избачено из омиљених",
"You added {file} to your favorites" : "Додали сте {file} у омиљене",
"You removed {file} from your favorites" : "Избацили сте {file} из омиљених",
+ "Favorites" : "Омиљени",
"File changes" : "Измене над фајлом",
"Created by {user}" : "Направио {user}",
"Changed by {user}" : "Изменио {user}",
@@ -109,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Повратио {user}",
"Renamed by {user}" : "Преименовао {user}",
"Moved by {user}" : "Померио {user}",
- "\"remote user\"" : "„удаљени корисник“",
+ "\"remote account\"" : "„удаљени налог”",
"You created {file}" : "Направили сте {file}",
"You created an encrypted file in {file}" : "Направили сте шифровани фајл {file}",
"{user} created {file}" : "{user} је направио {file}",
@@ -125,20 +29,37 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} је обрисао шифровани фајл {file}",
"You restored {file}" : "Повратили сте {file}",
"{user} restored {file}" : "{user} је повратио {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Променили сте име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Променили сте име фајла {oldfile} (скривено) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Променили сте име фајла {oldfile} на {newfile} (скривено)",
"You renamed {oldfile} to {newfile}" : "Преименовали сте {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} је променио име фајла {oldfile} (скривено) на {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} на {newfile} (скривено)",
"{user} renamed {oldfile} to {newfile}" : "{user} је преименовао {oldfile} на {newfile}",
"You moved {oldfile} to {newfile}" : "Померили сте {oldfile} на {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} је померио {oldfile} на {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Фајл је додат или избрисан из Ваших <strong>омиљених</strong>",
+ "Files" : "Фајлови",
"A file or folder has been <strong>changed</strong>" : "Фајл или фасцикла су <strong>измењени</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Омиљени фајл или фасцикла су <strong>измењени</strong>",
- "All files" : "Сви фајлови",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Отпремање (макс. %s)",
+ "Failed to authorize" : "Није успело добијање дозволе",
+ "Invalid folder path" : "Неисправна путања фолдера",
+ "Folder not found" : "Није пронађен фолдер",
+ "The file cannot be found" : "Фајл не може да се пронађе",
+ "The destination path does not exist: %1$s" : "Путања одредишта не постоји: %1$s",
+ "You do not have permission to create a file at the specified location" : "Немате дозволу да креирате фајл на наведеној локацији",
+ "The file could not be converted." : "Фајл није могао да се конвертује.",
+ "Could not get relative path to converted file" : "Није могла да се преузме релативна путања до конвертованог фајла",
+ "Favorite files" : "Омиљени фајлови",
+ "No favorites" : "Нема омиљених",
+ "More favorites" : "Још омиљених",
"Accept" : "Прихвати",
"Reject" : "Одбаци",
"Incoming ownership transfer from {user}" : "Надолазећи пренос власништва од корисника {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Да ли желите да прихватите {path}?\n\nПажња: После прихватања, процес трансфера може потрајати и до 1h.",
+ "Ownership transfer denied" : "Пренос власништва је одбијен",
+ "Your ownership transfer of {path} was denied by {user}." : "Корисник {user} је одбио ваш пренос власништва над {path}.",
"Ownership transfer failed" : "Пренос власништва није успео",
"Your ownership transfer of {path} to {user} failed." : "Ваш пренос власништва {path} на корисника {user} није успео.",
"The ownership transfer of {path} from {user} failed." : "Пренос власништва {path} на корисника {user} није успео.",
@@ -146,52 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Ваш пренос власништва {path} на корисника {user} завршен.",
"The ownership transfer of {path} from {user} has completed." : "Пренос власништва {path} на корисника {user} завршен.",
"in %s" : "за %s",
+ "Transferred from %1$s on %2$s" : "Пренесено са %1$s на %2$s",
+ "Files compatibility" : "Компатибилност фајлова",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозвољава се ограничавање имена фајлова тако да сви клијенти могу да их синхронизују. Подразумевано се дозвољавају сва имена фајлова која су исправна на POSIX системима (нпр. Linux или macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Када се укључе Windows компатибилна имена фајлова, постојећи фајлови се више неће моћи мењати, али њихов власник може да им промени име на исправно ново име.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Фајлови такође могу аутоматски да се мигрирају након укључивања овог подешавања, молимо вас да погледате документацију у вези са occ командом.",
+ "Enforce Windows compatibility" : "Форсирај Windows компатибилност",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ово ће да блокира имена фајлова која су неисправна на Windows системима, као што су она која користе резервисана имена или специјалне карактере. Али ово неће форсирати компатибилност разликовања малих и великих слова.",
"File Management" : "Управљање фајловима",
- "Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
- "Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
- "Change" : "Измени",
- "New owner" : "Нови власник",
- "Search users" : "Претражи кориснике",
+ "Home" : "Почетна",
+ "Target folder does not exist any more" : "Одредишна фасцикла више не постоји",
+ "Reload current directory" : "Поново учитај текући директоријум",
+ "Go to the \"{dir}\" directory" : "Иди у „{dir}” дирекотријум",
+ "Current directory path" : "Путања текућег директоријума",
+ "Your have used your space quota and cannot upload files anymore" : "Искористили сте квоту простора и више не можете да отпремате фајлове",
+ "You do not have permission to upload or create files here." : "Немате дозволу да овде отпремите или креирате фајлове.",
+ "Drag and drop files here to upload" : "Да отпремите, превуците и отпустите фајлове овде",
+ "Favorite" : "Омиљено",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Укљ./искљ. избор за фајл „{displayName}”",
+ "Toggle selection for folder \"{displayName}\"" : "Укљ./искљ. избор за фолдер „{displayName}”",
+ "File is loading" : "Фајл се учитава",
+ "Folder is loading" : "Фолдер се учитава",
+ "Filename" : "Назив фајла",
+ "Folder name" : "Назив фасцикле",
+ "This node is unavailable" : "Овај чвор није доступан",
+ "Another entry with the same name already exists." : "Већ постоји ставка са истим именом.",
+ "Invalid filename." : "Неисправно име фајла.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "„{oldName}” је промењено на „{newName}”",
+ "Rename file" : "Промени назив фајла",
+ "Folder" : "Фасцикла",
+ "Unknown file type" : "Непознат тип фајла",
+ "{ext} image" : "{ext} слика",
+ "{ext} video" : "{ext} видео",
+ "{ext} audio" : "{ext} аудио",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "На чекању",
+ "Unknown date" : "Непознат датум",
+ "Clear filter" : "Очисти филтер",
+ "Modified" : "Измењен",
+ "Search everywhere" : "Претражи свуда",
+ "Type" : "Тип",
+ "Active filters" : "Активни филтери",
+ "Remove filter" : "Уклони филтер",
+ "Total rows summary" : "Резиме укупног броја редова",
+ "Toggle selection for all files and folders" : "Укљ./искљ. избор за све фајлове и фолдере",
+ "Name" : "Назив",
+ "File type" : "Тип фајла",
+ "Size" : "Величина",
+ "{displayName}: failed on some elements" : "{displayName}: није успело на неким елементима",
+ "{displayName}: done" : "{displayName}: завршено",
+ "{displayName}: failed" : "{displayName}: није успело",
+ "Actions" : "Радње",
+ "(selected)" : "(изабрано)",
+ "List of files and folders." : "Листа фајлова и фолдера.",
+ "You have used your space quota and cannot upload files anymore." : "Искористили сте квоту простора и више не можете да отпремате фајлове.",
+ "Column headers with buttons are sortable." : "Заглавља колона са дугмићима могу да се соритрају.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
+ "File not found" : "Фајл није нађен",
+ "_{count} selected_::_{count} selected_" : ["изабран је {count}","изабрана су {count}","изабрано је {count}"],
+ "Search everywhere …" : "Претражи свуда",
+ "Search here …" : "Претражи овде…",
+ "Search scope options" : "Опције опсега претраге",
+ "Search here" : "Претражи овде",
+ "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
+ "{used} of {quota} used" : "{used} од {quota} искоришћено",
+ "{relative}% used" : "{relative}% искоришћено",
+ "Could not refresh storage stats" : "Статистике складишта нису могле да се освеже",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
+ "Storage information" : "Информације о складишту",
+ "Storage quota" : "Квота складишта",
+ "New folder" : "Нова фасцикла",
+ "Create new folder" : "Направи нову фасциклу",
+ "This name is already in use." : "Ово име се већ користи.",
+ "Create" : "Направи",
+ "Files starting with a dot are hidden by default" : "Фајлови који почињу тачком су подразумевано скривени",
+ "Fill template fields" : "Попуните поља шаблона",
+ "Submitting fields …" : "Поља се подносе…",
+ "Submit" : "Пошаљи",
"Choose a file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
"Transfer" : "Пренеси",
"Transfer {path} to {userid}" : "Пренеси {path} на корисника {userid}",
"Invalid path selected" : "Одабрана неисправна путања",
+ "Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Послат захтев за пренос власништва",
- "Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше",
- "Tags" : "Ознаке",
- "Unable to change the favourite state of the file" : "Неуспела промена стања омиљености фајла",
- "Error while loading the file data" : "Грешка при учитавању података фајла",
- "Cancel" : "Поништи",
- "Create" : "Направи",
- "%s used" : "%s искоришћено",
- "%s%% of %s used" : "%s%% од %s искоришћено",
- "%1$s of %2$s used" : "Заузето %1$s од %2$s",
- "Settings" : "Поставке",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да пренесете власништво над фајлом или фолдером који не поседујете",
+ "Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
+ "Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
+ "Change" : "Измени",
+ "New owner" : "Нови власник",
+ "Keep {old}" : "Задржи {old}",
+ "Keep without extension" : "Задржи без екстензије",
+ "Use {new}" : "Користи {new}",
+ "Remove extension" : "Уклони екстензију фајла",
+ "Change file extension" : "Промени екстензију фајла",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ако екстензију „{old}” промените на „{new}” фајл може да постане нечитљив.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Ако уклоните екстензију „{old}” фајл може да постане нечитљив.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Ако додате екстензију „{new}” фајл може да постане нечитљив.",
+ "Do not show this dialog again." : "Не приказуј поново овај дијалог.",
+ "Select file or folder to link to" : "Изаберите фајл или фолдер на који показује линк",
+ "Choose {file}" : "Изабери {file}",
+ "Share" : "Пдели",
+ "Shared by link" : "Дељени путем везе",
+ "Shared" : "Подељено",
+ "Switch to list view" : "Пређи на поглед листе",
+ "Switch to grid view" : "Пређи на поглед мреже",
+ "The file could not be found" : "Фајл није могао да се пронађе",
+ "Upload was cancelled by user" : "Корисник је прекинуо отпремање",
+ "Not enough free space" : "Нема довољно слободног места",
+ "Operation is blocked by access control" : "Контрола приступа је блокирала операцију",
+ "Error during upload: {message}" : "Грешка при отпремању: {message}",
+ "Error during upload, status code {status}" : "Грешка приликом отпремања, кôд статуса {status}",
+ "Unknown error during upload" : "Непозната грешка током отпремања",
+ "Loading current folder" : "Учитавање текућег фолдера",
+ "Retry" : "Покушај поново",
+ "No files in here" : "Овде нема фајлова",
+ "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
+ "Go back" : "Иди назад",
+ "Views" : "Прикази",
+ "Files settings" : "Подешавања фајлова",
+ "Your files" : "Ваши фајлови",
+ "Open in files" : "Отвори у фајловима",
+ "File cannot be accessed" : "Фајлу не може да се приступи",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Фајл није могао да се пронађе или немате дозволу да га прегледате. Замолите пошиљаоца да га подели.",
+ "No search results for “{query}”" : "Није нађен ниједан резултат за „{query}”",
+ "Search for files" : "Претражи фајлове",
+ "Clipboard is not available" : "Клипборд није доступан",
+ "WebDAV URL copied" : "WebDAV URL је копиран",
+ "General" : "Опште",
+ "Default view" : "Подразумевани поглед",
+ "All files" : "Сви фајлови",
+ "Personal files" : "Лични фајлови",
+ "Sort favorites first" : "Сортирај прво омиљене",
+ "Sort folders before files" : "Поређај фолдере испред фајлова",
+ "Folder tree" : "Стабло фолдера",
+ "Appearance" : "Изглед",
"Show hidden files" : "Прикажи скривене фајлове",
+ "Show file type column" : "Прикажи колону са типом фајла",
+ "Show file extensions" : "Прикажи екстензије фајла",
+ "Crop image previews" : "Опсецање прегледа слика",
+ "Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
- "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Копирај",
+ "How to access files using WebDAV" : "Како да приступите фајловима преко WebDAV протокола",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Двофакторска потврда идентитета је укључена за ваш налог, тако да морате користити лозинку апликације да повежете спољни WebDAV клијент.",
+ "Warnings" : "Упозорења",
+ "Warn before changing a file extension" : "Упозори пре измене екстензије фајла",
+ "Warn before deleting files" : "Упозори пре брисања фајлова",
+ "Keyboard shortcuts" : "Пречице на тастатури",
+ "File actions" : "Фајл акције",
+ "Rename" : "Преименуј",
+ "Delete" : "Обриши",
+ "Add or remove favorite" : "Додај или уклони омиљене",
+ "Manage tags" : "Управљање ознакама",
+ "Selection" : "Избор",
+ "Select all files" : "Изабери све фајлове",
+ "Deselect all" : "Поништи цео избор",
+ "Select or deselect" : "Изабери или уклони избор",
+ "Select a range" : "Изабери опсег",
+ "Navigation" : "Навигација",
+ "Go to parent folder" : "Иди на фолдер родитељ",
+ "Go to file above" : "Иди на фајл изнад",
+ "Go to file below" : "Иди на фајл испод",
+ "Go left in grid" : "Иди на лево у мрежи",
+ "Go right in grid" : "Иди на десно у мреж",
+ "View" : "Погледај",
"Toggle grid view" : "Укључи/искључи приказ мреже",
- "No files in here" : "Овде нема фајлова",
- "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
+ "Open file sidebar" : "Отвори бочну траку за фајл",
+ "Show those shortcuts" : "Прикажи те пречице",
+ "You" : "Ви",
+ "Shared multiple times with different people" : "Дељено више пута са разним људима",
+ "Unable to change the favorite state of the file" : "Није успела измена стања омиљено за фајл",
+ "Error while loading the file data" : "Грешка при учитавању података фајла",
+ "Owner" : "Власник",
+ "Remove from favorites" : "Избаци из омиљених",
+ "Add to favorites" : "Додај у омиљене",
+ "Tags" : "Ознаке",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл",
+ "Pick a template for {name}" : "Изаберите шаблон за {name}",
+ "Create a new file with the selected template" : "Креирање новог фајла по изабраном шаблону",
+ "Creating file" : "Креирање фајла",
+ "Save as {displayName}" : "Сачувај као {displayName}",
+ "Save as …" : "Сачувај као",
+ "Converting files …" : "Фајлови се конвертују",
+ "Failed to convert files: {message}" : "Није успела конверзија фајлова: {message}",
+ "All files failed to be converted" : "Ниједан фајл није могао да се конвертује",
+ "One file could not be converted: {message}" : "Један фајл није могао да се конвертује: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Један фајл није могао да се конвертује","Није могло да се конвертује %n фајла","Није могло да се конвертује %n фајлова"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Фајл је успешно конвертован","Успешно су конвертована %n фајла","Успешно је конвертовано %n фајлова"],
+ "Files successfully converted" : "Фајлови су успешно конвертовани",
+ "Failed to convert files" : "Није успела конверзија фајлова",
+ "Converting file …" : "Фајл се конвертује",
+ "File successfully converted" : "Фајл је успешно конвертован",
+ "Failed to convert file: {message}" : "Није успела конверзија фајла: {message}",
+ "Failed to convert file" : "Фајл није могао да се конвертује",
+ "Leave this share" : "Напусти ово дељење",
+ "Leave these shares" : "Напусти ова дељења",
+ "Disconnect storage" : "Искључи складиште",
+ "Disconnect storages" : "Искључи складишта",
+ "Delete permanently" : "Обриши заувек",
+ "Delete and unshare" : "Обриши и прекини дељење",
+ "Delete file" : "Обриши фајл",
+ "Delete files" : "Обриши фајлове",
+ "Delete folder" : "Обрши фолдер",
+ "Delete folders" : "Обриши фолдере",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Управо ћете неповратно обрисати {count} ставку","Управо ћете неповратно обрисати {count} ставке","Управо ћете неповратно обрисати {count} ставки"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Управо ћете обрисати {count} ставку","Управо ћете обрисати {count} ставке","Управо ћете обрисати {count} ставки"],
+ "Confirm deletion" : "Потврди брисање",
+ "Cancel" : "Поништи",
+ "Download" : "Преузми",
+ "Moving \"{source}\" to \"{destination}\" …" : "„{source}” се премешта у „{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "„{source}” се копира у „{destination}”…",
+ "Destination is not a folder" : "Одредиште није фолдер",
+ "This file/folder is already in that directory" : "Овај фајл/фолдер се већ налази у том директоријуму",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Фајл/фолдер не можете да преместите у самог себе или у његов подфолдер",
+ "(copy)" : "(копиран)",
+ "(copy %n)" : "(копирано %n)",
+ "A file or folder with that name already exists in this folder" : "У овом фолдеру већ постоји фајл или фолдер са тим именом",
+ "The files are locked" : "Фајлови су закључани",
+ "The file does not exist anymore" : "Фајл више не постоји",
+ "Choose destination" : "Изаберите одредиште",
+ "Copy to {target}" : "Копирај у {target}",
+ "Move to {target}" : "Премести у {target}",
+ "Move" : "Помери",
+ "Move or copy operation failed" : "Није успела операција премештања или копирања",
+ "Move or copy" : "Помери или копирај",
+ "Open folder {displayName}" : "Отвори фолдер {displayName}",
+ "Open in Files" : "Отвори у Фајловима",
+ "Open locally" : "Отвори локално",
+ "Failed to redirect to client" : "Преусмеравање на клијента није успело",
+ "Open file locally" : "Отвори фајл локално",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Фајл би сада требало да се отвори на вашем уређају. Ако се не отвори, проверите да ли сте инсталирали декстоп апликацију.",
+ "Retry and close" : "Покушај поново и затвори",
+ "Open online" : "Отвори на мрежи",
+ "Details" : "Детаљи",
+ "View in folder" : "Види у фасцикли",
+ "Today" : "Данас",
+ "Last 7 days" : "Последњих 7 дана",
+ "Last 30 days" : "Последњих 30 дана",
+ "This year ({year})" : "Ове године ({year})",
+ "Last year ({year})" : "Прошле године ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Табеле",
+ "Presentations" : "Презентације",
+ "PDFs" : "PDF фајлови",
+ "Folders" : "Фолдери",
+ "Audio" : "Звук",
+ "Images" : "Слике",
+ "Videos" : "Видео снимци",
+ "Created new folder \"{name}\"" : "Креиран је нови фолдер „{name}”",
+ "Unable to initialize the templates directory" : "Фолдер са шаблонима није могао да се иницијализује",
+ "Create templates folder" : "Креирај фолдер шаблона",
+ "Templates" : "Шаблони",
+ "New template folder" : "Нови фолдер шаблона",
+ "In folder" : "У фолдеру",
+ "Search in all files" : "Претражи у свим фајловима",
+ "Search in folder: {folder}" : "Претрага у фолдеру: {folder}",
+ "One of the dropped files could not be processed" : "Један од упуштених фајлова не може да се обради",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш интернет прегледач не подржава Filesystem API. Нећете моћи да отпремате директоријуме",
+ "No files to upload" : "Нема фајлова за отпремање",
+ "Unable to create the directory {directory}" : "Не може да се креира директоријум {directory}",
+ "Some files could not be uploaded" : "Неки фајлови нису могли да се отпреме",
+ "Files uploaded successfully" : "Фајлови су успешно отремљени",
+ "No files to process" : "Нема фајлова за обраду",
+ "Some files could not be copied" : "Неки фајлови нису могли да се копирају",
+ "Some files could not be moved" : "Неке фајлове нисам могао да преместим",
+ "Files copied successfully" : "Фајлови су успешно копирани",
+ "Files moved successfully" : "Фајлови су успешно премештени",
+ "Conflicts resolution skipped" : "Прексочено је разрешавање конфилката",
+ "Upload cancelled" : "Отпремање је отказано",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не може да се промени име фајла „{oldName}” јер фајл више не постоји",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Назив „{newName}” се већ користи у директоријуму „{dir}”. Молимо вас да изаберете неко друго име.",
+ "Could not rename \"{oldName}\"" : "Не може да се промени име фајла „{oldName}”",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This folder is unavailable, please try again later or contact the administration" : "Овај фолдер није доступан, молимо вас да покушате касније или да контактирате администрацију",
+ "Storage is temporarily not available" : "Складиште привремено није доступно",
+ "Unexpected error: {error}" : "Неочекивана грешка: {error}",
+ "_%n file_::_%n files_" : ["%n фајл","%n фајла","%n фајлова"],
+ "_%n folder_::_%n folders_" : ["%n фасцикла","%n фасцикле","%n фасцикли"],
+ "_%n hidden_::_%n hidden_" : ["%n скривен","%n скривена","%n скривених"],
+ "Filename must not be empty." : "Назив фајла не може бити празан.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ није дозвољен карактер у имену фајла.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}” је резервисано име и не сме се користити као име фајла.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}” није дозвољени тип фајла.",
+ "Filenames must not end with \"{extension}\"." : "Имена фајлова не смеју да се завршавају са „{extension}”.",
+ "List of favorite files and folders." : "Листа омиљених фајлова и фолдера.",
+ "No favorites yet" : "Још нема омиљених",
+ "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
+ "List of your files and folders." : "Листа ваших фајлова и фолдера.",
+ "List of your files and folders that are not shared." : "Листа ваших фајлова и фолдера који се не деле.",
+ "No personal files found" : "Није пронађен ниједан лични фајл",
+ "Files that are not shared will show up here." : "Овде ће се појавити фајлови који се не деле.",
+ "Recent" : "Скорашњи",
+ "List of recently modified files and folders." : "Листа фајлова и директоријума који су недавно измењени.",
+ "No recently modified files" : "Нема недавно промењених фајлова",
+ "Files and folders you recently modified will show up here." : "Овде ће се појавити фајлови и фолдери које сте недавно изменили.",
+ "Search" : "Претрага",
+ "Search results within your files." : "Претрага резултата у вашим фајловима.",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
- "Upload too large" : "Фајл за отпремање је превелики",
+ "Upload too large" : "Отпремање је превелико",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.",
- "No favorites yet" : "Још нема омиљених",
- "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
- "Deleted files" : "Обрисани фајлови",
- "Shares" : "Дељења",
- "Shared with others" : "Дељени са осталима",
- "Shared with you" : "Дељени са вама",
- "Shared by link" : "Дељени путем везе",
- "Deleted shares" : "Обрисана дељења",
- "Pending shares" : "Дељења на чекању",
+ "File could not be found" : "Фајл није нађен",
+ "Show list view" : "Prikaži prikaz liste",
+ "Show grid view" : "Prikaži prikaz mreže",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Не могу да направим фасциклу „{dir}“",
+ "This will stop your current uploads." : "Ово ће да прекине тренутна отпремања.",
+ "Upload cancelled." : "Отпремање је отказано.",
+ "Processing files …" : "Обрађујем фајлове…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то или директоријум или има 0 бајтова",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало",
+ "Target folder \"{dir}\" does not exist any more" : "Одредишна фасцикла „{dir}“ више не постоји",
+ "An unknown error has occurred" : "Десила се непозната грешка",
+ "File could not be uploaded" : "Фајл не може да се отпреми",
+ "Uploading …" : "Отпремам…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Отпремање … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Отпремање те ставке није подржано",
+ "Error when assembling chunks, status code {status}" : "Грешки при прикупљању делова фајла, статус код {status}",
+ "Choose target folder" : "Одаберите одредишну фасциклу",
+ "Set reminder" : "Постави подсетник",
+ "Edit locally" : "Уреди локално",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Не могу да учитам информације фајла „{file}“",
+ "Please select tag(s) to add to the selection" : "Молимо вас да изаберете ознаку (или више њих) која треба да се дода избору",
+ "Apply tag(s) to selection" : "Примени ознаку (или више њих) на избор",
+ "Select directory \"{dirName}\"" : "Избор директоријума „{dirName}",
+ "Select file \"{fileName}\"" : "Избор фајла „{fileName}”",
+ "Unable to determine date" : "Не могу да одредим датум",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите дневник или контактирајте администратора",
+ "Could not move \"{file}\", target exists" : "Не могу да преместим „{file}“. Одредиште већ постоји",
+ "Could not move \"{file}\"" : "Не могу да преместим „{file}“",
+ "copy" : "копиран",
+ "Could not copy \"{file}\", target exists" : "Не могу да копирам „{file}“, одредиште већ постоји",
+ "Could not copy \"{file}\"" : "Не могу да копирам „{file}“",
+ "Copied {origin} inside {destination}" : "Копиран {origin} у {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копиран{origin} и још {nbfiles} других фајлова у {destination}",
+ "{newName} already exists" : "{newName} већ постоји",
+ "Could not create file \"{file}\"" : "Не могу да направим фајл „{file}“",
+ "Could not create file \"{file}\" because it already exists" : "Не могу да направим фајл „{file}“ јер већ постоји",
+ "Could not create folder \"{dir}\" because it already exists" : "Не могу да направим фасциклу „{dir}“ јер већ постоји",
+ "Could not fetch file details \"{file}\"" : "Не могу да дохватим детаље за „{file}“",
+ "Error deleting file \"{fileName}\"." : "Грешка при брисању фајла „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултата претраге у осталим фасциклама за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Унесите више од два карактера да претражујете у другим фасциклама",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"],
+ "You do not have permission to upload or create files here" : "Немате дозволу да овде отпремите или креирате фајлове",
+ "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"],
+ "New" : "Нов",
+ "New file/folder menu" : "Мени за нови фајл/фолдер",
+ "Select file range" : "Одаберите опсег фајлова",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} искоришћено",
+ "\"{name}\" is an invalid file name." : "„{name}“ није исправан назив фајла.",
+ "File name cannot be empty." : "Назив фајла не може бити празан.",
+ "\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиште власника {owner} је пуно, више није могуће отпремање или синхронизација фајлова!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групни фолдер „{mountPoint}” је пун, фајлови више не могу да се ажурирају или синхронизују!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Спаљно складиште „{mountPoint}” је пуно, фајлови више не могу да се ажурирају или синхронизују!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше складиште је пуно, фајлови випе не могу да се ажурирају или синхронизују!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["се подудара са „{filter}”","се подударају са „{filter}","се подудара са „{filter}"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Копиран је директан линк (функционише само за особе који имају приступ овом фајлу/фолдеру)",
+ "Path" : "Путања",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
+ "Favored" : "Наклоњен",
+ "Favor" : "Наклоност",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирај директни линк (ради само за особе које имају приступ овом фајлу/фолдеру)",
+ "Upload file" : "Отпреми фајл",
+ "Not favored" : "Ненаклоњен",
+ "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
+ "Upload (max. %s)" : "Отпремање (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "Акција „{displayName}” је успешно извршена",
+ "\"{displayName}\" action failed" : "Акција „{displayName}” није успела",
+ "\"{displayName}\" failed on some elements" : "„{displayName}” није успело на неким елементима",
+ "\"{displayName}\" batch action executed successfully" : "Пакетна акција „{displayName}” се успешно извршила",
+ "Submitting fields…" : "Поља се подносе…",
+ "Filter filenames…" : "Филтрирање имена фајлова…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL је копиран у клипборд",
+ "Enable the grid view" : "Укључи приказ мреже",
+ "Enable folder tree" : "Укључи стабло фолдера",
+ "Copy to clipboard" : "Копирај у оставу",
+ "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
+ "Deletion cancelled" : "Брисање је отказано",
+ "Move cancelled" : "Премештање је отказано",
+ "Cancelled move or copy of \"{filename}\"." : "Операција премештања или копирања „{filename}” је отказана.",
+ "Cancelled move or copy operation" : "Операција премештања или копирања је отказана",
+ "Open details" : "Отвори детаље",
+ "Photos and images" : "Фотографије и слике",
+ "New folder creation cancelled" : "Отказане је креирање новог фолдера",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} фолдер","{folderCount} фолдера","{folderCount} фолдера"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} фајл","{fileCount} фајла","{fileCount} фајлова"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 фајл и {folderCount} фолдер","1 фајл и {folderCount} фолдера","1 фајл и {folderCount} фолдера"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} фајл и 1 фолдер","{fileCount} фајла и 1 фолдер","{fileCount} фајлова и 1 фолдер"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} фајлова и {folderCount} фолдера",
+ "All folders" : "Сви фолдери",
+ "Personal Files" : "Лични фајлови",
"Text file" : "Tекстуални фајл",
"New text file.txt" : "Нов текстуални фајл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Складиште корисника {owner} је пуно. Фајлови се не могу ажурирати нити синхронизовати!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Групна фасцикла „{mountPoint}“ је пуна. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Спољашње складиште „{mountPoint}“ је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "_matches '{filter}'_::_match '{filter}'_" : ["се поклапа са '{filter}'","се поклапају са '{filter}'","се поклапа са '{filter}'"]
+ "%1$s (renamed)" : "%1$s (преименован)",
+ "renamed file" : "преименован фајл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Када се укључе windows компатибилна имена фајлова, постојећи фајлови се више неће моћи мењати, али њихов власник може да им промени име на исправно ново име.",
+ "Filter file names …" : "Филтрирање имена фајлова…",
+ "Prevent warning dialogs from open or reenable them." : "Спречава да се дијалози упозорења отворе или да се поново укључе.",
+ "Show a warning dialog when changing a file extension." : "Прикажи дијалог упозорења када се мења екстензија фајла.",
+ "Speed up your Files experience with these quick shortcuts." : "Убрзајте рад у апликацији Фајлови следећим брзим пречицама.",
+ "Open the actions menu for a file" : "Отвори мени са акцијама над фајлом",
+ "Rename a file" : "Промени име фајла",
+ "Delete a file" : "Обриши фајл",
+ "Favorite or remove a file from favorites" : "Постави или уклони из омиљених",
+ "Manage tags for a file" : "Управљај ознакама фајла",
+ "Deselect all files" : "Уклони избор са свих фајлова",
+ "Select or deselect a file" : "Изабери фајл или уклони избор фајла",
+ "Select a range of files" : "Изабери опсег фајлова",
+ "Navigate to the parent folder" : "Пређи на фолдер родитељ",
+ "Navigate to the file above" : "Пређи на фајл изнад",
+ "Navigate to the file below" : "Пређи на фајл испод",
+ "Navigate to the file on the left (in grid mode)" : "Пређи на фајл са леве стране (у режиму мреже)",
+ "Navigate to the file on the right (in grid mode)" : "Пређи на фајл са десне стране (у режиму мреже)",
+ "Toggle the grid view" : "Укључи/искључи приказ мреже",
+ "Open the sidebar for a file" : "Отвори у бочни панел за фајл"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index 83a58b63ac9..8746aa285a7 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -1,105 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Складиште привремено није доступно",
- "Storage invalid" : "Неисправно складиште",
- "Unknown error" : "Непозната грешка",
- "File could not be found" : "Фајл није нађен",
- "Move or copy" : "Помери или копирај",
- "Download" : "Преузми",
- "Delete" : "Обриши",
- "Home" : "Почетна",
- "Close" : "Затвори",
- "Favorites" : "Омиљени",
- "Could not create folder \"{dir}\"" : "Не могу да направим фасциклу „{dir}“",
- "This will stop your current uploads." : "Ово ће да прекине тренутна отпремања.",
- "Upload cancelled." : "Отпремање је отказано.",
- "Processing files …" : "Обрађујем фајлове…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то или директоријум или има 0 бајтова",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало",
- "Target folder \"{dir}\" does not exist any more" : "Одредишна фасцикла „{dir}“ више не постоји",
- "Not enough free space" : "Нема довољно слободног места",
- "An unknown error has occurred" : "Десила се непозната грешка",
- "Uploading …" : "Отпремам…",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Отпремање те ставке није подржано",
- "Target folder does not exist any more" : "Одредишна фасцикла више не постоји",
- "Operation is blocked by access control" : "Контрола приступа је блокирала операцију",
- "Error when assembling chunks, status code {status}" : "Грешки при прикупљању делова фајла, статус код {status}",
- "Actions" : "Радње",
- "Rename" : "Преименуј",
- "Copy" : "Копирај",
- "Choose target folder" : "Одаберите одредишну фасциклу",
- "Open" : "Отвори",
- "Delete file" : "Обриши фајл",
- "Delete folder" : "Обриши фасциклу",
- "Disconnect storage" : "Искључи складиште",
- "Leave this share" : "Напусти ово дељење",
- "Could not load info for file \"{file}\"" : "Не могу да учитам информације фајла „{file}“",
- "Files" : "Фајлови",
- "Details" : "Детаљи",
- "Select" : "Изабери",
- "Pending" : "На чекању",
- "Unable to determine date" : "Не могу да одредим датум",
- "This operation is forbidden" : "Ова радња је забрањена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
- "Could not move \"{file}\", target exists" : "Не могу да померим „{file}“, одредиште већ постоји",
- "Could not move \"{file}\"" : "Не могу да померим „{file}“",
- "copy" : "копиран",
- "Could not copy \"{file}\", target exists" : "Не могу да копирам „{file}“, одредиште већ постоји",
- "Could not copy \"{file}\"" : "Не могу да копирам „{file}“",
- "Copied {origin} inside {destination}" : "Копиран {origin} у {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Копиран{origin} и још {nbfiles} других фајлова у {destination}",
- "{newName} already exists" : "{newName} већ постоји",
- "Could not rename \"{fileName}\", it does not exist any more" : "Не могу да преименујем „{fileName}“, фајл више не постоји",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Име „{targetName}“ се већ користи за фасциклу „{dir}“. Одаберите неко друго име.",
- "Could not rename \"{fileName}\"" : "Не могу да преименујем „{fileName}“",
- "Could not create file \"{file}\"" : "Не могу да направим фајл „{file}“",
- "Could not create file \"{file}\" because it already exists" : "Не могу да направим фајл „{file}“ јер већ постоји",
- "Could not create folder \"{dir}\" because it already exists" : "Не могу да направим фасциклу „{dir}“ јер већ постоји",
- "Could not fetch file details \"{file}\"" : "Не могу да дохватим детаље за „{file}“",
- "Error deleting file \"{fileName}\"." : "Грешка при брисању фајла „{fileName}“.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултата претраге у осталим фасциклама за {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Унесите више од два карактера да претражујете у другим фасциклама",
- "Name" : "Назив",
- "Size" : "Величина",
- "Modified" : "Измењен",
- "_%n folder_::_%n folders_" : ["%n фасцикла","%n фасцикле","%n фасцикли"],
- "_%n file_::_%n files_" : ["%n фајл","%n фајла","%n фајлова"],
- "{dirs} and {files}" : "{dirs} и {files}",
- "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"],
- "You don’t have permission to upload or create files here" : "Немате дозволе да овде отпремате или стварате фајлове",
- "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"],
- "New" : "Ново",
- "Select file range" : "Одаберите опсег фајлова",
- "{used} of {quota} used" : "{used} од {quota} искоришћено",
- "{used} used" : "{used} искоришћено",
- "\"{name}\" is an invalid file name." : "„{name}“ није исправан назив фајла.",
- "File name cannot be empty." : "Назив фајла не може бити празан.",
- "\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
- "\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
- "View in folder" : "Види у фасцикли",
- "Copied!" : "Копирано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Копирај директну везу (ради само за кориснике који имају приступ овом фајлу/фасциклу)",
- "Path" : "Путања",
- "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
- "Favorited" : "Омиљено",
- "Favorite" : "Омиљени",
- "You can only favorite a single file or folder at a time" : "Можете поставити као омиљени само један фајл или фасциклу одједном",
- "New folder" : "Нова фасцикла",
- "Upload file" : "Отпреми фајл",
- "Recent" : "Скорашњи",
- "Not favorited" : "Није омиљено",
- "Remove from favorites" : "Избаци из омиљених",
- "Add to favorites" : "Додај у омиљене",
- "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
"Added to favorites" : "Додато у омиљено",
"Removed from favorites" : "Избачено из омиљених",
"You added {file} to your favorites" : "Додали сте {file} у омиљене",
"You removed {file} from your favorites" : "Избацили сте {file} из омиљених",
+ "Favorites" : "Омиљени",
"File changes" : "Измене над фајлом",
"Created by {user}" : "Направио {user}",
"Changed by {user}" : "Изменио {user}",
@@ -107,7 +11,7 @@
"Restored by {user}" : "Повратио {user}",
"Renamed by {user}" : "Преименовао {user}",
"Moved by {user}" : "Померио {user}",
- "\"remote user\"" : "„удаљени корисник“",
+ "\"remote account\"" : "„удаљени налог”",
"You created {file}" : "Направили сте {file}",
"You created an encrypted file in {file}" : "Направили сте шифровани фајл {file}",
"{user} created {file}" : "{user} је направио {file}",
@@ -123,20 +27,37 @@
"{user} deleted an encrypted file in {file}" : "{user} је обрисао шифровани фајл {file}",
"You restored {file}" : "Повратили сте {file}",
"{user} restored {file}" : "{user} је повратио {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Променили сте име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Променили сте име фајла {oldfile} (скривено) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Променили сте име фајла {oldfile} на {newfile} (скривено)",
"You renamed {oldfile} to {newfile}" : "Преименовали сте {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} је променио име фајла {oldfile} (скривено) на {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} на {newfile} (скривено)",
"{user} renamed {oldfile} to {newfile}" : "{user} је преименовао {oldfile} на {newfile}",
"You moved {oldfile} to {newfile}" : "Померили сте {oldfile} на {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} је померио {oldfile} на {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Фајл је додат или избрисан из Ваших <strong>омиљених</strong>",
+ "Files" : "Фајлови",
"A file or folder has been <strong>changed</strong>" : "Фајл или фасцикла су <strong>измењени</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Омиљени фајл или фасцикла су <strong>измењени</strong>",
- "All files" : "Сви фајлови",
- "Unlimited" : "Неограничено",
- "Upload (max. %s)" : "Отпремање (макс. %s)",
+ "Failed to authorize" : "Није успело добијање дозволе",
+ "Invalid folder path" : "Неисправна путања фолдера",
+ "Folder not found" : "Није пронађен фолдер",
+ "The file cannot be found" : "Фајл не може да се пронађе",
+ "The destination path does not exist: %1$s" : "Путања одредишта не постоји: %1$s",
+ "You do not have permission to create a file at the specified location" : "Немате дозволу да креирате фајл на наведеној локацији",
+ "The file could not be converted." : "Фајл није могао да се конвертује.",
+ "Could not get relative path to converted file" : "Није могла да се преузме релативна путања до конвертованог фајла",
+ "Favorite files" : "Омиљени фајлови",
+ "No favorites" : "Нема омиљених",
+ "More favorites" : "Још омиљених",
"Accept" : "Прихвати",
"Reject" : "Одбаци",
"Incoming ownership transfer from {user}" : "Надолазећи пренос власништва од корисника {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Да ли желите да прихватите {path}?\n\nПажња: После прихватања, процес трансфера може потрајати и до 1h.",
+ "Ownership transfer denied" : "Пренос власништва је одбијен",
+ "Your ownership transfer of {path} was denied by {user}." : "Корисник {user} је одбио ваш пренос власништва над {path}.",
"Ownership transfer failed" : "Пренос власништва није успео",
"Your ownership transfer of {path} to {user} failed." : "Ваш пренос власништва {path} на корисника {user} није успео.",
"The ownership transfer of {path} from {user} failed." : "Пренос власништва {path} на корисника {user} није успео.",
@@ -144,52 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "Ваш пренос власништва {path} на корисника {user} завршен.",
"The ownership transfer of {path} from {user} has completed." : "Пренос власништва {path} на корисника {user} завршен.",
"in %s" : "за %s",
+ "Transferred from %1$s on %2$s" : "Пренесено са %1$s на %2$s",
+ "Files compatibility" : "Компатибилност фајлова",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозвољава се ограничавање имена фајлова тако да сви клијенти могу да их синхронизују. Подразумевано се дозвољавају сва имена фајлова која су исправна на POSIX системима (нпр. Linux или macOS).",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Када се укључе Windows компатибилна имена фајлова, постојећи фајлови се више неће моћи мењати, али њихов власник може да им промени име на исправно ново име.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Фајлови такође могу аутоматски да се мигрирају након укључивања овог подешавања, молимо вас да погледате документацију у вези са occ командом.",
+ "Enforce Windows compatibility" : "Форсирај Windows компатибилност",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ово ће да блокира имена фајлова која су неисправна на Windows системима, као што су она која користе резервисана имена или специјалне карактере. Али ово неће форсирати компатибилност разликовања малих и великих слова.",
"File Management" : "Управљање фајловима",
- "Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
- "Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
- "Change" : "Измени",
- "New owner" : "Нови власник",
- "Search users" : "Претражи кориснике",
+ "Home" : "Почетна",
+ "Target folder does not exist any more" : "Одредишна фасцикла више не постоји",
+ "Reload current directory" : "Поново учитај текући директоријум",
+ "Go to the \"{dir}\" directory" : "Иди у „{dir}” дирекотријум",
+ "Current directory path" : "Путања текућег директоријума",
+ "Your have used your space quota and cannot upload files anymore" : "Искористили сте квоту простора и више не можете да отпремате фајлове",
+ "You do not have permission to upload or create files here." : "Немате дозволу да овде отпремите или креирате фајлове.",
+ "Drag and drop files here to upload" : "Да отпремите, превуците и отпустите фајлове овде",
+ "Favorite" : "Омиљено",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Укљ./искљ. избор за фајл „{displayName}”",
+ "Toggle selection for folder \"{displayName}\"" : "Укљ./искљ. избор за фолдер „{displayName}”",
+ "File is loading" : "Фајл се учитава",
+ "Folder is loading" : "Фолдер се учитава",
+ "Filename" : "Назив фајла",
+ "Folder name" : "Назив фасцикле",
+ "This node is unavailable" : "Овај чвор није доступан",
+ "Another entry with the same name already exists." : "Већ постоји ставка са истим именом.",
+ "Invalid filename." : "Неисправно име фајла.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "„{oldName}” је промењено на „{newName}”",
+ "Rename file" : "Промени назив фајла",
+ "Folder" : "Фасцикла",
+ "Unknown file type" : "Непознат тип фајла",
+ "{ext} image" : "{ext} слика",
+ "{ext} video" : "{ext} видео",
+ "{ext} audio" : "{ext} аудио",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "На чекању",
+ "Unknown date" : "Непознат датум",
+ "Clear filter" : "Очисти филтер",
+ "Modified" : "Измењен",
+ "Search everywhere" : "Претражи свуда",
+ "Type" : "Тип",
+ "Active filters" : "Активни филтери",
+ "Remove filter" : "Уклони филтер",
+ "Total rows summary" : "Резиме укупног броја редова",
+ "Toggle selection for all files and folders" : "Укљ./искљ. избор за све фајлове и фолдере",
+ "Name" : "Назив",
+ "File type" : "Тип фајла",
+ "Size" : "Величина",
+ "{displayName}: failed on some elements" : "{displayName}: није успело на неким елементима",
+ "{displayName}: done" : "{displayName}: завршено",
+ "{displayName}: failed" : "{displayName}: није успело",
+ "Actions" : "Радње",
+ "(selected)" : "(изабрано)",
+ "List of files and folders." : "Листа фајлова и фолдера.",
+ "You have used your space quota and cannot upload files anymore." : "Искористили сте квоту простора и више не можете да отпремате фајлове.",
+ "Column headers with buttons are sortable." : "Заглавља колона са дугмићима могу да се соритрају.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
+ "File not found" : "Фајл није нађен",
+ "_{count} selected_::_{count} selected_" : ["изабран је {count}","изабрана су {count}","изабрано је {count}"],
+ "Search everywhere …" : "Претражи свуда",
+ "Search here …" : "Претражи овде…",
+ "Search scope options" : "Опције опсега претраге",
+ "Search here" : "Претражи овде",
+ "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
+ "{used} of {quota} used" : "{used} од {quota} искоришћено",
+ "{relative}% used" : "{relative}% искоришћено",
+ "Could not refresh storage stats" : "Статистике складишта нису могле да се освеже",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
+ "Storage information" : "Информације о складишту",
+ "Storage quota" : "Квота складишта",
+ "New folder" : "Нова фасцикла",
+ "Create new folder" : "Направи нову фасциклу",
+ "This name is already in use." : "Ово име се већ користи.",
+ "Create" : "Направи",
+ "Files starting with a dot are hidden by default" : "Фајлови који почињу тачком су подразумевано скривени",
+ "Fill template fields" : "Попуните поља шаблона",
+ "Submitting fields …" : "Поља се подносе…",
+ "Submit" : "Пошаљи",
"Choose a file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
"Transfer" : "Пренеси",
"Transfer {path} to {userid}" : "Пренеси {path} на корисника {userid}",
"Invalid path selected" : "Одабрана неисправна путања",
+ "Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Послат захтев за пренос власништва",
- "Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше",
- "Tags" : "Ознаке",
- "Unable to change the favourite state of the file" : "Неуспела промена стања омиљености фајла",
- "Error while loading the file data" : "Грешка при учитавању података фајла",
- "Cancel" : "Поништи",
- "Create" : "Направи",
- "%s used" : "%s искоришћено",
- "%s%% of %s used" : "%s%% од %s искоришћено",
- "%1$s of %2$s used" : "Заузето %1$s од %2$s",
- "Settings" : "Поставке",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да пренесете власништво над фајлом или фолдером који не поседујете",
+ "Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
+ "Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
+ "Change" : "Измени",
+ "New owner" : "Нови власник",
+ "Keep {old}" : "Задржи {old}",
+ "Keep without extension" : "Задржи без екстензије",
+ "Use {new}" : "Користи {new}",
+ "Remove extension" : "Уклони екстензију фајла",
+ "Change file extension" : "Промени екстензију фајла",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Ако екстензију „{old}” промените на „{new}” фајл може да постане нечитљив.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Ако уклоните екстензију „{old}” фајл може да постане нечитљив.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Ако додате екстензију „{new}” фајл може да постане нечитљив.",
+ "Do not show this dialog again." : "Не приказуј поново овај дијалог.",
+ "Select file or folder to link to" : "Изаберите фајл или фолдер на који показује линк",
+ "Choose {file}" : "Изабери {file}",
+ "Share" : "Пдели",
+ "Shared by link" : "Дељени путем везе",
+ "Shared" : "Подељено",
+ "Switch to list view" : "Пређи на поглед листе",
+ "Switch to grid view" : "Пређи на поглед мреже",
+ "The file could not be found" : "Фајл није могао да се пронађе",
+ "Upload was cancelled by user" : "Корисник је прекинуо отпремање",
+ "Not enough free space" : "Нема довољно слободног места",
+ "Operation is blocked by access control" : "Контрола приступа је блокирала операцију",
+ "Error during upload: {message}" : "Грешка при отпремању: {message}",
+ "Error during upload, status code {status}" : "Грешка приликом отпремања, кôд статуса {status}",
+ "Unknown error during upload" : "Непозната грешка током отпремања",
+ "Loading current folder" : "Учитавање текућег фолдера",
+ "Retry" : "Покушај поново",
+ "No files in here" : "Овде нема фајлова",
+ "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
+ "Go back" : "Иди назад",
+ "Views" : "Прикази",
+ "Files settings" : "Подешавања фајлова",
+ "Your files" : "Ваши фајлови",
+ "Open in files" : "Отвори у фајловима",
+ "File cannot be accessed" : "Фајлу не може да се приступи",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Фајл није могао да се пронађе или немате дозволу да га прегледате. Замолите пошиљаоца да га подели.",
+ "No search results for “{query}”" : "Није нађен ниједан резултат за „{query}”",
+ "Search for files" : "Претражи фајлове",
+ "Clipboard is not available" : "Клипборд није доступан",
+ "WebDAV URL copied" : "WebDAV URL је копиран",
+ "General" : "Опште",
+ "Default view" : "Подразумевани поглед",
+ "All files" : "Сви фајлови",
+ "Personal files" : "Лични фајлови",
+ "Sort favorites first" : "Сортирај прво омиљене",
+ "Sort folders before files" : "Поређај фолдере испред фајлова",
+ "Folder tree" : "Стабло фолдера",
+ "Appearance" : "Изглед",
"Show hidden files" : "Прикажи скривене фајлове",
+ "Show file type column" : "Прикажи колону са типом фајла",
+ "Show file extensions" : "Прикажи екстензије фајла",
+ "Crop image previews" : "Опсецање прегледа слика",
+ "Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
- "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Копирај",
+ "How to access files using WebDAV" : "Како да приступите фајловима преко WebDAV протокола",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Двофакторска потврда идентитета је укључена за ваш налог, тако да морате користити лозинку апликације да повежете спољни WebDAV клијент.",
+ "Warnings" : "Упозорења",
+ "Warn before changing a file extension" : "Упозори пре измене екстензије фајла",
+ "Warn before deleting files" : "Упозори пре брисања фајлова",
+ "Keyboard shortcuts" : "Пречице на тастатури",
+ "File actions" : "Фајл акције",
+ "Rename" : "Преименуј",
+ "Delete" : "Обриши",
+ "Add or remove favorite" : "Додај или уклони омиљене",
+ "Manage tags" : "Управљање ознакама",
+ "Selection" : "Избор",
+ "Select all files" : "Изабери све фајлове",
+ "Deselect all" : "Поништи цео избор",
+ "Select or deselect" : "Изабери или уклони избор",
+ "Select a range" : "Изабери опсег",
+ "Navigation" : "Навигација",
+ "Go to parent folder" : "Иди на фолдер родитељ",
+ "Go to file above" : "Иди на фајл изнад",
+ "Go to file below" : "Иди на фајл испод",
+ "Go left in grid" : "Иди на лево у мрежи",
+ "Go right in grid" : "Иди на десно у мреж",
+ "View" : "Погледај",
"Toggle grid view" : "Укључи/искључи приказ мреже",
- "No files in here" : "Овде нема фајлова",
- "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
+ "Open file sidebar" : "Отвори бочну траку за фајл",
+ "Show those shortcuts" : "Прикажи те пречице",
+ "You" : "Ви",
+ "Shared multiple times with different people" : "Дељено више пута са разним људима",
+ "Unable to change the favorite state of the file" : "Није успела измена стања омиљено за фајл",
+ "Error while loading the file data" : "Грешка при учитавању података фајла",
+ "Owner" : "Власник",
+ "Remove from favorites" : "Избаци из омиљених",
+ "Add to favorites" : "Додај у омиљене",
+ "Tags" : "Ознаке",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл",
+ "Pick a template for {name}" : "Изаберите шаблон за {name}",
+ "Create a new file with the selected template" : "Креирање новог фајла по изабраном шаблону",
+ "Creating file" : "Креирање фајла",
+ "Save as {displayName}" : "Сачувај као {displayName}",
+ "Save as …" : "Сачувај као",
+ "Converting files …" : "Фајлови се конвертују",
+ "Failed to convert files: {message}" : "Није успела конверзија фајлова: {message}",
+ "All files failed to be converted" : "Ниједан фајл није могао да се конвертује",
+ "One file could not be converted: {message}" : "Један фајл није могао да се конвертује: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Један фајл није могао да се конвертује","Није могло да се конвертује %n фајла","Није могло да се конвертује %n фајлова"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Фајл је успешно конвертован","Успешно су конвертована %n фајла","Успешно је конвертовано %n фајлова"],
+ "Files successfully converted" : "Фајлови су успешно конвертовани",
+ "Failed to convert files" : "Није успела конверзија фајлова",
+ "Converting file …" : "Фајл се конвертује",
+ "File successfully converted" : "Фајл је успешно конвертован",
+ "Failed to convert file: {message}" : "Није успела конверзија фајла: {message}",
+ "Failed to convert file" : "Фајл није могао да се конвертује",
+ "Leave this share" : "Напусти ово дељење",
+ "Leave these shares" : "Напусти ова дељења",
+ "Disconnect storage" : "Искључи складиште",
+ "Disconnect storages" : "Искључи складишта",
+ "Delete permanently" : "Обриши заувек",
+ "Delete and unshare" : "Обриши и прекини дељење",
+ "Delete file" : "Обриши фајл",
+ "Delete files" : "Обриши фајлове",
+ "Delete folder" : "Обрши фолдер",
+ "Delete folders" : "Обриши фолдере",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Управо ћете неповратно обрисати {count} ставку","Управо ћете неповратно обрисати {count} ставке","Управо ћете неповратно обрисати {count} ставки"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Управо ћете обрисати {count} ставку","Управо ћете обрисати {count} ставке","Управо ћете обрисати {count} ставки"],
+ "Confirm deletion" : "Потврди брисање",
+ "Cancel" : "Поништи",
+ "Download" : "Преузми",
+ "Moving \"{source}\" to \"{destination}\" …" : "„{source}” се премешта у „{destination}”…",
+ "Copying \"{source}\" to \"{destination}\" …" : "„{source}” се копира у „{destination}”…",
+ "Destination is not a folder" : "Одредиште није фолдер",
+ "This file/folder is already in that directory" : "Овај фајл/фолдер се већ налази у том директоријуму",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Фајл/фолдер не можете да преместите у самог себе или у његов подфолдер",
+ "(copy)" : "(копиран)",
+ "(copy %n)" : "(копирано %n)",
+ "A file or folder with that name already exists in this folder" : "У овом фолдеру већ постоји фајл или фолдер са тим именом",
+ "The files are locked" : "Фајлови су закључани",
+ "The file does not exist anymore" : "Фајл више не постоји",
+ "Choose destination" : "Изаберите одредиште",
+ "Copy to {target}" : "Копирај у {target}",
+ "Move to {target}" : "Премести у {target}",
+ "Move" : "Помери",
+ "Move or copy operation failed" : "Није успела операција премештања или копирања",
+ "Move or copy" : "Помери или копирај",
+ "Open folder {displayName}" : "Отвори фолдер {displayName}",
+ "Open in Files" : "Отвори у Фајловима",
+ "Open locally" : "Отвори локално",
+ "Failed to redirect to client" : "Преусмеравање на клијента није успело",
+ "Open file locally" : "Отвори фајл локално",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Фајл би сада требало да се отвори на вашем уређају. Ако се не отвори, проверите да ли сте инсталирали декстоп апликацију.",
+ "Retry and close" : "Покушај поново и затвори",
+ "Open online" : "Отвори на мрежи",
+ "Details" : "Детаљи",
+ "View in folder" : "Види у фасцикли",
+ "Today" : "Данас",
+ "Last 7 days" : "Последњих 7 дана",
+ "Last 30 days" : "Последњих 30 дана",
+ "This year ({year})" : "Ове године ({year})",
+ "Last year ({year})" : "Прошле године ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Табеле",
+ "Presentations" : "Презентације",
+ "PDFs" : "PDF фајлови",
+ "Folders" : "Фолдери",
+ "Audio" : "Звук",
+ "Images" : "Слике",
+ "Videos" : "Видео снимци",
+ "Created new folder \"{name}\"" : "Креиран је нови фолдер „{name}”",
+ "Unable to initialize the templates directory" : "Фолдер са шаблонима није могао да се иницијализује",
+ "Create templates folder" : "Креирај фолдер шаблона",
+ "Templates" : "Шаблони",
+ "New template folder" : "Нови фолдер шаблона",
+ "In folder" : "У фолдеру",
+ "Search in all files" : "Претражи у свим фајловима",
+ "Search in folder: {folder}" : "Претрага у фолдеру: {folder}",
+ "One of the dropped files could not be processed" : "Један од упуштених фајлова не може да се обради",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш интернет прегледач не подржава Filesystem API. Нећете моћи да отпремате директоријуме",
+ "No files to upload" : "Нема фајлова за отпремање",
+ "Unable to create the directory {directory}" : "Не може да се креира директоријум {directory}",
+ "Some files could not be uploaded" : "Неки фајлови нису могли да се отпреме",
+ "Files uploaded successfully" : "Фајлови су успешно отремљени",
+ "No files to process" : "Нема фајлова за обраду",
+ "Some files could not be copied" : "Неки фајлови нису могли да се копирају",
+ "Some files could not be moved" : "Неке фајлове нисам могао да преместим",
+ "Files copied successfully" : "Фајлови су успешно копирани",
+ "Files moved successfully" : "Фајлови су успешно премештени",
+ "Conflicts resolution skipped" : "Прексочено је разрешавање конфилката",
+ "Upload cancelled" : "Отпремање је отказано",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не може да се промени име фајла „{oldName}” јер фајл више не постоји",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Назив „{newName}” се већ користи у директоријуму „{dir}”. Молимо вас да изаберете неко друго име.",
+ "Could not rename \"{oldName}\"" : "Не може да се промени име фајла „{oldName}”",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This folder is unavailable, please try again later or contact the administration" : "Овај фолдер није доступан, молимо вас да покушате касније или да контактирате администрацију",
+ "Storage is temporarily not available" : "Складиште привремено није доступно",
+ "Unexpected error: {error}" : "Неочекивана грешка: {error}",
+ "_%n file_::_%n files_" : ["%n фајл","%n фајла","%n фајлова"],
+ "_%n folder_::_%n folders_" : ["%n фасцикла","%n фасцикле","%n фасцикли"],
+ "_%n hidden_::_%n hidden_" : ["%n скривен","%n скривена","%n скривених"],
+ "Filename must not be empty." : "Назив фајла не може бити празан.",
+ "\"{char}\" is not allowed inside a filename." : "„{char}“ није дозвољен карактер у имену фајла.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "„{segment}” је резервисано име и не сме се користити као име фајла.",
+ "\"{extension}\" is not an allowed filetype." : "„{extension}” није дозвољени тип фајла.",
+ "Filenames must not end with \"{extension}\"." : "Имена фајлова не смеју да се завршавају са „{extension}”.",
+ "List of favorite files and folders." : "Листа омиљених фајлова и фолдера.",
+ "No favorites yet" : "Још нема омиљених",
+ "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
+ "List of your files and folders." : "Листа ваших фајлова и фолдера.",
+ "List of your files and folders that are not shared." : "Листа ваших фајлова и фолдера који се не деле.",
+ "No personal files found" : "Није пронађен ниједан лични фајл",
+ "Files that are not shared will show up here." : "Овде ће се појавити фајлови који се не деле.",
+ "Recent" : "Скорашњи",
+ "List of recently modified files and folders." : "Листа фајлова и директоријума који су недавно измењени.",
+ "No recently modified files" : "Нема недавно промењених фајлова",
+ "Files and folders you recently modified will show up here." : "Овде ће се појавити фајлови и фолдери које сте недавно изменили.",
+ "Search" : "Претрага",
+ "Search results within your files." : "Претрага резултата у вашим фајловима.",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
- "Upload too large" : "Фајл за отпремање је превелики",
+ "Upload too large" : "Отпремање је превелико",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.",
- "No favorites yet" : "Још нема омиљених",
- "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде",
- "Deleted files" : "Обрисани фајлови",
- "Shares" : "Дељења",
- "Shared with others" : "Дељени са осталима",
- "Shared with you" : "Дељени са вама",
- "Shared by link" : "Дељени путем везе",
- "Deleted shares" : "Обрисана дељења",
- "Pending shares" : "Дељења на чекању",
+ "File could not be found" : "Фајл није нађен",
+ "Show list view" : "Prikaži prikaz liste",
+ "Show grid view" : "Prikaži prikaz mreže",
+ "Close" : "Затвори",
+ "Could not create folder \"{dir}\"" : "Не могу да направим фасциклу „{dir}“",
+ "This will stop your current uploads." : "Ово ће да прекине тренутна отпремања.",
+ "Upload cancelled." : "Отпремање је отказано.",
+ "Processing files …" : "Обрађујем фајлове…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то или директоријум или има 0 бајтова",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало",
+ "Target folder \"{dir}\" does not exist any more" : "Одредишна фасцикла „{dir}“ више не постоји",
+ "An unknown error has occurred" : "Десила се непозната грешка",
+ "File could not be uploaded" : "Фајл не може да се отпреми",
+ "Uploading …" : "Отпремам…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Отпремање … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} од {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Отпремање те ставке није подржано",
+ "Error when assembling chunks, status code {status}" : "Грешки при прикупљању делова фајла, статус код {status}",
+ "Choose target folder" : "Одаберите одредишну фасциклу",
+ "Set reminder" : "Постави подсетник",
+ "Edit locally" : "Уреди локално",
+ "Open" : "Отвори",
+ "Could not load info for file \"{file}\"" : "Не могу да учитам информације фајла „{file}“",
+ "Please select tag(s) to add to the selection" : "Молимо вас да изаберете ознаку (или више њих) која треба да се дода избору",
+ "Apply tag(s) to selection" : "Примени ознаку (или више њих) на избор",
+ "Select directory \"{dirName}\"" : "Избор директоријума „{dirName}",
+ "Select file \"{fileName}\"" : "Избор фајла „{fileName}”",
+ "Unable to determine date" : "Не могу да одредим датум",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите дневник или контактирајте администратора",
+ "Could not move \"{file}\", target exists" : "Не могу да преместим „{file}“. Одредиште већ постоји",
+ "Could not move \"{file}\"" : "Не могу да преместим „{file}“",
+ "copy" : "копиран",
+ "Could not copy \"{file}\", target exists" : "Не могу да копирам „{file}“, одредиште већ постоји",
+ "Could not copy \"{file}\"" : "Не могу да копирам „{file}“",
+ "Copied {origin} inside {destination}" : "Копиран {origin} у {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Копиран{origin} и још {nbfiles} других фајлова у {destination}",
+ "{newName} already exists" : "{newName} већ постоји",
+ "Could not create file \"{file}\"" : "Не могу да направим фајл „{file}“",
+ "Could not create file \"{file}\" because it already exists" : "Не могу да направим фајл „{file}“ јер већ постоји",
+ "Could not create folder \"{dir}\" because it already exists" : "Не могу да направим фасциклу „{dir}“ јер већ постоји",
+ "Could not fetch file details \"{file}\"" : "Не могу да дохватим детаље за „{file}“",
+ "Error deleting file \"{fileName}\"." : "Грешка при брисању фајла „{fileName}“.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нема резултата претраге у осталим фасциклама за {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Унесите више од два карактера да претражујете у другим фасциклама",
+ "{dirs} and {files}" : "{dirs} и {files}",
+ "_including %n hidden_::_including %n hidden_" : ["укључујући и %n скривени","укључујући и %n скривена","укључујући и %n скривених"],
+ "You do not have permission to upload or create files here" : "Немате дозволу да овде отпремите или креирате фајлове",
+ "_Uploading %n file_::_Uploading %n files_" : ["Отпремам %n фајл","Отпремам %n фајла","Отпремам %n фајлова"],
+ "New" : "Нов",
+ "New file/folder menu" : "Мени за нови фајл/фолдер",
+ "Select file range" : "Одаберите опсег фајлова",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} искоришћено",
+ "\"{name}\" is an invalid file name." : "„{name}“ није исправан назив фајла.",
+ "File name cannot be empty." : "Назив фајла не може бити празан.",
+ "\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
+ "\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиште власника {owner} је пуно, више није могуће отпремање или синхронизација фајлова!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групни фолдер „{mountPoint}” је пун, фајлови више не могу да се ажурирају или синхронизују!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Спаљно складиште „{mountPoint}” је пуно, фајлови више не могу да се ажурирају или синхронизују!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше складиште је пуно, фајлови випе не могу да се ажурирају или синхронизују!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["се подудара са „{filter}”","се подударају са „{filter}","се подудара са „{filter}"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Копиран је директан линк (функционише само за особе који имају приступ овом фајлу/фолдеру)",
+ "Path" : "Путања",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
+ "Favored" : "Наклоњен",
+ "Favor" : "Наклоност",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копирај директни линк (ради само за особе које имају приступ овом фајлу/фолдеру)",
+ "Upload file" : "Отпреми фајл",
+ "Not favored" : "Ненаклоњен",
+ "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака",
+ "Upload (max. %s)" : "Отпремање (макс. %s)",
+ "\"{displayName}\" action executed successfully" : "Акција „{displayName}” је успешно извршена",
+ "\"{displayName}\" action failed" : "Акција „{displayName}” није успела",
+ "\"{displayName}\" failed on some elements" : "„{displayName}” није успело на неким елементима",
+ "\"{displayName}\" batch action executed successfully" : "Пакетна акција „{displayName}” се успешно извршила",
+ "Submitting fields…" : "Поља се подносе…",
+ "Filter filenames…" : "Филтрирање имена фајлова…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL је копиран у клипборд",
+ "Enable the grid view" : "Укључи приказ мреже",
+ "Enable folder tree" : "Укључи стабло фолдера",
+ "Copy to clipboard" : "Копирај у оставу",
+ "Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ако сте укључили 2FA, морате кликом овде да крерате нову лозинку апликације.",
+ "Deletion cancelled" : "Брисање је отказано",
+ "Move cancelled" : "Премештање је отказано",
+ "Cancelled move or copy of \"{filename}\"." : "Операција премештања или копирања „{filename}” је отказана.",
+ "Cancelled move or copy operation" : "Операција премештања или копирања је отказана",
+ "Open details" : "Отвори детаље",
+ "Photos and images" : "Фотографије и слике",
+ "New folder creation cancelled" : "Отказане је креирање новог фолдера",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} фолдер","{folderCount} фолдера","{folderCount} фолдера"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} фајл","{fileCount} фајла","{fileCount} фајлова"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 фајл и {folderCount} фолдер","1 фајл и {folderCount} фолдера","1 фајл и {folderCount} фолдера"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} фајл и 1 фолдер","{fileCount} фајла и 1 фолдер","{fileCount} фајлова и 1 фолдер"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} фајлова и {folderCount} фолдера",
+ "All folders" : "Сви фолдери",
+ "Personal Files" : "Лични фајлови",
"Text file" : "Tекстуални фајл",
"New text file.txt" : "Нов текстуални фајл.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Складиште корисника {owner} је пуно. Фајлови се не могу ажурирати нити синхронизовати!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Групна фасцикла „{mountPoint}“ је пуна. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Спољашње складиште „{mountPoint}“ је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Фајлови више не могу бити ажурирани ни синхронизовани!",
- "_matches '{filter}'_::_match '{filter}'_" : ["се поклапа са '{filter}'","се поклапају са '{filter}'","се поклапа са '{filter}'"]
+ "%1$s (renamed)" : "%1$s (преименован)",
+ "renamed file" : "преименован фајл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Када се укључе windows компатибилна имена фајлова, постојећи фајлови се више неће моћи мењати, али њихов власник може да им промени име на исправно ново име.",
+ "Filter file names …" : "Филтрирање имена фајлова…",
+ "Prevent warning dialogs from open or reenable them." : "Спречава да се дијалози упозорења отворе или да се поново укључе.",
+ "Show a warning dialog when changing a file extension." : "Прикажи дијалог упозорења када се мења екстензија фајла.",
+ "Speed up your Files experience with these quick shortcuts." : "Убрзајте рад у апликацији Фајлови следећим брзим пречицама.",
+ "Open the actions menu for a file" : "Отвори мени са акцијама над фајлом",
+ "Rename a file" : "Промени име фајла",
+ "Delete a file" : "Обриши фајл",
+ "Favorite or remove a file from favorites" : "Постави или уклони из омиљених",
+ "Manage tags for a file" : "Управљај ознакама фајла",
+ "Deselect all files" : "Уклони избор са свих фајлова",
+ "Select or deselect a file" : "Изабери фајл или уклони избор фајла",
+ "Select a range of files" : "Изабери опсег фајлова",
+ "Navigate to the parent folder" : "Пређи на фолдер родитељ",
+ "Navigate to the file above" : "Пређи на фајл изнад",
+ "Navigate to the file below" : "Пређи на фајл испод",
+ "Navigate to the file on the left (in grid mode)" : "Пређи на фајл са леве стране (у режиму мреже)",
+ "Navigate to the file on the right (in grid mode)" : "Пређи на фајл са десне стране (у режиму мреже)",
+ "Toggle the grid view" : "Укључи/искључи приказ мреже",
+ "Open the sidebar for a file" : "Отвори у бочни панел за фајл"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js
deleted file mode 100644
index 736e4a1cc81..00000000000
--- a/apps/files/l10n/sr@latin.js
+++ /dev/null
@@ -1,95 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage not available" : "Skladište nije dostupno",
- "Storage invalid" : "Neispravno skladište",
- "Unknown error" : "Nepoznata greška",
- "Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.",
- "Invalid Token" : "Neispravan token",
- "No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška",
- "There is no error, the file uploaded with success" : "Nema greške, fajl je uspešno otpremljen",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Otpremani fajl prevazilazi smernicu upload_max_filesize u fajlu php.ini:",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Otpremani fajl prevazilazi smernicu MAX_FILE_SIZE koja je navedena u HTML obrascu",
- "The uploaded file was only partially uploaded" : "Otpremani fajl je samo delimično otpremljen",
- "No file was uploaded" : "Ništa nije otpremljeno",
- "Missing a temporary folder" : "Nedostaje privremena fascikla",
- "Failed to write to disk" : "Ne mogu da pišem na disk",
- "Not enough storage available" : "Nema dovoljno prostora",
- "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
- "Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl",
- "Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.",
- "Invalid directory." : "Neispravna fascikla.",
- "Files" : "Fajlovi",
- "All files" : "Svi fajlovi",
- "Home" : "Početna",
- "Close" : "Zatvori",
- "Favorites" : "Omiljeni",
- "Upload cancelled." : "Otpremanje je otkazano.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova",
- "Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo",
- "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
- "Uploading..." : "Otpremam…",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
- "Download" : "Preuzmi",
- "Rename" : "Preimenuj",
- "Delete" : "Obriši",
- "Disconnect storage" : "Isključi skladište",
- "Unshare" : "Ne deli",
- "Details" : "Detaljnije",
- "Select" : "Izaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Ne mogu da odredim datum",
- "No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'",
- "Name" : "Naziv",
- "Size" : "Veličina",
- "Modified" : "Izmenjen",
- "_%n folder_::_%n folders_" : ["%n fascikla","%n fascikle","%n fascikli"],
- "_%n file_::_%n files_" : ["%n fajl","%n fajla","%n fajlova"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "You don’t have permission to upload or create files here" : "Nemate dozvole da ovde otpremate ili stvarate fajlove",
- "_Uploading %n file_::_Uploading %n files_" : ["Otpremam %n fajl","Otpremam %n fajla","Otpremam %n fajlova"],
- "New" : "Novo",
- "\"{name}\" is an invalid file name." : "\"{name}\" nije ispravan naziv fajla.",
- "File name cannot be empty." : "Naziv fajla ne može biti prazan.",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše skladište je puno. Fajlovi više ne mogu biti ažurirani ni sinhronizovani!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vaše skladište je skoro puno ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"],
- "Favorited" : "Omiljeno",
- "Favorite" : "Omiljeni",
- "Folder" : "fascikla",
- "New folder" : "Nova fascikla",
- "Upload" : "Otpremi",
- "An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka",
- "A new file or folder has been <strong>created</strong>" : "Novi fajl ili fascikla su <strong>napravljeni</strong>",
- "A file or folder has been <strong>changed</strong>" : "Fajl ili fascikla su <strong>izmenjeni</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ograniči obaveštenja o stvaranju i izmenama na <strong>omiljene fajlove</strong> <em>(samo u zapisniku)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Fajl ili fascikla su <strong>obrisani</strong>",
- "A file or folder has been <strong>restored</strong>" : "Fajl ili fascikla su <strong>vraćeni</strong>",
- "You created %1$s" : "Napravili ste %1$s",
- "%2$s created %1$s" : "%2$s napravi %1$s",
- "%1$s was created in a public folder" : "%1$s je napravljen u javnoj fascikli",
- "You changed %1$s" : "Izmenili ste %1$s",
- "%2$s changed %1$s" : "%2$s izmeni %1$s",
- "You deleted %1$s" : "Obrisali ste %1$s",
- "%2$s deleted %1$s" : "%2$s obrisa %1$s",
- "You restored %1$s" : "Vratili ste %1$s",
- "%2$s restored %1$s" : "%2$s povrati %1$s",
- "Upload (max. %s)" : "Otpremanje (maks. %s)",
- "File handling" : "Rukovanje fajlovima",
- "Maximum upload size" : "Najveća veličina otpremanja",
- "max. possible: " : "najviše moguće:",
- "Save" : "Sačuvaj",
- "Settings" : "Postavke",
- "WebDAV" : "WebDAV",
- "No files in here" : "Ovde nema fajlova",
- "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
- "No entries found in this folder" : "Nema ničega u ovoj fascikli",
- "Select all" : "Označi sve",
- "Upload too large" : "Otpremanje je preveliko",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.",
- "No favorites" : "Nema omiljenih",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde",
- "Text file" : "tekstualni fajl"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json
deleted file mode 100644
index 0710435eb69..00000000000
--- a/apps/files/l10n/sr@latin.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{ "translations": {
- "Storage not available" : "Skladište nije dostupno",
- "Storage invalid" : "Neispravno skladište",
- "Unknown error" : "Nepoznata greška",
- "Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.",
- "Invalid Token" : "Neispravan token",
- "No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška",
- "There is no error, the file uploaded with success" : "Nema greške, fajl je uspešno otpremljen",
- "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Otpremani fajl prevazilazi smernicu upload_max_filesize u fajlu php.ini:",
- "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Otpremani fajl prevazilazi smernicu MAX_FILE_SIZE koja je navedena u HTML obrascu",
- "The uploaded file was only partially uploaded" : "Otpremani fajl je samo delimično otpremljen",
- "No file was uploaded" : "Ništa nije otpremljeno",
- "Missing a temporary folder" : "Nedostaje privremena fascikla",
- "Failed to write to disk" : "Ne mogu da pišem na disk",
- "Not enough storage available" : "Nema dovoljno prostora",
- "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.",
- "Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl",
- "Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.",
- "Invalid directory." : "Neispravna fascikla.",
- "Files" : "Fajlovi",
- "All files" : "Svi fajlovi",
- "Home" : "Početna",
- "Close" : "Zatvori",
- "Favorites" : "Omiljeni",
- "Upload cancelled." : "Otpremanje je otkazano.",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova",
- "Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo",
- "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
- "Uploading..." : "Otpremam…",
- "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
- "Download" : "Preuzmi",
- "Rename" : "Preimenuj",
- "Delete" : "Obriši",
- "Disconnect storage" : "Isključi skladište",
- "Unshare" : "Ne deli",
- "Details" : "Detaljnije",
- "Select" : "Izaberi",
- "Pending" : "Na čekanju",
- "Unable to determine date" : "Ne mogu da odredim datum",
- "No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'",
- "Name" : "Naziv",
- "Size" : "Veličina",
- "Modified" : "Izmenjen",
- "_%n folder_::_%n folders_" : ["%n fascikla","%n fascikle","%n fascikli"],
- "_%n file_::_%n files_" : ["%n fajl","%n fajla","%n fajlova"],
- "{dirs} and {files}" : "{dirs} i {files}",
- "You don’t have permission to upload or create files here" : "Nemate dozvole da ovde otpremate ili stvarate fajlove",
- "_Uploading %n file_::_Uploading %n files_" : ["Otpremam %n fajl","Otpremam %n fajla","Otpremam %n fajlova"],
- "New" : "Novo",
- "\"{name}\" is an invalid file name." : "\"{name}\" nije ispravan naziv fajla.",
- "File name cannot be empty." : "Naziv fajla ne može biti prazan.",
- "Your storage is full, files can not be updated or synced anymore!" : "Vaše skladište je puno. Fajlovi više ne mogu biti ažurirani ni sinhronizovani!",
- "Your storage is almost full ({usedSpacePercent}%)" : "Vaše skladište je skoro puno ({usedSpacePercent}%)",
- "_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"],
- "Favorited" : "Omiljeno",
- "Favorite" : "Omiljeni",
- "Folder" : "fascikla",
- "New folder" : "Nova fascikla",
- "Upload" : "Otpremi",
- "An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka",
- "A new file or folder has been <strong>created</strong>" : "Novi fajl ili fascikla su <strong>napravljeni</strong>",
- "A file or folder has been <strong>changed</strong>" : "Fajl ili fascikla su <strong>izmenjeni</strong>",
- "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ograniči obaveštenja o stvaranju i izmenama na <strong>omiljene fajlove</strong> <em>(samo u zapisniku)</em>",
- "A file or folder has been <strong>deleted</strong>" : "Fajl ili fascikla su <strong>obrisani</strong>",
- "A file or folder has been <strong>restored</strong>" : "Fajl ili fascikla su <strong>vraćeni</strong>",
- "You created %1$s" : "Napravili ste %1$s",
- "%2$s created %1$s" : "%2$s napravi %1$s",
- "%1$s was created in a public folder" : "%1$s je napravljen u javnoj fascikli",
- "You changed %1$s" : "Izmenili ste %1$s",
- "%2$s changed %1$s" : "%2$s izmeni %1$s",
- "You deleted %1$s" : "Obrisali ste %1$s",
- "%2$s deleted %1$s" : "%2$s obrisa %1$s",
- "You restored %1$s" : "Vratili ste %1$s",
- "%2$s restored %1$s" : "%2$s povrati %1$s",
- "Upload (max. %s)" : "Otpremanje (maks. %s)",
- "File handling" : "Rukovanje fajlovima",
- "Maximum upload size" : "Najveća veličina otpremanja",
- "max. possible: " : "najviše moguće:",
- "Save" : "Sačuvaj",
- "Settings" : "Postavke",
- "WebDAV" : "WebDAV",
- "No files in here" : "Ovde nema fajlova",
- "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
- "No entries found in this folder" : "Nema ničega u ovoj fascikli",
- "Select all" : "Označi sve",
- "Upload too large" : "Otpremanje je preveliko",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.",
- "No favorites" : "Nema omiljenih",
- "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde",
- "Text file" : "tekstualni fajl"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/su.js b/apps/files/l10n/su.js
deleted file mode 100644
index 91d52801985..00000000000
--- a/apps/files/l10n/su.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : [""],
- "_%n file_::_%n files_" : [""],
- "_Uploading %n file_::_Uploading %n files_" : [""],
- "_matches '{filter}'_::_match '{filter}'_" : [""]
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/su.json b/apps/files/l10n/su.json
deleted file mode 100644
index 82cca5a0661..00000000000
--- a/apps/files/l10n/su.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : [""],
- "_%n file_::_%n files_" : [""],
- "_Uploading %n file_::_Uploading %n files_" : [""],
- "_matches '{filter}'_::_match '{filter}'_" : [""]
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 039447581cd..7450ec73c6e 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Lagring är tillfälligt inte tillgänglig",
- "Storage invalid" : "Lagring ogiltig",
- "Unknown error" : "Okänt fel",
- "File could not be found" : "Fil kunde inte hittas",
- "Move or copy" : "Flytta eller kopiera",
- "Download" : "Hämta",
- "Delete" : "Ta bort",
- "Home" : "Hem",
- "Close" : "Stäng",
- "Favorites" : "Favoriter",
- "Could not create folder \"{dir}\"" : "Kunde inte skapa mapp \"{dir}\"",
- "This will stop your current uploads." : "Detta kommer att stoppa nuvarande uppladdningar.",
- "Upload cancelled." : "Uppladdning avbruten.",
- "Processing files …" : "Bearbetar filer ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.",
- "Target folder \"{dir}\" does not exist any more" : "Målmapp \"{dir}\" existerar inte mer",
- "Not enough free space" : "Inte tillräckligt med ledigt utrymme",
- "An unknown error has occurred" : "Ett okänt fel uppstod",
- "Uploading …" : "Laddar upp ..",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Uppladdning av det här objektet stöds inte",
- "Target folder does not exist any more" : "Målmapp existerar inte längre",
- "Operation is blocked by access control" : "Operationen blockeras av åtkomstkontroll",
- "Error when assembling chunks, status code {status}" : "Fel vid ihopsättning av bitarna: statuskod: {status}",
- "Actions" : "Åtgärder",
- "Rename" : "Byt namn",
- "Copy" : "Kopiera",
- "Choose target folder" : "Välj målmapp",
- "Open" : "Öppna",
- "Delete file" : "Ta bort fil",
- "Delete folder" : "Ta bort mapp",
- "Disconnect storage" : "Koppla bort lagring",
- "Leave this share" : "Lämna denna delning",
- "Could not load info for file \"{file}\"" : "Kunde inte läsa in information för filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Please select tag(s) to add to the selection" : "Vänligen välj tagg(ar) att lägga till i ditt urval",
- "Apply tag(s) to selection" : "Lägg till tagg(ar) i ditt urval",
- "Select" : "Välj",
- "Pending" : "Väntar",
- "Unable to determine date" : "Misslyckades avgöra datum",
- "This operation is forbidden" : "Denna operation är förbjuden",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
- "Could not move \"{file}\", target exists" : "Kunde inte flytta \"{file}\", filen existerar redan",
- "Could not move \"{file}\"" : "Kunde inte flytta \"{file}\"",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Kunde inte kopiera \"{file}\", filen existerar redan",
- "Could not copy \"{file}\"" : "Kunde inte kopiera \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopierade {origin} till {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierade {origin} och {nbfiles} andra filer i {destination}",
- "{newName} already exists" : "{newName} existerar redan",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kunde inte döpa om \"{fileName}\", filen existerar inte mer",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Namnet \"{targetName}\" används redan i mappen \"{dir}\". Välj ett annat namn.",
- "Could not rename \"{fileName}\"" : "Kan inte döpa om \"{fileName}\"",
- "Could not create file \"{file}\"" : "Kunde inte skapa fil \"{fileName}\"",
- "Could not create file \"{file}\" because it already exists" : "Kunde inte skapa fil \"{file}\" därför att den redan existerar",
- "Could not create folder \"{dir}\" because it already exists" : "Kunde inte skapa \"{dir}\" därför att den redan existerar",
- "Could not fetch file details \"{file}\"" : "Kunde inte hämta filinformation \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Fel när \"{fileName}\" skulle raderas.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Inga sökresultat i andra mappar för {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ange mer än två tecken för att söka i andra mappar",
- "Name" : "Namn",
- "Size" : "Storlek",
- "Modified" : "Ändrad",
- "_%n folder_::_%n folders_" : ["%n mapp","%n mappar"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} och {files}",
- "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"],
- "You don’t have permission to upload or create files here" : "Du har inte tillåtelse att ladda upp eller skapa filer här",
- "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
- "New" : "Ny",
- "Select file range" : "Välj filintervall",
- "{used} of {quota} used" : "{used} av {quota} använt",
- "{used} used" : "{used} använt",
- "\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
- "File name cannot be empty." : "Filnamn kan inte vara tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagring av {owner} är nästan full ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppmapp \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Extern lagring \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matcha \"{filter}\"","matcha \"{filter}\""],
- "View in folder" : "Utforska i mapp",
- "Copied!" : "Kopierad!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiera direktlänk (fungerar endast för användare som har åtkomst till denna fil eller mapp)",
- "Path" : "Sökväg",
- "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
- "Favorited" : "Favoriserad",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Du kan bara favoritmarkera en fil eller mapp åt gången",
- "New folder" : "Ny mapp",
- "Upload file" : "Ladda upp fil",
- "Recent" : "Senaste",
- "Not favorited" : "Inte favoriserade",
- "Remove from favorites" : "Ta bort från favoriter",
- "Add to favorites" : "Lägg till i favoriter",
- "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"Added to favorites" : "Lades till i favoriter",
"Removed from favorites" : "Togs bort från favoriter",
"You added {file} to your favorites" : "Du la till {file} till dina favoriter",
"You removed {file} from your favorites" : "Du tog bort {file} från dina favoriter",
+ "Favorites" : "Favoriter",
"File changes" : "Filändringar",
"Created by {user}" : "Skapad av {user}",
"Changed by {user}" : "Ändrad av {user}",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Återställd av {user}",
"Renamed by {user}" : "Filnamn ändrat av {user}",
"Moved by {user}" : "Flyttad av {user}",
- "\"remote user\"" : "\"extern användare\"",
+ "\"remote account\"" : "\"externt konto\"",
"You created {file}" : "Du skapade {file}",
"You created an encrypted file in {file}" : "Du skapade en krypterad fil i {file}",
"{user} created {file}" : "{user} skapade {file}",
@@ -126,9 +23,9 @@ OC.L10N.register(
"You changed an encrypted file in {file}" : "Du ändrade en krypterad fil i {file}",
"{user} changed {file}" : "{user} ändrade {file}",
"{user} changed an encrypted file in {file}" : "{user} ändrade en krypterad fil i {file}",
- "You deleted {file}" : "Du tog bort {file}",
+ "You deleted {file}" : "Du raderade {file}",
"You deleted an encrypted file in {file}" : "Du tog bort en krypterad fil i {file}",
- "{user} deleted {file}" : "{user} tog bort {file}",
+ "{user} deleted {file}" : "{user} raderade {file}",
"{user} deleted an encrypted file in {file}" : "{user} tog bort en krypterad fil i {file}",
"You restored {file}" : "Du återställde {file}",
"{user} restored {file}" : "{user} återställde {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "Du flyttade {oldfile} till {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttade {oldfile} till {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil har lagts till eller tagits bort från dina <strong>favoriter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favorit-fil eller mapp har blivit <strong>ändrad</strong>",
- "All files" : "Alla filer",
- "Unlimited" : "Obegränsad",
- "Upload (max. %s)" : "Ladda upp (högst %s)",
+ "Failed to authorize" : "Det gick inte att auktorisera",
+ "Invalid folder path" : "Ogiltig mappsökväg",
+ "Folder not found" : "Mappen hittades inte",
+ "The file cannot be found" : "Filen kan inte hittas",
+ "The destination path does not exist: %1$s" : "Målsökvägen finns inte: %1$s",
+ "You do not have permission to create a file at the specified location" : "Du har inte behörighet att skapa en fil på den angivna platsen",
+ "The file could not be converted." : "Filen kunde inte konverteras.",
+ "Could not get relative path to converted file" : "Kunde inte hämta relativ sökväg till den konverterade filen",
+ "Favorite files" : "Favoritfiler",
+ "No favorites" : "Inga favoriter",
+ "More favorites" : "Fler favoriter",
"Accept" : "Acceptera",
"Reject" : "Avvisa",
"Incoming ownership transfer from {user}" : "Inkommande ägaröverföring från {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vill du acceptera {path}?\n\nNotera: Överföringen kan efter att du accepterat ta upp till 1 timme.",
+ "Ownership transfer denied" : "Ägarskapsöverföring nekad",
+ "Your ownership transfer of {path} was denied by {user}." : "Din ägaröverföring av {path} nekades av {user}.",
"Ownership transfer failed" : "Ägarskapsöverföring misslyckades",
"Your ownership transfer of {path} to {user} failed." : "Din ägaröverföring av {path} till {user} misslyckades.",
"The ownership transfer of {path} from {user} failed." : "Din ägaröverföring av {path} från {user} misslyckades.",
@@ -159,62 +67,415 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "Din ägaröverföring av {path} till {user} är klar.",
"The ownership transfer of {path} from {user} has completed." : "Ägaröverföringen av {path} från {user} är klar.",
"in %s" : "om %s",
+ "Transferred from %1$s on %2$s" : "Överförd från %1$s på %2$s",
+ "Files compatibility" : "Filkompatibilitet",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillåt att begränsa filnamn för att säkerställa att filer kan synkroniseras med alla klienter. Som standard är alla filnamn som är giltiga på POSIX (t.ex. Linux eller macOS) tillåtna.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "När Windows-kompatibla filnamn har aktiverats kan befintliga filer inte längre ändras, men de kan byta namn till giltiga nya namn av sin ägare.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Det är också möjligt att migrera filer automatiskt efter att den här inställningen har aktiverats. Se dokumentationen om kommandot occ för mer information.",
+ "Enforce Windows compatibility" : "Tvinga Windows-kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Detta kommer att blockera filnamn som inte är giltiga på Windows-system, som att använda reserverade namn eller specialtecken. Men detta kommer inte att framtvinga kompatibiliteten för skiftlägeskänslighet.",
"File Management" : "Filhantering",
- "Transfer ownership of a file or folder" : "Överför ägarskap av en fil eller mapp",
- "Choose file or folder to transfer" : "Välj fil eller mapp att överföra",
- "Change" : "Ändra",
- "New owner" : "Ny ägare",
- "Search users" : "Sök användare",
+ "Home" : "Hem",
+ "Target folder does not exist any more" : "Målmapp existerar inte längre",
+ "Reload current directory" : "Ladda om nuvarande mapp",
+ "Go to the \"{dir}\" directory" : "Gå till \"{dir}\" mappen",
+ "Current directory path" : "Aktuell katalogsökväg",
+ "Your have used your space quota and cannot upload files anymore" : "Du har använt din utrymmeskvot och kan inte längre ladda upp filer",
+ "You do not have permission to upload or create files here." : "Du har inte behörighet att ladda upp eller skapa filer här.",
+ "Drag and drop files here to upload" : "Dra och släpp filer här för att ladda upp",
+ "Favorite" : "Favorit",
+ "Back" : "Tillbaka",
+ "Toggle selection for file \"{displayName}\"" : "Växla markering för filen \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Växla markering för mappen \"{displayName}\"",
+ "File is loading" : "Filen laddas",
+ "Folder is loading" : "Mappen laddas",
+ "Filename" : "Filnamn",
+ "Folder name" : "Mappnamn",
+ "This node is unavailable" : "Den här noden är inte tillgänglig",
+ "Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
+ "Invalid filename." : "Ogiltigt filnamn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Bytte namn på \"{oldName}\" till \"{newName}\"",
+ "Rename file" : "Byt namn på fil",
+ "Folder" : "Mapp",
+ "Unknown file type" : "Okänd filtyp",
+ "{ext} image" : "{ext} bild",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} ljud",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Väntar",
+ "Unknown date" : "Okänt datum",
+ "Clear filter" : "Rensa filter",
+ "Modified" : "Ändrad",
+ "Search everywhere" : "Sök överallt",
+ "Type" : "Typ",
+ "Active filters" : "Aktiva filter",
+ "Remove filter" : "Ta bort filter",
+ "Total rows summary" : "Sammanfattning antal rader",
+ "Toggle selection for all files and folders" : "Växla markering för alla filer och mappar",
+ "Name" : "Namn",
+ "File type" : "Filtyp",
+ "Size" : "Storlek",
+ "Actions" : "Funktioner",
+ "(selected)" : "(vald)",
+ "List of files and folders." : "Lista över filer och mappar.",
+ "You have used your space quota and cannot upload files anymore." : "Du har använt din utrymmeskvot och kan inte längre ladda upp filer.",
+ "Column headers with buttons are sortable." : "Kolumnrubriker med knappar är sorterbara.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
+ "File not found" : "Filen kunde inte hittas",
+ "_{count} selected_::_{count} selected_" : ["{count} vald","{count} valda"],
+ "Search scope options" : "Alternativ för sökomfång",
+ "{usedQuotaByte} used" : "{usedQuotaByte} använt",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{relative}% used" : "{relative}% använt",
+ "Could not refresh storage stats" : "Det gick inte att uppdatera lagringsstatistiken",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
+ "Storage information" : "Lagringsinformation",
+ "Storage quota" : "Lagringskvot",
+ "New folder" : "Ny mapp",
+ "Create new folder" : "Skapa ny mapp",
+ "This name is already in use." : "Namnet används redan.",
+ "Create" : "Skapa",
+ "Files starting with a dot are hidden by default" : "Filer som börjar med en punkt är dolda som standard",
+ "Fill template fields" : "Fyll mallfält",
+ "Submitting fields …" : "Skickar fält ...",
+ "Submit" : "Skicka",
"Choose a file or folder to transfer" : "Välj en fil eller mapp att överföra",
"Transfer" : "Överför",
"Transfer {path} to {userid}" : "Överför {path} till {userid}",
"Invalid path selected" : "Ogiltig sökväg vald",
+ "Unknown error" : "Okänt fel",
"Ownership transfer request sent" : "Förfrågan om ägaröverföring skickad",
- "Cannot transfer ownership of a file or folder you don't own" : "Det går inte att överföra ägarskap av en fil eller mapp som du inte äger",
- "Tags" : "Taggar",
- "Unable to change the favourite state of the file" : "Kan inte ändra filens favoritstatus",
+ "Cannot transfer ownership of a file or folder you do not own" : "Det går inte att överföra äganderätten till en fil eller mapp som du inte äger",
+ "Transfer ownership of a file or folder" : "Överför ägarskap av en fil eller mapp",
+ "Choose file or folder to transfer" : "Välj fil eller mapp att överföra",
+ "Change" : "Ändra",
+ "New owner" : "Ny ägare",
+ "Keep {old}" : "Behåll {old}",
+ "Keep without extension" : "Behåll utan filändelse",
+ "Use {new}" : "Använd {new}",
+ "Remove extension" : "Ta bort filändelse",
+ "Change file extension" : "Ändra filändelse",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Att ändra filtillägget från \"{old}\" till \"{new}\" kan göra filen oläsbar.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
+ "Do not show this dialog again." : "Visa inte denna dialog igen.",
+ "Select file or folder to link to" : "Välj fil eller mapp att länka till",
+ "Choose {file}" : "Välj {file}",
+ "Share" : "Dela",
+ "Shared by link" : "Delad via länk",
+ "Shared" : "Delad",
+ "Switch to list view" : "Växla till listvy",
+ "Switch to grid view" : "Växla till rutnätsvy",
+ "The file could not be found" : "Filen kunde inte hittas",
+ "Upload was cancelled by user" : "Uppladdningen avbröts av användaren",
+ "Not enough free space" : "Inte tillräckligt med ledigt utrymme",
+ "Operation is blocked by access control" : "Operationen blockeras av åtkomstkontroll",
+ "Error during upload: {message}" : "Fel vid uppladdning: {message}",
+ "Error during upload, status code {status}" : "Fel vid uppladdning, statuskod {status}",
+ "Unknown error during upload" : "Okänt fel under uppladdning",
+ "Loading current folder" : "Laddar aktuell mapp",
+ "Retry" : "Försök igen",
+ "No files in here" : "Inga filer kunde hittas",
+ "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
+ "Go back" : "Gå tillbaks",
+ "Views" : "Vyer",
+ "Files settings" : "Filinställningar",
+ "Your files" : "Dina filer",
+ "Open in files" : "Öppna i filer",
+ "File cannot be accessed" : "Det går inte att komma åt filen",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen kunde inte hittas eller så har du inte behörighet att visa den. Be avsändaren att dela den.",
+ "No search results for “{query}”" : "Inget sökresultat för “{query}”",
+ "Search for files" : "Sök efter filer",
+ "Clipboard is not available" : "Urklipp är inte tillgängligt",
+ "General" : "Allmänt",
+ "Default view" : "Standardvy",
+ "All files" : "Alla filer",
+ "Personal files" : "Personliga filer",
+ "Sort favorites first" : "Sortera favoriter först",
+ "Sort folders before files" : "Sortera mappar före filer",
+ "Folder tree" : "Mappträd",
+ "Appearance" : "Utseende",
+ "Show hidden files" : "Visa dolda filer",
+ "Show file type column" : "Visa kolumn för filtyp",
+ "Crop image previews" : "Beskär förhandsgranskningar för bilder",
+ "Additional settings" : "Övriga inställningar",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopiera",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tvåfaktorsautentisering är aktiverad för ditt konto och därför måste du använda ett applösenord för att ansluta en extern WebDAV-klient.",
+ "Warnings" : "Varningar",
+ "Keyboard shortcuts" : "Tangentbordsgenvägar",
+ "File actions" : "Filåtgärder",
+ "Rename" : "Byt namn",
+ "Delete" : "Radera",
+ "Manage tags" : "Hantera taggar",
+ "Selection" : "Markerade",
+ "Select all files" : "Välj alla filer",
+ "Deselect all" : "Avmarkera alla",
+ "Navigation" : "Navigering",
+ "View" : "Visa",
+ "Toggle grid view" : "Växla rutnätsvy",
+ "Show those shortcuts" : "Visa dessa genvägar",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Delad flera gånger med olika personer",
+ "Unable to change the favorite state of the file" : "Kan inte ändra filens favoritstatus",
"Error while loading the file data" : "Fel vid inläsning av fildata",
+ "Owner" : "Ägare",
+ "Remove from favorites" : "Ta bort från favoriter",
+ "Add to favorites" : "Lägg till i favoriter",
+ "Tags" : "Taggar",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kunde inte skapa fil från mall",
"Pick a template for {name}" : "Välj en mall för {name}",
- "Cancel" : "Avbryt",
- "Create" : "Skapa",
"Create a new file with the selected template" : "Skapa en ny fil med den valda mallen",
"Creating file" : "Skapar fil",
- "Blank" : "Tom",
- "Unable to create new file from template" : "Kunde inte skapa fil från mall",
- "Set up templates folder" : "Skapa en mapp för mallar",
- "Templates" : "Mallar",
+ "Save as {displayName}" : "Spara som {displayName}",
+ "Save as …" : "Spara som …",
+ "Converting files …" : "Konverterar filer ...",
+ "Failed to convert files: {message}" : "Kunde inte konvertera filer: {message}",
+ "All files failed to be converted" : "Alla filer misslyckades med att konverteras",
+ "One file could not be converted: {message}" : "En fil kunde inte konverteras: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["En fil kunde inte konverteras","%n filer kunde inte konverteras"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["En fil har konverterats","%n filer har konverterats"],
+ "Files successfully converted" : "Filerna har konverterats",
+ "Failed to convert files" : "Det gick inte att konvertera filer",
+ "Converting file …" : "Konverterar fil ...",
+ "File successfully converted" : "Filen har konverterats",
+ "Failed to convert file: {message}" : "Kunde inte konvertera filen: {message}",
+ "Failed to convert file" : "Kunde inte konvertera filen",
+ "Leave this share" : "Lämna denna delning",
+ "Leave these shares" : "Lämna dessa delningar",
+ "Disconnect storage" : "Koppla bort lagring",
+ "Disconnect storages" : "Koppla bort lagringar",
+ "Delete permanently" : "Ta bort permanent",
+ "Delete and unshare" : "Radera och sluta dela",
+ "Delete file" : "Ta bort fil",
+ "Delete files" : "Radera filer",
+ "Delete folder" : "Radera mapp",
+ "Delete folders" : "Radera mappar",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du är på väg att permanent ta bort {count} objekt","Du är på väg att permanent ta bort {count} objekt"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du är på väg att ta bort {count} objekt","Du är på väg att ta bort {count} objekt"],
+ "Confirm deletion" : "Bekräfta radering",
+ "Cancel" : "Avbryt",
+ "Download" : "Hämta",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
+ "Destination is not a folder" : "Destinationen är inte en mapp",
+ "This file/folder is already in that directory" : "Den här filen/mappen finns redan i den katalogen",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv",
+ "(copy)" : "(kopia)",
+ "(copy %n)" : "(kopia %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mapp med det namnet finns redan i den här mappen",
+ "The files are locked" : "Filerna är låsta",
+ "The file does not exist anymore" : "Filen finns inte längre",
+ "Choose destination" : "Välj destination",
+ "Copy to {target}" : "Kopiera till {target}",
+ "Move to {target}" : "Flytta till {target}",
+ "Move" : "Flytta",
+ "Move or copy operation failed" : "Flytta eller kopiera misslyckades",
+ "Move or copy" : "Flytta eller kopiera",
+ "Open folder {displayName}" : "Öppna mappen {displayName}",
+ "Open in Files" : "Öppna i Filer",
+ "Open locally" : "Öppna lokalt",
+ "Failed to redirect to client" : "Det gick inte att omdirigera till klienten",
+ "Open file locally" : "Öppna filen lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen bör nu öppnas på din enhet. Om den inte gör det, kontrollera att du har installerat skrivbordsappen.",
+ "Retry and close" : "Försök igen och stäng",
+ "Open online" : "Öppna online",
+ "Details" : "Detaljer",
+ "View in folder" : "Utforska i mapp",
+ "Today" : "Idag",
+ "Last 7 days" : "Senaste 7 dagarna",
+ "Last 30 days" : "Senaste 30 dagarna",
+ "This year ({year})" : "I år ({year})",
+ "Last year ({year})" : "Förra året ({year})",
+ "Documents" : "Dokument",
+ "Spreadsheets" : "Kalkylblad",
+ "Presentations" : "Presentationer",
+ "PDFs" : "PDF-filer",
+ "Folders" : "Mappar",
+ "Audio" : "Ljud",
+ "Images" : "Bilder",
+ "Videos" : "Videor",
+ "Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
"Unable to initialize the templates directory" : "Kunde inte initialisera mall-mappen",
- "%s used" : "%s använt",
- "%s%% of %s used" : "%s%% av %s använt",
- "%1$s of %2$s used" : "%1$s av %2$s använt",
- "Settings" : "Inställningar",
- "Show hidden files" : "Visa dolda filer",
- "Crop image previews" : "Beskär förhandsgranskningar för bilder",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
- "Toggle %1$s sublist" : "Växla %1$s sublista",
- "Toggle grid view" : "Växla rutnätsvy",
- "No files in here" : "Inga filer kunde hittas",
- "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
+ "Create templates folder" : "Skapa mallmapp",
+ "Templates" : "Mallar",
+ "New template folder" : "Ny mallmapp",
+ "In folder" : "I mapp",
+ "Search in all files" : "Sök i alla filer",
+ "Search in folder: {folder}" : "Sök i mapp: {folder}",
+ "One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din webbläsare stöder inte Filesystem API. Mappar kommer inte att laddas upp",
+ "No files to upload" : "Inga filer att ladda upp",
+ "Unable to create the directory {directory}" : "Det gick inte att skapa mappen {directory}",
+ "Some files could not be uploaded" : "Vissa filer kunde inte laddas upp",
+ "Files uploaded successfully" : "Filerna uppladdade",
+ "No files to process" : "Inga filer att bearbeta",
+ "Some files could not be copied" : "Vissa filer kunde inte kopieras",
+ "Some files could not be moved" : "Vissa filer kunde inte flyttas",
+ "Files copied successfully" : "Filerna kopierade",
+ "Files moved successfully" : "Filerna flyttade",
+ "Conflicts resolution skipped" : "Konfliktlösning hoppades över",
+ "Upload cancelled" : "Uppladdning avbruten",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunde inte byta namn på \"{oldName}\", den finns inte längre",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Namnet \"{newName}\" används redan i mappen \"{dir}\". Välj ett annat namn.",
+ "Could not rename \"{oldName}\"" : "Kunde inte byta namn på \"{oldName}\"",
+ "This operation is forbidden" : "Denna operation är förbjuden",
+ "Storage is temporarily not available" : "Lagring är tillfälligt inte tillgänglig",
+ "Unexpected error: {error}" : "Oväntat fel: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mapp","%n mappar"],
+ "_%n hidden_::_%n hidden_" : ["%n gömd","%n gömd"],
+ "Filename must not be empty." : "Filnamn får inte vara tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" är inte tillåtet i ett filnamn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" är ett reserverat namn och inte tillåtet som filnamn.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" är inte en tillåten filtyp.",
+ "Filenames must not end with \"{extension}\"." : "Filnamn får inte sluta med \"{extension}\".",
+ "List of favorite files and folders." : "Lista över favoritfiler och mappar.",
+ "No favorites yet" : "Inga favoriter ännu",
+ "Files and folders you mark as favorite will show up here" : "Filer och mappar markerade som favoriter kommer att visas här",
+ "List of your files and folders." : "Lista över dina filer och mappar.",
+ "List of your files and folders that are not shared." : "Lista över dina filer och mappar som inte delas.",
+ "No personal files found" : "Inga personliga filer hittades",
+ "Files that are not shared will show up here." : "Filer som inte delas kommer att visas här.",
+ "Recent" : "Senaste",
+ "List of recently modified files and folders." : "Lista över nyligen ändrade filer och mappar.",
+ "No recently modified files" : "Inga nyligen ändrade filer",
+ "Files and folders you recently modified will show up here." : "Filer och mappar som du nyligen ändrat kommer att visas här.",
+ "Search" : "Sök",
+ "Search results within your files." : "Sökresultat i dina filer.",
"No entries found in this folder" : "Inget innehåll hittades i denna mapp",
"Select all" : "Välj allt",
"Upload too large" : "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
- "No favorites yet" : "Inga favoriter ännu",
- "Files and folders you mark as favorite will show up here" : "Filer och mappar markerade som favoriter kommer att visas här",
- "Deleted files" : "Borttagna filer",
- "Shares" : "Delningar",
- "Shared with others" : "Delad med andra",
- "Shared with you" : "Delad med dig",
- "Shared by link" : "Delad via länk",
- "Deleted shares" : "Borttagna delningar",
- "Pending shares" : "Väntande delningar",
+ "File could not be found" : "Fil kunde inte hittas",
+ "Show list view" : "Visa listvy",
+ "Show grid view" : "Visa rutnätsvy",
+ "Close" : "Stäng",
+ "Could not create folder \"{dir}\"" : "Kunde inte skapa mapp \"{dir}\"",
+ "This will stop your current uploads." : "Detta kommer att stoppa nuvarande uppladdningar.",
+ "Upload cancelled." : "Uppladdning avbruten.",
+ "Processing files …" : "Bearbetar filer ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.",
+ "Target folder \"{dir}\" does not exist any more" : "Målmapp \"{dir}\" existerar inte mer",
+ "An unknown error has occurred" : "Ett okänt fel uppstod",
+ "File could not be uploaded" : "Filen kunde inte laddas upp",
+ "Uploading …" : "Laddar upp ..",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Laddar upp … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uppladdning av det här objektet stöds inte",
+ "Error when assembling chunks, status code {status}" : "Fel vid ihopsättning av bitarna: statuskod: {status}",
+ "Choose target folder" : "Välj målmapp",
+ "Set reminder" : "Ställ in påminnelse",
+ "Edit locally" : "Redigera lokalt",
+ "Open" : "Öppna",
+ "Could not load info for file \"{file}\"" : "Kunde inte läsa in information för filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Vänligen välj tagg(ar) att lägga till i ditt urval",
+ "Apply tag(s) to selection" : "Lägg till tagg(ar) i ditt urval",
+ "Select directory \"{dirName}\"" : "Välj mapp \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Välj fil \"{fileName}\"",
+ "Unable to determine date" : "Misslyckades avgöra datum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
+ "Could not move \"{file}\", target exists" : "Kunde inte flytta \"{file}\", filen existerar redan",
+ "Could not move \"{file}\"" : "Kunde inte flytta \"{file}\"",
+ "copy" : "kopia",
+ "Could not copy \"{file}\", target exists" : "Kunde inte kopiera \"{file}\", filen existerar redan",
+ "Could not copy \"{file}\"" : "Kunde inte kopiera \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopierade {origin} till {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierade {origin} och {nbfiles} andra filer i {destination}",
+ "{newName} already exists" : "{newName} existerar redan",
+ "Could not create file \"{file}\"" : "Kunde inte skapa fil \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Kunde inte skapa fil \"{file}\" därför att den redan existerar",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunde inte skapa \"{dir}\" därför att den redan existerar",
+ "Could not fetch file details \"{file}\"" : "Kunde inte hämta filinformation \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Fel när \"{fileName}\" skulle raderas.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Inga sökresultat i andra mappar för {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ange mer än två tecken för att söka i andra mappar",
+ "{dirs} and {files}" : "{dirs} och {files}",
+ "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"],
+ "You do not have permission to upload or create files here" : "Du har inte behörighet att ladda upp eller skapa filer här",
+ "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
+ "New" : "Ny",
+ "New file/folder menu" : "Ny fil/mapp -meny",
+ "Select file range" : "Välj filintervall",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} använt",
+ "\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
+ "File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagring av {owner} är nästan full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppmapp \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Extern lagring \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matcha \"{filter}\"","matcha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlänk kopierades (fungerar endast för användare som har tillgång till denna fil/mapp)",
+ "Path" : "Sökväg",
+ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
+ "Favored" : "Favoriserad",
+ "Favor" : "Favorisera",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiera direktlänk (fungerar endast för användare som har åtkomst till denna fil/mapp)",
+ "Upload file" : "Ladda upp fil",
+ "Not favored" : "Inte favoriserad",
+ "An error occurred while trying to update the tags" : "Fel vid uppdatering av taggarna",
+ "Upload (max. %s)" : "Ladda upp (högst %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-åtgärden har utförts",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-åtgärden misslyckades",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" misslyckades med vissa element",
+ "\"{displayName}\" batch action executed successfully" : "Batchåtgärden \"{displayName}\" har utförts",
+ "Submitting fields…" : "Skickar fält...",
+ "Filter filenames…" : "Filtrera filnamn...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL kopierad till urklipp",
+ "Enable the grid view" : "Aktivera rutnätsvy",
+ "Enable folder tree" : "Aktivera mappträd",
+ "Copy to clipboard" : "Kopiera till urklipp",
+ "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
+ "Deletion cancelled" : "Radering avbruten",
+ "Move cancelled" : "Flytt avbruten",
+ "Cancelled move or copy of \"{filename}\"." : "Avbröt flytt eller kopiering av \"{filename}\".",
+ "Cancelled move or copy operation" : "Flytta eller kopiera avbröts",
+ "Open details" : "Öppna detaljer",
+ "Photos and images" : "Foton och bilder",
+ "New folder creation cancelled" : "Skapandet av ny mapp avbröts",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapp","{folderCount} mappar"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil och {folderCount} mapp","1 fil och {folderCount} mappar"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil och 1 mapp","{fileCount} filer och 1 mapp"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer och {folderCount} mappar",
+ "All folders" : "Alla mappar",
+ "Personal Files" : "Personliga filer",
"Text file" : "Textfil",
"New text file.txt" : "Ny textfil.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
- "_matches '{filter}'_::_match '{filter}'_" : ["matchar '{filter}'","matcha '{filter}'"]
+ "%1$s (renamed)" : "%1$s (omdöpt)",
+ "renamed file" : "omdöpt fil",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "När Windows-kompatibla filnamn har aktiverats kan befintliga filer inte längre ändras, men de kan byta namn till giltiga nya namn av sin ägare.",
+ "Filter file names …" : "Filtrera filnamn …",
+ "Prevent warning dialogs from open or reenable them." : "Förhindra varningsdialoger från att öppnas eller aktivera dem igen.",
+ "Show a warning dialog when changing a file extension." : "Visa en varningsdialog vid ändring av filändelse.",
+ "Speed up your Files experience with these quick shortcuts." : "Snabba upp din upplevelse i Filer med dessa smarta genvägar.",
+ "Open the actions menu for a file" : "Öppna åtgärdsmenyn för en fil",
+ "Rename a file" : "Byt namn på en fil",
+ "Delete a file" : "Ta bort en fil",
+ "Favorite or remove a file from favorites" : "Lägg till eller ta bort en fil från favoriter",
+ "Manage tags for a file" : "Hantera taggar för en fil",
+ "Deselect all files" : "Avmarkera alla filer",
+ "Select or deselect a file" : "Markera eller avmarkera en fil",
+ "Select a range of files" : "Markera ett filintervall",
+ "Navigate to the parent folder" : "Gå till överordnad mapp",
+ "Navigate to the file above" : "Gå till filen ovan",
+ "Navigate to the file below" : "Gå till filen nedan",
+ "Navigate to the file on the left (in grid mode)" : "Gå till filen till vänster (i rutnätsvy)",
+ "Navigate to the file on the right (in grid mode)" : "Gå till filen till höger (i rutnätsvy)",
+ "Toggle the grid view" : "Växla rutnätsvy",
+ "Open the sidebar for a file" : "Öppna sidofältet för en fil"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index 7ea4279571f..c07d8f4fc4f 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Lagring är tillfälligt inte tillgänglig",
- "Storage invalid" : "Lagring ogiltig",
- "Unknown error" : "Okänt fel",
- "File could not be found" : "Fil kunde inte hittas",
- "Move or copy" : "Flytta eller kopiera",
- "Download" : "Hämta",
- "Delete" : "Ta bort",
- "Home" : "Hem",
- "Close" : "Stäng",
- "Favorites" : "Favoriter",
- "Could not create folder \"{dir}\"" : "Kunde inte skapa mapp \"{dir}\"",
- "This will stop your current uploads." : "Detta kommer att stoppa nuvarande uppladdningar.",
- "Upload cancelled." : "Uppladdning avbruten.",
- "Processing files …" : "Bearbetar filer ...",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.",
- "Target folder \"{dir}\" does not exist any more" : "Målmapp \"{dir}\" existerar inte mer",
- "Not enough free space" : "Inte tillräckligt med ledigt utrymme",
- "An unknown error has occurred" : "Ett okänt fel uppstod",
- "Uploading …" : "Laddar upp ..",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Uppladdning av det här objektet stöds inte",
- "Target folder does not exist any more" : "Målmapp existerar inte längre",
- "Operation is blocked by access control" : "Operationen blockeras av åtkomstkontroll",
- "Error when assembling chunks, status code {status}" : "Fel vid ihopsättning av bitarna: statuskod: {status}",
- "Actions" : "Åtgärder",
- "Rename" : "Byt namn",
- "Copy" : "Kopiera",
- "Choose target folder" : "Välj målmapp",
- "Open" : "Öppna",
- "Delete file" : "Ta bort fil",
- "Delete folder" : "Ta bort mapp",
- "Disconnect storage" : "Koppla bort lagring",
- "Leave this share" : "Lämna denna delning",
- "Could not load info for file \"{file}\"" : "Kunde inte läsa in information för filen \"{file}\"",
- "Files" : "Filer",
- "Details" : "Detaljer",
- "Please select tag(s) to add to the selection" : "Vänligen välj tagg(ar) att lägga till i ditt urval",
- "Apply tag(s) to selection" : "Lägg till tagg(ar) i ditt urval",
- "Select" : "Välj",
- "Pending" : "Väntar",
- "Unable to determine date" : "Misslyckades avgöra datum",
- "This operation is forbidden" : "Denna operation är förbjuden",
- "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
- "Could not move \"{file}\", target exists" : "Kunde inte flytta \"{file}\", filen existerar redan",
- "Could not move \"{file}\"" : "Kunde inte flytta \"{file}\"",
- "copy" : "kopia",
- "Could not copy \"{file}\", target exists" : "Kunde inte kopiera \"{file}\", filen existerar redan",
- "Could not copy \"{file}\"" : "Kunde inte kopiera \"{file}\"",
- "Copied {origin} inside {destination}" : "Kopierade {origin} till {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierade {origin} och {nbfiles} andra filer i {destination}",
- "{newName} already exists" : "{newName} existerar redan",
- "Could not rename \"{fileName}\", it does not exist any more" : "Kunde inte döpa om \"{fileName}\", filen existerar inte mer",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Namnet \"{targetName}\" används redan i mappen \"{dir}\". Välj ett annat namn.",
- "Could not rename \"{fileName}\"" : "Kan inte döpa om \"{fileName}\"",
- "Could not create file \"{file}\"" : "Kunde inte skapa fil \"{fileName}\"",
- "Could not create file \"{file}\" because it already exists" : "Kunde inte skapa fil \"{file}\" därför att den redan existerar",
- "Could not create folder \"{dir}\" because it already exists" : "Kunde inte skapa \"{dir}\" därför att den redan existerar",
- "Could not fetch file details \"{file}\"" : "Kunde inte hämta filinformation \"{file}\"",
- "Error deleting file \"{fileName}\"." : "Fel när \"{fileName}\" skulle raderas.",
- "No search results in other folders for {tag}{filter}{endtag}" : "Inga sökresultat i andra mappar för {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Ange mer än två tecken för att söka i andra mappar",
- "Name" : "Namn",
- "Size" : "Storlek",
- "Modified" : "Ändrad",
- "_%n folder_::_%n folders_" : ["%n mapp","%n mappar"],
- "_%n file_::_%n files_" : ["%n fil","%n filer"],
- "{dirs} and {files}" : "{dirs} och {files}",
- "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"],
- "You don’t have permission to upload or create files here" : "Du har inte tillåtelse att ladda upp eller skapa filer här",
- "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
- "New" : "Ny",
- "Select file range" : "Välj filintervall",
- "{used} of {quota} used" : "{used} av {quota} använt",
- "{used} used" : "{used} använt",
- "\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
- "File name cannot be empty." : "Filnamn kan inte vara tomt.",
- "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagring av {owner} är nästan full ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppmapp \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Extern lagring \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matcha \"{filter}\"","matcha \"{filter}\""],
- "View in folder" : "Utforska i mapp",
- "Copied!" : "Kopierad!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Kopiera direktlänk (fungerar endast för användare som har åtkomst till denna fil eller mapp)",
- "Path" : "Sökväg",
- "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
- "Favorited" : "Favoriserad",
- "Favorite" : "Favorit",
- "You can only favorite a single file or folder at a time" : "Du kan bara favoritmarkera en fil eller mapp åt gången",
- "New folder" : "Ny mapp",
- "Upload file" : "Ladda upp fil",
- "Recent" : "Senaste",
- "Not favorited" : "Inte favoriserade",
- "Remove from favorites" : "Ta bort från favoriter",
- "Add to favorites" : "Lägg till i favoriter",
- "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna",
"Added to favorites" : "Lades till i favoriter",
"Removed from favorites" : "Togs bort från favoriter",
"You added {file} to your favorites" : "Du la till {file} till dina favoriter",
"You removed {file} from your favorites" : "Du tog bort {file} från dina favoriter",
+ "Favorites" : "Favoriter",
"File changes" : "Filändringar",
"Created by {user}" : "Skapad av {user}",
"Changed by {user}" : "Ändrad av {user}",
@@ -114,7 +11,7 @@
"Restored by {user}" : "Återställd av {user}",
"Renamed by {user}" : "Filnamn ändrat av {user}",
"Moved by {user}" : "Flyttad av {user}",
- "\"remote user\"" : "\"extern användare\"",
+ "\"remote account\"" : "\"externt konto\"",
"You created {file}" : "Du skapade {file}",
"You created an encrypted file in {file}" : "Du skapade en krypterad fil i {file}",
"{user} created {file}" : "{user} skapade {file}",
@@ -124,9 +21,9 @@
"You changed an encrypted file in {file}" : "Du ändrade en krypterad fil i {file}",
"{user} changed {file}" : "{user} ändrade {file}",
"{user} changed an encrypted file in {file}" : "{user} ändrade en krypterad fil i {file}",
- "You deleted {file}" : "Du tog bort {file}",
+ "You deleted {file}" : "Du raderade {file}",
"You deleted an encrypted file in {file}" : "Du tog bort en krypterad fil i {file}",
- "{user} deleted {file}" : "{user} tog bort {file}",
+ "{user} deleted {file}" : "{user} raderade {file}",
"{user} deleted an encrypted file in {file}" : "{user} tog bort en krypterad fil i {file}",
"You restored {file}" : "Du återställde {file}",
"{user} restored {file}" : "{user} återställde {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "Du flyttade {oldfile} till {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} flyttade {oldfile} till {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "En fil har lagts till eller tagits bort från dina <strong>favoriter</strong>",
+ "Files" : "Filer",
"A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "En favorit-fil eller mapp har blivit <strong>ändrad</strong>",
- "All files" : "Alla filer",
- "Unlimited" : "Obegränsad",
- "Upload (max. %s)" : "Ladda upp (högst %s)",
+ "Failed to authorize" : "Det gick inte att auktorisera",
+ "Invalid folder path" : "Ogiltig mappsökväg",
+ "Folder not found" : "Mappen hittades inte",
+ "The file cannot be found" : "Filen kan inte hittas",
+ "The destination path does not exist: %1$s" : "Målsökvägen finns inte: %1$s",
+ "You do not have permission to create a file at the specified location" : "Du har inte behörighet att skapa en fil på den angivna platsen",
+ "The file could not be converted." : "Filen kunde inte konverteras.",
+ "Could not get relative path to converted file" : "Kunde inte hämta relativ sökväg till den konverterade filen",
+ "Favorite files" : "Favoritfiler",
+ "No favorites" : "Inga favoriter",
+ "More favorites" : "Fler favoriter",
"Accept" : "Acceptera",
"Reject" : "Avvisa",
"Incoming ownership transfer from {user}" : "Inkommande ägaröverföring från {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Vill du acceptera {path}?\n\nNotera: Överföringen kan efter att du accepterat ta upp till 1 timme.",
+ "Ownership transfer denied" : "Ägarskapsöverföring nekad",
+ "Your ownership transfer of {path} was denied by {user}." : "Din ägaröverföring av {path} nekades av {user}.",
"Ownership transfer failed" : "Ägarskapsöverföring misslyckades",
"Your ownership transfer of {path} to {user} failed." : "Din ägaröverföring av {path} till {user} misslyckades.",
"The ownership transfer of {path} from {user} failed." : "Din ägaröverföring av {path} från {user} misslyckades.",
@@ -157,62 +65,415 @@
"Your ownership transfer of {path} to {user} has completed." : "Din ägaröverföring av {path} till {user} är klar.",
"The ownership transfer of {path} from {user} has completed." : "Ägaröverföringen av {path} från {user} är klar.",
"in %s" : "om %s",
+ "Transferred from %1$s on %2$s" : "Överförd från %1$s på %2$s",
+ "Files compatibility" : "Filkompatibilitet",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Tillåt att begränsa filnamn för att säkerställa att filer kan synkroniseras med alla klienter. Som standard är alla filnamn som är giltiga på POSIX (t.ex. Linux eller macOS) tillåtna.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "När Windows-kompatibla filnamn har aktiverats kan befintliga filer inte längre ändras, men de kan byta namn till giltiga nya namn av sin ägare.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Det är också möjligt att migrera filer automatiskt efter att den här inställningen har aktiverats. Se dokumentationen om kommandot occ för mer information.",
+ "Enforce Windows compatibility" : "Tvinga Windows-kompatibilitet",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Detta kommer att blockera filnamn som inte är giltiga på Windows-system, som att använda reserverade namn eller specialtecken. Men detta kommer inte att framtvinga kompatibiliteten för skiftlägeskänslighet.",
"File Management" : "Filhantering",
- "Transfer ownership of a file or folder" : "Överför ägarskap av en fil eller mapp",
- "Choose file or folder to transfer" : "Välj fil eller mapp att överföra",
- "Change" : "Ändra",
- "New owner" : "Ny ägare",
- "Search users" : "Sök användare",
+ "Home" : "Hem",
+ "Target folder does not exist any more" : "Målmapp existerar inte längre",
+ "Reload current directory" : "Ladda om nuvarande mapp",
+ "Go to the \"{dir}\" directory" : "Gå till \"{dir}\" mappen",
+ "Current directory path" : "Aktuell katalogsökväg",
+ "Your have used your space quota and cannot upload files anymore" : "Du har använt din utrymmeskvot och kan inte längre ladda upp filer",
+ "You do not have permission to upload or create files here." : "Du har inte behörighet att ladda upp eller skapa filer här.",
+ "Drag and drop files here to upload" : "Dra och släpp filer här för att ladda upp",
+ "Favorite" : "Favorit",
+ "Back" : "Tillbaka",
+ "Toggle selection for file \"{displayName}\"" : "Växla markering för filen \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Växla markering för mappen \"{displayName}\"",
+ "File is loading" : "Filen laddas",
+ "Folder is loading" : "Mappen laddas",
+ "Filename" : "Filnamn",
+ "Folder name" : "Mappnamn",
+ "This node is unavailable" : "Den här noden är inte tillgänglig",
+ "Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
+ "Invalid filename." : "Ogiltigt filnamn.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Bytte namn på \"{oldName}\" till \"{newName}\"",
+ "Rename file" : "Byt namn på fil",
+ "Folder" : "Mapp",
+ "Unknown file type" : "Okänd filtyp",
+ "{ext} image" : "{ext} bild",
+ "{ext} video" : "{ext} video",
+ "{ext} audio" : "{ext} ljud",
+ "{ext} text" : "{ext} text",
+ "Pending" : "Väntar",
+ "Unknown date" : "Okänt datum",
+ "Clear filter" : "Rensa filter",
+ "Modified" : "Ändrad",
+ "Search everywhere" : "Sök överallt",
+ "Type" : "Typ",
+ "Active filters" : "Aktiva filter",
+ "Remove filter" : "Ta bort filter",
+ "Total rows summary" : "Sammanfattning antal rader",
+ "Toggle selection for all files and folders" : "Växla markering för alla filer och mappar",
+ "Name" : "Namn",
+ "File type" : "Filtyp",
+ "Size" : "Storlek",
+ "Actions" : "Funktioner",
+ "(selected)" : "(vald)",
+ "List of files and folders." : "Lista över filer och mappar.",
+ "You have used your space quota and cannot upload files anymore." : "Du har använt din utrymmeskvot och kan inte längre ladda upp filer.",
+ "Column headers with buttons are sortable." : "Kolumnrubriker med knappar är sorterbara.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
+ "File not found" : "Filen kunde inte hittas",
+ "_{count} selected_::_{count} selected_" : ["{count} vald","{count} valda"],
+ "Search scope options" : "Alternativ för sökomfång",
+ "{usedQuotaByte} used" : "{usedQuotaByte} använt",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{relative}% used" : "{relative}% använt",
+ "Could not refresh storage stats" : "Det gick inte att uppdatera lagringsstatistiken",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
+ "Storage information" : "Lagringsinformation",
+ "Storage quota" : "Lagringskvot",
+ "New folder" : "Ny mapp",
+ "Create new folder" : "Skapa ny mapp",
+ "This name is already in use." : "Namnet används redan.",
+ "Create" : "Skapa",
+ "Files starting with a dot are hidden by default" : "Filer som börjar med en punkt är dolda som standard",
+ "Fill template fields" : "Fyll mallfält",
+ "Submitting fields …" : "Skickar fält ...",
+ "Submit" : "Skicka",
"Choose a file or folder to transfer" : "Välj en fil eller mapp att överföra",
"Transfer" : "Överför",
"Transfer {path} to {userid}" : "Överför {path} till {userid}",
"Invalid path selected" : "Ogiltig sökväg vald",
+ "Unknown error" : "Okänt fel",
"Ownership transfer request sent" : "Förfrågan om ägaröverföring skickad",
- "Cannot transfer ownership of a file or folder you don't own" : "Det går inte att överföra ägarskap av en fil eller mapp som du inte äger",
- "Tags" : "Taggar",
- "Unable to change the favourite state of the file" : "Kan inte ändra filens favoritstatus",
+ "Cannot transfer ownership of a file or folder you do not own" : "Det går inte att överföra äganderätten till en fil eller mapp som du inte äger",
+ "Transfer ownership of a file or folder" : "Överför ägarskap av en fil eller mapp",
+ "Choose file or folder to transfer" : "Välj fil eller mapp att överföra",
+ "Change" : "Ändra",
+ "New owner" : "Ny ägare",
+ "Keep {old}" : "Behåll {old}",
+ "Keep without extension" : "Behåll utan filändelse",
+ "Use {new}" : "Använd {new}",
+ "Remove extension" : "Ta bort filändelse",
+ "Change file extension" : "Ändra filändelse",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Att ändra filtillägget från \"{old}\" till \"{new}\" kan göra filen oläsbar.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
+ "Do not show this dialog again." : "Visa inte denna dialog igen.",
+ "Select file or folder to link to" : "Välj fil eller mapp att länka till",
+ "Choose {file}" : "Välj {file}",
+ "Share" : "Dela",
+ "Shared by link" : "Delad via länk",
+ "Shared" : "Delad",
+ "Switch to list view" : "Växla till listvy",
+ "Switch to grid view" : "Växla till rutnätsvy",
+ "The file could not be found" : "Filen kunde inte hittas",
+ "Upload was cancelled by user" : "Uppladdningen avbröts av användaren",
+ "Not enough free space" : "Inte tillräckligt med ledigt utrymme",
+ "Operation is blocked by access control" : "Operationen blockeras av åtkomstkontroll",
+ "Error during upload: {message}" : "Fel vid uppladdning: {message}",
+ "Error during upload, status code {status}" : "Fel vid uppladdning, statuskod {status}",
+ "Unknown error during upload" : "Okänt fel under uppladdning",
+ "Loading current folder" : "Laddar aktuell mapp",
+ "Retry" : "Försök igen",
+ "No files in here" : "Inga filer kunde hittas",
+ "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
+ "Go back" : "Gå tillbaks",
+ "Views" : "Vyer",
+ "Files settings" : "Filinställningar",
+ "Your files" : "Dina filer",
+ "Open in files" : "Öppna i filer",
+ "File cannot be accessed" : "Det går inte att komma åt filen",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Filen kunde inte hittas eller så har du inte behörighet att visa den. Be avsändaren att dela den.",
+ "No search results for “{query}”" : "Inget sökresultat för “{query}”",
+ "Search for files" : "Sök efter filer",
+ "Clipboard is not available" : "Urklipp är inte tillgängligt",
+ "General" : "Allmänt",
+ "Default view" : "Standardvy",
+ "All files" : "Alla filer",
+ "Personal files" : "Personliga filer",
+ "Sort favorites first" : "Sortera favoriter först",
+ "Sort folders before files" : "Sortera mappar före filer",
+ "Folder tree" : "Mappträd",
+ "Appearance" : "Utseende",
+ "Show hidden files" : "Visa dolda filer",
+ "Show file type column" : "Visa kolumn för filtyp",
+ "Crop image previews" : "Beskär förhandsgranskningar för bilder",
+ "Additional settings" : "Övriga inställningar",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "Kopiera",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tvåfaktorsautentisering är aktiverad för ditt konto och därför måste du använda ett applösenord för att ansluta en extern WebDAV-klient.",
+ "Warnings" : "Varningar",
+ "Keyboard shortcuts" : "Tangentbordsgenvägar",
+ "File actions" : "Filåtgärder",
+ "Rename" : "Byt namn",
+ "Delete" : "Radera",
+ "Manage tags" : "Hantera taggar",
+ "Selection" : "Markerade",
+ "Select all files" : "Välj alla filer",
+ "Deselect all" : "Avmarkera alla",
+ "Navigation" : "Navigering",
+ "View" : "Visa",
+ "Toggle grid view" : "Växla rutnätsvy",
+ "Show those shortcuts" : "Visa dessa genvägar",
+ "You" : "Du",
+ "Shared multiple times with different people" : "Delad flera gånger med olika personer",
+ "Unable to change the favorite state of the file" : "Kan inte ändra filens favoritstatus",
"Error while loading the file data" : "Fel vid inläsning av fildata",
+ "Owner" : "Ägare",
+ "Remove from favorites" : "Ta bort från favoriter",
+ "Add to favorites" : "Lägg till i favoriter",
+ "Tags" : "Taggar",
+ "Blank" : "Tom",
+ "Unable to create new file from template" : "Kunde inte skapa fil från mall",
"Pick a template for {name}" : "Välj en mall för {name}",
- "Cancel" : "Avbryt",
- "Create" : "Skapa",
"Create a new file with the selected template" : "Skapa en ny fil med den valda mallen",
"Creating file" : "Skapar fil",
- "Blank" : "Tom",
- "Unable to create new file from template" : "Kunde inte skapa fil från mall",
- "Set up templates folder" : "Skapa en mapp för mallar",
- "Templates" : "Mallar",
+ "Save as {displayName}" : "Spara som {displayName}",
+ "Save as …" : "Spara som …",
+ "Converting files …" : "Konverterar filer ...",
+ "Failed to convert files: {message}" : "Kunde inte konvertera filer: {message}",
+ "All files failed to be converted" : "Alla filer misslyckades med att konverteras",
+ "One file could not be converted: {message}" : "En fil kunde inte konverteras: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["En fil kunde inte konverteras","%n filer kunde inte konverteras"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["En fil har konverterats","%n filer har konverterats"],
+ "Files successfully converted" : "Filerna har konverterats",
+ "Failed to convert files" : "Det gick inte att konvertera filer",
+ "Converting file …" : "Konverterar fil ...",
+ "File successfully converted" : "Filen har konverterats",
+ "Failed to convert file: {message}" : "Kunde inte konvertera filen: {message}",
+ "Failed to convert file" : "Kunde inte konvertera filen",
+ "Leave this share" : "Lämna denna delning",
+ "Leave these shares" : "Lämna dessa delningar",
+ "Disconnect storage" : "Koppla bort lagring",
+ "Disconnect storages" : "Koppla bort lagringar",
+ "Delete permanently" : "Ta bort permanent",
+ "Delete and unshare" : "Radera och sluta dela",
+ "Delete file" : "Ta bort fil",
+ "Delete files" : "Radera filer",
+ "Delete folder" : "Radera mapp",
+ "Delete folders" : "Radera mappar",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Du är på väg att permanent ta bort {count} objekt","Du är på väg att permanent ta bort {count} objekt"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Du är på väg att ta bort {count} objekt","Du är på väg att ta bort {count} objekt"],
+ "Confirm deletion" : "Bekräfta radering",
+ "Cancel" : "Avbryt",
+ "Download" : "Hämta",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
+ "Destination is not a folder" : "Destinationen är inte en mapp",
+ "This file/folder is already in that directory" : "Den här filen/mappen finns redan i den katalogen",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv",
+ "(copy)" : "(kopia)",
+ "(copy %n)" : "(kopia %n)",
+ "A file or folder with that name already exists in this folder" : "En fil eller mapp med det namnet finns redan i den här mappen",
+ "The files are locked" : "Filerna är låsta",
+ "The file does not exist anymore" : "Filen finns inte längre",
+ "Choose destination" : "Välj destination",
+ "Copy to {target}" : "Kopiera till {target}",
+ "Move to {target}" : "Flytta till {target}",
+ "Move" : "Flytta",
+ "Move or copy operation failed" : "Flytta eller kopiera misslyckades",
+ "Move or copy" : "Flytta eller kopiera",
+ "Open folder {displayName}" : "Öppna mappen {displayName}",
+ "Open in Files" : "Öppna i Filer",
+ "Open locally" : "Öppna lokalt",
+ "Failed to redirect to client" : "Det gick inte att omdirigera till klienten",
+ "Open file locally" : "Öppna filen lokalt",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Filen bör nu öppnas på din enhet. Om den inte gör det, kontrollera att du har installerat skrivbordsappen.",
+ "Retry and close" : "Försök igen och stäng",
+ "Open online" : "Öppna online",
+ "Details" : "Detaljer",
+ "View in folder" : "Utforska i mapp",
+ "Today" : "Idag",
+ "Last 7 days" : "Senaste 7 dagarna",
+ "Last 30 days" : "Senaste 30 dagarna",
+ "This year ({year})" : "I år ({year})",
+ "Last year ({year})" : "Förra året ({year})",
+ "Documents" : "Dokument",
+ "Spreadsheets" : "Kalkylblad",
+ "Presentations" : "Presentationer",
+ "PDFs" : "PDF-filer",
+ "Folders" : "Mappar",
+ "Audio" : "Ljud",
+ "Images" : "Bilder",
+ "Videos" : "Videor",
+ "Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
"Unable to initialize the templates directory" : "Kunde inte initialisera mall-mappen",
- "%s used" : "%s använt",
- "%s%% of %s used" : "%s%% av %s använt",
- "%1$s of %2$s used" : "%1$s av %2$s använt",
- "Settings" : "Inställningar",
- "Show hidden files" : "Visa dolda filer",
- "Crop image previews" : "Beskär förhandsgranskningar för bilder",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
- "Toggle %1$s sublist" : "Växla %1$s sublista",
- "Toggle grid view" : "Växla rutnätsvy",
- "No files in here" : "Inga filer kunde hittas",
- "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
+ "Create templates folder" : "Skapa mallmapp",
+ "Templates" : "Mallar",
+ "New template folder" : "Ny mallmapp",
+ "In folder" : "I mapp",
+ "Search in all files" : "Sök i alla filer",
+ "Search in folder: {folder}" : "Sök i mapp: {folder}",
+ "One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Din webbläsare stöder inte Filesystem API. Mappar kommer inte att laddas upp",
+ "No files to upload" : "Inga filer att ladda upp",
+ "Unable to create the directory {directory}" : "Det gick inte att skapa mappen {directory}",
+ "Some files could not be uploaded" : "Vissa filer kunde inte laddas upp",
+ "Files uploaded successfully" : "Filerna uppladdade",
+ "No files to process" : "Inga filer att bearbeta",
+ "Some files could not be copied" : "Vissa filer kunde inte kopieras",
+ "Some files could not be moved" : "Vissa filer kunde inte flyttas",
+ "Files copied successfully" : "Filerna kopierade",
+ "Files moved successfully" : "Filerna flyttade",
+ "Conflicts resolution skipped" : "Konfliktlösning hoppades över",
+ "Upload cancelled" : "Uppladdning avbruten",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Kunde inte byta namn på \"{oldName}\", den finns inte längre",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Namnet \"{newName}\" används redan i mappen \"{dir}\". Välj ett annat namn.",
+ "Could not rename \"{oldName}\"" : "Kunde inte byta namn på \"{oldName}\"",
+ "This operation is forbidden" : "Denna operation är förbjuden",
+ "Storage is temporarily not available" : "Lagring är tillfälligt inte tillgänglig",
+ "Unexpected error: {error}" : "Oväntat fel: {error}",
+ "_%n file_::_%n files_" : ["%n fil","%n filer"],
+ "_%n folder_::_%n folders_" : ["%n mapp","%n mappar"],
+ "_%n hidden_::_%n hidden_" : ["%n gömd","%n gömd"],
+ "Filename must not be empty." : "Filnamn får inte vara tomt.",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" är inte tillåtet i ett filnamn.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" är ett reserverat namn och inte tillåtet som filnamn.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" är inte en tillåten filtyp.",
+ "Filenames must not end with \"{extension}\"." : "Filnamn får inte sluta med \"{extension}\".",
+ "List of favorite files and folders." : "Lista över favoritfiler och mappar.",
+ "No favorites yet" : "Inga favoriter ännu",
+ "Files and folders you mark as favorite will show up here" : "Filer och mappar markerade som favoriter kommer att visas här",
+ "List of your files and folders." : "Lista över dina filer och mappar.",
+ "List of your files and folders that are not shared." : "Lista över dina filer och mappar som inte delas.",
+ "No personal files found" : "Inga personliga filer hittades",
+ "Files that are not shared will show up here." : "Filer som inte delas kommer att visas här.",
+ "Recent" : "Senaste",
+ "List of recently modified files and folders." : "Lista över nyligen ändrade filer och mappar.",
+ "No recently modified files" : "Inga nyligen ändrade filer",
+ "Files and folders you recently modified will show up here." : "Filer och mappar som du nyligen ändrat kommer att visas här.",
+ "Search" : "Sök",
+ "Search results within your files." : "Sökresultat i dina filer.",
"No entries found in this folder" : "Inget innehåll hittades i denna mapp",
"Select all" : "Välj allt",
"Upload too large" : "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
- "No favorites yet" : "Inga favoriter ännu",
- "Files and folders you mark as favorite will show up here" : "Filer och mappar markerade som favoriter kommer att visas här",
- "Deleted files" : "Borttagna filer",
- "Shares" : "Delningar",
- "Shared with others" : "Delad med andra",
- "Shared with you" : "Delad med dig",
- "Shared by link" : "Delad via länk",
- "Deleted shares" : "Borttagna delningar",
- "Pending shares" : "Väntande delningar",
+ "File could not be found" : "Fil kunde inte hittas",
+ "Show list view" : "Visa listvy",
+ "Show grid view" : "Visa rutnätsvy",
+ "Close" : "Stäng",
+ "Could not create folder \"{dir}\"" : "Kunde inte skapa mapp \"{dir}\"",
+ "This will stop your current uploads." : "Detta kommer att stoppa nuvarande uppladdningar.",
+ "Upload cancelled." : "Uppladdning avbruten.",
+ "Processing files …" : "Bearbetar filer ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.",
+ "Target folder \"{dir}\" does not exist any more" : "Målmapp \"{dir}\" existerar inte mer",
+ "An unknown error has occurred" : "Ett okänt fel uppstod",
+ "File could not be uploaded" : "Filen kunde inte laddas upp",
+ "Uploading …" : "Laddar upp ..",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Laddar upp … ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Uppladdning av det här objektet stöds inte",
+ "Error when assembling chunks, status code {status}" : "Fel vid ihopsättning av bitarna: statuskod: {status}",
+ "Choose target folder" : "Välj målmapp",
+ "Set reminder" : "Ställ in påminnelse",
+ "Edit locally" : "Redigera lokalt",
+ "Open" : "Öppna",
+ "Could not load info for file \"{file}\"" : "Kunde inte läsa in information för filen \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Vänligen välj tagg(ar) att lägga till i ditt urval",
+ "Apply tag(s) to selection" : "Lägg till tagg(ar) i ditt urval",
+ "Select directory \"{dirName}\"" : "Välj mapp \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Välj fil \"{fileName}\"",
+ "Unable to determine date" : "Misslyckades avgöra datum",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören",
+ "Could not move \"{file}\", target exists" : "Kunde inte flytta \"{file}\", filen existerar redan",
+ "Could not move \"{file}\"" : "Kunde inte flytta \"{file}\"",
+ "copy" : "kopia",
+ "Could not copy \"{file}\", target exists" : "Kunde inte kopiera \"{file}\", filen existerar redan",
+ "Could not copy \"{file}\"" : "Kunde inte kopiera \"{file}\"",
+ "Copied {origin} inside {destination}" : "Kopierade {origin} till {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Kopierade {origin} och {nbfiles} andra filer i {destination}",
+ "{newName} already exists" : "{newName} existerar redan",
+ "Could not create file \"{file}\"" : "Kunde inte skapa fil \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Kunde inte skapa fil \"{file}\" därför att den redan existerar",
+ "Could not create folder \"{dir}\" because it already exists" : "Kunde inte skapa \"{dir}\" därför att den redan existerar",
+ "Could not fetch file details \"{file}\"" : "Kunde inte hämta filinformation \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Fel när \"{fileName}\" skulle raderas.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Inga sökresultat i andra mappar för {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ange mer än två tecken för att söka i andra mappar",
+ "{dirs} and {files}" : "{dirs} och {files}",
+ "_including %n hidden_::_including %n hidden_" : ["inkluderar %n dold","inkluderar %n dolda"],
+ "You do not have permission to upload or create files here" : "Du har inte behörighet att ladda upp eller skapa filer här",
+ "_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
+ "New" : "Ny",
+ "New file/folder menu" : "Ny fil/mapp -meny",
+ "Select file range" : "Välj filintervall",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} använt",
+ "\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
+ "File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Lagring av {owner} är nästan full ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Gruppmapp \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Extern lagring \"{mountPoint}\" är nästan full ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matcha \"{filter}\"","matcha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Direktlänk kopierades (fungerar endast för användare som har tillgång till denna fil/mapp)",
+ "Path" : "Sökväg",
+ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
+ "Favored" : "Favoriserad",
+ "Favor" : "Favorisera",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Kopiera direktlänk (fungerar endast för användare som har åtkomst till denna fil/mapp)",
+ "Upload file" : "Ladda upp fil",
+ "Not favored" : "Inte favoriserad",
+ "An error occurred while trying to update the tags" : "Fel vid uppdatering av taggarna",
+ "Upload (max. %s)" : "Ladda upp (högst %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\"-åtgärden har utförts",
+ "\"{displayName}\" action failed" : "\"{displayName}\"-åtgärden misslyckades",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" misslyckades med vissa element",
+ "\"{displayName}\" batch action executed successfully" : "Batchåtgärden \"{displayName}\" har utförts",
+ "Submitting fields…" : "Skickar fält...",
+ "Filter filenames…" : "Filtrera filnamn...",
+ "WebDAV URL copied to clipboard" : "WebDAV URL kopierad till urklipp",
+ "Enable the grid view" : "Aktivera rutnätsvy",
+ "Enable folder tree" : "Aktivera mappträd",
+ "Copy to clipboard" : "Kopiera till urklipp",
+ "Use this address to access your Files via WebDAV" : "Använd denna adress för att komma åt dina filer med WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Om du har aktiverat 2FA måste du skapa och använda ett nytt applösenord genom att klicka här.",
+ "Deletion cancelled" : "Radering avbruten",
+ "Move cancelled" : "Flytt avbruten",
+ "Cancelled move or copy of \"{filename}\"." : "Avbröt flytt eller kopiering av \"{filename}\".",
+ "Cancelled move or copy operation" : "Flytta eller kopiera avbröts",
+ "Open details" : "Öppna detaljer",
+ "Photos and images" : "Foton och bilder",
+ "New folder creation cancelled" : "Skapandet av ny mapp avbröts",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} mapp","{folderCount} mappar"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} fil","{fileCount} filer"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 fil och {folderCount} mapp","1 fil och {folderCount} mappar"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} fil och 1 mapp","{fileCount} filer och 1 mapp"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} filer och {folderCount} mappar",
+ "All folders" : "Alla mappar",
+ "Personal Files" : "Personliga filer",
"Text file" : "Textfil",
"New text file.txt" : "Ny textfil.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Gruppmapp \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "Extern lagring \"{mountPoint}\" är full, filer kan inte uppdateras eller synkroniseras längre!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
- "_matches '{filter}'_::_match '{filter}'_" : ["matchar '{filter}'","matcha '{filter}'"]
+ "%1$s (renamed)" : "%1$s (omdöpt)",
+ "renamed file" : "omdöpt fil",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "När Windows-kompatibla filnamn har aktiverats kan befintliga filer inte längre ändras, men de kan byta namn till giltiga nya namn av sin ägare.",
+ "Filter file names …" : "Filtrera filnamn …",
+ "Prevent warning dialogs from open or reenable them." : "Förhindra varningsdialoger från att öppnas eller aktivera dem igen.",
+ "Show a warning dialog when changing a file extension." : "Visa en varningsdialog vid ändring av filändelse.",
+ "Speed up your Files experience with these quick shortcuts." : "Snabba upp din upplevelse i Filer med dessa smarta genvägar.",
+ "Open the actions menu for a file" : "Öppna åtgärdsmenyn för en fil",
+ "Rename a file" : "Byt namn på en fil",
+ "Delete a file" : "Ta bort en fil",
+ "Favorite or remove a file from favorites" : "Lägg till eller ta bort en fil från favoriter",
+ "Manage tags for a file" : "Hantera taggar för en fil",
+ "Deselect all files" : "Avmarkera alla filer",
+ "Select or deselect a file" : "Markera eller avmarkera en fil",
+ "Select a range of files" : "Markera ett filintervall",
+ "Navigate to the parent folder" : "Gå till överordnad mapp",
+ "Navigate to the file above" : "Gå till filen ovan",
+ "Navigate to the file below" : "Gå till filen nedan",
+ "Navigate to the file on the left (in grid mode)" : "Gå till filen till vänster (i rutnätsvy)",
+ "Navigate to the file on the right (in grid mode)" : "Gå till filen till höger (i rutnätsvy)",
+ "Toggle the grid view" : "Växla rutnätsvy",
+ "Open the sidebar for a file" : "Öppna sidofältet för en fil"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/sw.js b/apps/files/l10n/sw.js
new file mode 100644
index 00000000000..f1e21bf7807
--- /dev/null
+++ b/apps/files/l10n/sw.js
@@ -0,0 +1,480 @@
+OC.L10N.register(
+ "files",
+ {
+ "Added to favorites" : "Imeongezwa kwa vipendwa",
+ "Removed from favorites" : "Imeondolewa kutoka vipendwa",
+ "You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako",
+ "You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako",
+ "Favorites" : "Vinavyopendwa",
+ "File changes" : "Mabadiliko ya faili",
+ "Created by {user}" : "Imetengenezwa na {user}",
+ "Changed by {user}" : "Imebadilishwa na {user}",
+ "Deleted by {user}" : "Imefutwa na {user}",
+ "Restored by {user}" : "Imehifadhiwa na {user}",
+ "Renamed by {user}" : "Imepewa jina upya na {user}",
+ "Moved by {user}" : "Imesogezwa na {user}",
+ "\"remote account\"" : "\"akaunti ya mbali\"",
+ "You created {file}" : "Umetengeneza {file}",
+ "You created an encrypted file in {file}" : "Umeunda faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} created {file}" : "{user} ameunda {file}",
+ "{user} created an encrypted file in {file}" : "{user}ameunda faili iliyosimbwa kwa njia fiche katika {file}",
+ "{file} was created in a public folder" : "{file}ilitengenezwa katika kisanduku cha umma",
+ "You changed {file}" : "Umebadilisha {file}",
+ "You changed an encrypted file in {file}" : "Umebadilisha faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} changed {file}" : "{user} amebadili {file}",
+ "{user} changed an encrypted file in {file}" : "{user}amebadili faili iliyosimbwa kwa njia fiche katika {file}",
+ "You deleted {file}" : "Umefuta {file}",
+ "You deleted an encrypted file in {file}" : "Umefuta faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} deleted {file}" : "{user} amefuta {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} amefuta faili iliyosimbwa kwa njia fiche katika {file}",
+ "You restored {file}" : "Umehifadhi upya {file}",
+ "{user} restored {file}" : "{user} amehifadhi upya {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Umeita jina upya {oldfile}(iliyofichwa)kwenda {newfile} (iliyofichwa)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Umeita jina upya {oldfile}(iliyofichwa)kwenda{newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Umeita jina upya {oldfile}kwenda{newfile}(iliyofichwa)",
+ "You renamed {oldfile} to {newfile}" : "Umeita jina upya {oldfile}hadi{newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}ameita jina upya{oldfile}(iliyofichwa) hadi {newfile} (iliyofichwa)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}ameita jina upya{oldfile}(iliyofichwa) hadi{newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}ameita jina upya{oldfile}hadi{newfile}(iliyofichwa)",
+ "{user} renamed {oldfile} to {newfile}" : "{user}ameita jina upya {oldfile}hadi{newfile}",
+ "You moved {oldfile} to {newfile}" : "Umeondoa {oldfile}hadi{newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user}amesogeza {oldfile}hadi{newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Faili limeongezwa kwenye au limeondolewa kutoka <strong>vipendwa</strong>",
+ "Files" : "Mafaili",
+ "A file or folder has been <strong>changed</strong>" : "Faili au kisanduku kime<strong>badilishwa</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Faili pendwa au kisanduku kime<strong>badilishwa</strong>",
+ "Failed to authorize" : "Imeshindwa kuidhinisha",
+ "Invalid folder path" : "Njia ya kisanduku si halali",
+ "Folder not found" : "Kisanduku hakipatikani",
+ "The file cannot be found" : "Faili haliwezi kupatikana",
+ "The destination path does not exist: %1$s" : "Njia lengwa haipo %1$s",
+ "You do not have permission to create a file at the specified location" : "Huna ruhusa kuunda faili katika eneo lililobainishwa",
+ "The file could not be converted." : "Faili halikuweza kubadilishwa",
+ "Could not get relative path to converted file" : "Haikuweza kupata njia sawia ya faili lililobadilishwa",
+ "Favorite files" : "Faili pendwa",
+ "No favorites" : "Hakuna vipendwa",
+ "More favorites" : "Vipendwa zaidi",
+ "Accept" : "Kubali",
+ "Reject" : "Kataa",
+ "Incoming ownership transfer from {user}" : "Uhamisho wa umiliki unaoingia kutoka {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Je unataka kukubali {path}?\n\nKubmbuka: Mchakato wa uhamisho baada ya kukubali unaweza kuchukua mpaka saa 1",
+ "Ownership transfer denied" : "Uhamisho wa umiliki umekataliwa",
+ "Your ownership transfer of {path} was denied by {user}." : "Uhamisho wa umiliki wako wa {path}umekataliwa na {user}",
+ "Ownership transfer failed" : "Uhamisho wa umiliki umeshindikana",
+ "Your ownership transfer of {path} to {user} failed." : "Uhamisho wa umiliki wako wa {path}kwenda {user}umeshindikana",
+ "The ownership transfer of {path} from {user} failed." : "Uhamisho wa umiliki wa {path}kutoka {user}umeshindikana",
+ "Ownership transfer done" : "Uhamisho wa umiliki umefanyika",
+ "Your ownership transfer of {path} to {user} has completed." : "Uhamisho wako wa umiliki wa {path}kwenda {user}umekamilika",
+ "The ownership transfer of {path} from {user} has completed." : "Uhamisho wa umiliki wa {path}kutoka{user}umekamilika",
+ "in %s" : "Katika %s",
+ "Transferred from %1$s on %2$s" : "Imehamishwa kutoka %1$skatika%2$s",
+ "Files compatibility" : "Utengamano wa faili",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ruhusu kuzuia majina ya faili ili kuhakikisha kuwa faili zinaweza kusawazishwa na wateja wote. Kwa chaguo-msingi, majina yote ya faili ni halali katika POSIX (e.g. Linux or macOS) zinaruhusiwa.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuruhusu majina ya faili yanayooana na Windows, faili zilizopo haziwezi kubadilishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Pia inawezekana kuhamisha faili kiotomatiki baada ya kuwezesha mpangilio huu, tafadhali rejelea hati kuhusu amri ya occ.",
+ "Enforce Windows compatibility" : "Tekeleza utangamano wa windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Hii itazuia majina ya faili ambayo si halali kwenye mifumo ya Windows, kama vile kutumia majina yaliyohifadhiwa au herufi maalum. Lakini hii haitatekeleza utangamano wa unyeti wa kesi.",
+ "File Management" : "Usimamizi wa faili",
+ "Home" : "Nyumbani",
+ "Target folder does not exist any more" : "Kisanduku kilicholengwa hakipo tena",
+ "Reload current directory" : "Pakia upya kitabu cha orodha ya sasa",
+ "Go to the \"{dir}\" directory" : "Nenda kwenye {dir}kitabu cha orodha",
+ "Current directory path" : "Njia ya kitabu cha orodha ya sasa",
+ "Your have used your space quota and cannot upload files anymore" : "Umetumia nafasi yako kwa upendeleo na huwezi kupakia faili zaidi",
+ "You do not have permission to upload or create files here." : "Huna ruhusa kupakia au kutengeneza faili hapa",
+ "Drag and drop files here to upload" : "Sogeza na udondoshe faili hapa ili upakie",
+ "Favorite" : "Kipendwa",
+ "Back" : "Rudi",
+ "Toggle selection for file \"{displayName}\"" : "Geuza uteuzi wa faili \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Geuza uteuzi wa kisanduku \"{displayName}\"",
+ "File is loading" : "Faili inapakia",
+ "Folder is loading" : "Kisanduku kinapakia",
+ "Filename" : "Jina la faili",
+ "Folder name" : "Jina la kisanduku",
+ "This node is unavailable" : "Nodi hii haipatikani",
+ "Another entry with the same name already exists." : "Ingizo lingine lenye jina sawasawa lipo tayari",
+ "Invalid filename." : "Majina ya faili si sahihi",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Imebadili jina \"{oldName}\" mpaka \"{newName}\"",
+ "Rename file" : "Badili jina la faili",
+ "Folder" : "Kisanduku",
+ "Unknown file type" : "Aina ya faili isiyojulikana",
+ "{ext} image" : "{ext}picha",
+ "{ext} video" : "{ext}picha mjongeo",
+ "{ext} audio" : "{ext}sauti",
+ "{ext} text" : "{ext}maandishi",
+ "Pending" : "Inasubiri",
+ "Unknown date" : "Tarehe isiyojulikana",
+ "Clear filter" : "Futa kichujio",
+ "Modified" : "Iliyoboreshwa",
+ "Search everywhere" : "Tafuta kila mahali",
+ "Type" : "Aina",
+ "Active filters" : "Vichujio vinavyotumika",
+ "Remove filter" : "Ondoa kichujio",
+ "Total rows summary" : "Muhtasari wa jumla ya safu mlalo",
+ "Toggle selection for all files and folders" : "Geuza uteuzi wa faili na visanduku vyote",
+ "Name" : "Jina",
+ "File type" : "Aina ya faili",
+ "Size" : "Ukubwa",
+ "Actions" : "Utendekaji",
+ "(selected)" : "(iliyochaguliwa)",
+ "List of files and folders." : "Orodha ya faili na visanduku",
+ "You have used your space quota and cannot upload files anymore." : "Umetumia mgao wako wa nafasi na huwezi kupakia faili tena.",
+ "Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
+ "File not found" : "Faili halipatikani",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"],
+ "Search scope options" : "Chaguo za upeo wa utafutaji",
+ "{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
+ "{used} of {quota} used" : "{used} ya {quota}imetumika",
+ "{relative}% used" : "{relative}% imetumika",
+ "Could not refresh storage stats" : "Haikuweza kuonesha upya takwimu za hifadhi",
+ "Your storage is full, files can not be updated or synced anymore!" : "Hifadhi yako imejaa, faili haziwezi kusasishwa au kusawazishwa tena!",
+ "Storage information" : "Taarifa za uhifadhi",
+ "Storage quota" : "Kiasi cha uhifadhi",
+ "New folder" : "Kisanduku kipya",
+ "Create new folder" : "Tengeneza kisanduku kipya",
+ "This name is already in use." : "Jina hili liko katika matumizi tayari",
+ "Create" : "Tengeneza",
+ "Files starting with a dot are hidden by default" : "Faili zinazoanza na nukta zimefichwa kwa chaguo-msingi",
+ "Fill template fields" : "Jaza sehemu za violezo",
+ "Submitting fields …" : "Inawasilisha violezo",
+ "Submit" : "Wasilisha",
+ "Choose a file or folder to transfer" : "Chagua faili au kisanduku cha kuhamisha",
+ "Transfer" : "Hamisha",
+ "Transfer {path} to {userid}" : "Hamisha {path}mpaka {userid}",
+ "Invalid path selected" : "Njia iliyochaguliwa si halali",
+ "Unknown error" : "Hitilafu isiyojulikana",
+ "Ownership transfer request sent" : "Ombi la uhamisho wa umiliki limetumwa",
+ "Cannot transfer ownership of a file or folder you do not own" : "Haiwezi kuhamisha umiliki wa faili au kisanduku usichomiliki",
+ "Transfer ownership of a file or folder" : "Hamisha umiliki wa faili au kisanduku",
+ "Choose file or folder to transfer" : "Chagua faili au kisanduku cha kuhamisha",
+ "Change" : "Badili",
+ "New owner" : "Mmiliki mpya",
+ "Keep {old}" : "Weka {old}",
+ "Keep without extension" : "Weka bila ongezeko",
+ "Use {new}" : "Tumia {new}",
+ "Remove extension" : "Ondoa ongezeko",
+ "Change file extension" : "Badili ongezeko la faili",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Kubadilisha kiendelezi cha faili kutoka \"{{old}}\" hadi \"{new}\" kunaweza kufanya faili isisomeke.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Kuondoa kiendelezi cha faili \"{old}\" kunaweza kufanya faili isisomeke.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Kuongeza kiendelezi cha faili \"{new}\" kunaweza kufanya faili isisomeke.",
+ "Do not show this dialog again." : "Usioneshe mazungumzo haya tena",
+ "Select file or folder to link to" : "Chagua faili au kisanduku cha kuunga kwa",
+ "Choose {file}" : "Chagua {file}",
+ "Share" : "Shirikisha",
+ "Shared by link" : "Imeshirikishwa na kiungio",
+ "Shared" : "Shirikisha",
+ "Switch to list view" : "Badili hadi mwonekano wa orodha",
+ "Switch to grid view" : "Badili hadi mwonekano wa gridi",
+ "The file could not be found" : "Faili halikupatikana",
+ "Upload was cancelled by user" : "Upakiaji ulisitishwa na mtumiaji",
+ "Not enough free space" : "Hakuna eneo huru la kutosha",
+ "Operation is blocked by access control" : "Uendeshaji umezuiwa na udhibiti wa ufikiaji",
+ "Error during upload: {message}" : "Hitilafu wakati wa kupakia: {message}",
+ "Error during upload, status code {status}" : "Hitilafu wakati wa kupakia, msimbo wa hali {status}",
+ "Unknown error during upload" : "Hitilafu isiyojulikana wakati wa kupakia",
+ "Loading current folder" : "Inapakia faili ya sasa",
+ "Retry" : "Jaribu tene",
+ "No files in here" : "Hakuna faili hapa",
+ "Upload some content or sync with your devices!" : "Pakia baadhi ya maudhui au usawazishe na vifaa vyako!",
+ "Go back" : "Rudi nyuma",
+ "Views" : "Mionekano",
+ "Files settings" : "Mipangilio ya faili",
+ "Your files" : "Mafaili yako",
+ "Open in files" : "Fungua ndani ya faili",
+ "File cannot be accessed" : "Faili haliwezi kufikika",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili haikupatikana au huna ruhusa ya kuitazama. Uliza mtumaji kuishirikisha.",
+ "No search results for “{query}”" : "Hakuna matokeo ya utafutaji kwa {query}",
+ "Search for files" : "Tafuta faili",
+ "Clipboard is not available" : "Ubao wa kunakili haupatikani",
+ "General" : "Kuu",
+ "Default view" : "Mwonekano chaguomsingi",
+ "All files" : "Faili zote",
+ "Personal files" : "Faili binafsi",
+ "Sort favorites first" : "Chagua za upendeleo kwanza",
+ "Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Folder tree" : "Mti wa folda",
+ "Appearance" : "Mwonekano",
+ "Show hidden files" : "Onesha mafaili yaliyofichwa",
+ "Show file type column" : "Onyesha safu wima ya aina ya faili",
+ "Crop image previews" : "Punguza onyesho la kukagua picha",
+ "Additional settings" : "Mipangilio ya nyongeza",
+ "WebDAV" : "WavutiDAV",
+ "WebDAV URL" : "WavutiDAV URL",
+ "Copy" : "Nakili",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uthibitishaji wa Mambo Mbili umewashwa kwa akaunti yako, na kwa hivyo unahitaji kutumia nenosiri la programu kuunganisha mteja wa nje wa WebDAV.",
+ "Warnings" : "Maonyo",
+ "Keyboard shortcuts" : "Mikato ya keyboard",
+ "File actions" : "Matendo ya faili",
+ "Rename" : "Ipe jina jipya",
+ "Delete" : "Futa",
+ "Manage tags" : "Simamia lebo",
+ "Selection" : "Machaguo",
+ "Select all files" : "Chagua faili zote",
+ "Deselect all" : "Acha kuchagua zote",
+ "Navigation" : "Uendeshaji",
+ "View" : "Angalia",
+ "Show those shortcuts" : "Onesha mikato hiyo",
+ "You" : "Wewe",
+ "Shared multiple times with different people" : "Imeshirikiwa mara nyingi na watu tofauti",
+ "Unable to change the favorite state of the file" : "Haiwezi kubadilisha hali ya faili inayopendwa",
+ "Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
+ "Owner" : "Mmiliki",
+ "Remove from favorites" : "Ondoa kutoka katika pendwa",
+ "Add to favorites" : "Ongeza kwenye pendwa",
+ "Tags" : "Maoni",
+ "Blank" : "Mabano",
+ "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo",
+ "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}",
+ "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa",
+ "Creating file" : "Inatengeneza faili",
+ "Save as {displayName}" : "Hifadhi kama {displayName}",
+ "Save as …" : "Hifadhi kama",
+ "Converting files …" : "Inageuza mafaili",
+ "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}",
+ "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa",
+ "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"],
+ "Files successfully converted" : "Faili zimegeuzwa kikamilifu",
+ "Failed to convert files" : "Imeshindwa kugeuza faili",
+ "Converting file …" : "Inageuza faili",
+ "File successfully converted" : "Faili imegeuzwa kikamilifu",
+ "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}",
+ "Failed to convert file" : "Imeshindwa kugeuza faili",
+ "Leave this share" : "Ondoa ushirikishaji huu",
+ "Leave these shares" : "Ondoa shiriki hizi",
+ "Disconnect storage" : "Achanisha uhifadhi",
+ "Disconnect storages" : "Achanisha hifadhi",
+ "Delete permanently" : "Futa moja kwa moja",
+ "Delete and unshare" : "Futa na usishirikishe",
+ "Delete file" : "Futa faili",
+ "Delete files" : "Futa faili",
+ "Delete folder" : "Futa kisanduku",
+ "Delete folders" : "Futa visanduku",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","Unakaribia kufuta vipengee {count}kabisa"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","Unakaribia kufuta vipengee{count}"],
+ "Confirm deletion" : "Thibitisha ufutaji",
+ "Cancel" : "Sitisha",
+ "Download" : "Pakua",
+ "Moving \"{source}\" to \"{destination}\" …" : "Sogeza \"{source}\" mpaka \"{destination}\"",
+ "Copying \"{source}\" to \"{destination}\" …" : "Inanakili \"{source}\" hadi \"{destination}\" ...",
+ "Destination is not a folder" : " Lengwa si folda",
+ "This file/folder is already in that directory" : "Faili/folda hii tayari iko kwenye saraka hiyo",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe",
+ "(copy)" : "(nakili)",
+ "(copy %n)" : "(nakili %n)",
+ "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki",
+ "The files are locked" : "Faili zimezuiliwa",
+ "The file does not exist anymore" : "Faili halipo tena",
+ "Choose destination" : "Chagua eneo lengwa",
+ "Copy to {target}" : "Nakili kwenda {target}",
+ "Move to {target}" : "Hamishia {target}",
+ "Move" : "Hamisha",
+ "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana",
+ "Move or copy" : "Hamisha au nakili",
+ "Open folder {displayName}" : "Fungua kisanduku {displayName}",
+ "Open in Files" : "Fungua ndani ya faili",
+ "Open locally" : "Fungua kikawaida",
+ "Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja",
+ "Open file locally" : "Fungua faili kikawaida",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.",
+ "Retry and close" : "Jaribu upya kisha funga",
+ "Open online" : "Fungua mtandaoni",
+ "Details" : "Maelezo ya kina",
+ "View in folder" : "Angalia ndani ya kisanduku",
+ "Today" : "Leo",
+ "Last 7 days" : "Siku 7 zilizopita",
+ "Last 30 days" : "Siku 30 zilizopita",
+ "This year ({year})" : "Mwaka {year} huu",
+ "Last year ({year})" : "Mwaka uliopita {year}",
+ "Documents" : "Nyaraka",
+ "Spreadsheets" : "Lahajedwali",
+ "Presentations" : "Uwasilishaji",
+ "PDFs" : "PDFs",
+ "Folders" : "Visanduku",
+ "Audio" : "Sauti",
+ "Images" : "Picha",
+ "Videos" : "Picha mjongeo",
+ "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"",
+ "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo",
+ "Create templates folder" : "Imetengeneza kisanduku cha violezo",
+ "Templates" : "Violezo",
+ "New template folder" : "Kisanduku kipya cha violezo",
+ "In folder" : "Ndani ya kisanduku",
+ "Search in all files" : "Tafuta katika faili zote",
+ "Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
+ "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa",
+ "No files to upload" : "Hakuna faili la kupakia",
+ "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}",
+ "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa",
+ "Files uploaded successfully" : "Faili zimepakiwa kikamilifu",
+ "No files to process" : "Hakuna faili la kuchakata",
+ "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa",
+ "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa",
+ "Files copied successfully" : "Faili limenakiliwa kikamilifu",
+ "Files moved successfully" : "Faili limeondolewa kikamilifu",
+ "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa",
+ "Upload cancelled" : "Upakiaji umesitishwa",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{oldName}\", halipo tena",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{newName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti",
+ "Could not rename \"{oldName}\"" : "Haikuweza kuita jina jipya \"{oldName}\"",
+ "This operation is forbidden" : "Opereshini hii imezuiwa",
+ "Storage is temporarily not available" : "Uhifadhi haupo kwa muda",
+ "Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}",
+ "_%n file_::_%n files_" : ["%n file","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"],
+ "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa",
+ "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"",
+ "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa",
+ "No favorites yet" : "Bado hakuna vinavyopendwa",
+ "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa",
+ "List of your files and folders." : "Orodha ya faili na vikasha vyako",
+ "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa",
+ "No personal files found" : "Hakuna faili binafsi zilizopatikana",
+ "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa",
+ "Recent" : "Hivi karibuni",
+ "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni",
+ "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni",
+ "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa",
+ "Search" : "Tafuta",
+ "Search results within your files." : "Tafuta matokeo katika faili zako",
+ "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili",
+ "Select all" : "Chagua zote",
+ "Upload too large" : "Upakiaji mkubwa mno",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.",
+ "File could not be found" : "Faili isingeweza kupatikana",
+ "Show list view" : "Onesha mwonekeno wa orodha",
+ "Show grid view" : "Onesha mwonekano wa mstariramani",
+ "Close" : "Funga",
+ "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"",
+ "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa",
+ "Upload cancelled." : "Upakiaji umesitishwa ",
+ "Processing files …" : "Faili zinazochakatwa",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee",
+ "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena",
+ "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea",
+ "File could not be uploaded" : "Faili isingeweza kupakia",
+ "Uploading …" : "Inapakia",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi",
+ "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}",
+ "Choose target folder" : "Chagua kasha lililolengwa",
+ "Set reminder" : "Weka ukumbusho",
+ "Edit locally" : "Hariri kikawaida",
+ "Open" : "Fungua",
+ "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi",
+ "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi",
+ "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"",
+ "Unable to determine date" : "Haiwezi kuamua tarehe",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi",
+ "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo",
+ "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"",
+ "copy" : "Nakili",
+ "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo",
+ "Could not copy \"{file}\"" : "Haikuweza kunakili {file}",
+ "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}",
+ "{newName} already exists" : "{newName} lipo tayari",
+ "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari",
+ "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari",
+ "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine",
+ "{dirs} and {files}" : "{dirs} na {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"],
+ "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"],
+ "New" : "Mpya",
+ "New file/folder menu" : "Faili mpya/ menyu ya kisanduku",
+ "Select file range" : "Chagua safu ya faili",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used}imetumika",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali",
+ "File name cannot be empty." : "Jina la faili haliwezi kawa tupu",
+ "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)",
+ "Path" : "Njia",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"],
+ "Favored" : "Imependelewa",
+ "Favor" : "Upendeleo",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)",
+ "Upload file" : "Pakia faili",
+ "Not favored" : "Haikupendwa",
+ "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo",
+ "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" kitendo kimetekelezwa kwa mafanikio",
+ "\"{displayName}\" action failed" : "\"{displayName}\" matendo yameshindwa",
+ "\"{displayName}\" failed on some elements" : "\"{displayName} imeshindwa katika vipengele kadhaa",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" kitendo cha kundi kimetekelezwa kwa mafanikio",
+ "Submitting fields…" : "Inawasilisha migunda",
+ "Filter filenames…" : "Chuja majina ya faili",
+ "WebDAV URL copied to clipboard" : "WavutiDAV URL umenakiliwa kwenye ubao wa kunakili",
+ "Enable the grid view" : "Wezesha mwonekano wa gridi",
+ "Enable folder tree" : "Wezesha faili la tatu",
+ "Copy to clipboard" : "Nakili kwenye ubao wa kunakili",
+ "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
+ "Deletion cancelled" : "Ufutaji umesitishwa",
+ "Move cancelled" : "Uhamishaji umeghairishwa",
+ "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"",
+ "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili",
+ "Open details" : "Fungua maelezo",
+ "Photos and images" : "Picha na taswira",
+ "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha",
+ "All folders" : "Vikasha vyote",
+ "Personal Files" : "Faili binafsi",
+ "Text file" : "Faili ya maandishi",
+ "New text file.txt" : "Faili mpya ya maandishi.txt",
+ "%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
+ "renamed file" : "Faili iliyopewa jina jipya",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "Filter file names …" : "Chuja majina ya faili...",
+ "Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.",
+ "Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
+ "Speed up your Files experience with these quick shortcuts." : "Ongeza kasi ya utumiaji wa Faili zako kwa njia hizi za mkato za haraka.",
+ "Open the actions menu for a file" : "Fungua menyu ya vitendo kwa faili",
+ "Rename a file" : "Ita faili jina jipya",
+ "Delete a file" : "Futa faili",
+ "Favorite or remove a file from favorites" : "Pendwa au ondoa faili kutoka pendwa",
+ "Manage tags for a file" : "simamia maoni kwa faili",
+ "Deselect all files" : "Usichague faili zote",
+ "Select or deselect a file" : "Chagua au usichague faili",
+ "Select a range of files" : "Chagua anuwai ya faili",
+ "Navigate to the parent folder" : "Nenda kwenye kisanduku kikuu",
+ "Navigate to the file above" : "Sogea kwenye faili la juu",
+ "Navigate to the file below" : "Sogea kwenye faili la chini",
+ "Navigate to the file on the left (in grid mode)" : "Sogea kwenye faili la kushoto (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Sogea kwenye faili la kulia ( in grid mode)",
+ "Toggle the grid view" : "Geuza mwonekano wa gridi",
+ "Open the sidebar for a file" : "Fungua utepe kwa faili"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sw.json b/apps/files/l10n/sw.json
new file mode 100644
index 00000000000..0e6d0634b64
--- /dev/null
+++ b/apps/files/l10n/sw.json
@@ -0,0 +1,478 @@
+{ "translations": {
+ "Added to favorites" : "Imeongezwa kwa vipendwa",
+ "Removed from favorites" : "Imeondolewa kutoka vipendwa",
+ "You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako",
+ "You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako",
+ "Favorites" : "Vinavyopendwa",
+ "File changes" : "Mabadiliko ya faili",
+ "Created by {user}" : "Imetengenezwa na {user}",
+ "Changed by {user}" : "Imebadilishwa na {user}",
+ "Deleted by {user}" : "Imefutwa na {user}",
+ "Restored by {user}" : "Imehifadhiwa na {user}",
+ "Renamed by {user}" : "Imepewa jina upya na {user}",
+ "Moved by {user}" : "Imesogezwa na {user}",
+ "\"remote account\"" : "\"akaunti ya mbali\"",
+ "You created {file}" : "Umetengeneza {file}",
+ "You created an encrypted file in {file}" : "Umeunda faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} created {file}" : "{user} ameunda {file}",
+ "{user} created an encrypted file in {file}" : "{user}ameunda faili iliyosimbwa kwa njia fiche katika {file}",
+ "{file} was created in a public folder" : "{file}ilitengenezwa katika kisanduku cha umma",
+ "You changed {file}" : "Umebadilisha {file}",
+ "You changed an encrypted file in {file}" : "Umebadilisha faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} changed {file}" : "{user} amebadili {file}",
+ "{user} changed an encrypted file in {file}" : "{user}amebadili faili iliyosimbwa kwa njia fiche katika {file}",
+ "You deleted {file}" : "Umefuta {file}",
+ "You deleted an encrypted file in {file}" : "Umefuta faili iliyosimbwa kwa njia fiche katika {file}",
+ "{user} deleted {file}" : "{user} amefuta {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} amefuta faili iliyosimbwa kwa njia fiche katika {file}",
+ "You restored {file}" : "Umehifadhi upya {file}",
+ "{user} restored {file}" : "{user} amehifadhi upya {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Umeita jina upya {oldfile}(iliyofichwa)kwenda {newfile} (iliyofichwa)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Umeita jina upya {oldfile}(iliyofichwa)kwenda{newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Umeita jina upya {oldfile}kwenda{newfile}(iliyofichwa)",
+ "You renamed {oldfile} to {newfile}" : "Umeita jina upya {oldfile}hadi{newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user}ameita jina upya{oldfile}(iliyofichwa) hadi {newfile} (iliyofichwa)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user}ameita jina upya{oldfile}(iliyofichwa) hadi{newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user}ameita jina upya{oldfile}hadi{newfile}(iliyofichwa)",
+ "{user} renamed {oldfile} to {newfile}" : "{user}ameita jina upya {oldfile}hadi{newfile}",
+ "You moved {oldfile} to {newfile}" : "Umeondoa {oldfile}hadi{newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user}amesogeza {oldfile}hadi{newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Faili limeongezwa kwenye au limeondolewa kutoka <strong>vipendwa</strong>",
+ "Files" : "Mafaili",
+ "A file or folder has been <strong>changed</strong>" : "Faili au kisanduku kime<strong>badilishwa</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Faili pendwa au kisanduku kime<strong>badilishwa</strong>",
+ "Failed to authorize" : "Imeshindwa kuidhinisha",
+ "Invalid folder path" : "Njia ya kisanduku si halali",
+ "Folder not found" : "Kisanduku hakipatikani",
+ "The file cannot be found" : "Faili haliwezi kupatikana",
+ "The destination path does not exist: %1$s" : "Njia lengwa haipo %1$s",
+ "You do not have permission to create a file at the specified location" : "Huna ruhusa kuunda faili katika eneo lililobainishwa",
+ "The file could not be converted." : "Faili halikuweza kubadilishwa",
+ "Could not get relative path to converted file" : "Haikuweza kupata njia sawia ya faili lililobadilishwa",
+ "Favorite files" : "Faili pendwa",
+ "No favorites" : "Hakuna vipendwa",
+ "More favorites" : "Vipendwa zaidi",
+ "Accept" : "Kubali",
+ "Reject" : "Kataa",
+ "Incoming ownership transfer from {user}" : "Uhamisho wa umiliki unaoingia kutoka {user}",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Je unataka kukubali {path}?\n\nKubmbuka: Mchakato wa uhamisho baada ya kukubali unaweza kuchukua mpaka saa 1",
+ "Ownership transfer denied" : "Uhamisho wa umiliki umekataliwa",
+ "Your ownership transfer of {path} was denied by {user}." : "Uhamisho wa umiliki wako wa {path}umekataliwa na {user}",
+ "Ownership transfer failed" : "Uhamisho wa umiliki umeshindikana",
+ "Your ownership transfer of {path} to {user} failed." : "Uhamisho wa umiliki wako wa {path}kwenda {user}umeshindikana",
+ "The ownership transfer of {path} from {user} failed." : "Uhamisho wa umiliki wa {path}kutoka {user}umeshindikana",
+ "Ownership transfer done" : "Uhamisho wa umiliki umefanyika",
+ "Your ownership transfer of {path} to {user} has completed." : "Uhamisho wako wa umiliki wa {path}kwenda {user}umekamilika",
+ "The ownership transfer of {path} from {user} has completed." : "Uhamisho wa umiliki wa {path}kutoka{user}umekamilika",
+ "in %s" : "Katika %s",
+ "Transferred from %1$s on %2$s" : "Imehamishwa kutoka %1$skatika%2$s",
+ "Files compatibility" : "Utengamano wa faili",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Ruhusu kuzuia majina ya faili ili kuhakikisha kuwa faili zinaweza kusawazishwa na wateja wote. Kwa chaguo-msingi, majina yote ya faili ni halali katika POSIX (e.g. Linux or macOS) zinaruhusiwa.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuruhusu majina ya faili yanayooana na Windows, faili zilizopo haziwezi kubadilishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Pia inawezekana kuhamisha faili kiotomatiki baada ya kuwezesha mpangilio huu, tafadhali rejelea hati kuhusu amri ya occ.",
+ "Enforce Windows compatibility" : "Tekeleza utangamano wa windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Hii itazuia majina ya faili ambayo si halali kwenye mifumo ya Windows, kama vile kutumia majina yaliyohifadhiwa au herufi maalum. Lakini hii haitatekeleza utangamano wa unyeti wa kesi.",
+ "File Management" : "Usimamizi wa faili",
+ "Home" : "Nyumbani",
+ "Target folder does not exist any more" : "Kisanduku kilicholengwa hakipo tena",
+ "Reload current directory" : "Pakia upya kitabu cha orodha ya sasa",
+ "Go to the \"{dir}\" directory" : "Nenda kwenye {dir}kitabu cha orodha",
+ "Current directory path" : "Njia ya kitabu cha orodha ya sasa",
+ "Your have used your space quota and cannot upload files anymore" : "Umetumia nafasi yako kwa upendeleo na huwezi kupakia faili zaidi",
+ "You do not have permission to upload or create files here." : "Huna ruhusa kupakia au kutengeneza faili hapa",
+ "Drag and drop files here to upload" : "Sogeza na udondoshe faili hapa ili upakie",
+ "Favorite" : "Kipendwa",
+ "Back" : "Rudi",
+ "Toggle selection for file \"{displayName}\"" : "Geuza uteuzi wa faili \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Geuza uteuzi wa kisanduku \"{displayName}\"",
+ "File is loading" : "Faili inapakia",
+ "Folder is loading" : "Kisanduku kinapakia",
+ "Filename" : "Jina la faili",
+ "Folder name" : "Jina la kisanduku",
+ "This node is unavailable" : "Nodi hii haipatikani",
+ "Another entry with the same name already exists." : "Ingizo lingine lenye jina sawasawa lipo tayari",
+ "Invalid filename." : "Majina ya faili si sahihi",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Imebadili jina \"{oldName}\" mpaka \"{newName}\"",
+ "Rename file" : "Badili jina la faili",
+ "Folder" : "Kisanduku",
+ "Unknown file type" : "Aina ya faili isiyojulikana",
+ "{ext} image" : "{ext}picha",
+ "{ext} video" : "{ext}picha mjongeo",
+ "{ext} audio" : "{ext}sauti",
+ "{ext} text" : "{ext}maandishi",
+ "Pending" : "Inasubiri",
+ "Unknown date" : "Tarehe isiyojulikana",
+ "Clear filter" : "Futa kichujio",
+ "Modified" : "Iliyoboreshwa",
+ "Search everywhere" : "Tafuta kila mahali",
+ "Type" : "Aina",
+ "Active filters" : "Vichujio vinavyotumika",
+ "Remove filter" : "Ondoa kichujio",
+ "Total rows summary" : "Muhtasari wa jumla ya safu mlalo",
+ "Toggle selection for all files and folders" : "Geuza uteuzi wa faili na visanduku vyote",
+ "Name" : "Jina",
+ "File type" : "Aina ya faili",
+ "Size" : "Ukubwa",
+ "Actions" : "Utendekaji",
+ "(selected)" : "(iliyochaguliwa)",
+ "List of files and folders." : "Orodha ya faili na visanduku",
+ "You have used your space quota and cannot upload files anymore." : "Umetumia mgao wako wa nafasi na huwezi kupakia faili tena.",
+ "Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
+ "File not found" : "Faili halipatikani",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"],
+ "Search scope options" : "Chaguo za upeo wa utafutaji",
+ "{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
+ "{used} of {quota} used" : "{used} ya {quota}imetumika",
+ "{relative}% used" : "{relative}% imetumika",
+ "Could not refresh storage stats" : "Haikuweza kuonesha upya takwimu za hifadhi",
+ "Your storage is full, files can not be updated or synced anymore!" : "Hifadhi yako imejaa, faili haziwezi kusasishwa au kusawazishwa tena!",
+ "Storage information" : "Taarifa za uhifadhi",
+ "Storage quota" : "Kiasi cha uhifadhi",
+ "New folder" : "Kisanduku kipya",
+ "Create new folder" : "Tengeneza kisanduku kipya",
+ "This name is already in use." : "Jina hili liko katika matumizi tayari",
+ "Create" : "Tengeneza",
+ "Files starting with a dot are hidden by default" : "Faili zinazoanza na nukta zimefichwa kwa chaguo-msingi",
+ "Fill template fields" : "Jaza sehemu za violezo",
+ "Submitting fields …" : "Inawasilisha violezo",
+ "Submit" : "Wasilisha",
+ "Choose a file or folder to transfer" : "Chagua faili au kisanduku cha kuhamisha",
+ "Transfer" : "Hamisha",
+ "Transfer {path} to {userid}" : "Hamisha {path}mpaka {userid}",
+ "Invalid path selected" : "Njia iliyochaguliwa si halali",
+ "Unknown error" : "Hitilafu isiyojulikana",
+ "Ownership transfer request sent" : "Ombi la uhamisho wa umiliki limetumwa",
+ "Cannot transfer ownership of a file or folder you do not own" : "Haiwezi kuhamisha umiliki wa faili au kisanduku usichomiliki",
+ "Transfer ownership of a file or folder" : "Hamisha umiliki wa faili au kisanduku",
+ "Choose file or folder to transfer" : "Chagua faili au kisanduku cha kuhamisha",
+ "Change" : "Badili",
+ "New owner" : "Mmiliki mpya",
+ "Keep {old}" : "Weka {old}",
+ "Keep without extension" : "Weka bila ongezeko",
+ "Use {new}" : "Tumia {new}",
+ "Remove extension" : "Ondoa ongezeko",
+ "Change file extension" : "Badili ongezeko la faili",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Kubadilisha kiendelezi cha faili kutoka \"{{old}}\" hadi \"{new}\" kunaweza kufanya faili isisomeke.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Kuondoa kiendelezi cha faili \"{old}\" kunaweza kufanya faili isisomeke.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Kuongeza kiendelezi cha faili \"{new}\" kunaweza kufanya faili isisomeke.",
+ "Do not show this dialog again." : "Usioneshe mazungumzo haya tena",
+ "Select file or folder to link to" : "Chagua faili au kisanduku cha kuunga kwa",
+ "Choose {file}" : "Chagua {file}",
+ "Share" : "Shirikisha",
+ "Shared by link" : "Imeshirikishwa na kiungio",
+ "Shared" : "Shirikisha",
+ "Switch to list view" : "Badili hadi mwonekano wa orodha",
+ "Switch to grid view" : "Badili hadi mwonekano wa gridi",
+ "The file could not be found" : "Faili halikupatikana",
+ "Upload was cancelled by user" : "Upakiaji ulisitishwa na mtumiaji",
+ "Not enough free space" : "Hakuna eneo huru la kutosha",
+ "Operation is blocked by access control" : "Uendeshaji umezuiwa na udhibiti wa ufikiaji",
+ "Error during upload: {message}" : "Hitilafu wakati wa kupakia: {message}",
+ "Error during upload, status code {status}" : "Hitilafu wakati wa kupakia, msimbo wa hali {status}",
+ "Unknown error during upload" : "Hitilafu isiyojulikana wakati wa kupakia",
+ "Loading current folder" : "Inapakia faili ya sasa",
+ "Retry" : "Jaribu tene",
+ "No files in here" : "Hakuna faili hapa",
+ "Upload some content or sync with your devices!" : "Pakia baadhi ya maudhui au usawazishe na vifaa vyako!",
+ "Go back" : "Rudi nyuma",
+ "Views" : "Mionekano",
+ "Files settings" : "Mipangilio ya faili",
+ "Your files" : "Mafaili yako",
+ "Open in files" : "Fungua ndani ya faili",
+ "File cannot be accessed" : "Faili haliwezi kufikika",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili haikupatikana au huna ruhusa ya kuitazama. Uliza mtumaji kuishirikisha.",
+ "No search results for “{query}”" : "Hakuna matokeo ya utafutaji kwa {query}",
+ "Search for files" : "Tafuta faili",
+ "Clipboard is not available" : "Ubao wa kunakili haupatikani",
+ "General" : "Kuu",
+ "Default view" : "Mwonekano chaguomsingi",
+ "All files" : "Faili zote",
+ "Personal files" : "Faili binafsi",
+ "Sort favorites first" : "Chagua za upendeleo kwanza",
+ "Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Folder tree" : "Mti wa folda",
+ "Appearance" : "Mwonekano",
+ "Show hidden files" : "Onesha mafaili yaliyofichwa",
+ "Show file type column" : "Onyesha safu wima ya aina ya faili",
+ "Crop image previews" : "Punguza onyesho la kukagua picha",
+ "Additional settings" : "Mipangilio ya nyongeza",
+ "WebDAV" : "WavutiDAV",
+ "WebDAV URL" : "WavutiDAV URL",
+ "Copy" : "Nakili",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Uthibitishaji wa Mambo Mbili umewashwa kwa akaunti yako, na kwa hivyo unahitaji kutumia nenosiri la programu kuunganisha mteja wa nje wa WebDAV.",
+ "Warnings" : "Maonyo",
+ "Keyboard shortcuts" : "Mikato ya keyboard",
+ "File actions" : "Matendo ya faili",
+ "Rename" : "Ipe jina jipya",
+ "Delete" : "Futa",
+ "Manage tags" : "Simamia lebo",
+ "Selection" : "Machaguo",
+ "Select all files" : "Chagua faili zote",
+ "Deselect all" : "Acha kuchagua zote",
+ "Navigation" : "Uendeshaji",
+ "View" : "Angalia",
+ "Show those shortcuts" : "Onesha mikato hiyo",
+ "You" : "Wewe",
+ "Shared multiple times with different people" : "Imeshirikiwa mara nyingi na watu tofauti",
+ "Unable to change the favorite state of the file" : "Haiwezi kubadilisha hali ya faili inayopendwa",
+ "Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
+ "Owner" : "Mmiliki",
+ "Remove from favorites" : "Ondoa kutoka katika pendwa",
+ "Add to favorites" : "Ongeza kwenye pendwa",
+ "Tags" : "Maoni",
+ "Blank" : "Mabano",
+ "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo",
+ "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}",
+ "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa",
+ "Creating file" : "Inatengeneza faili",
+ "Save as {displayName}" : "Hifadhi kama {displayName}",
+ "Save as …" : "Hifadhi kama",
+ "Converting files …" : "Inageuza mafaili",
+ "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}",
+ "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa",
+ "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"],
+ "Files successfully converted" : "Faili zimegeuzwa kikamilifu",
+ "Failed to convert files" : "Imeshindwa kugeuza faili",
+ "Converting file …" : "Inageuza faili",
+ "File successfully converted" : "Faili imegeuzwa kikamilifu",
+ "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}",
+ "Failed to convert file" : "Imeshindwa kugeuza faili",
+ "Leave this share" : "Ondoa ushirikishaji huu",
+ "Leave these shares" : "Ondoa shiriki hizi",
+ "Disconnect storage" : "Achanisha uhifadhi",
+ "Disconnect storages" : "Achanisha hifadhi",
+ "Delete permanently" : "Futa moja kwa moja",
+ "Delete and unshare" : "Futa na usishirikishe",
+ "Delete file" : "Futa faili",
+ "Delete files" : "Futa faili",
+ "Delete folder" : "Futa kisanduku",
+ "Delete folders" : "Futa visanduku",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","Unakaribia kufuta vipengee {count}kabisa"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","Unakaribia kufuta vipengee{count}"],
+ "Confirm deletion" : "Thibitisha ufutaji",
+ "Cancel" : "Sitisha",
+ "Download" : "Pakua",
+ "Moving \"{source}\" to \"{destination}\" …" : "Sogeza \"{source}\" mpaka \"{destination}\"",
+ "Copying \"{source}\" to \"{destination}\" …" : "Inanakili \"{source}\" hadi \"{destination}\" ...",
+ "Destination is not a folder" : " Lengwa si folda",
+ "This file/folder is already in that directory" : "Faili/folda hii tayari iko kwenye saraka hiyo",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe",
+ "(copy)" : "(nakili)",
+ "(copy %n)" : "(nakili %n)",
+ "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki",
+ "The files are locked" : "Faili zimezuiliwa",
+ "The file does not exist anymore" : "Faili halipo tena",
+ "Choose destination" : "Chagua eneo lengwa",
+ "Copy to {target}" : "Nakili kwenda {target}",
+ "Move to {target}" : "Hamishia {target}",
+ "Move" : "Hamisha",
+ "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana",
+ "Move or copy" : "Hamisha au nakili",
+ "Open folder {displayName}" : "Fungua kisanduku {displayName}",
+ "Open in Files" : "Fungua ndani ya faili",
+ "Open locally" : "Fungua kikawaida",
+ "Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja",
+ "Open file locally" : "Fungua faili kikawaida",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.",
+ "Retry and close" : "Jaribu upya kisha funga",
+ "Open online" : "Fungua mtandaoni",
+ "Details" : "Maelezo ya kina",
+ "View in folder" : "Angalia ndani ya kisanduku",
+ "Today" : "Leo",
+ "Last 7 days" : "Siku 7 zilizopita",
+ "Last 30 days" : "Siku 30 zilizopita",
+ "This year ({year})" : "Mwaka {year} huu",
+ "Last year ({year})" : "Mwaka uliopita {year}",
+ "Documents" : "Nyaraka",
+ "Spreadsheets" : "Lahajedwali",
+ "Presentations" : "Uwasilishaji",
+ "PDFs" : "PDFs",
+ "Folders" : "Visanduku",
+ "Audio" : "Sauti",
+ "Images" : "Picha",
+ "Videos" : "Picha mjongeo",
+ "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"",
+ "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo",
+ "Create templates folder" : "Imetengeneza kisanduku cha violezo",
+ "Templates" : "Violezo",
+ "New template folder" : "Kisanduku kipya cha violezo",
+ "In folder" : "Ndani ya kisanduku",
+ "Search in all files" : "Tafuta katika faili zote",
+ "Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
+ "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa",
+ "No files to upload" : "Hakuna faili la kupakia",
+ "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}",
+ "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa",
+ "Files uploaded successfully" : "Faili zimepakiwa kikamilifu",
+ "No files to process" : "Hakuna faili la kuchakata",
+ "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa",
+ "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa",
+ "Files copied successfully" : "Faili limenakiliwa kikamilifu",
+ "Files moved successfully" : "Faili limeondolewa kikamilifu",
+ "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa",
+ "Upload cancelled" : "Upakiaji umesitishwa",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{oldName}\", halipo tena",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{newName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti",
+ "Could not rename \"{oldName}\"" : "Haikuweza kuita jina jipya \"{oldName}\"",
+ "This operation is forbidden" : "Opereshini hii imezuiwa",
+ "Storage is temporarily not available" : "Uhifadhi haupo kwa muda",
+ "Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}",
+ "_%n file_::_%n files_" : ["%n file","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"],
+ "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa",
+ "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"",
+ "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa",
+ "No favorites yet" : "Bado hakuna vinavyopendwa",
+ "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa",
+ "List of your files and folders." : "Orodha ya faili na vikasha vyako",
+ "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa",
+ "No personal files found" : "Hakuna faili binafsi zilizopatikana",
+ "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa",
+ "Recent" : "Hivi karibuni",
+ "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni",
+ "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni",
+ "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa",
+ "Search" : "Tafuta",
+ "Search results within your files." : "Tafuta matokeo katika faili zako",
+ "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili",
+ "Select all" : "Chagua zote",
+ "Upload too large" : "Upakiaji mkubwa mno",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.",
+ "File could not be found" : "Faili isingeweza kupatikana",
+ "Show list view" : "Onesha mwonekeno wa orodha",
+ "Show grid view" : "Onesha mwonekano wa mstariramani",
+ "Close" : "Funga",
+ "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"",
+ "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa",
+ "Upload cancelled." : "Upakiaji umesitishwa ",
+ "Processing files …" : "Faili zinazochakatwa",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee",
+ "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena",
+ "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea",
+ "File could not be uploaded" : "Faili isingeweza kupakia",
+ "Uploading …" : "Inapakia",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi",
+ "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}",
+ "Choose target folder" : "Chagua kasha lililolengwa",
+ "Set reminder" : "Weka ukumbusho",
+ "Edit locally" : "Hariri kikawaida",
+ "Open" : "Fungua",
+ "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi",
+ "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi",
+ "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"",
+ "Unable to determine date" : "Haiwezi kuamua tarehe",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi",
+ "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo",
+ "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"",
+ "copy" : "Nakili",
+ "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo",
+ "Could not copy \"{file}\"" : "Haikuweza kunakili {file}",
+ "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}",
+ "{newName} already exists" : "{newName} lipo tayari",
+ "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari",
+ "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari",
+ "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine",
+ "{dirs} and {files}" : "{dirs} na {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"],
+ "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"],
+ "New" : "Mpya",
+ "New file/folder menu" : "Faili mpya/ menyu ya kisanduku",
+ "Select file range" : "Chagua safu ya faili",
+ "{used}%" : "{used} %",
+ "{used} used" : "{used}imetumika",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali",
+ "File name cannot be empty." : "Jina la faili haliwezi kawa tupu",
+ "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)",
+ "Path" : "Njia",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"],
+ "Favored" : "Imependelewa",
+ "Favor" : "Upendeleo",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)",
+ "Upload file" : "Pakia faili",
+ "Not favored" : "Haikupendwa",
+ "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo",
+ "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" kitendo kimetekelezwa kwa mafanikio",
+ "\"{displayName}\" action failed" : "\"{displayName}\" matendo yameshindwa",
+ "\"{displayName}\" failed on some elements" : "\"{displayName} imeshindwa katika vipengele kadhaa",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" kitendo cha kundi kimetekelezwa kwa mafanikio",
+ "Submitting fields…" : "Inawasilisha migunda",
+ "Filter filenames…" : "Chuja majina ya faili",
+ "WebDAV URL copied to clipboard" : "WavutiDAV URL umenakiliwa kwenye ubao wa kunakili",
+ "Enable the grid view" : "Wezesha mwonekano wa gridi",
+ "Enable folder tree" : "Wezesha faili la tatu",
+ "Copy to clipboard" : "Nakili kwenye ubao wa kunakili",
+ "Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
+ "Deletion cancelled" : "Ufutaji umesitishwa",
+ "Move cancelled" : "Uhamishaji umeghairishwa",
+ "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"",
+ "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili",
+ "Open details" : "Fungua maelezo",
+ "Photos and images" : "Picha na taswira",
+ "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha",
+ "All folders" : "Vikasha vyote",
+ "Personal Files" : "Faili binafsi",
+ "Text file" : "Faili ya maandishi",
+ "New text file.txt" : "Faili mpya ya maandishi.txt",
+ "%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
+ "renamed file" : "Faili iliyopewa jina jipya",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "Filter file names …" : "Chuja majina ya faili...",
+ "Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.",
+ "Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
+ "Speed up your Files experience with these quick shortcuts." : "Ongeza kasi ya utumiaji wa Faili zako kwa njia hizi za mkato za haraka.",
+ "Open the actions menu for a file" : "Fungua menyu ya vitendo kwa faili",
+ "Rename a file" : "Ita faili jina jipya",
+ "Delete a file" : "Futa faili",
+ "Favorite or remove a file from favorites" : "Pendwa au ondoa faili kutoka pendwa",
+ "Manage tags for a file" : "simamia maoni kwa faili",
+ "Deselect all files" : "Usichague faili zote",
+ "Select or deselect a file" : "Chagua au usichague faili",
+ "Select a range of files" : "Chagua anuwai ya faili",
+ "Navigate to the parent folder" : "Nenda kwenye kisanduku kikuu",
+ "Navigate to the file above" : "Sogea kwenye faili la juu",
+ "Navigate to the file below" : "Sogea kwenye faili la chini",
+ "Navigate to the file on the left (in grid mode)" : "Sogea kwenye faili la kushoto (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Sogea kwenye faili la kulia ( in grid mode)",
+ "Toggle the grid view" : "Geuza mwonekano wa gridi",
+ "Open the sidebar for a file" : "Fungua utepe kwa faili"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/files/l10n/sw_KE.js b/apps/files/l10n/sw_KE.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/sw_KE.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sw_KE.json b/apps/files/l10n/sw_KE.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/sw_KE.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/tg_TJ.js b/apps/files/l10n/tg_TJ.js
deleted file mode 100644
index 7988332fa91..00000000000
--- a/apps/files/l10n/tg_TJ.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/tg_TJ.json b/apps/files/l10n/tg_TJ.json
deleted file mode 100644
index ef5fc586755..00000000000
--- a/apps/files/l10n/tg_TJ.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js
deleted file mode 100644
index deb34583b02..00000000000
--- a/apps/files/l10n/th.js
+++ /dev/null
@@ -1,220 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Storage is temporarily not available" : "พื้นที่จัดเก็บข้อมูลไม่สามารถใช้งานได้ชั่วคราว",
- "Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
- "Unknown error" : "ข้อผิดพลาดที่ไม่รู้จัก",
- "File could not be found" : "ไม่พบไฟล์",
- "Move or copy" : "ย้ายหรือคัดลอก",
- "Download" : "ดาวน์โหลด",
- "Delete" : "ลบ",
- "Home" : "หน้าหลัก",
- "Close" : "ปิด",
- "Favorites" : "รายการโปรด",
- "Could not create folder \"{dir}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"",
- "This will stop your current uploads." : "การกระทำนี้จะหยุดการอัปโหลดปัจจุบันของคุณ",
- "Upload cancelled." : "การอัปโหลดถูกยกเลิก",
- "Processing files …" : "กำลังประมวลผลไฟล์ …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัปโหลด {filename} เนื่องจากเป็นไดเรกทอรีหรือมี 0 ไบต์",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอ คุณกำลังจะอัปโหลด {size1} แต่เหลือพื้นที่แค่ {size2}",
- "Target folder \"{dir}\" does not exist any more" : "ไม่มีโฟลเดอร์เป้าหมาย \"{dir}\" อีกต่อไป",
- "Not enough free space" : "พื้นที่ว่างไม่เพียงพอ",
- "An unknown error has occurred" : "เกิดข้อผิดพลาดที่ไม่รู้จัก",
- "Uploading …" : "กำลังอัปโหลด …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} จาก {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "ไม่รองรับการอัปโหลดสิ่งนั้น",
- "Target folder does not exist any more" : "ไม่มีโฟลเดอร์เป้าหมายอีกต่อไป",
- "Operation is blocked by access control" : "การดำเนินการถูกห้ามไว้โดยการควบคุมการเข้าถึง",
- "Error when assembling chunks, status code {status}" : "ข้อผิดพลาดขณะประกอบกลุ่ม รหัสสถานะ {status}",
- "Actions" : "การกระทำ",
- "Rename" : "เปลี่ยนชื่อ",
- "Copy" : "คัดลอก",
- "Choose target folder" : "เลือกโฟลเดอร์เป้าหมาย",
- "Open" : "เปิด",
- "Delete file" : "ลบไฟล์",
- "Delete folder" : "ลบโฟลเดอร์",
- "Disconnect storage" : "ยกเลิกการเชื่อมต่อพื้นที่จัดเก็บข้อมูล",
- "Leave this share" : "ออกจากการแชร์นี้",
- "Could not load info for file \"{file}\"" : "ไม่สามารถโหลดข้อมูลสำหรับไฟล์ \"{file}\"",
- "Files" : "ไฟล์",
- "Details" : "รายละเอียด",
- "Please select tag(s) to add to the selection" : "กรุณาเลือกแท็กเพื่อเพิ่มเข้าไปในรายการที่เลือก",
- "Apply tag(s) to selection" : "นำแท็กไปใช้ในรายการที่เลือก",
- "Select" : "เลือก",
- "Pending" : "อยู่ระหว่างดำเนินการ",
- "Unable to determine date" : "ไม่สามารถระบุวัน",
- "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
- "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้ โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
- "Could not move \"{file}\", target exists" : "ไม่สามารถย้าย \"{file}\" เป้าหมายมีอยู่แล้ว",
- "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"",
- "copy" : "คัดลอก",
- "Could not copy \"{file}\", target exists" : "ไม่สามารถคัดลอก \"{file}\" เป้าหมายมีอยู่แล้ว",
- "Could not copy \"{file}\"" : "ไม่สามารถคัดลอก \"{file}\"",
- "Copied {origin} inside {destination}" : "คัดลอก {origin} ไว้ใน {destination} แล้ว",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "คัดลอก {origin} และ {nbfiles} ไฟล์อื่น ๆ ไว้ใน {destination} แล้ว",
- "{newName} already exists" : "{newName} มีอยู่แล้ว",
- "Could not rename \"{fileName}\", it does not exist any more" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\" ไฟล์นั้นไม่มีอยู่",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "ชื่อ \"{targetName}\" มีอยู่แล้วในโฟลเดอร์ \"{dir}\" กรุณาเปลี่ยนชื่อใหม่",
- "Could not rename \"{fileName}\"" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\"",
- "Could not create file \"{file}\"" : "ไม่สามารถสร้างไฟล์ \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "ไม่สามารถสร้างไฟล์ \"{file}\" เพราะมันมีอยู่แล้ว",
- "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว",
- "Could not fetch file details \"{file}\"" : "ไม่สามารถดึงข้อมูลไฟล์ \"{file}\"",
- "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"",
- "No search results in other folders for {tag}{filter}{endtag}" : "ไม่มีผลลัพธ์การค้นหาในโฟลเดอร์อื่นสำหรับ {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "ใส่มากกว่า 2 ตัวอักษร เพื่อค้นหาในโฟลเดอร์อื่น",
- "Name" : "ชื่อ",
- "Size" : "ขนาด",
- "Modified" : "แก้ไขเมื่อ",
- "_%n folder_::_%n folders_" : ["%n โฟลเดอร์"],
- "_%n file_::_%n files_" : ["%n ไฟล์"],
- "{dirs} and {files}" : "{dirs} และ {files}",
- "_including %n hidden_::_including %n hidden_" : ["รวมถึง %n ไฟล์ที่ซ่อนอยู่"],
- "You don’t have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่",
- "_Uploading %n file_::_Uploading %n files_" : ["กำลังอัปโหลด %n ไฟล์"],
- "New" : "สร้างใหม่",
- "Select file range" : "เลือกช่วงไฟล์",
- "{used} of {quota} used" : "ใช้ไป {used} จาก {quota}",
- "{used} used" : "ใช้ไป {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" เป็นชื่อไฟล์ที่ไม่ถูกต้อง",
- "File name cannot be empty." : "ชื่อไฟล์ไม่สามารถเว้นว่างได้",
- "\"/\" is not allowed inside a file name." : "ไม่อนุญาตให้ใช้ \"/\" ในชื่อไฟล์",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" เป็นประเภทไฟล์ที่ไม่ได้รับอนุญาต",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของ {owner} เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "โฟลเดอร์กลุ่ม \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Your storage is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลของ {owner} ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "โฟลเดอร์กลุ่ม \"{mountPoint}\" ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["ตรงกับ \"{filter}\""],
- "View in folder" : "ดูในโฟลเดอร์",
- "Copied!" : "คัดลอกแล้ว",
- "Copy direct link (only works for users who have access to this file/folder)" : "คัดลอกลิงก์โดยตรง (ใช้ได้เฉพาะผู้ใช้ที่มีสิทธิ์เข้าถึงไฟล์/โฟลเดอร์นี้)",
- "Path" : "เส้นทาง",
- "_%n byte_::_%n bytes_" : ["%n ไบต์"],
- "Favorited" : "เพิ่มในรายการโปรดแล้ว",
- "Favorite" : "รายการโปรด",
- "You can only favorite a single file or folder at a time" : "คุณสามารถระบุเป็นรายการโปรดได้แค่ครั้งละ 1 ไฟล์หรือโฟลเดอร์",
- "New folder" : "โฟลเดอร์ใหม่",
- "Upload file" : "อัปโหลดไฟล์",
- "Recent" : "ล่าสุด",
- "Not favorited" : "ไม่ได้เป็นรายการโปรด",
- "Remove from favorites" : "เอาออกจากรายการโปรด",
- "Add to favorites" : "เพิ่มในรายการโปรด",
- "An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะกำลังพยายามอัปเดตแท็ก",
- "Added to favorites" : "เพิ่มในรายการโปรดแล้ว",
- "Removed from favorites" : "เอาออกจากรายการโปรดแล้ว",
- "You added {file} to your favorites" : "คุณได้เพิ่ม {file} ในรายการโปรดของคุณ",
- "You removed {file} from your favorites" : "คุณได้เอา {file} ออกจากรายการโปรดของคุณ",
- "File changes" : "การเปลี่ยนแปลงไฟล์",
- "Created by {user}" : "สร้างโดย {user}",
- "Changed by {user}" : "เปลี่ยนแปลงโดย {user}",
- "Deleted by {user}" : "ลบโดย {user}",
- "Restored by {user}" : "กู้คืนโดย {user}",
- "Renamed by {user}" : "เปลี่ยนชื่อโดย {user}",
- "Moved by {user}" : "ย้ายโดย {user}",
- "\"remote user\"" : "\"ผู้ใช้รีโมท\"",
- "You created {file}" : "คุณได้สร้าง {file}",
- "You created an encrypted file in {file}" : "คุณได้สร้างไฟล์ที่เข้ารหัสใน {file}",
- "{user} created {file}" : "{user} ได้สร้าง {file}",
- "{user} created an encrypted file in {file}" : "{user} ได้สร้างไฟล์ที่เข้ารหัสใน {file}",
- "{file} was created in a public folder" : "{file} ถูกสร้างขึ้นในโฟลเดอร์สาธารณะ",
- "You changed {file}" : "คุณได้เปลี่ยนแปลง {file}",
- "You changed an encrypted file in {file}" : "คุณได้เปลี่ยนแปลงไฟล์ที่เข้ารหัสใน {file}",
- "{user} changed {file}" : "{user} ได้เปลี่ยนแปลง {file}",
- "{user} changed an encrypted file in {file}" : "{user} ได้เปลี่ยนแปลงไฟล์ที่เข้ารหัสใน {file}",
- "You deleted {file}" : "คุณได้ลบ {file}",
- "You deleted an encrypted file in {file}" : "คุณได้ลบไฟล์ที่เข้ารหัสใน {file}",
- "{user} deleted {file}" : "{user} ได้ลบ {file}",
- "{user} deleted an encrypted file in {file}" : "{user} ได้ลบไฟล์ที่เข้ารหัสใน {file}",
- "You restored {file}" : "คุณได้กู้คืน {file}",
- "{user} restored {file}" : "{user} ได้กู้คืน {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "คุณได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile} (ซ่อนอยู่)",
- "You renamed {oldfile} (hidden) to {newfile}" : "คุณได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "คุณได้เปลี่ยนชื่อ {oldfile} เป็น {newfile} (ซ่อนอยู่)",
- "You renamed {oldfile} to {newfile}" : "คุณได้เปลี่ยนชื่อ {oldfile} เป็น {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile} (ซ่อนอยู่)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ได้เปลี่ยนชื่อ {oldfile} เป็น {newfile} (ซ่อนอยู่)",
- "{user} renamed {oldfile} to {newfile}" : "{user} ได้เปลี่ยนชื่อ {oldfile} เป็น {newfile}",
- "You moved {oldfile} to {newfile}" : "คุณได้ย้าย {oldfile} ไปยัง {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} ได้ย้าย {oldfile} ไปยัง {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "มีไฟล์ที่ถูกเพิ่มเข้าหรือเอาออกจาก<strong>รายการโปรด</strong>ของคุณ",
- "A file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ที่มีการ<strong>เปลี่ยนแปลง</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ในรายการโปรดที่มีการ<strong>เปลี่ยนแปลง</strong>",
- "All files" : "ไฟล์ทั้งหมด",
- "Unlimited" : "ไม่จำกัด",
- "Upload (max. %s)" : "อัปโหลด (สูงสุด %s)",
- "Accept" : "ยอมรับ",
- "Reject" : "ปฏิเสธ",
- "Incoming ownership transfer from {user}" : "คำขอการโอนย้ายความเป็นเจ้าของจาก {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "คุณต้องการยอมรับ {path} หรือไม่?\n\nหมายเหตุ: หลังยอมรับแล้ว กระบวนการโอนย้ายอาจใช้เวลาสูงสุด 1 ชั่วโมง",
- "Ownership transfer failed" : "การโอนย้ายความเป็นเจ้าของล้มเหลว",
- "Your ownership transfer of {path} to {user} failed." : "การโอนย้ายความเป็นเจ้าของของคุณของ {path} ไปยัง {user} ล้มเหลว",
- "The ownership transfer of {path} from {user} failed." : "การโอนย้ายความเป็นเจ้าของของ {path} จาก {user} ล้มเหลว",
- "Ownership transfer done" : "การโอนย้ายความเป็นเจ้าของสำเร็จ",
- "Your ownership transfer of {path} to {user} has completed." : "การโอนย้ายความเป็นเจ้าของของคุณของ {path} ไปยัง {user} สำเร็จแล้ว",
- "The ownership transfer of {path} from {user} has completed." : "การโอนย้ายความเป็นเจ้าของของ {path} จาก {user} สำเร็จแล้ว",
- "in %s" : "ใน %s",
- "File Management" : "การจัดการไฟล์",
- "Transfer ownership of a file or folder" : "โอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์",
- "Choose file or folder to transfer" : "เลือกไฟล์หรือโฟลเดอร์ที่จะโอนย้าย",
- "Change" : "เปลี่ยนแปลง",
- "New owner" : "เจ้าของใหม่",
- "Search users" : "ค้นหาผู้ใช้",
- "Choose a file or folder to transfer" : "เลือกไฟล์หรือโฟลเดอร์ที่จะโอนย้าย",
- "Transfer" : "โอนย้าย",
- "Transfer {path} to {userid}" : "โอนย้าย {path} ไปยัง {userid}",
- "Invalid path selected" : "เลือกเส้นทางไม่ถูกต้อง",
- "Ownership transfer request sent" : "ส่งคำขอโอนย้ายความเป็นเจ้าของแล้ว",
- "Cannot transfer ownership of a file or folder you don't own" : "ไม่สามารถโอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์ที่คุณไม่ได้เป็นเจ้าของ",
- "Tags" : "แท็ก",
- "Unable to change the favourite state of the file" : "ไม่สามารถเปลี่ยนสถานะรายการโปรดของไฟล์",
- "Error while loading the file data" : "ข้อผิดพลาดขณะโหลดข้อมูลไฟล์",
- "Pick a template for {name}" : "เลือกเทมเพลตสำหรับ {name}",
- "Cancel" : "ยกเลิก",
- "Create" : "สร้าง",
- "Create a new file with the selected template" : "สร้างไฟล์ใหม่ด้วยเทมเพลตที่เลือก",
- "Creating file" : "กำลังสร้างไฟล์",
- "Blank" : "ว่าง",
- "Unable to create new file from template" : "ไม่สามารถสร้างไฟล์ใหม่จากเทมเพลต",
- "Set up templates folder" : "ตั้งค่าโฟลเดอร์เทมเพลต",
- "Templates" : "เทมเพลต",
- "Unable to initialize the templates directory" : "ไม่สามารถเตรียมไดเรกทอรีเทมเพลต",
- "%s used" : "ใช้ไป %s",
- "%s%% of %s used" : "ใช้ไป %s%% จาก %s",
- "%1$s of %2$s used" : "ใช้ไป %1$s จาก %2$s",
- "Settings" : "การตั้งค่า",
- "Show hidden files" : "แสดงไฟล์ที่ซ่อนอยู่",
- "Crop image previews" : "ครอปตัดรูปภาพตัวอย่าง",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
- "Toggle %1$s sublist" : "สลับรายการย่อย %1$s",
- "Toggle grid view" : "สลับมุมมองตาราง",
- "No files in here" : "ไม่มีไฟล์ที่นี่",
- "Upload some content or sync with your devices!" : "ลองอัปโหลดเนื้อหาหรือซิงค์กับอุปกรณ์อื่นของคุณ",
- "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
- "Select all" : "เลือกทั้งหมด",
- "Upload too large" : "ไฟล์ที่อัปโหลดมีขนาดใหญ่เกินไป",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัปโหลดมีขนาดเกินกว่าขนาดสูงสุดที่อัปโหลดได้สำหรับเซิร์ฟเวอร์นี้",
- "No favorites yet" : "ยังไม่มีรายการโปรด",
- "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณระบุเป็นรายการโปรดจะแสดงที่นี่",
- "Deleted files" : "ไฟล์ที่ถูกลบ",
- "Shares" : "การแชร์",
- "Shared with others" : "แชร์กับผู้อื่น",
- "Shared with you" : "แชร์กับคุณ",
- "Shared by link" : "แชร์โดยลิงก์",
- "Deleted shares" : "การแชร์ที่ถูกลบ",
- "Pending shares" : "การแชร์ที่กำลังดำเนินการ",
- "Text file" : "ไฟล์ข้อความ",
- "New text file.txt" : "ไฟล์ข้อความใหม่.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของ {owner} เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "โฟลเดอร์กลุ่ม \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Your storage is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ตรงกับ '{filter}'"]
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/th.json b/apps/files/l10n/th.json
deleted file mode 100644
index 90ed23b47a9..00000000000
--- a/apps/files/l10n/th.json
+++ /dev/null
@@ -1,218 +0,0 @@
-{ "translations": {
- "Storage is temporarily not available" : "พื้นที่จัดเก็บข้อมูลไม่สามารถใช้งานได้ชั่วคราว",
- "Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
- "Unknown error" : "ข้อผิดพลาดที่ไม่รู้จัก",
- "File could not be found" : "ไม่พบไฟล์",
- "Move or copy" : "ย้ายหรือคัดลอก",
- "Download" : "ดาวน์โหลด",
- "Delete" : "ลบ",
- "Home" : "หน้าหลัก",
- "Close" : "ปิด",
- "Favorites" : "รายการโปรด",
- "Could not create folder \"{dir}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"",
- "This will stop your current uploads." : "การกระทำนี้จะหยุดการอัปโหลดปัจจุบันของคุณ",
- "Upload cancelled." : "การอัปโหลดถูกยกเลิก",
- "Processing files …" : "กำลังประมวลผลไฟล์ …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัปโหลด {filename} เนื่องจากเป็นไดเรกทอรีหรือมี 0 ไบต์",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอ คุณกำลังจะอัปโหลด {size1} แต่เหลือพื้นที่แค่ {size2}",
- "Target folder \"{dir}\" does not exist any more" : "ไม่มีโฟลเดอร์เป้าหมาย \"{dir}\" อีกต่อไป",
- "Not enough free space" : "พื้นที่ว่างไม่เพียงพอ",
- "An unknown error has occurred" : "เกิดข้อผิดพลาดที่ไม่รู้จัก",
- "Uploading …" : "กำลังอัปโหลด …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} จาก {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "ไม่รองรับการอัปโหลดสิ่งนั้น",
- "Target folder does not exist any more" : "ไม่มีโฟลเดอร์เป้าหมายอีกต่อไป",
- "Operation is blocked by access control" : "การดำเนินการถูกห้ามไว้โดยการควบคุมการเข้าถึง",
- "Error when assembling chunks, status code {status}" : "ข้อผิดพลาดขณะประกอบกลุ่ม รหัสสถานะ {status}",
- "Actions" : "การกระทำ",
- "Rename" : "เปลี่ยนชื่อ",
- "Copy" : "คัดลอก",
- "Choose target folder" : "เลือกโฟลเดอร์เป้าหมาย",
- "Open" : "เปิด",
- "Delete file" : "ลบไฟล์",
- "Delete folder" : "ลบโฟลเดอร์",
- "Disconnect storage" : "ยกเลิกการเชื่อมต่อพื้นที่จัดเก็บข้อมูล",
- "Leave this share" : "ออกจากการแชร์นี้",
- "Could not load info for file \"{file}\"" : "ไม่สามารถโหลดข้อมูลสำหรับไฟล์ \"{file}\"",
- "Files" : "ไฟล์",
- "Details" : "รายละเอียด",
- "Please select tag(s) to add to the selection" : "กรุณาเลือกแท็กเพื่อเพิ่มเข้าไปในรายการที่เลือก",
- "Apply tag(s) to selection" : "นำแท็กไปใช้ในรายการที่เลือก",
- "Select" : "เลือก",
- "Pending" : "อยู่ระหว่างดำเนินการ",
- "Unable to determine date" : "ไม่สามารถระบุวัน",
- "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม",
- "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้ โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ",
- "Could not move \"{file}\", target exists" : "ไม่สามารถย้าย \"{file}\" เป้าหมายมีอยู่แล้ว",
- "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"",
- "copy" : "คัดลอก",
- "Could not copy \"{file}\", target exists" : "ไม่สามารถคัดลอก \"{file}\" เป้าหมายมีอยู่แล้ว",
- "Could not copy \"{file}\"" : "ไม่สามารถคัดลอก \"{file}\"",
- "Copied {origin} inside {destination}" : "คัดลอก {origin} ไว้ใน {destination} แล้ว",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "คัดลอก {origin} และ {nbfiles} ไฟล์อื่น ๆ ไว้ใน {destination} แล้ว",
- "{newName} already exists" : "{newName} มีอยู่แล้ว",
- "Could not rename \"{fileName}\", it does not exist any more" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\" ไฟล์นั้นไม่มีอยู่",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "ชื่อ \"{targetName}\" มีอยู่แล้วในโฟลเดอร์ \"{dir}\" กรุณาเปลี่ยนชื่อใหม่",
- "Could not rename \"{fileName}\"" : "ไม่สามารถเปลี่ยนชื่อไฟล์ \"{fileName}\"",
- "Could not create file \"{file}\"" : "ไม่สามารถสร้างไฟล์ \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "ไม่สามารถสร้างไฟล์ \"{file}\" เพราะมันมีอยู่แล้ว",
- "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว",
- "Could not fetch file details \"{file}\"" : "ไม่สามารถดึงข้อมูลไฟล์ \"{file}\"",
- "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"",
- "No search results in other folders for {tag}{filter}{endtag}" : "ไม่มีผลลัพธ์การค้นหาในโฟลเดอร์อื่นสำหรับ {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "ใส่มากกว่า 2 ตัวอักษร เพื่อค้นหาในโฟลเดอร์อื่น",
- "Name" : "ชื่อ",
- "Size" : "ขนาด",
- "Modified" : "แก้ไขเมื่อ",
- "_%n folder_::_%n folders_" : ["%n โฟลเดอร์"],
- "_%n file_::_%n files_" : ["%n ไฟล์"],
- "{dirs} and {files}" : "{dirs} และ {files}",
- "_including %n hidden_::_including %n hidden_" : ["รวมถึง %n ไฟล์ที่ซ่อนอยู่"],
- "You don’t have permission to upload or create files here" : "คุณไม่ได้รับอนุญาตให้อัปโหลดหรือสร้างไฟล์ที่นี่",
- "_Uploading %n file_::_Uploading %n files_" : ["กำลังอัปโหลด %n ไฟล์"],
- "New" : "สร้างใหม่",
- "Select file range" : "เลือกช่วงไฟล์",
- "{used} of {quota} used" : "ใช้ไป {used} จาก {quota}",
- "{used} used" : "ใช้ไป {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" เป็นชื่อไฟล์ที่ไม่ถูกต้อง",
- "File name cannot be empty." : "ชื่อไฟล์ไม่สามารถเว้นว่างได้",
- "\"/\" is not allowed inside a file name." : "ไม่อนุญาตให้ใช้ \"/\" ในชื่อไฟล์",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" เป็นประเภทไฟล์ที่ไม่ได้รับอนุญาต",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของ {owner} เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "โฟลเดอร์กลุ่ม \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Your storage is full, files cannot be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลของ {owner} ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "โฟลเดอร์กลุ่ม \"{mountPoint}\" ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" ใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "Your storage is almost full ({usedSpacePercent}%)." : "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["ตรงกับ \"{filter}\""],
- "View in folder" : "ดูในโฟลเดอร์",
- "Copied!" : "คัดลอกแล้ว",
- "Copy direct link (only works for users who have access to this file/folder)" : "คัดลอกลิงก์โดยตรง (ใช้ได้เฉพาะผู้ใช้ที่มีสิทธิ์เข้าถึงไฟล์/โฟลเดอร์นี้)",
- "Path" : "เส้นทาง",
- "_%n byte_::_%n bytes_" : ["%n ไบต์"],
- "Favorited" : "เพิ่มในรายการโปรดแล้ว",
- "Favorite" : "รายการโปรด",
- "You can only favorite a single file or folder at a time" : "คุณสามารถระบุเป็นรายการโปรดได้แค่ครั้งละ 1 ไฟล์หรือโฟลเดอร์",
- "New folder" : "โฟลเดอร์ใหม่",
- "Upload file" : "อัปโหลดไฟล์",
- "Recent" : "ล่าสุด",
- "Not favorited" : "ไม่ได้เป็นรายการโปรด",
- "Remove from favorites" : "เอาออกจากรายการโปรด",
- "Add to favorites" : "เพิ่มในรายการโปรด",
- "An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะกำลังพยายามอัปเดตแท็ก",
- "Added to favorites" : "เพิ่มในรายการโปรดแล้ว",
- "Removed from favorites" : "เอาออกจากรายการโปรดแล้ว",
- "You added {file} to your favorites" : "คุณได้เพิ่ม {file} ในรายการโปรดของคุณ",
- "You removed {file} from your favorites" : "คุณได้เอา {file} ออกจากรายการโปรดของคุณ",
- "File changes" : "การเปลี่ยนแปลงไฟล์",
- "Created by {user}" : "สร้างโดย {user}",
- "Changed by {user}" : "เปลี่ยนแปลงโดย {user}",
- "Deleted by {user}" : "ลบโดย {user}",
- "Restored by {user}" : "กู้คืนโดย {user}",
- "Renamed by {user}" : "เปลี่ยนชื่อโดย {user}",
- "Moved by {user}" : "ย้ายโดย {user}",
- "\"remote user\"" : "\"ผู้ใช้รีโมท\"",
- "You created {file}" : "คุณได้สร้าง {file}",
- "You created an encrypted file in {file}" : "คุณได้สร้างไฟล์ที่เข้ารหัสใน {file}",
- "{user} created {file}" : "{user} ได้สร้าง {file}",
- "{user} created an encrypted file in {file}" : "{user} ได้สร้างไฟล์ที่เข้ารหัสใน {file}",
- "{file} was created in a public folder" : "{file} ถูกสร้างขึ้นในโฟลเดอร์สาธารณะ",
- "You changed {file}" : "คุณได้เปลี่ยนแปลง {file}",
- "You changed an encrypted file in {file}" : "คุณได้เปลี่ยนแปลงไฟล์ที่เข้ารหัสใน {file}",
- "{user} changed {file}" : "{user} ได้เปลี่ยนแปลง {file}",
- "{user} changed an encrypted file in {file}" : "{user} ได้เปลี่ยนแปลงไฟล์ที่เข้ารหัสใน {file}",
- "You deleted {file}" : "คุณได้ลบ {file}",
- "You deleted an encrypted file in {file}" : "คุณได้ลบไฟล์ที่เข้ารหัสใน {file}",
- "{user} deleted {file}" : "{user} ได้ลบ {file}",
- "{user} deleted an encrypted file in {file}" : "{user} ได้ลบไฟล์ที่เข้ารหัสใน {file}",
- "You restored {file}" : "คุณได้กู้คืน {file}",
- "{user} restored {file}" : "{user} ได้กู้คืน {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "คุณได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile} (ซ่อนอยู่)",
- "You renamed {oldfile} (hidden) to {newfile}" : "คุณได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "คุณได้เปลี่ยนชื่อ {oldfile} เป็น {newfile} (ซ่อนอยู่)",
- "You renamed {oldfile} to {newfile}" : "คุณได้เปลี่ยนชื่อ {oldfile} เป็น {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile} (ซ่อนอยู่)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ได้เปลี่ยนชื่อ {oldfile} (ซ่อนอยู่) เป็น {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ได้เปลี่ยนชื่อ {oldfile} เป็น {newfile} (ซ่อนอยู่)",
- "{user} renamed {oldfile} to {newfile}" : "{user} ได้เปลี่ยนชื่อ {oldfile} เป็น {newfile}",
- "You moved {oldfile} to {newfile}" : "คุณได้ย้าย {oldfile} ไปยัง {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} ได้ย้าย {oldfile} ไปยัง {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "มีไฟล์ที่ถูกเพิ่มเข้าหรือเอาออกจาก<strong>รายการโปรด</strong>ของคุณ",
- "A file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ที่มีการ<strong>เปลี่ยนแปลง</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "มีไฟล์หรือโฟลเดอร์ในรายการโปรดที่มีการ<strong>เปลี่ยนแปลง</strong>",
- "All files" : "ไฟล์ทั้งหมด",
- "Unlimited" : "ไม่จำกัด",
- "Upload (max. %s)" : "อัปโหลด (สูงสุด %s)",
- "Accept" : "ยอมรับ",
- "Reject" : "ปฏิเสธ",
- "Incoming ownership transfer from {user}" : "คำขอการโอนย้ายความเป็นเจ้าของจาก {user}",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "คุณต้องการยอมรับ {path} หรือไม่?\n\nหมายเหตุ: หลังยอมรับแล้ว กระบวนการโอนย้ายอาจใช้เวลาสูงสุด 1 ชั่วโมง",
- "Ownership transfer failed" : "การโอนย้ายความเป็นเจ้าของล้มเหลว",
- "Your ownership transfer of {path} to {user} failed." : "การโอนย้ายความเป็นเจ้าของของคุณของ {path} ไปยัง {user} ล้มเหลว",
- "The ownership transfer of {path} from {user} failed." : "การโอนย้ายความเป็นเจ้าของของ {path} จาก {user} ล้มเหลว",
- "Ownership transfer done" : "การโอนย้ายความเป็นเจ้าของสำเร็จ",
- "Your ownership transfer of {path} to {user} has completed." : "การโอนย้ายความเป็นเจ้าของของคุณของ {path} ไปยัง {user} สำเร็จแล้ว",
- "The ownership transfer of {path} from {user} has completed." : "การโอนย้ายความเป็นเจ้าของของ {path} จาก {user} สำเร็จแล้ว",
- "in %s" : "ใน %s",
- "File Management" : "การจัดการไฟล์",
- "Transfer ownership of a file or folder" : "โอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์",
- "Choose file or folder to transfer" : "เลือกไฟล์หรือโฟลเดอร์ที่จะโอนย้าย",
- "Change" : "เปลี่ยนแปลง",
- "New owner" : "เจ้าของใหม่",
- "Search users" : "ค้นหาผู้ใช้",
- "Choose a file or folder to transfer" : "เลือกไฟล์หรือโฟลเดอร์ที่จะโอนย้าย",
- "Transfer" : "โอนย้าย",
- "Transfer {path} to {userid}" : "โอนย้าย {path} ไปยัง {userid}",
- "Invalid path selected" : "เลือกเส้นทางไม่ถูกต้อง",
- "Ownership transfer request sent" : "ส่งคำขอโอนย้ายความเป็นเจ้าของแล้ว",
- "Cannot transfer ownership of a file or folder you don't own" : "ไม่สามารถโอนย้ายความเป็นเจ้าของไฟล์หรือโฟลเดอร์ที่คุณไม่ได้เป็นเจ้าของ",
- "Tags" : "แท็ก",
- "Unable to change the favourite state of the file" : "ไม่สามารถเปลี่ยนสถานะรายการโปรดของไฟล์",
- "Error while loading the file data" : "ข้อผิดพลาดขณะโหลดข้อมูลไฟล์",
- "Pick a template for {name}" : "เลือกเทมเพลตสำหรับ {name}",
- "Cancel" : "ยกเลิก",
- "Create" : "สร้าง",
- "Create a new file with the selected template" : "สร้างไฟล์ใหม่ด้วยเทมเพลตที่เลือก",
- "Creating file" : "กำลังสร้างไฟล์",
- "Blank" : "ว่าง",
- "Unable to create new file from template" : "ไม่สามารถสร้างไฟล์ใหม่จากเทมเพลต",
- "Set up templates folder" : "ตั้งค่าโฟลเดอร์เทมเพลต",
- "Templates" : "เทมเพลต",
- "Unable to initialize the templates directory" : "ไม่สามารถเตรียมไดเรกทอรีเทมเพลต",
- "%s used" : "ใช้ไป %s",
- "%s%% of %s used" : "ใช้ไป %s%% จาก %s",
- "%1$s of %2$s used" : "ใช้ไป %1$s จาก %2$s",
- "Settings" : "การตั้งค่า",
- "Show hidden files" : "แสดงไฟล์ที่ซ่อนอยู่",
- "Crop image previews" : "ครอปตัดรูปภาพตัวอย่าง",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อเข้าถึงไฟล์ของคุณผ่าน WebDAV",
- "Toggle %1$s sublist" : "สลับรายการย่อย %1$s",
- "Toggle grid view" : "สลับมุมมองตาราง",
- "No files in here" : "ไม่มีไฟล์ที่นี่",
- "Upload some content or sync with your devices!" : "ลองอัปโหลดเนื้อหาหรือซิงค์กับอุปกรณ์อื่นของคุณ",
- "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
- "Select all" : "เลือกทั้งหมด",
- "Upload too large" : "ไฟล์ที่อัปโหลดมีขนาดใหญ่เกินไป",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัปโหลดมีขนาดเกินกว่าขนาดสูงสุดที่อัปโหลดได้สำหรับเซิร์ฟเวอร์นี้",
- "No favorites yet" : "ยังไม่มีรายการโปรด",
- "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณระบุเป็นรายการโปรดจะแสดงที่นี่",
- "Deleted files" : "ไฟล์ที่ถูกลบ",
- "Shares" : "การแชร์",
- "Shared with others" : "แชร์กับผู้อื่น",
- "Shared with you" : "แชร์กับคุณ",
- "Shared by link" : "แชร์โดยลิงก์",
- "Deleted shares" : "การแชร์ที่ถูกลบ",
- "Pending shares" : "การแชร์ที่กำลังดำเนินการ",
- "Text file" : "ไฟล์ข้อความ",
- "New text file.txt" : "ไฟล์ข้อความใหม่.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของ {owner} เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "โฟลเดอร์กลุ่ม \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลภายนอก \"{mountPoint}\" เต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "Your storage is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัปเดตหรือซิงค์ไฟล์ได้อีก!",
- "_matches '{filter}'_::_match '{filter}'_" : ["ตรงกับ '{filter}'"]
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/tl_PH.js b/apps/files/l10n/tl_PH.js
deleted file mode 100644
index c50be1aa479..00000000000
--- a/apps/files/l10n/tl_PH.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/tl_PH.json b/apps/files/l10n/tl_PH.json
deleted file mode 100644
index 210ac153bab..00000000000
--- a/apps/files/l10n/tl_PH.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 2862c1767a1..33cbd8a58eb 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
- "Storage invalid" : "Depolama geçersiz",
- "Unknown error" : "Bilinmeyen sorun",
- "File could not be found" : "Dosya bulunamadı",
- "Move or copy" : "Taşı ya da kopyala",
- "Download" : "İndir",
- "Delete" : "Sil",
- "Home" : "Giriş",
- "Close" : "Kapat",
- "Favorites" : "Sık kullanılanlar",
- "Could not create folder \"{dir}\"" : "\"{dir}\" klasörü oluşturulamadı",
- "This will stop your current uploads." : "Bu işlem geçerli yüklemeleri durduracak.",
- "Upload cancelled." : "Yükleme iptal edildi.",
- "Processing files …" : "Dosyalar işleniyor …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir klasör ya da 0 bayt boyutunda olduğundan yüklenemedi",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterli boş alan yok. Yüklemek istediğiniz boyut {size1} ancak yalnız {size2} boş alan var",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" hedef klasörü artık yok",
- "Not enough free space" : "Yeterli boş alan yok",
- "An unknown error has occurred" : "Bilinmeyen bir sorun çıktı",
- "Uploading …" : "Yükleniyor …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Bu ögenin yüklenmesi desteklenmiyor",
- "Target folder does not exist any more" : "Hedef klasör artık yok",
- "Operation is blocked by access control" : "İşlem erişim denetimi tarafından engellendi",
- "Error when assembling chunks, status code {status}" : "Kümeler oluşturulurken sorun çıktı, durum kodu {status}",
- "Actions" : "İşlemler",
- "Rename" : "Yeniden adlandır",
- "Copy" : "Kopyala",
- "Choose target folder" : "Hedef klasörü seçin",
- "Open" : "Aç",
- "Delete file" : "Dosyayı sil",
- "Delete folder" : "Klasörü sil",
- "Disconnect storage" : "Depolama bağlantısını kes",
- "Leave this share" : "Bu paylaşımdan ayrıl",
- "Could not load info for file \"{file}\"" : "\"{file}\" dosyasının bilgileri alınamadı",
- "Files" : "Dosyalar",
- "Details" : "Ayrıntılar",
- "Please select tag(s) to add to the selection" : "Seçime eklemek için etiketleri seçin",
- "Apply tag(s) to selection" : "Etiketleri seçime uygula",
- "Select" : "Seçin",
- "Pending" : "Bekliyor",
- "Unable to determine date" : "Tarih belirlenemedi",
- "This operation is forbidden" : "Bu işleme izin verilmiyor",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
- "Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
- "Could not move \"{file}\"" : "\"{file}\" taşınamadı",
- "copy" : "kopya",
- "Could not copy \"{file}\", target exists" : "\"{file}\" dosyası kopyalanamadı, hedef zaten var",
- "Could not copy \"{file}\"" : "\"{file}\" kopyalanamadı",
- "Copied {origin} inside {destination}" : "{origin} dosyası, {destination} içine kopyalandı",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ve diğer {nbfiles} dosya, {destination} içine kopyalandı",
- "{newName} already exists" : "{newName} zaten var",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" yeniden adlandırılamadı, artık yok",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" adı \"{dir}\" klasöründe zaten var. Lütfen farklı bir ad seçin.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" yeniden adlandırılamadı",
- "Could not create file \"{file}\"" : "\"{file}\" dosyası oluşturulamadı",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" dosyası zaten var olduğundan oluşturulamadı",
- "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" klasörü zaten var olduğundan oluşturulamadı",
- "Could not fetch file details \"{file}\"" : "\"{file}\" dosyasının ayrıntıları alınamadı",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" dosyası silinirken sorun çıktı.",
- "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} için diğer klasörlerde herhangi bir arama sonucu yok",
- "Enter more than two characters to search in other folders" : "Diğer klasörlerde aramak için iki karakterden fazla yazın",
- "Name" : "Ad",
- "Size" : "Boyut",
- "Modified" : "Değiştirilme",
- "_%n folder_::_%n folders_" : ["%n klasör","%n klasör"],
- "_%n file_::_%n files_" : ["%n dosya","%n dosya"],
- "{dirs} and {files}" : "{dirs} ve {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"],
- "You don’t have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok",
- "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"],
- "New" : "Yeni",
- "Select file range" : "Dosya aralığını seçin",
- "{used} of {quota} used" : "{used} / {quota} kullanılmış",
- "{used} used" : "{used} kullanılmış",
- "\"{name}\" is an invalid file name." : "\"{name}\" geçersiz bir dosya adı.",
- "File name cannot be empty." : "Dosya adı boş olamaz.",
- "\"/\" is not allowed inside a file name." : "Dosya adında \"/\" kullanılamaz.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" dosya türüne izin verilmiyor",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} boş depolama alanı bitmek üzere ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" grup klasöründeki boş alan bitmek üzere ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" dış depolamasındaki boş alan bitmek üzere ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Boş depolama alanınız bitmek üzere ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" ile eşleşiyor","\"{filter}\" ile eşleşiyor"],
- "View in folder" : "Klasörde görüntüle",
- "Copied!" : "Kopyalandı!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Doğrudan bağlantıyı kopyala (yalnız bu dosya ya da klasöre erişim izni olan kullanıcılar için)",
- "Path" : "Yol",
- "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
- "Favorited" : "Sık kullanılanlara eklendi",
- "Favorite" : "Sık kullanılanlara ekle",
- "You can only favorite a single file or folder at a time" : "Aynı anda yalnız bir dosya ya da bir klasör sık kullanılanlara eklenebilir",
- "New folder" : "Yeni klasör",
- "Upload file" : "Dosya yükle",
- "Recent" : "Son",
- "Not favorited" : "Sık kullanılanlarda değil",
- "Remove from favorites" : "Sık kullanılanlardan kaldır",
- "Add to favorites" : "Sık kullanılanlara ekle",
- "An error occurred while trying to update the tags" : "Etiketler güncellenirken bir sorun çıktı",
"Added to favorites" : "Sık kullanılanlara eklendi",
"Removed from favorites" : "Sık kullanılanlardan çıkarıldı",
"You added {file} to your favorites" : "{file} dosyasını sık kullandıklarınıza eklediniz",
"You removed {file} from your favorites" : "{file} dosyasını sık kullandıklarınızdan çıkardınız",
+ "Favorites" : "Sık kullanılanlar",
"File changes" : "Dosya değişikleri",
"Created by {user}" : "{user} tarafından eklendi",
"Changed by {user}" : "{user} tarafından değiştirildi",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "{user} tarafından geri yüklendi",
"Renamed by {user}" : "{user} tarafından adı değiştirildi",
"Moved by {user}" : "{user} tarafından taşındı",
- "\"remote user\"" : "\"uzak kullanıcı\"",
+ "\"remote account\"" : "\"uzak hesap\"",
"You created {file}" : "{file} dosyasını eklediniz",
"You created an encrypted file in {file}" : "{file} içinde şifrelenmiş bir dosya oluşturdunuz",
"{user} created {file}" : "{user}, {file} dosyasını ekledi",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "{oldfile} dosyasını {newfile} klasörüne taşıdınız",
"{user} moved {oldfile} to {newfile}" : "{user}, {oldfile} dosyasının {newfile} dosyasına taşıdı",
"A file has been added to or removed from your <strong>favorites</strong>" : "<strong>Sık kullandıklarınıza</strong> bir dosya eklendi ya da silindi",
- "A file or folder has been <strong>changed</strong>" : "Bir dosya ya da klasör <strong>değiştirildi</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Sık kullanılan bir dosya ya da klasör <strong>değiştirildi</strong>",
- "All files" : "Tüm dosyalar",
- "Unlimited" : "Sınırsız",
- "Upload (max. %s)" : "Yükle (en büyük: %s)",
+ "Files" : "Dosyalar",
+ "A file or folder has been <strong>changed</strong>" : "Bir dosya ya da klasör <strong>değiştirildiğinde</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Sık kullanılan bir dosya ya da klasör <strong>değiştirildiğinde</strong>",
+ "Failed to authorize" : "İzin verilemedi",
+ "Invalid folder path" : "Klasör yolu geçersiz",
+ "Folder not found" : "Klasör bulunamadı",
+ "The file cannot be found" : "Dosya bulunamadı",
+ "The destination path does not exist: %1$s" : "Hedef yolu bulunamadı: %1$s",
+ "You do not have permission to create a file at the specified location" : "Belirtilen konumda bir dosya oluşturma izniniz yok",
+ "The file could not be converted." : "Dosya dönüştürülemedi.",
+ "Could not get relative path to converted file" : "Dönüştürülen dosyanın yolu göreli yolu alınamadı",
+ "Favorite files" : "Sık kullanılan dosyalar",
+ "No favorites" : "Sık kullanılan bir öge yok",
+ "More favorites" : "Diğer sık kullanılanlar",
"Accept" : "Kabul et",
"Reject" : "Reddet",
"Incoming ownership transfer from {user}" : "{user} kullanıcısından gelen sahiplik aktarımı ",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} yolunu onaylamak istiyor musunuz?\n\nNot: Onay verdikten sonra aktarım işleminin tamamlanması 1 saat kadar sürebilir.",
+ "Ownership transfer denied" : "Sahiplik aktarımı reddedildi",
+ "Your ownership transfer of {path} was denied by {user}." : "{path} sahipliğini aktarma işleminiz {user} tarafından reddedildi.",
"Ownership transfer failed" : "Sahiplik aktarılamadı",
"Your ownership transfer of {path} to {user} failed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarılamadı.",
"The ownership transfer of {path} from {user} failed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarılamadı.",
@@ -159,62 +67,412 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarıldı.",
"The ownership transfer of {path} from {user} has completed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarıldı.",
"in %s" : "%s içinde",
+ "Transferred from %1$s on %2$s" : "%1$s üzerinden %2$s zamanında aktarıldı",
+ "Files compatibility" : "Dosyalar uygulaması uyumluluğu",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Dosyaların tüm istemcilerle eşitlenebilmesi için dosya adlarının kısıtlanmasını sağlar. Varsayılan olarak POSIX içinde geçerli olan tüm dosya adlarına (Linux veya macOS) izin verilir.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows uyumlu dosya adları açıldıktan sonra, var olan dosyalar artık değiştirilemez. Ancak sahipleri tarafından geçerli yeni adlarla yeniden adlandırılabilir.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Bu ayarı açtıktan sonra dosyaları otomatik olarak da aktarılabilir. Lütfen occ komutuyla ilgili belgelere bakın.",
+ "Enforce Windows compatibility" : "Windows uyumluluğu zorunlu kılınsın",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ayrılmış adlar veya özel karakterler kullanmak gibi Windows sistemlerinde geçerli olmayan dosya adlarını engeller. Ancak büyük/küçük harf duyarlılığı uyumluluğunu zorunlu kılmaz.",
"File Management" : "Dosya yönetimi",
- "Transfer ownership of a file or folder" : "Bir dosya ya da klasörün sahipliğini aktar",
- "Choose file or folder to transfer" : "Sahipliği aktarılacak dosya ya da klasörü seçin",
- "Change" : "Değiştir",
- "New owner" : "Yeni sahip",
- "Search users" : "Kullanıcı arama",
+ "Home" : "Giriş",
+ "Target folder does not exist any more" : "Hedef klasör artık yok",
+ "Reload current directory" : "Geçerli klasörü yeniden yükle",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" klasörüne git",
+ "Current directory path" : "Geçerli klasör yolu",
+ "Your have used your space quota and cannot upload files anymore" : "Depolama alanınızın tümünü kullandığınız için başka dosya yüklemezsiniz",
+ "You do not have permission to upload or create files here." : "Buraya dosya yükleme ya da ekleme izniniz yok.",
+ "Drag and drop files here to upload" : "Yüklemek istediğiniz dosyaları sürükleyip buraya bırakın",
+ "Favorite" : "Sık kullanılanlara ekle",
+ "Back" : "Geri",
+ "Toggle selection for file \"{displayName}\"" : "\"{displayName}\" dosyasını seç/bırak",
+ "Toggle selection for folder \"{displayName}\"" : "\"{displayName}\" klasörünü seç/bırak",
+ "File is loading" : "Dosya yükleniyor",
+ "Folder is loading" : "Klasör yükleniyor",
+ "Filename" : "Dosya adı",
+ "Folder name" : "Klasör adı",
+ "This node is unavailable" : "Bu düğüm kullanılamıyor",
+ "Another entry with the same name already exists." : "Aynı adlı bir kayıt zaten var.",
+ "Invalid filename." : "Dosya adı geçersiz.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" adı \"{newName}\" olarak değiştirildi",
+ "Rename file" : "Dosyayı yeniden adlandır",
+ "Folder" : "Klasör",
+ "Unknown file type" : "Dosya türü bilinmiyor",
+ "{ext} image" : "{ext} görsel",
+ "{ext} video" : "{ext} görüntü",
+ "{ext} audio" : "{ext} ses",
+ "{ext} text" : "{ext} metin",
+ "Pending" : "Bekliyor",
+ "Unknown date" : "Tarih bilinmiyor",
+ "Clear filter" : "Süzgeci temizle",
+ "Modified" : "Değiştirilme",
+ "Search everywhere" : "Her yerde ara",
+ "Type" : "Tür",
+ "Active filters" : "Etkin süzgeçler",
+ "Remove filter" : "Süzgeci kaldır",
+ "Total rows summary" : "Toplam satır özeti",
+ "Toggle selection for all files and folders" : "Tüm dosyaları ve klasörleri seç/bırak",
+ "Name" : "Ad",
+ "File type" : "Dosya türü",
+ "Size" : "Boyut",
+ "Actions" : "İşlemler",
+ "(selected)" : "(seçilmiş)",
+ "List of files and folders." : "Dosya ve klasörlerin listesi.",
+ "You have used your space quota and cannot upload files anymore." : "Depolama alanınızın tümünü kullandığınız için başka dosya yüklemezsiniz.",
+ "Column headers with buttons are sortable." : "Düğmeler olan sütunlar sıralanabilir.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
+ "File not found" : "Dosya bulunamadı",
+ "_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
+ "Search scope options" : "Arama kapsamı seçenekleri",
+ "{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
+ "{used} of {quota} used" : "{used} / {quota} kullanılmış",
+ "{relative}% used" : "%{relative} kullanılmış",
+ "Could not refresh storage stats" : "Depolama istatistikleri yenilenemedi",
+ "Your storage is full, files can not be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Storage information" : "Depolama alanı bilgileri",
+ "Storage quota" : "Depolama alanı kotası",
+ "New folder" : "Yeni klasör",
+ "Create new folder" : "Klasör ekle",
+ "This name is already in use." : "Bu ad zaten kullanılıyor.",
+ "Create" : "Ekle",
+ "Files starting with a dot are hidden by default" : "Bir nokta ile başlayan dosyalar varsayılan olarak gizlidir",
+ "Fill template fields" : "Kalıp alanlarını doldur",
+ "Submitting fields …" : "Alanlar gönderiliyor…",
+ "Submit" : "Gönder",
"Choose a file or folder to transfer" : "Sahipliği aktarılacak bir dosya ya da klasör seçin",
"Transfer" : "Sahipliği aktar",
"Transfer {path} to {userid}" : "{path} yolunun sahipliğini {userid} kullanıcısına aktar",
"Invalid path selected" : "Seçilen yol geçersiz",
+ "Unknown error" : "Bilinmeyen sorun",
"Ownership transfer request sent" : "Sahiplik aktarımı isteği gönderildi",
- "Cannot transfer ownership of a file or folder you don't own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız",
- "Tags" : "Etiketler",
- "Unable to change the favourite state of the file" : "Dosyanın sık kullanılan durumu değiştirilemedi",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız",
+ "Transfer ownership of a file or folder" : "Bir dosya ya da klasörün sahipliğini aktarabilirsiniz",
+ "Choose file or folder to transfer" : "Sahipliği aktarılacak dosya ya da klasörü seçin",
+ "Change" : "Değiştir",
+ "New owner" : "Yeni sahip",
+ "Keep {old}" : "{old} kalsın",
+ "Keep without extension" : "Uzantı olmadan kalsın",
+ "Use {new}" : "{new} kullanılsın",
+ "Remove extension" : "Uzantıyı kaldır",
+ "Change file extension" : "Dosya uzantısını değiştir",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "\"{old}\" dosya uzantısının \"{new}\" olarak değiştirilmesi dosyayı okunamaz yapabilir.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "\"{old}\" dosya uzantısının kaldırılması dosyayı okunamaz yapabilir.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "\"{new}\" dosya uzantısının eklenmesi dosyayı okunamaz yapabilir.",
+ "Do not show this dialog again." : "Bu ileti bir daha görüntülenmesin.",
+ "Select file or folder to link to" : "Bağlantı verilecek dosya ya da klasörü seçin",
+ "Choose {file}" : "{file} seçin",
+ "Share" : "Paylaş",
+ "Shared by link" : "Bağlantı ile paylaşılmış",
+ "Shared" : "Paylaşılan",
+ "Switch to list view" : "Liste görünümüne geç",
+ "Switch to grid view" : "Tablo görünümüne geç",
+ "The file could not be found" : "Dosya bulunamadı",
+ "Upload was cancelled by user" : "Kullanıcı yüklemeyi iptal etti",
+ "Not enough free space" : "Yeterli boş alan yok",
+ "Operation is blocked by access control" : "İşlem erişim denetimi tarafından engellendi",
+ "Error during upload: {message}" : "Yükleme sırasında sorun çıktı: {message}",
+ "Error during upload, status code {status}" : "Yüklenirken sorun çıktı, durum kodu {status}",
+ "Unknown error during upload" : "Yükleme sırasında bilinmeyen bir sorun çıktı",
+ "Loading current folder" : "Geçerli klasör yükleniyor",
+ "Retry" : "Yeniden dene",
+ "No files in here" : "Burada herhangi bir dosya yok",
+ "Upload some content or sync with your devices!" : "Bir şeyler yükleyin ya da aygıtlarınızla eşitleyin!",
+ "Go back" : "Geri dön",
+ "Views" : "Görünümler",
+ "Files settings" : "Dosyalar ayarları",
+ "Your files" : "Dosyalarınız",
+ "Open in files" : "Dosyalar uygulamasında aç",
+ "File cannot be accessed" : "Dosyaya erişilemedi",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Dosya bulunamadı ya da görüntüleme izniniz olmayabilir. Gönderenden paylaşmasını isteyin",
+ "No search results for “{query}”" : "“{query}” için bir arama sonucu bulunamadı",
+ "Search for files" : "Dosya ara",
+ "Clipboard is not available" : "Pano kullanılamıyor",
+ "General" : "Genel",
+ "Default view" : "Varsayılan görünüm",
+ "All files" : "Tüm dosyalar",
+ "Personal files" : "Kişisel dosyalar",
+ "Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
+ "Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
+ "Appearance" : "Görünüm",
+ "Show hidden files" : "Gizli dosyaları görüntüle",
+ "Show file type column" : "Dosya türü sütunu görüntülensin",
+ "Crop image previews" : "Görsel ön izlemeleri kırpılsın",
+ "Additional settings" : "Ek ayarlar",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV adresi",
+ "Copy" : "Kopyala",
+ "Warnings" : "Uyarılar",
+ "Keyboard shortcuts" : "Kısayol tuşları",
+ "File actions" : "Dosya işlemleri",
+ "Rename" : "Yeniden adlandır",
+ "Delete" : "Sil",
+ "Manage tags" : "Etiket yönetimi",
+ "Selection" : "Seçim",
+ "Select all files" : "Tüm dosyaları seçer",
+ "Deselect all" : "Tümünü bırak",
+ "Navigation" : "Gezinme",
+ "View" : "Görüntüle",
+ "Toggle grid view" : "Tablo görünümünü aç/kapat",
+ "Show those shortcuts" : "Bu kısayolları görüntüler",
+ "You" : "Siz",
+ "Shared multiple times with different people" : "Farklı kişilerle birkaç kez paylaşılmış",
+ "Unable to change the favorite state of the file" : "Dosyanın sık kullanılan durumu değiştirilemedi",
"Error while loading the file data" : "Dosya verileri yüklenirken sorun çıktı",
+ "Owner" : "Sahibi",
+ "Remove from favorites" : "Sık kullanılanlardan kaldır",
+ "Add to favorites" : "Sık kullanılanlara ekle",
+ "Tags" : "Etiketler",
+ "Blank" : "Boş",
+ "Unable to create new file from template" : "Kalıptan yeni dosya eklenemedi",
"Pick a template for {name}" : "{name} için bir kalıp seçin",
- "Cancel" : "İptal",
- "Create" : "Ekle",
"Create a new file with the selected template" : "Seçilmiş kalıp ile yeni bir dosya ekle",
"Creating file" : "Dosya ekleniyor",
- "Blank" : "Boş",
- "Unable to create new file from template" : "Kalıptan yeni dosya eklenemedi",
- "Set up templates folder" : "Kalıp klasörünü ayarlayın",
- "Templates" : "Kalıplar",
+ "Save as {displayName}" : "{displayName} olarak kaydet",
+ "Save as …" : "Farklı kaydet…",
+ "Converting files …" : "Dosyalar dönüştürülüyor…",
+ "Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
+ "All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
+ "One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Bir dosya dönüştürülemedi","%n dosya dönüştürülemedi"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Bir dosya dönüştürüldü","%n dosya dönüştürüldü"],
+ "Files successfully converted" : "Dosyalar dönüştürüldü",
+ "Failed to convert files" : "Dosyalar dönüştürülemedi",
+ "Converting file …" : "Dosya dönüştürülüyor…",
+ "File successfully converted" : "Dosya dönüştürüldü",
+ "Failed to convert file: {message}" : "Dosya dönüştürülemedi: {message}",
+ "Failed to convert file" : "Dosya dönüştürülemedi",
+ "Leave this share" : "Bu paylaşımdan ayrıl",
+ "Leave these shares" : "Bu paylaşımlardan ayrıl",
+ "Disconnect storage" : "Depolama bağlantısını kes",
+ "Disconnect storages" : "Depolama alanlarının bağlantısını kes",
+ "Delete permanently" : "Kalıcı olarak sil",
+ "Delete and unshare" : "Sil ve paylaşımdan kaldır",
+ "Delete file" : "Dosyayı sil",
+ "Delete files" : "Dosyaları sil",
+ "Delete folder" : "Klasörü sil",
+ "Delete folders" : "Klasörleri sil",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count} ögeyi kalıcı olarak silmek üzeresiniz","{count} ögeyi kalıcı olarak silmek üzeresiniz"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count} ögeyi silmek üzeresiniz","{count} ögeyi silmek üzeresiniz"],
+ "Confirm deletion" : "Silmeyi onaylayın",
+ "Cancel" : "İptal",
+ "Download" : "İndir",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" hedefine taşınıyor…",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" hedefine kopyalanıyor…",
+ "Destination is not a folder" : "Hedef bir klasör değil",
+ "This file/folder is already in that directory" : "Dosya ya da klasör bu klasörde zaten var",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Bir dosyayı ya da klasörü kendi üzerine veya kendisinin alt klasörüne taşıyamazsınız",
+ "(copy)" : "(kopya)",
+ "(copy %n)" : "(%n kopyası)",
+ "A file or folder with that name already exists in this folder" : "Bu klasörde aynı adlı bir dosya ya da klasör zaten var",
+ "The files are locked" : "Dosyalar kilitli",
+ "The file does not exist anymore" : "Dosya artık yok",
+ "Choose destination" : "Hedefi seçin",
+ "Copy to {target}" : "{target} içine kopyala",
+ "Move to {target}" : "{target} içine taşı",
+ "Move" : "Taşı",
+ "Move or copy operation failed" : "Taşıma ya da kopyalama yapılamadı",
+ "Move or copy" : "Taşı ya da kopyala",
+ "Open folder {displayName}" : "{displayName} klasörünü aç",
+ "Open in Files" : "Dosyalar uygulamasında aç",
+ "Open locally" : "Yerel olarak aç",
+ "Failed to redirect to client" : "İstemciye yönlendirilemedi",
+ "Open file locally" : "Dosyayı yerel olarak aç",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Dosya artık aygıtınızda açılmalıdır. Açılmazsa lütfen bilgisayar uygulamasının kurulu olduğundan emin olun.",
+ "Retry and close" : "Yeniden deneyip kapat",
+ "Open online" : "Çevrim içi aç",
+ "Details" : "Ayrıntılar",
+ "View in folder" : "Klasörde görüntüle",
+ "Today" : "Bugün",
+ "Last 7 days" : "Önceki 7 gün",
+ "Last 30 days" : "Önceki 30 gün",
+ "This year ({year})" : "Bu yıl ({year})",
+ "Last year ({year})" : "Önceki yıl ({year})",
+ "Documents" : "Belgeler",
+ "Spreadsheets" : "Çalışma sayfaları",
+ "Presentations" : "Sunumlar",
+ "PDFs" : "PDF dosyaları",
+ "Folders" : "Klasörler",
+ "Audio" : "Ses",
+ "Images" : "Görseller",
+ "Videos" : "Görüntüler",
+ "Created new folder \"{name}\"" : "\"{name}\" yeni klasörü oluşturuldu",
"Unable to initialize the templates directory" : "Kalıp klasörü hazırlanamadı",
- "%s used" : "%s kullanılıyor",
- "%s%% of %s used" : "%s%%/%s kullanılmış",
- "%1$s of %2$s used" : "%1$s / %2$s kullanıldı",
- "Settings" : "Ayarlar",
- "Show hidden files" : "Gizli dosyaları görüntüle",
- "Crop image previews" : "Görsel ön izlemeleri kırpılsın",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
- "Toggle %1$s sublist" : "%1$s alt listesini aç/kapat",
- "Toggle grid view" : "Tablo görünümünü değiştir",
- "No files in here" : "Burada herhangi bir dosya yok",
- "Upload some content or sync with your devices!" : "Bir şeyler yükleyin ya da aygıtlarınızla eşitleyin!",
+ "Create templates folder" : "Kalıplar klasörü oluştur",
+ "Templates" : "Kalıplar",
+ "New template folder" : "Yeni kalıp klasörü",
+ "In folder" : "Klasörde",
+ "Search in folder: {folder}" : "Şu klasörde ara: {folder}",
+ "One of the dropped files could not be processed" : "Bırakılan dosyalardan biri işlenemedi",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Tarayıcınız dosya sistemi API uygulamasını desteklemiyor. Klasörler yüklenemeyecek",
+ "No files to upload" : "Yüklenecek bir dosya yok",
+ "Unable to create the directory {directory}" : "{directory} klasörü oluşturulamadı",
+ "Some files could not be uploaded" : "Bazı dosyalar yüklenemedi",
+ "Files uploaded successfully" : "Dosyalar yüklendi",
+ "No files to process" : "İşlenecek bir dosya yok",
+ "Some files could not be copied" : "Bazı dosyalar kopyalanamadı",
+ "Some files could not be moved" : "Bazı dosyalar taşınamadı",
+ "Files copied successfully" : "Dosyalar kopyalandı",
+ "Files moved successfully" : "Dosyalar taşındı",
+ "Conflicts resolution skipped" : "Çakışma çözümleme atlandı",
+ "Upload cancelled" : "Yükleme iptal edildi",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" adı artık olmadığından değiştirilemedi. ",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" adı \"{dir}\" klasöründe zaten kullanılmış. Lütfen başka bir ad seçin.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" adı değiştirilemedi",
+ "This operation is forbidden" : "Bu işleme izin verilmiyor",
+ "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
+ "Unexpected error: {error}" : "Beklenmeyen bir sorun çıktı: {error}",
+ "_%n file_::_%n files_" : ["%n dosya","%n dosya"],
+ "_%n folder_::_%n folders_" : ["%n klasör","%n klasör"],
+ "_%n hidden_::_%n hidden_" : ["%n gizli","%n gizli"],
+ "Filename must not be empty." : "Dosya adı boş olamaz.",
+ "\"{char}\" is not allowed inside a filename." : "Dosya adlarında \"{char}\" kullanılamaz.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ayrılmış bir ad olduğundan dosya adlarında kullanılamaz.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" dosya uzantısına izin verilmiyor.",
+ "Filenames must not end with \"{extension}\"." : "Dosya adları \"{extension}\" ile bitemez.",
+ "List of favorite files and folders." : "Sık kullanılan dosya ve klasör listesi.",
+ "No favorites yet" : "Henüz sık kullanılan bir öge yok",
+ "Files and folders you mark as favorite will show up here" : "Sık kullanılanlara eklediğiniz dosya ve klasörler burada görüntülenir",
+ "List of your files and folders." : "Dosya ve klasörlerinizin listesi",
+ "List of your files and folders that are not shared." : "Paylaşılmayan dosya ve klasörlerinizin listesi.",
+ "No personal files found" : "Herhangi bir kişisel dosya bulunamadı",
+ "Files that are not shared will show up here." : "Paylaşımayan dosyalar burada görüntülenir.",
+ "Recent" : "Son",
+ "List of recently modified files and folders." : "Son değiştirilen dosya ve klasörlerin listesi.",
+ "No recently modified files" : "Yakınlarda değiştirilmiş bir dosya yok",
+ "Files and folders you recently modified will show up here." : "Son zamanlarda değiştirdiğiniz dosya ve klasörler burada görüntülenir.",
+ "Search" : "Ara",
+ "Search results within your files." : "Dosyalarınızda arama sonuçları.",
"No entries found in this folder" : "Bu klasörde herhangi bir kayıt bulunamadı",
"Select all" : "Tümünü seç",
"Upload too large" : "Yükleme boyutu çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucuya yüklenmesine izin verilen en büyük dosya boyutunu aşıyor.",
- "No favorites yet" : "Henüz sık kullanılan bir öge yok",
- "Files and folders you mark as favorite will show up here" : "Sık kullanılanlara eklediğiniz dosya ve klasörler burada görüntülenir",
- "Deleted files" : "Silinmiş dosyalar",
- "Shares" : "Paylaşımlar",
- "Shared with others" : "Başkalarıyla paylaşılan",
- "Shared with you" : "Sizinle paylaşılan",
- "Shared by link" : "Bağlantı ile paylaşılmış",
- "Deleted shares" : "Silinmiş paylaşımlar",
- "Pending shares" : "Bekleyen paylaşımlar",
+ "File could not be found" : "Dosya bulunamadı",
+ "Show list view" : "Liste görünümüne geç",
+ "Show grid view" : "Tablo görünümüne geç",
+ "Close" : "Kapat",
+ "Could not create folder \"{dir}\"" : "\"{dir}\" klasörü oluşturulamadı",
+ "This will stop your current uploads." : "Bu işlem geçerli yüklemeleri durduracak.",
+ "Upload cancelled." : "Yükleme iptal edildi.",
+ "Processing files …" : "Dosyalar işleniyor …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir klasör ya da 0 bayt boyutunda olduğundan yüklenemedi",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterli boş alan yok. Yüklemek istediğiniz boyut {size1} ancak yalnızca {size2} boş alan var",
+ "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" hedef klasörü artık yok",
+ "An unknown error has occurred" : "Bilinmeyen bir sorun çıktı",
+ "File could not be uploaded" : "Dosya yüklenemedi",
+ "Uploading …" : "Yükleniyor …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Yükleniyor… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Bu ögenin yüklenmesi desteklenmiyor",
+ "Error when assembling chunks, status code {status}" : "Kümeler oluşturulurken sorun çıktı, durum kodu {status}",
+ "Choose target folder" : "Hedef klasörü seçin",
+ "Set reminder" : "Anımsatıcı ayarla",
+ "Edit locally" : "Yerel olarak düzenle",
+ "Open" : "Aç",
+ "Could not load info for file \"{file}\"" : "\"{file}\" dosyasının bilgileri alınamadı",
+ "Please select tag(s) to add to the selection" : "Seçime eklemek için etiketleri seçin",
+ "Apply tag(s) to selection" : "Etiketleri seçime uygula",
+ "Select directory \"{dirName}\"" : "\"{dirName}\" klasörünü seçin",
+ "Select file \"{fileName}\"" : "\"{fileName}\" dosyasını seçin",
+ "Unable to determine date" : "Tarih belirlenemedi",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
+ "Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
+ "Could not move \"{file}\"" : "\"{file}\" taşınamadı",
+ "copy" : "kopya",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" dosyası kopyalanamadı, hedef zaten var",
+ "Could not copy \"{file}\"" : "\"{file}\" kopyalanamadı",
+ "Copied {origin} inside {destination}" : "{origin} dosyası, {destination} içine kopyalandı",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ve diğer {nbfiles} dosya, {destination} içine kopyalandı",
+ "{newName} already exists" : "{newName} zaten var",
+ "Could not create file \"{file}\"" : "\"{file}\" dosyası oluşturulamadı",
+ "Could not create file \"{file}\" because it already exists" : "\"{file}\" dosyası zaten var olduğundan oluşturulamadı",
+ "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" klasörü zaten var olduğundan oluşturulamadı",
+ "Could not fetch file details \"{file}\"" : "\"{file}\" dosyasının ayrıntıları alınamadı",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" dosyası silinirken sorun çıktı.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} için diğer klasörlerde herhangi bir arama sonucu yok",
+ "Enter more than two characters to search in other folders" : "Diğer klasörlerde aramak için iki karakterden fazla yazın",
+ "{dirs} and {files}" : "{dirs} ve {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"],
+ "You do not have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"],
+ "New" : "Yeni",
+ "New file/folder menu" : "Yeni dosya/klasör menüsü",
+ "Select file range" : "Dosya aralığını seçin",
+ "{used}%" : "%{used}",
+ "{used} used" : "{used} kullanılmış",
+ "\"{name}\" is an invalid file name." : "\"{name}\" geçersiz bir dosya adı.",
+ "File name cannot be empty." : "Dosya adı boş olamaz.",
+ "\"/\" is not allowed inside a file name." : "Dosya adında \"/\" kullanılamaz.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" dosya türüne izin verilmiyor",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} boş depolama alanı bitmek üzere ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" grup klasöründeki boş alan bitmek üzere ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" dış depolamasındaki boş alan bitmek üzere ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Boş depolama alanınız bitmek üzere ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" ile eşleşiyor","\"{filter}\" ile eşleşiyor"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Doğrudan bağlantı kopyalandı (yalnızca bu dosya ya da klasöre erişim izni olan kişiler kullanabilir)",
+ "Path" : "Yol",
+ "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
+ "Favored" : "Sık kullanılanlara eklenmiş",
+ "Favor" : "Sık kullanılanlara ekle",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Doğrudan bağlantıyı kopyala (yalnızca bu dosya ya da klasöre erişim izni olan kişiler için)",
+ "Upload file" : "Dosya yükle",
+ "Not favored" : "Sık kullanılanlara eklenmemiş",
+ "An error occurred while trying to update the tags" : "Etiketler güncellenirken bir sorun çıktı",
+ "Upload (max. %s)" : "Yükle (en büyük: %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" işlemi tamamlandı",
+ "\"{displayName}\" action failed" : "\"{displayName}\" işlemi tamamlanamadı",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" bazı bileşenlerde tamamlanamadı",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" toplu işlemi tamamlandı",
+ "Submitting fields…" : "Alanlar gönderiliyor…",
+ "Filter filenames…" : "Dosya adlarını süz…",
+ "WebDAV URL copied to clipboard" : "WebDAV adresi panoya kopyalandı",
+ "Enable the grid view" : "Tablo görünümü kullanılsın",
+ "Enable folder tree" : "Klasör ağacını aç",
+ "Copy to clipboard" : "Panoya kopyala",
+ "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
+ "Deletion cancelled" : "Silme iptal edildi",
+ "Move cancelled" : "Taşıma iptal edildi",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\" dosyasını taşıma ya da kopyalama işlemi iptal edildi",
+ "Cancelled move or copy operation" : "Taşıma ya da kopyalama işlemi iptal edildi",
+ "Open details" : "Ayrıntıları aç",
+ "Photos and images" : "Fotoğraflar ve görseller",
+ "New folder creation cancelled" : "Yeni klasör oluşturma işlemi iptal edildi",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} klasör","{folderCount} klasör"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} dosya","{fileCount} dosya"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 dosya ve {folderCount} klasör","1 dosya ve {folderCount} klasör"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} dosya ve 1 klasör","{fileCount} dosya ve 1 klasör"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} dosya ve {folderCount} klasör",
+ "All folders" : "Tüm klasörler",
+ "Personal Files" : "Kişisel dosyalar",
"Text file" : "Metin dosyası",
"New text file.txt" : "Yeni metin dosyası.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "Your storage is full, files can not be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}' ile eşleşen","'{filter}' ile eşleşen"]
+ "%1$s (renamed)" : "%1$s (yeniden adlandırıldı)",
+ "renamed file" : "dosyayı yeniden adlandırdı",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows uyumlu dosya adları açıldıktan sonra, var olan dosyalar artık değiştirilemez. Ancak sahipleri tarafından geçerli yeni adlarla yeniden adlandırılabilir.",
+ "Filter file names …" : "Dosya adlarını süz…",
+ "Prevent warning dialogs from open or reenable them." : "Uyarı pencerelerinin görüntülenmesini açın ya da kapatın.",
+ "Show a warning dialog when changing a file extension." : "Dosya uzantısı değiştirilirken uyarı penceresi görüntülensin.",
+ "Speed up your Files experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Dosyalar deneyiminizi hızlandırabilirsiniz.",
+ "Open the actions menu for a file" : "Bir dosyanın işlemler menüsünü açar",
+ "Rename a file" : "Bir dosyayı yeniden adlandırır",
+ "Delete a file" : "Bir dosyayı siler",
+ "Favorite or remove a file from favorites" : "Bir dosyayı sık kullanılanlara ekler ya da kaldırır",
+ "Manage tags for a file" : "Bir dosyanın etiketlerini yönetir",
+ "Deselect all files" : "Tüm dosyaları bırakır",
+ "Select or deselect a file" : "Bir dosyayı seçer ya da bırakır",
+ "Select a range of files" : "Bir dosya grubunu seçer",
+ "Navigate to the parent folder" : "Üst klasöre gider",
+ "Navigate to the file above" : "Üstteki dosyaya gider",
+ "Navigate to the file below" : "Aşağıdaki dosyaya gider",
+ "Navigate to the file on the left (in grid mode)" : "Soldaki dosyaya gider (ızgara görünümünde)",
+ "Navigate to the file on the right (in grid mode)" : "Sağdaki dosyaya gider (ızgara görünümünde)",
+ "Toggle the grid view" : "Izgara görünümünü açar ya da kapatır",
+ "Open the sidebar for a file" : "Bir dosyanın kenar çubuğunu açar"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 8d13e7d7c1a..1d14af7094c 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
- "Storage invalid" : "Depolama geçersiz",
- "Unknown error" : "Bilinmeyen sorun",
- "File could not be found" : "Dosya bulunamadı",
- "Move or copy" : "Taşı ya da kopyala",
- "Download" : "İndir",
- "Delete" : "Sil",
- "Home" : "Giriş",
- "Close" : "Kapat",
- "Favorites" : "Sık kullanılanlar",
- "Could not create folder \"{dir}\"" : "\"{dir}\" klasörü oluşturulamadı",
- "This will stop your current uploads." : "Bu işlem geçerli yüklemeleri durduracak.",
- "Upload cancelled." : "Yükleme iptal edildi.",
- "Processing files …" : "Dosyalar işleniyor …",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir klasör ya da 0 bayt boyutunda olduğundan yüklenemedi",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterli boş alan yok. Yüklemek istediğiniz boyut {size1} ancak yalnız {size2} boş alan var",
- "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" hedef klasörü artık yok",
- "Not enough free space" : "Yeterli boş alan yok",
- "An unknown error has occurred" : "Bilinmeyen bir sorun çıktı",
- "Uploading …" : "Yükleniyor …",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "Bu ögenin yüklenmesi desteklenmiyor",
- "Target folder does not exist any more" : "Hedef klasör artık yok",
- "Operation is blocked by access control" : "İşlem erişim denetimi tarafından engellendi",
- "Error when assembling chunks, status code {status}" : "Kümeler oluşturulurken sorun çıktı, durum kodu {status}",
- "Actions" : "İşlemler",
- "Rename" : "Yeniden adlandır",
- "Copy" : "Kopyala",
- "Choose target folder" : "Hedef klasörü seçin",
- "Open" : "Aç",
- "Delete file" : "Dosyayı sil",
- "Delete folder" : "Klasörü sil",
- "Disconnect storage" : "Depolama bağlantısını kes",
- "Leave this share" : "Bu paylaşımdan ayrıl",
- "Could not load info for file \"{file}\"" : "\"{file}\" dosyasının bilgileri alınamadı",
- "Files" : "Dosyalar",
- "Details" : "Ayrıntılar",
- "Please select tag(s) to add to the selection" : "Seçime eklemek için etiketleri seçin",
- "Apply tag(s) to selection" : "Etiketleri seçime uygula",
- "Select" : "Seçin",
- "Pending" : "Bekliyor",
- "Unable to determine date" : "Tarih belirlenemedi",
- "This operation is forbidden" : "Bu işleme izin verilmiyor",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
- "Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
- "Could not move \"{file}\"" : "\"{file}\" taşınamadı",
- "copy" : "kopya",
- "Could not copy \"{file}\", target exists" : "\"{file}\" dosyası kopyalanamadı, hedef zaten var",
- "Could not copy \"{file}\"" : "\"{file}\" kopyalanamadı",
- "Copied {origin} inside {destination}" : "{origin} dosyası, {destination} içine kopyalandı",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ve diğer {nbfiles} dosya, {destination} içine kopyalandı",
- "{newName} already exists" : "{newName} zaten var",
- "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" yeniden adlandırılamadı, artık yok",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" adı \"{dir}\" klasöründe zaten var. Lütfen farklı bir ad seçin.",
- "Could not rename \"{fileName}\"" : "\"{fileName}\" yeniden adlandırılamadı",
- "Could not create file \"{file}\"" : "\"{file}\" dosyası oluşturulamadı",
- "Could not create file \"{file}\" because it already exists" : "\"{file}\" dosyası zaten var olduğundan oluşturulamadı",
- "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" klasörü zaten var olduğundan oluşturulamadı",
- "Could not fetch file details \"{file}\"" : "\"{file}\" dosyasının ayrıntıları alınamadı",
- "Error deleting file \"{fileName}\"." : "\"{fileName}\" dosyası silinirken sorun çıktı.",
- "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} için diğer klasörlerde herhangi bir arama sonucu yok",
- "Enter more than two characters to search in other folders" : "Diğer klasörlerde aramak için iki karakterden fazla yazın",
- "Name" : "Ad",
- "Size" : "Boyut",
- "Modified" : "Değiştirilme",
- "_%n folder_::_%n folders_" : ["%n klasör","%n klasör"],
- "_%n file_::_%n files_" : ["%n dosya","%n dosya"],
- "{dirs} and {files}" : "{dirs} ve {files}",
- "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"],
- "You don’t have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok",
- "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"],
- "New" : "Yeni",
- "Select file range" : "Dosya aralığını seçin",
- "{used} of {quota} used" : "{used} / {quota} kullanılmış",
- "{used} used" : "{used} kullanılmış",
- "\"{name}\" is an invalid file name." : "\"{name}\" geçersiz bir dosya adı.",
- "File name cannot be empty." : "Dosya adı boş olamaz.",
- "\"/\" is not allowed inside a file name." : "Dosya adında \"/\" kullanılamaz.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" dosya türüne izin verilmiyor",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "Your storage is full, files cannot be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} boş depolama alanı bitmek üzere ({usedSpacePercent}%).",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" grup klasöründeki boş alan bitmek üzere ({usedSpacePercent}%).",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" dış depolamasındaki boş alan bitmek üzere ({usedSpacePercent}%).",
- "Your storage is almost full ({usedSpacePercent}%)." : "Boş depolama alanınız bitmek üzere ({usedSpacePercent}%).",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" ile eşleşiyor","\"{filter}\" ile eşleşiyor"],
- "View in folder" : "Klasörde görüntüle",
- "Copied!" : "Kopyalandı!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Doğrudan bağlantıyı kopyala (yalnız bu dosya ya da klasöre erişim izni olan kullanıcılar için)",
- "Path" : "Yol",
- "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
- "Favorited" : "Sık kullanılanlara eklendi",
- "Favorite" : "Sık kullanılanlara ekle",
- "You can only favorite a single file or folder at a time" : "Aynı anda yalnız bir dosya ya da bir klasör sık kullanılanlara eklenebilir",
- "New folder" : "Yeni klasör",
- "Upload file" : "Dosya yükle",
- "Recent" : "Son",
- "Not favorited" : "Sık kullanılanlarda değil",
- "Remove from favorites" : "Sık kullanılanlardan kaldır",
- "Add to favorites" : "Sık kullanılanlara ekle",
- "An error occurred while trying to update the tags" : "Etiketler güncellenirken bir sorun çıktı",
"Added to favorites" : "Sık kullanılanlara eklendi",
"Removed from favorites" : "Sık kullanılanlardan çıkarıldı",
"You added {file} to your favorites" : "{file} dosyasını sık kullandıklarınıza eklediniz",
"You removed {file} from your favorites" : "{file} dosyasını sık kullandıklarınızdan çıkardınız",
+ "Favorites" : "Sık kullanılanlar",
"File changes" : "Dosya değişikleri",
"Created by {user}" : "{user} tarafından eklendi",
"Changed by {user}" : "{user} tarafından değiştirildi",
@@ -114,7 +11,7 @@
"Restored by {user}" : "{user} tarafından geri yüklendi",
"Renamed by {user}" : "{user} tarafından adı değiştirildi",
"Moved by {user}" : "{user} tarafından taşındı",
- "\"remote user\"" : "\"uzak kullanıcı\"",
+ "\"remote account\"" : "\"uzak hesap\"",
"You created {file}" : "{file} dosyasını eklediniz",
"You created an encrypted file in {file}" : "{file} içinde şifrelenmiş bir dosya oluşturdunuz",
"{user} created {file}" : "{user}, {file} dosyasını ekledi",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "{oldfile} dosyasını {newfile} klasörüne taşıdınız",
"{user} moved {oldfile} to {newfile}" : "{user}, {oldfile} dosyasının {newfile} dosyasına taşıdı",
"A file has been added to or removed from your <strong>favorites</strong>" : "<strong>Sık kullandıklarınıza</strong> bir dosya eklendi ya da silindi",
- "A file or folder has been <strong>changed</strong>" : "Bir dosya ya da klasör <strong>değiştirildi</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "Sık kullanılan bir dosya ya da klasör <strong>değiştirildi</strong>",
- "All files" : "Tüm dosyalar",
- "Unlimited" : "Sınırsız",
- "Upload (max. %s)" : "Yükle (en büyük: %s)",
+ "Files" : "Dosyalar",
+ "A file or folder has been <strong>changed</strong>" : "Bir dosya ya da klasör <strong>değiştirildiğinde</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Sık kullanılan bir dosya ya da klasör <strong>değiştirildiğinde</strong>",
+ "Failed to authorize" : "İzin verilemedi",
+ "Invalid folder path" : "Klasör yolu geçersiz",
+ "Folder not found" : "Klasör bulunamadı",
+ "The file cannot be found" : "Dosya bulunamadı",
+ "The destination path does not exist: %1$s" : "Hedef yolu bulunamadı: %1$s",
+ "You do not have permission to create a file at the specified location" : "Belirtilen konumda bir dosya oluşturma izniniz yok",
+ "The file could not be converted." : "Dosya dönüştürülemedi.",
+ "Could not get relative path to converted file" : "Dönüştürülen dosyanın yolu göreli yolu alınamadı",
+ "Favorite files" : "Sık kullanılan dosyalar",
+ "No favorites" : "Sık kullanılan bir öge yok",
+ "More favorites" : "Diğer sık kullanılanlar",
"Accept" : "Kabul et",
"Reject" : "Reddet",
"Incoming ownership transfer from {user}" : "{user} kullanıcısından gelen sahiplik aktarımı ",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} yolunu onaylamak istiyor musunuz?\n\nNot: Onay verdikten sonra aktarım işleminin tamamlanması 1 saat kadar sürebilir.",
+ "Ownership transfer denied" : "Sahiplik aktarımı reddedildi",
+ "Your ownership transfer of {path} was denied by {user}." : "{path} sahipliğini aktarma işleminiz {user} tarafından reddedildi.",
"Ownership transfer failed" : "Sahiplik aktarılamadı",
"Your ownership transfer of {path} to {user} failed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarılamadı.",
"The ownership transfer of {path} from {user} failed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarılamadı.",
@@ -157,62 +65,412 @@
"Your ownership transfer of {path} to {user} has completed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarıldı.",
"The ownership transfer of {path} from {user} has completed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarıldı.",
"in %s" : "%s içinde",
+ "Transferred from %1$s on %2$s" : "%1$s üzerinden %2$s zamanında aktarıldı",
+ "Files compatibility" : "Dosyalar uygulaması uyumluluğu",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Dosyaların tüm istemcilerle eşitlenebilmesi için dosya adlarının kısıtlanmasını sağlar. Varsayılan olarak POSIX içinde geçerli olan tüm dosya adlarına (Linux veya macOS) izin verilir.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows uyumlu dosya adları açıldıktan sonra, var olan dosyalar artık değiştirilemez. Ancak sahipleri tarafından geçerli yeni adlarla yeniden adlandırılabilir.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Bu ayarı açtıktan sonra dosyaları otomatik olarak da aktarılabilir. Lütfen occ komutuyla ilgili belgelere bakın.",
+ "Enforce Windows compatibility" : "Windows uyumluluğu zorunlu kılınsın",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ayrılmış adlar veya özel karakterler kullanmak gibi Windows sistemlerinde geçerli olmayan dosya adlarını engeller. Ancak büyük/küçük harf duyarlılığı uyumluluğunu zorunlu kılmaz.",
"File Management" : "Dosya yönetimi",
- "Transfer ownership of a file or folder" : "Bir dosya ya da klasörün sahipliğini aktar",
- "Choose file or folder to transfer" : "Sahipliği aktarılacak dosya ya da klasörü seçin",
- "Change" : "Değiştir",
- "New owner" : "Yeni sahip",
- "Search users" : "Kullanıcı arama",
+ "Home" : "Giriş",
+ "Target folder does not exist any more" : "Hedef klasör artık yok",
+ "Reload current directory" : "Geçerli klasörü yeniden yükle",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" klasörüne git",
+ "Current directory path" : "Geçerli klasör yolu",
+ "Your have used your space quota and cannot upload files anymore" : "Depolama alanınızın tümünü kullandığınız için başka dosya yüklemezsiniz",
+ "You do not have permission to upload or create files here." : "Buraya dosya yükleme ya da ekleme izniniz yok.",
+ "Drag and drop files here to upload" : "Yüklemek istediğiniz dosyaları sürükleyip buraya bırakın",
+ "Favorite" : "Sık kullanılanlara ekle",
+ "Back" : "Geri",
+ "Toggle selection for file \"{displayName}\"" : "\"{displayName}\" dosyasını seç/bırak",
+ "Toggle selection for folder \"{displayName}\"" : "\"{displayName}\" klasörünü seç/bırak",
+ "File is loading" : "Dosya yükleniyor",
+ "Folder is loading" : "Klasör yükleniyor",
+ "Filename" : "Dosya adı",
+ "Folder name" : "Klasör adı",
+ "This node is unavailable" : "Bu düğüm kullanılamıyor",
+ "Another entry with the same name already exists." : "Aynı adlı bir kayıt zaten var.",
+ "Invalid filename." : "Dosya adı geçersiz.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" adı \"{newName}\" olarak değiştirildi",
+ "Rename file" : "Dosyayı yeniden adlandır",
+ "Folder" : "Klasör",
+ "Unknown file type" : "Dosya türü bilinmiyor",
+ "{ext} image" : "{ext} görsel",
+ "{ext} video" : "{ext} görüntü",
+ "{ext} audio" : "{ext} ses",
+ "{ext} text" : "{ext} metin",
+ "Pending" : "Bekliyor",
+ "Unknown date" : "Tarih bilinmiyor",
+ "Clear filter" : "Süzgeci temizle",
+ "Modified" : "Değiştirilme",
+ "Search everywhere" : "Her yerde ara",
+ "Type" : "Tür",
+ "Active filters" : "Etkin süzgeçler",
+ "Remove filter" : "Süzgeci kaldır",
+ "Total rows summary" : "Toplam satır özeti",
+ "Toggle selection for all files and folders" : "Tüm dosyaları ve klasörleri seç/bırak",
+ "Name" : "Ad",
+ "File type" : "Dosya türü",
+ "Size" : "Boyut",
+ "Actions" : "İşlemler",
+ "(selected)" : "(seçilmiş)",
+ "List of files and folders." : "Dosya ve klasörlerin listesi.",
+ "You have used your space quota and cannot upload files anymore." : "Depolama alanınızın tümünü kullandığınız için başka dosya yüklemezsiniz.",
+ "Column headers with buttons are sortable." : "Düğmeler olan sütunlar sıralanabilir.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
+ "File not found" : "Dosya bulunamadı",
+ "_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
+ "Search scope options" : "Arama kapsamı seçenekleri",
+ "{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
+ "{used} of {quota} used" : "{used} / {quota} kullanılmış",
+ "{relative}% used" : "%{relative} kullanılmış",
+ "Could not refresh storage stats" : "Depolama istatistikleri yenilenemedi",
+ "Your storage is full, files can not be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Storage information" : "Depolama alanı bilgileri",
+ "Storage quota" : "Depolama alanı kotası",
+ "New folder" : "Yeni klasör",
+ "Create new folder" : "Klasör ekle",
+ "This name is already in use." : "Bu ad zaten kullanılıyor.",
+ "Create" : "Ekle",
+ "Files starting with a dot are hidden by default" : "Bir nokta ile başlayan dosyalar varsayılan olarak gizlidir",
+ "Fill template fields" : "Kalıp alanlarını doldur",
+ "Submitting fields …" : "Alanlar gönderiliyor…",
+ "Submit" : "Gönder",
"Choose a file or folder to transfer" : "Sahipliği aktarılacak bir dosya ya da klasör seçin",
"Transfer" : "Sahipliği aktar",
"Transfer {path} to {userid}" : "{path} yolunun sahipliğini {userid} kullanıcısına aktar",
"Invalid path selected" : "Seçilen yol geçersiz",
+ "Unknown error" : "Bilinmeyen sorun",
"Ownership transfer request sent" : "Sahiplik aktarımı isteği gönderildi",
- "Cannot transfer ownership of a file or folder you don't own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız",
- "Tags" : "Etiketler",
- "Unable to change the favourite state of the file" : "Dosyanın sık kullanılan durumu değiştirilemedi",
+ "Cannot transfer ownership of a file or folder you do not own" : "Sahibi olmadığınız bir dosya ya da klasörün sahipliğini aktaramazsınız",
+ "Transfer ownership of a file or folder" : "Bir dosya ya da klasörün sahipliğini aktarabilirsiniz",
+ "Choose file or folder to transfer" : "Sahipliği aktarılacak dosya ya da klasörü seçin",
+ "Change" : "Değiştir",
+ "New owner" : "Yeni sahip",
+ "Keep {old}" : "{old} kalsın",
+ "Keep without extension" : "Uzantı olmadan kalsın",
+ "Use {new}" : "{new} kullanılsın",
+ "Remove extension" : "Uzantıyı kaldır",
+ "Change file extension" : "Dosya uzantısını değiştir",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "\"{old}\" dosya uzantısının \"{new}\" olarak değiştirilmesi dosyayı okunamaz yapabilir.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "\"{old}\" dosya uzantısının kaldırılması dosyayı okunamaz yapabilir.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "\"{new}\" dosya uzantısının eklenmesi dosyayı okunamaz yapabilir.",
+ "Do not show this dialog again." : "Bu ileti bir daha görüntülenmesin.",
+ "Select file or folder to link to" : "Bağlantı verilecek dosya ya da klasörü seçin",
+ "Choose {file}" : "{file} seçin",
+ "Share" : "Paylaş",
+ "Shared by link" : "Bağlantı ile paylaşılmış",
+ "Shared" : "Paylaşılan",
+ "Switch to list view" : "Liste görünümüne geç",
+ "Switch to grid view" : "Tablo görünümüne geç",
+ "The file could not be found" : "Dosya bulunamadı",
+ "Upload was cancelled by user" : "Kullanıcı yüklemeyi iptal etti",
+ "Not enough free space" : "Yeterli boş alan yok",
+ "Operation is blocked by access control" : "İşlem erişim denetimi tarafından engellendi",
+ "Error during upload: {message}" : "Yükleme sırasında sorun çıktı: {message}",
+ "Error during upload, status code {status}" : "Yüklenirken sorun çıktı, durum kodu {status}",
+ "Unknown error during upload" : "Yükleme sırasında bilinmeyen bir sorun çıktı",
+ "Loading current folder" : "Geçerli klasör yükleniyor",
+ "Retry" : "Yeniden dene",
+ "No files in here" : "Burada herhangi bir dosya yok",
+ "Upload some content or sync with your devices!" : "Bir şeyler yükleyin ya da aygıtlarınızla eşitleyin!",
+ "Go back" : "Geri dön",
+ "Views" : "Görünümler",
+ "Files settings" : "Dosyalar ayarları",
+ "Your files" : "Dosyalarınız",
+ "Open in files" : "Dosyalar uygulamasında aç",
+ "File cannot be accessed" : "Dosyaya erişilemedi",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Dosya bulunamadı ya da görüntüleme izniniz olmayabilir. Gönderenden paylaşmasını isteyin",
+ "No search results for “{query}”" : "“{query}” için bir arama sonucu bulunamadı",
+ "Search for files" : "Dosya ara",
+ "Clipboard is not available" : "Pano kullanılamıyor",
+ "General" : "Genel",
+ "Default view" : "Varsayılan görünüm",
+ "All files" : "Tüm dosyalar",
+ "Personal files" : "Kişisel dosyalar",
+ "Sort favorites first" : "Sık kullanılanlar üstte sıralansın",
+ "Sort folders before files" : "Klasörler dosyaların üzerinde sıralansın",
+ "Appearance" : "Görünüm",
+ "Show hidden files" : "Gizli dosyaları görüntüle",
+ "Show file type column" : "Dosya türü sütunu görüntülensin",
+ "Crop image previews" : "Görsel ön izlemeleri kırpılsın",
+ "Additional settings" : "Ek ayarlar",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV adresi",
+ "Copy" : "Kopyala",
+ "Warnings" : "Uyarılar",
+ "Keyboard shortcuts" : "Kısayol tuşları",
+ "File actions" : "Dosya işlemleri",
+ "Rename" : "Yeniden adlandır",
+ "Delete" : "Sil",
+ "Manage tags" : "Etiket yönetimi",
+ "Selection" : "Seçim",
+ "Select all files" : "Tüm dosyaları seçer",
+ "Deselect all" : "Tümünü bırak",
+ "Navigation" : "Gezinme",
+ "View" : "Görüntüle",
+ "Toggle grid view" : "Tablo görünümünü aç/kapat",
+ "Show those shortcuts" : "Bu kısayolları görüntüler",
+ "You" : "Siz",
+ "Shared multiple times with different people" : "Farklı kişilerle birkaç kez paylaşılmış",
+ "Unable to change the favorite state of the file" : "Dosyanın sık kullanılan durumu değiştirilemedi",
"Error while loading the file data" : "Dosya verileri yüklenirken sorun çıktı",
+ "Owner" : "Sahibi",
+ "Remove from favorites" : "Sık kullanılanlardan kaldır",
+ "Add to favorites" : "Sık kullanılanlara ekle",
+ "Tags" : "Etiketler",
+ "Blank" : "Boş",
+ "Unable to create new file from template" : "Kalıptan yeni dosya eklenemedi",
"Pick a template for {name}" : "{name} için bir kalıp seçin",
- "Cancel" : "İptal",
- "Create" : "Ekle",
"Create a new file with the selected template" : "Seçilmiş kalıp ile yeni bir dosya ekle",
"Creating file" : "Dosya ekleniyor",
- "Blank" : "Boş",
- "Unable to create new file from template" : "Kalıptan yeni dosya eklenemedi",
- "Set up templates folder" : "Kalıp klasörünü ayarlayın",
- "Templates" : "Kalıplar",
+ "Save as {displayName}" : "{displayName} olarak kaydet",
+ "Save as …" : "Farklı kaydet…",
+ "Converting files …" : "Dosyalar dönüştürülüyor…",
+ "Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
+ "All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
+ "One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Bir dosya dönüştürülemedi","%n dosya dönüştürülemedi"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Bir dosya dönüştürüldü","%n dosya dönüştürüldü"],
+ "Files successfully converted" : "Dosyalar dönüştürüldü",
+ "Failed to convert files" : "Dosyalar dönüştürülemedi",
+ "Converting file …" : "Dosya dönüştürülüyor…",
+ "File successfully converted" : "Dosya dönüştürüldü",
+ "Failed to convert file: {message}" : "Dosya dönüştürülemedi: {message}",
+ "Failed to convert file" : "Dosya dönüştürülemedi",
+ "Leave this share" : "Bu paylaşımdan ayrıl",
+ "Leave these shares" : "Bu paylaşımlardan ayrıl",
+ "Disconnect storage" : "Depolama bağlantısını kes",
+ "Disconnect storages" : "Depolama alanlarının bağlantısını kes",
+ "Delete permanently" : "Kalıcı olarak sil",
+ "Delete and unshare" : "Sil ve paylaşımdan kaldır",
+ "Delete file" : "Dosyayı sil",
+ "Delete files" : "Dosyaları sil",
+ "Delete folder" : "Klasörü sil",
+ "Delete folders" : "Klasörleri sil",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["{count} ögeyi kalıcı olarak silmek üzeresiniz","{count} ögeyi kalıcı olarak silmek üzeresiniz"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["{count} ögeyi silmek üzeresiniz","{count} ögeyi silmek üzeresiniz"],
+ "Confirm deletion" : "Silmeyi onaylayın",
+ "Cancel" : "İptal",
+ "Download" : "İndir",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" hedefine taşınıyor…",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" hedefine kopyalanıyor…",
+ "Destination is not a folder" : "Hedef bir klasör değil",
+ "This file/folder is already in that directory" : "Dosya ya da klasör bu klasörde zaten var",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Bir dosyayı ya da klasörü kendi üzerine veya kendisinin alt klasörüne taşıyamazsınız",
+ "(copy)" : "(kopya)",
+ "(copy %n)" : "(%n kopyası)",
+ "A file or folder with that name already exists in this folder" : "Bu klasörde aynı adlı bir dosya ya da klasör zaten var",
+ "The files are locked" : "Dosyalar kilitli",
+ "The file does not exist anymore" : "Dosya artık yok",
+ "Choose destination" : "Hedefi seçin",
+ "Copy to {target}" : "{target} içine kopyala",
+ "Move to {target}" : "{target} içine taşı",
+ "Move" : "Taşı",
+ "Move or copy operation failed" : "Taşıma ya da kopyalama yapılamadı",
+ "Move or copy" : "Taşı ya da kopyala",
+ "Open folder {displayName}" : "{displayName} klasörünü aç",
+ "Open in Files" : "Dosyalar uygulamasında aç",
+ "Open locally" : "Yerel olarak aç",
+ "Failed to redirect to client" : "İstemciye yönlendirilemedi",
+ "Open file locally" : "Dosyayı yerel olarak aç",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Dosya artık aygıtınızda açılmalıdır. Açılmazsa lütfen bilgisayar uygulamasının kurulu olduğundan emin olun.",
+ "Retry and close" : "Yeniden deneyip kapat",
+ "Open online" : "Çevrim içi aç",
+ "Details" : "Ayrıntılar",
+ "View in folder" : "Klasörde görüntüle",
+ "Today" : "Bugün",
+ "Last 7 days" : "Önceki 7 gün",
+ "Last 30 days" : "Önceki 30 gün",
+ "This year ({year})" : "Bu yıl ({year})",
+ "Last year ({year})" : "Önceki yıl ({year})",
+ "Documents" : "Belgeler",
+ "Spreadsheets" : "Çalışma sayfaları",
+ "Presentations" : "Sunumlar",
+ "PDFs" : "PDF dosyaları",
+ "Folders" : "Klasörler",
+ "Audio" : "Ses",
+ "Images" : "Görseller",
+ "Videos" : "Görüntüler",
+ "Created new folder \"{name}\"" : "\"{name}\" yeni klasörü oluşturuldu",
"Unable to initialize the templates directory" : "Kalıp klasörü hazırlanamadı",
- "%s used" : "%s kullanılıyor",
- "%s%% of %s used" : "%s%%/%s kullanılmış",
- "%1$s of %2$s used" : "%1$s / %2$s kullanıldı",
- "Settings" : "Ayarlar",
- "Show hidden files" : "Gizli dosyaları görüntüle",
- "Crop image previews" : "Görsel ön izlemeleri kırpılsın",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
- "Toggle %1$s sublist" : "%1$s alt listesini aç/kapat",
- "Toggle grid view" : "Tablo görünümünü değiştir",
- "No files in here" : "Burada herhangi bir dosya yok",
- "Upload some content or sync with your devices!" : "Bir şeyler yükleyin ya da aygıtlarınızla eşitleyin!",
+ "Create templates folder" : "Kalıplar klasörü oluştur",
+ "Templates" : "Kalıplar",
+ "New template folder" : "Yeni kalıp klasörü",
+ "In folder" : "Klasörde",
+ "Search in folder: {folder}" : "Şu klasörde ara: {folder}",
+ "One of the dropped files could not be processed" : "Bırakılan dosyalardan biri işlenemedi",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Tarayıcınız dosya sistemi API uygulamasını desteklemiyor. Klasörler yüklenemeyecek",
+ "No files to upload" : "Yüklenecek bir dosya yok",
+ "Unable to create the directory {directory}" : "{directory} klasörü oluşturulamadı",
+ "Some files could not be uploaded" : "Bazı dosyalar yüklenemedi",
+ "Files uploaded successfully" : "Dosyalar yüklendi",
+ "No files to process" : "İşlenecek bir dosya yok",
+ "Some files could not be copied" : "Bazı dosyalar kopyalanamadı",
+ "Some files could not be moved" : "Bazı dosyalar taşınamadı",
+ "Files copied successfully" : "Dosyalar kopyalandı",
+ "Files moved successfully" : "Dosyalar taşındı",
+ "Conflicts resolution skipped" : "Çakışma çözümleme atlandı",
+ "Upload cancelled" : "Yükleme iptal edildi",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" adı artık olmadığından değiştirilemedi. ",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{newName}\" adı \"{dir}\" klasöründe zaten kullanılmış. Lütfen başka bir ad seçin.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" adı değiştirilemedi",
+ "This operation is forbidden" : "Bu işleme izin verilmiyor",
+ "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
+ "Unexpected error: {error}" : "Beklenmeyen bir sorun çıktı: {error}",
+ "_%n file_::_%n files_" : ["%n dosya","%n dosya"],
+ "_%n folder_::_%n folders_" : ["%n klasör","%n klasör"],
+ "_%n hidden_::_%n hidden_" : ["%n gizli","%n gizli"],
+ "Filename must not be empty." : "Dosya adı boş olamaz.",
+ "\"{char}\" is not allowed inside a filename." : "Dosya adlarında \"{char}\" kullanılamaz.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ayrılmış bir ad olduğundan dosya adlarında kullanılamaz.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" dosya uzantısına izin verilmiyor.",
+ "Filenames must not end with \"{extension}\"." : "Dosya adları \"{extension}\" ile bitemez.",
+ "List of favorite files and folders." : "Sık kullanılan dosya ve klasör listesi.",
+ "No favorites yet" : "Henüz sık kullanılan bir öge yok",
+ "Files and folders you mark as favorite will show up here" : "Sık kullanılanlara eklediğiniz dosya ve klasörler burada görüntülenir",
+ "List of your files and folders." : "Dosya ve klasörlerinizin listesi",
+ "List of your files and folders that are not shared." : "Paylaşılmayan dosya ve klasörlerinizin listesi.",
+ "No personal files found" : "Herhangi bir kişisel dosya bulunamadı",
+ "Files that are not shared will show up here." : "Paylaşımayan dosyalar burada görüntülenir.",
+ "Recent" : "Son",
+ "List of recently modified files and folders." : "Son değiştirilen dosya ve klasörlerin listesi.",
+ "No recently modified files" : "Yakınlarda değiştirilmiş bir dosya yok",
+ "Files and folders you recently modified will show up here." : "Son zamanlarda değiştirdiğiniz dosya ve klasörler burada görüntülenir.",
+ "Search" : "Ara",
+ "Search results within your files." : "Dosyalarınızda arama sonuçları.",
"No entries found in this folder" : "Bu klasörde herhangi bir kayıt bulunamadı",
"Select all" : "Tümünü seç",
"Upload too large" : "Yükleme boyutu çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucuya yüklenmesine izin verilen en büyük dosya boyutunu aşıyor.",
- "No favorites yet" : "Henüz sık kullanılan bir öge yok",
- "Files and folders you mark as favorite will show up here" : "Sık kullanılanlara eklediğiniz dosya ve klasörler burada görüntülenir",
- "Deleted files" : "Silinmiş dosyalar",
- "Shares" : "Paylaşımlar",
- "Shared with others" : "Başkalarıyla paylaşılan",
- "Shared with you" : "Sizinle paylaşılan",
- "Shared by link" : "Bağlantı ile paylaşılmış",
- "Deleted shares" : "Silinmiş paylaşımlar",
- "Pending shares" : "Bekleyen paylaşımlar",
+ "File could not be found" : "Dosya bulunamadı",
+ "Show list view" : "Liste görünümüne geç",
+ "Show grid view" : "Tablo görünümüne geç",
+ "Close" : "Kapat",
+ "Could not create folder \"{dir}\"" : "\"{dir}\" klasörü oluşturulamadı",
+ "This will stop your current uploads." : "Bu işlem geçerli yüklemeleri durduracak.",
+ "Upload cancelled." : "Yükleme iptal edildi.",
+ "Processing files …" : "Dosyalar işleniyor …",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir klasör ya da 0 bayt boyutunda olduğundan yüklenemedi",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterli boş alan yok. Yüklemek istediğiniz boyut {size1} ancak yalnızca {size2} boş alan var",
+ "Target folder \"{dir}\" does not exist any more" : "\"{dir}\" hedef klasörü artık yok",
+ "An unknown error has occurred" : "Bilinmeyen bir sorun çıktı",
+ "File could not be uploaded" : "Dosya yüklenemedi",
+ "Uploading …" : "Yükleniyor …",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Yükleniyor… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Bu ögenin yüklenmesi desteklenmiyor",
+ "Error when assembling chunks, status code {status}" : "Kümeler oluşturulurken sorun çıktı, durum kodu {status}",
+ "Choose target folder" : "Hedef klasörü seçin",
+ "Set reminder" : "Anımsatıcı ayarla",
+ "Edit locally" : "Yerel olarak düzenle",
+ "Open" : "Aç",
+ "Could not load info for file \"{file}\"" : "\"{file}\" dosyasının bilgileri alınamadı",
+ "Please select tag(s) to add to the selection" : "Seçime eklemek için etiketleri seçin",
+ "Apply tag(s) to selection" : "Etiketleri seçime uygula",
+ "Select directory \"{dirName}\"" : "\"{dirName}\" klasörünü seçin",
+ "Select file \"{fileName}\"" : "\"{fileName}\" dosyasını seçin",
+ "Unable to determine date" : "Tarih belirlenemedi",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
+ "Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
+ "Could not move \"{file}\"" : "\"{file}\" taşınamadı",
+ "copy" : "kopya",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" dosyası kopyalanamadı, hedef zaten var",
+ "Could not copy \"{file}\"" : "\"{file}\" kopyalanamadı",
+ "Copied {origin} inside {destination}" : "{origin} dosyası, {destination} içine kopyalandı",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ve diğer {nbfiles} dosya, {destination} içine kopyalandı",
+ "{newName} already exists" : "{newName} zaten var",
+ "Could not create file \"{file}\"" : "\"{file}\" dosyası oluşturulamadı",
+ "Could not create file \"{file}\" because it already exists" : "\"{file}\" dosyası zaten var olduğundan oluşturulamadı",
+ "Could not create folder \"{dir}\" because it already exists" : "\"{dir}\" klasörü zaten var olduğundan oluşturulamadı",
+ "Could not fetch file details \"{file}\"" : "\"{file}\" dosyasının ayrıntıları alınamadı",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" dosyası silinirken sorun çıktı.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "{tag}{filter}{endtag} için diğer klasörlerde herhangi bir arama sonucu yok",
+ "Enter more than two characters to search in other folders" : "Diğer klasörlerde aramak için iki karakterden fazla yazın",
+ "{dirs} and {files}" : "{dirs} ve {files}",
+ "_including %n hidden_::_including %n hidden_" : ["%n gizli ile birlikte","%n gizli ile birlikte"],
+ "You do not have permission to upload or create files here" : "Buraya dosya yükleme ya da ekleme izniniz yok",
+ "_Uploading %n file_::_Uploading %n files_" : ["%n dosya yükleniyor","%n dosya yükleniyor"],
+ "New" : "Yeni",
+ "New file/folder menu" : "Yeni dosya/klasör menüsü",
+ "Select file range" : "Dosya aralığını seçin",
+ "{used}%" : "%{used}",
+ "{used} used" : "{used} kullanılmış",
+ "\"{name}\" is an invalid file name." : "\"{name}\" geçersiz bir dosya adı.",
+ "File name cannot be empty." : "Dosya adı boş olamaz.",
+ "\"/\" is not allowed inside a file name." : "Dosya adında \"/\" kullanılamaz.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" dosya türüne izin verilmiyor",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} boş depolama alanı bitmek üzere ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" grup klasöründeki boş alan bitmek üzere ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "\"{mountPoint}\" dış depolamasındaki boş alan bitmek üzere ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Boş depolama alanınız bitmek üzere ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["\"{filter}\" ile eşleşiyor","\"{filter}\" ile eşleşiyor"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Doğrudan bağlantı kopyalandı (yalnızca bu dosya ya da klasöre erişim izni olan kişiler kullanabilir)",
+ "Path" : "Yol",
+ "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"],
+ "Favored" : "Sık kullanılanlara eklenmiş",
+ "Favor" : "Sık kullanılanlara ekle",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Doğrudan bağlantıyı kopyala (yalnızca bu dosya ya da klasöre erişim izni olan kişiler için)",
+ "Upload file" : "Dosya yükle",
+ "Not favored" : "Sık kullanılanlara eklenmemiş",
+ "An error occurred while trying to update the tags" : "Etiketler güncellenirken bir sorun çıktı",
+ "Upload (max. %s)" : "Yükle (en büyük: %s)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" işlemi tamamlandı",
+ "\"{displayName}\" action failed" : "\"{displayName}\" işlemi tamamlanamadı",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" bazı bileşenlerde tamamlanamadı",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" toplu işlemi tamamlandı",
+ "Submitting fields…" : "Alanlar gönderiliyor…",
+ "Filter filenames…" : "Dosya adlarını süz…",
+ "WebDAV URL copied to clipboard" : "WebDAV adresi panoya kopyalandı",
+ "Enable the grid view" : "Tablo görünümü kullanılsın",
+ "Enable folder tree" : "Klasör ağacını aç",
+ "Copy to clipboard" : "Panoya kopyala",
+ "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV üzerinden erişmek için bu adresi kullanın",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "İki adımlı doğrulamayı açtıysanız buraya tıklayarak yeni bir uygulama parolası oluşturmalısınız.",
+ "Deletion cancelled" : "Silme iptal edildi",
+ "Move cancelled" : "Taşıma iptal edildi",
+ "Cancelled move or copy of \"{filename}\"." : "\"{filename}\" dosyasını taşıma ya da kopyalama işlemi iptal edildi",
+ "Cancelled move or copy operation" : "Taşıma ya da kopyalama işlemi iptal edildi",
+ "Open details" : "Ayrıntıları aç",
+ "Photos and images" : "Fotoğraflar ve görseller",
+ "New folder creation cancelled" : "Yeni klasör oluşturma işlemi iptal edildi",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} klasör","{folderCount} klasör"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} dosya","{fileCount} dosya"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 dosya ve {folderCount} klasör","1 dosya ve {folderCount} klasör"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} dosya ve 1 klasör","{fileCount} dosya ve 1 klasör"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} dosya ve {folderCount} klasör",
+ "All folders" : "Tüm klasörler",
+ "Personal Files" : "Kişisel dosyalar",
"Text file" : "Metin dosyası",
"New text file.txt" : "Yeni metin dosyası.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} için boş depolama alanı kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" grup klasöründe boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "\"{mountPoint}\" dış depolamasında boş alan kalmadı. Artık güncellenemeyecek ya da eşitlenemeyecek!",
- "Your storage is full, files can not be updated or synced anymore!" : "Boş depolama alanınız kalmadı. Artık dosyalar güncellenmeyecek ya da eşitlenmeyecek!",
- "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}' ile eşleşen","'{filter}' ile eşleşen"]
+ "%1$s (renamed)" : "%1$s (yeniden adlandırıldı)",
+ "renamed file" : "dosyayı yeniden adlandırdı",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows uyumlu dosya adları açıldıktan sonra, var olan dosyalar artık değiştirilemez. Ancak sahipleri tarafından geçerli yeni adlarla yeniden adlandırılabilir.",
+ "Filter file names …" : "Dosya adlarını süz…",
+ "Prevent warning dialogs from open or reenable them." : "Uyarı pencerelerinin görüntülenmesini açın ya da kapatın.",
+ "Show a warning dialog when changing a file extension." : "Dosya uzantısı değiştirilirken uyarı penceresi görüntülensin.",
+ "Speed up your Files experience with these quick shortcuts." : "Şu kısayol tuşlarını kullanarak Dosyalar deneyiminizi hızlandırabilirsiniz.",
+ "Open the actions menu for a file" : "Bir dosyanın işlemler menüsünü açar",
+ "Rename a file" : "Bir dosyayı yeniden adlandırır",
+ "Delete a file" : "Bir dosyayı siler",
+ "Favorite or remove a file from favorites" : "Bir dosyayı sık kullanılanlara ekler ya da kaldırır",
+ "Manage tags for a file" : "Bir dosyanın etiketlerini yönetir",
+ "Deselect all files" : "Tüm dosyaları bırakır",
+ "Select or deselect a file" : "Bir dosyayı seçer ya da bırakır",
+ "Select a range of files" : "Bir dosya grubunu seçer",
+ "Navigate to the parent folder" : "Üst klasöre gider",
+ "Navigate to the file above" : "Üstteki dosyaya gider",
+ "Navigate to the file below" : "Aşağıdaki dosyaya gider",
+ "Navigate to the file on the left (in grid mode)" : "Soldaki dosyaya gider (ızgara görünümünde)",
+ "Navigate to the file on the right (in grid mode)" : "Sağdaki dosyaya gider (ızgara görünümünde)",
+ "Toggle the grid view" : "Izgara görünümünü açar ya da kapatır",
+ "Open the sidebar for a file" : "Bir dosyanın kenar çubuğunu açar"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/tzm.js b/apps/files/l10n/tzm.js
deleted file mode 100644
index f5528cd729c..00000000000
--- a/apps/files/l10n/tzm.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},
-"nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;");
diff --git a/apps/files/l10n/tzm.json b/apps/files/l10n/tzm.json
deleted file mode 100644
index 2fe6b60516a..00000000000
--- a/apps/files/l10n/tzm.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "_%n folder_::_%n folders_" : ["",""],
- "_%n file_::_%n files_" : ["",""],
- "_Uploading %n file_::_Uploading %n files_" : ["",""],
- "_matches '{filter}'_::_match '{filter}'_" : ["",""]
-},"pluralForm" :"nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;"
-} \ No newline at end of file
diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js
index 6f0c6f9a733..cf01962edbb 100644
--- a/apps/files/l10n/ug.js
+++ b/apps/files/l10n/ug.js
@@ -1,37 +1,380 @@
OC.L10N.register(
"files",
{
- "Unknown error" : "يوچۇن خاتالىق",
- "No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق",
- "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى",
- "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.",
- "Failed to write to disk" : "دىسكىغا يازالمىدى",
- "Not enough storage available" : "يېتەرلىك ساقلاش بوشلۇقى يوق",
+ "Added to favorites" : "ياقتۇرىدىغانلارغا قوشۇلدى",
+ "Removed from favorites" : "ياقتۇرىدىغانلاردىن ئۆچۈرۈلدى",
+ "You added {file} to your favorites" : "ياقتۇرىدىغانلىرىڭىزغا {file} قوشتىڭىز",
+ "You removed {file} from your favorites" : "ياقتۇرىدىغانلىرىڭىزدىن {file} نى ئۆچۈردىڭىز",
+ "Favorites" : "يىغقۇچ",
+ "File changes" : "ھۆججەت ئۆزگەرتىش",
+ "Created by {user}" : "{user} قۇرغان",
+ "Changed by {user}" : "{user} تەرىپىدىن ئۆزگەرتىلدى",
+ "Deleted by {user}" : "{user} by تەرىپىدىن ئۆچۈرۈلدى",
+ "Restored by {user}" : "{user} تەرىپىدىن ئەسلىگە كەلتۈرۈلدى",
+ "Renamed by {user}" : "{user} تەرىپىدىن ئۆزگەرتىلدى",
+ "Moved by {user}" : "{user} تەرىپىدىن يۆتكەلدى",
+ "\"remote account\"" : "\"يىراقتىكى ھېسابات\"",
+ "You created {file}" : "سىز {file} قۇردىڭىز",
+ "You created an encrypted file in {file}" : "سىز {file} دە شىفىرلانغان ھۆججەت قۇردىڭىز",
+ "{user} created {file}" : "{user} قۇرغان {file}",
+ "{user} created an encrypted file in {file}" : "{user} {file} شىفىرلانغان ھۆججەت قۇردى",
+ "{file} was created in a public folder" : "{file} public ئاممىۋى ھۆججەت قىسقۇچتا قۇرۇلدى",
+ "You changed {file}" : "{file} ئۆزگەرتتىڭىز",
+ "You changed an encrypted file in {file}" : "سىز شىفىرلانغان ھۆججەتنى {file} گە ئۆزگەرتتىڭىز",
+ "{user} changed {file}" : "{user} ئۆزگەرتىلگەن {file}",
+ "{user} changed an encrypted file in {file}" : "{user} شىفىرلانغان ھۆججەتنى {file} گە ئۆزگەرتتى",
+ "You deleted {file}" : "{file} ئۆچۈردىڭىز",
+ "You deleted an encrypted file in {file}" : "سىز {file} دىكى شىفىرلانغان ھۆججەتنى ئۆچۈردىڭىز",
+ "{user} deleted {file}" : "{user} ئۆچۈرۈلگەن {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} شىفىرلانغان ھۆججەتنى {file} ئۆچۈردى",
+ "You restored {file}" : "{file} ئەسلىگە كەلتۈردىڭىز",
+ "{user} restored {file}" : "{user} ئەسلىگە كەلتۈرۈلگەن {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "سىز {oldfile} (يوشۇرۇن) نى {newfile} (يوشۇرۇن) غا ئۆزگەرتتىڭىز",
+ "You renamed {oldfile} (hidden) to {newfile}" : "سىز {oldfile} (يوشۇرۇن) نى {newfile} غا ئۆزگەرتتىڭىز",
+ "You renamed {oldfile} to {newfile} (hidden)" : "سىز {oldfile} غا {newfile} (يوشۇرۇن) دەپ ئىسىم قويدىڭىز",
+ "You renamed {oldfile} to {newfile}" : "سىز {oldfile} غا {newfile} غا ئۆزگەرتتىڭىز",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ئۆزگەرتىلگەن {oldfile} (يوشۇرۇن) {newfile} (يوشۇرۇن)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ئۆزگەرتىلگەن {oldfile} (يوشۇرۇن) {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ئۆزگەرتىلگەن {oldfile} دىن {newfile} (يوشۇرۇن)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} ئۆزگەرتىلگەن {oldfile} دىن {newfile}",
+ "You moved {oldfile} to {newfile}" : "سىز {oldfile} نى {newfile} غا يۆتكىدىڭىز",
+ "{user} moved {oldfile} to {newfile}" : "{user} {oldfile} نى {newfile} غا يۆتكىدى",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "ھۆججەتلىرىڭىز <strong> ياقتۇرىدىغان </ strong> غا قوشۇلدى ياكى ئۆچۈرۈلدى",
"Files" : "ھۆججەتلەر",
+ "A file or folder has been <strong>changed</strong>" : "ھۆججەت ياكى ھۆججەت قىسقۇچ <strong> ئۆزگەرتىلدى </ strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "ياقتۇرىدىغان ھۆججەت ياكى ھۆججەت قىسقۇچ <strong> ئۆزگەرتىلدى </ strong>",
+ "Failed to authorize" : "ھوقۇق بېرىش مەغلۇب بولدى",
+ "Invalid folder path" : "ھۆججەت قىسقۇچ يولى ئىناۋەتسىز",
+ "Folder not found" : "ھۆججەت قىسقۇچ تېپىلمىدى",
+ "Accept" : "قوبۇل قىلىڭ",
+ "Reject" : "رەت قىلىش",
+ "Incoming ownership transfer from {user}" : "{user} دىن كەلگەن ئىگىدارلىق ھوقۇقىنى يۆتكەش",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} نى قوبۇل قىلامسىز؟\n\nئەسكەرتىش: قوبۇل قىلغاندىن كېيىن يۆتكىلىش جەريانى 1 سائەتكە يېتىشى مۇمكىن.",
+ "Ownership transfer denied" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش رەت قىلىندى",
+ "Your ownership transfer of {path} was denied by {user}." : "{path} نىڭ ئىگىدارلىق ھوقۇقىڭىزنى {user} رەت قىلدى.",
+ "Ownership transfer failed" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش مەغلۇب بولدى",
+ "Your ownership transfer of {path} to {user} failed." : "ئىگىدارلىق ھوقۇقىڭىز {path} دىن {user} غا يۆتكەلدى.",
+ "The ownership transfer of {path} from {user} failed." : "{path} نىڭ {user} دىن ئىگىدارلىق ھوقۇقىنى يۆتكەش مەغلۇب بولدى.",
+ "Ownership transfer done" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش ئېلىپ بېرىلدى",
+ "Your ownership transfer of {path} to {user} has completed." : "ئىگىدارلىق ھوقۇقىڭىزنى {path} دىن {user} غا يۆتكەش تاماملاندى.",
+ "The ownership transfer of {path} from {user} has completed." : "{path} نىڭ {user} دىن ئىگىدارلىق ھوقۇقىنى يۆتكەش تاماملاندى.",
+ "in %s" : "% s",
+ "Transferred from %1$s on %2$s" : "%2 $ s دىكى%1 $ s دىن يۆتكەلدى",
+ "Files compatibility" : "ھۆججەتلەرنىڭ ماسلىشىشچانلىقى",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ھۆججەت نامىنى چەكلەشكە يول قويۇڭ ، ھۆججەتلەرنىڭ بارلىق خېرىدارلار بىلەن ماسقەدەملىنىشىگە كاپالەتلىك قىلىڭ. سۈكۈتتىكى ھالەتتە POSIX (ئىناۋەتلىك Linux ياكى macOS) دىكى بارلىق ھۆججەت ئىسمى رۇخسەت قىلىنىدۇ.",
+ "Enforce Windows compatibility" : "Windows ماسلىشىشچانلىقىنى كۈچەيتىڭ",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "بۇ Windows سىستېمىسىدا كۈچكە ئىگە بولمىغان ھۆججەت نامىنى چەكلەيدۇ ، مەسىلەن زاپاس ئىسىم ياكى ئالاھىدە ھەرپلەرنى ئىشلىتىش دېگەندەك. ئەمما بۇ ئەھۋال سەزگۈرلۈكىنىڭ ماسلىشىشچانلىقىنى ئىجرا قىلمايدۇ.",
+ "File Management" : "ھۆججەت باشقۇرۇش",
"Home" : "ئۆي",
- "Close" : "ياپ",
- "Favorites" : "يىغقۇچ",
- "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.",
- "Uploading..." : "يۈكلەۋاتىدۇ…",
- "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.",
- "Actions" : "مەشغۇلاتلار",
- "Download" : "چۈشۈر",
- "Rename" : "ئات ئۆزگەرت",
- "Delete" : "ئۆچۈر",
- "Unshare" : "ھەمبەھىرلىمە",
+ "Target folder does not exist any more" : "نىشان ھۆججەت قىسقۇچ ئەمدى مەۋجۇت ئەمەس",
+ "Reload current directory" : "نۆۋەتتىكى مۇندەرىجىنى قايتا يۈكلەڭ",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" مۇندەرىجىسىگە كىرىڭ",
+ "Current directory path" : "نۆۋەتتىكى مۇندەرىجە يولى",
+ "Your have used your space quota and cannot upload files anymore" : "بوشلۇق نورمىسىنى ئىشلىتىپ ، ھۆججەتلەرنى ئەمدى يۈكلىيەلمەيسىز",
+ "Drag and drop files here to upload" : "ھۆججەتلەرنى بۇ يەرگە سۆرەپ تاشلاڭ",
+ "Favorite" : "يىغقۇچ",
+ "Back" : "قايتىش",
+ "Toggle selection for file \"{displayName}\"" : "«{displayName}» ھۆججىتىنى تاللاڭ.",
+ "Toggle selection for folder \"{displayName}\"" : "ھۆججەت قىسقۇچنى تاللاش \"{displayName}\"",
+ "File is loading" : "ھۆججەت يۈكلىنىۋاتىدۇ",
+ "Folder is loading" : "ھۆججەت قىسقۇچ يۈكلىنىۋاتىدۇ",
+ "Filename" : "ھۆججەت ئىسمى",
+ "Folder name" : "قىسقۇچ ئاتى",
+ "This node is unavailable" : "بۇ تۈگۈننى ئىشلەتكىلى بولمايدۇ",
+ "Another entry with the same name already exists." : "ئوخشاش ئىسىمدىكى يەنە بىر تۈر بار.",
+ "Invalid filename." : "ئىناۋەتسىز ھۆججەت ئىسمى.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" غا \"{newName}\" غا ئۆزگەرتىلدى",
+ "Rename file" : "ھۆججەتنىڭ نامىنى ئۆزگەرتىش",
+ "Folder" : "قىسقۇچ",
"Pending" : "كۈتۈۋاتىدۇ",
+ "Clear filter" : "سۈزگۈچنى تازىلاش",
+ "Modified" : "ئۆزگەرتكەن",
+ "Search everywhere" : "ھەممە يەردىن ئىزدەڭ",
+ "Type" : "تىپ",
+ "Active filters" : "ئاكتىپ سۈزگۈچ",
+ "Remove filter" : "سۈزگۈچنى ئۆچۈرۈڭ",
+ "Total rows summary" : "ئومۇمىي قۇر خۇلاسىسى",
+ "Toggle selection for all files and folders" : "بارلىق ھۆججەت ۋە ھۆججەت قىسقۇچلارنى تاللاڭ",
"Name" : "ئاتى",
"Size" : "چوڭلۇقى",
- "Modified" : "ئۆزگەرتكەن",
- "New" : "يېڭى",
- "Favorite" : "يىغقۇچ",
- "Folder" : "قىسقۇچ",
+ "Actions" : "مەشغۇلاتلار",
+ "(selected)" : "(تاللانغان)",
+ "List of files and folders." : "ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "Column headers with buttons are sortable." : "كۇنۇپكىلار بار ئىستون ماۋزۇلىرى تەرتىپلىك.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "بۇ تىزىملىك ئىقتىدار سەۋەبىدىن تولۇق كۆرسىتىلمىگەن. ھۆججەتلەر تىزىملىكتىن ئۆتكەندە كۆرسىتىلىدۇ.",
+ "File not found" : "ھۆججەت تېپىلمىدى",
+ "{usedQuotaByte} used" : "{usedQuotaByte} ئىشلىتىلگەن",
+ "{used} of {quota} used" : "{used} {quota} ئىشلىتىلگەن",
+ "{relative}% used" : "{relative}% ئىشلىتىلگەن",
+ "Could not refresh storage stats" : "ساقلاش سانلىق مەلۇماتلىرىنى يېڭىلىيالمىدى",
+ "Your storage is full, files can not be updated or synced anymore!" : "ساقلاش بوشلۇقىڭىز تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Storage information" : "ساقلاش ئۇچۇرى",
+ "Storage quota" : "ساقلاش نورمىسى",
"New folder" : "يېڭى قىسقۇچ",
- "Upload" : "يۈكلە",
- "Save" : "ساقلا",
- "Settings" : "تەڭشەكلەر",
+ "Create new folder" : "يېڭى ھۆججەت قىسقۇچ قۇر",
+ "This name is already in use." : "بۇ ئىسىم ئاللىقاچان ئىشلىتىلىۋاتىدۇ.",
+ "Create" : "قۇر",
+ "Fill template fields" : "قېلىپ بۆلەكلىرىنى تولدۇرۇڭ",
+ "Submit" : "يوللاڭ",
+ "Choose a file or folder to transfer" : "يۆتكەش ئۈچۈن ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Transfer" : "يۆتكەش",
+ "Transfer {path} to {userid}" : "{path} نى {userid} غا يۆتكەڭ",
+ "Invalid path selected" : "ئىناۋەتسىز يول تاللانغان",
+ "Unknown error" : "يوچۇن خاتالىق",
+ "Ownership transfer request sent" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش ئىلتىماسى ئەۋەتىلدى",
+ "Cannot transfer ownership of a file or folder you do not own" : "سىز ئىگە بولمىغان ھۆججەت ياكى ھۆججەت قىسقۇچنىڭ ئىگىدارلىق ھوقۇقىنى يۆتكىگىلى بولمايدۇ",
+ "Transfer ownership of a file or folder" : "ھۆججەت ياكى ھۆججەت قىسقۇچنىڭ ئىگىدارلىق ھوقۇقىنى يۆتكەڭ",
+ "Choose file or folder to transfer" : "يۆتكەش ئۈچۈن ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Change" : "ئۆزگەرتىش",
+ "New owner" : "يېڭى خوجايىن",
+ "Select file or folder to link to" : "ئۇلىنىدىغان ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Choose {file}" : "{file} نى تاللاڭ",
+ "Share" : "ھەمبەھىرلەش",
+ "Shared by link" : "ئۇلىنىش ئارقىلىق ئورتاقلاشتى",
+ "Shared" : "ئورتاقلاشتى",
+ "Switch to list view" : "تىزىملىك كۆرۈنۈشىگە ئالماشتۇرۇڭ",
+ "Switch to grid view" : "كاتەكچە كۆرۈنۈشكە ئالماشتۇرۇڭ",
+ "Upload was cancelled by user" : "ئىشلەتكۈچى يوللاش ئەمەلدىن قالدۇرۇلدى",
+ "Not enough free space" : "يېتەرلىك بوشلۇق يوق",
+ "Operation is blocked by access control" : "زىيارەتنى كونترول قىلىش ئارقىلىق مەشغۇلات توسۇلۇپ قالىدۇ",
+ "Error during upload: {message}" : "يوللاشتىكى خاتالىق: {message}",
+ "Error during upload, status code {status}" : "يوللاش جەريانىدا خاتالىق ، ھالەت كودى {status}",
+ "Unknown error during upload" : "يوللاش جەريانىدا نامەلۇم خاتالىق",
+ "Loading current folder" : "نۆۋەتتىكى ھۆججەت قىسقۇچنى يۈكلەۋاتىدۇ",
+ "Retry" : "قايتا سىناڭ",
+ "No files in here" : "بۇ يەردە ھۆججەت يوق",
+ "Upload some content or sync with your devices!" : "بەزى مەزمۇنلارنى يۈكلەڭ ياكى ئۈسكۈنىڭىز بىلەن ماسقەدەملەڭ!",
+ "Go back" : "قايتىڭ",
+ "Views" : "كۆرۈنۈشلەر",
+ "Files settings" : "ھۆججەت تەڭشىكى",
+ "Your files" : "ھۆججەتلىرىڭىز",
+ "Open in files" : "ھۆججەتلەرنى ئېچىڭ",
+ "File cannot be accessed" : "ھۆججەتنى زىيارەت قىلغىلى بولمايدۇ",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "ھۆججەت تېپىلمىدى ياكى ئۇنى كۆرۈش ھوقۇقىڭىز يوق. ئەۋەتكۈچىدىن ئورتاقلىشىشنى سوراڭ.",
+ "Clipboard is not available" : "چاپلاش تاختىسى يوق",
+ "General" : "General",
+ "All files" : "بارلىق ھۆججەتلەر",
+ "Personal files" : "شەخسىي ھۆججەتلەر",
+ "Sort favorites first" : "ياقتۇرىدىغانلارنى رەتلەڭ",
+ "Sort folders before files" : "ھۆججەتلەرنى ھۆججەتتىن بۇرۇن تەرتىپلەڭ",
+ "Appearance" : "كۆرۈنۈش",
+ "Show hidden files" : "يوشۇرۇن ھۆججەتلەرنى كۆرسەت",
+ "Crop image previews" : "رەسىمنى ئالدىن كۆرۈش",
+ "Additional settings" : "قوشۇمچە تەڭشەكلەر",
"WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "كۆچۈرۈڭ",
+ "Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى",
+ "File actions" : "ھۆججەت ھەرىكىتى",
+ "Rename" : "ئات ئۆزگەرت",
+ "Delete" : "ئۆچۈر",
+ "Manage tags" : "خەتكۈچلەرنى باشقۇرۇش",
+ "Selection" : "تاللاش",
+ "Deselect all" : "ھەممىنى تاللاڭ",
+ "Navigation" : "يول باشلاش",
+ "View" : "كۆرۈش",
+ "You" : "سەن",
+ "Shared multiple times with different people" : "ئوخشىمىغان كىشىلەر بىلەن كۆپ قېتىم ئورتاقلاشتى",
+ "Error while loading the file data" : "ھۆججەت سانلىق مەلۇماتلىرىنى يۈكلەۋاتقاندا خاتالىق",
+ "Owner" : "ئىگىسى",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Tags" : "بەلگەلەر",
+ "Blank" : "ئوچۇق",
+ "Unable to create new file from template" : "قېلىپتىن يېڭى ھۆججەت قۇرالمىدى",
+ "Pick a template for {name}" : "{name} for نىڭ قېلىپىنى تاللاڭ",
+ "Create a new file with the selected template" : "تاللانغان قېلىپ بىلەن يېڭى ھۆججەت قۇر",
+ "Creating file" : "ھۆججەت قۇرۇش",
+ "Leave this share" : "بۇ ئۈلۈشنى قالدۇرۇڭ",
+ "Leave these shares" : "بۇ پايلارنى قالدۇرۇڭ",
+ "Disconnect storage" : "ساقلاشنى ئۈزۈڭ",
+ "Disconnect storages" : "دۇكانلارنى ئۈزۈڭ",
+ "Delete permanently" : "مەڭگۈلۈك ئۆچۈر",
+ "Delete and unshare" : "ئۆچۈرۈش ۋە ئورتاقلىشىش",
+ "Delete file" : "ھۆججەتنى ئۆچۈرۈڭ",
+ "Delete files" : "ھۆججەتلەرنى ئۆچۈرۈڭ",
+ "Delete folder" : "ھۆججەت قىسقۇچنى ئۆچۈرۈڭ",
+ "Delete folders" : "ھۆججەت قىسقۇچلارنى ئۆچۈرۈڭ",
+ "Confirm deletion" : "ئۆچۈرۈشنى جەزملەشتۈرۈڭ",
+ "Cancel" : "ۋاز كەچ",
+ "Download" : "چۈشۈر",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\" نى \"{destination}\" غا يۆتكەش…",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\" نى \"{destination}\" غا كۆچۈرۈش…",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "ھۆججەت ياكى ھۆججەت قىسقۇچنى ئۆزىڭىزگە ياكى تارماق قىسقۇچقا يۆتكىيەلمەيسىز",
+ "(copy)" : "(كۆپەيتىلگەن نۇسخىسى)",
+ "(copy %n)" : "(% n)",
+ "A file or folder with that name already exists in this folder" : "بۇ ھۆججەت قىسقۇچتا بۇ ئىسىم بار ھۆججەت ياكى ھۆججەت قىسقۇچ بار",
+ "The files are locked" : "ھۆججەتلەر قۇلۇپلاندى",
+ "The file does not exist anymore" : "بۇ ھۆججەت ئەمدى مەۋجۇت ئەمەس",
+ "Choose destination" : "مەنزىلنى تاللاڭ",
+ "Copy to {target}" : "{target} غا كۆچۈرۈڭ",
+ "Move to {target}" : "{target} يۆتكەڭ",
+ "Move" : "Move",
+ "Move or copy operation failed" : "يۆتكەش ياكى كۆچۈرۈش مەشغۇلاتى مەغلۇپ بولدى",
+ "Move or copy" : "يۆتكەش ياكى كۆچۈرۈش",
+ "Open folder {displayName}" : "ھۆججەت قىسقۇچ {displayName}",
+ "Open in Files" : "ھۆججەتلەرنى ئېچىڭ",
+ "Open locally" : "يەرلىكتە ئېچىڭ",
+ "Failed to redirect to client" : "خېرىدارغا قايتا نىشانلاش مەغلۇپ بولدى",
+ "Open file locally" : "ھۆججەتنى يەرلىكتە ئېچىڭ",
+ "Details" : "تەپسىلاتى",
+ "View in folder" : "قىسقۇچتا كۆرۈش",
+ "Today" : "بۈگۈن",
+ "Last 7 days" : "ئاخىرقى 7 كۈن",
+ "Last 30 days" : "ئاخىرقى 30 كۈن",
+ "This year ({year})" : "بۇ يىل ({year})",
+ "Last year ({year})" : "ئۆتكەن يىلى ({year})",
+ "Documents" : "ھۆججەتلەر",
+ "Spreadsheets" : "ئېلېكترونلۇق جەدۋەل",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDF",
+ "Folders" : "ھۆججەت قىسقۇچ",
+ "Audio" : "Audio",
+ "Images" : "سۈرەتلەر",
+ "Videos" : "سىنلار",
+ "Created new folder \"{name}\"" : "يېڭى ھۆججەت قىسقۇچ \"{name}\" قۇرۇلدى",
+ "Unable to initialize the templates directory" : "قېلىپ مۇندەرىجىسىنى قوزغىتالمىدى",
+ "Create templates folder" : "قېلىپ ھۆججەت قىسقۇچى قۇرۇش",
+ "Templates" : "قېلىپلار",
+ "New template folder" : "يېڭى قېلىپ ھۆججەت قىسقۇچى",
+ "In folder" : "ھۆججەت قىسقۇچتا",
+ "Search in folder: {folder}" : "ھۆججەت قىسقۇچتىن ئىزدەش: {folder} قىسقۇچ}",
+ "One of the dropped files could not be processed" : "تاشلانغان ھۆججەتلەرنىڭ بىرىنى بىر تەرەپ قىلالمىدى",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "توركۆرگۈڭىز Filesystem API نى قوللىمايدۇ. مۇندەرىجە يۈكلەنمەيدۇ",
+ "No files to upload" : "يۈكلەيدىغان ھۆججەت يوق",
+ "Unable to create the directory {directory}" : "مۇندەرىجە {directory} قۇرالمىدى",
+ "Some files could not be uploaded" : "بەزى ھۆججەتلەرنى يۈكلەشكە بولمىدى",
+ "Files uploaded successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك يۈكلەندى",
+ "No files to process" : "بىر تەرەپ قىلىدىغان ھۆججەت يوق",
+ "Some files could not be copied" : "بەزى ھۆججەتلەرنى كۆچۈرگىلى بولمىدى",
+ "Some files could not be moved" : "بەزى ھۆججەتلەرنى يۆتكىگىلى بولمىدى",
+ "Files copied successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك كۆچۈرۈلدى",
+ "Files moved successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك يۆتكەلدى",
+ "Conflicts resolution skipped" : "زىددىيەتنىڭ ھەل قىلىنىشى ئاتلاپ كەتتى",
+ "Upload cancelled" : "يۈكلەش ئەمەلدىن قالدۇرۇلدى",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" نىڭ نامىنى ئۆزگەرتەلمىدى ، ئۇ ئەمدى مەۋجۇت ئەمەس",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{dir}\" ھۆججەت قىسقۇچىدا \"{newName}\" ئىسمى ئاللىبۇرۇن ئىشلىتىلگەن. باشقا ئىسىمنى تاللاڭ.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" نىڭ نامىنى ئۆزگەرتەلمىدى",
+ "This operation is forbidden" : "بۇ مەشغۇلات مەنئى قىلىنىدۇ",
+ "Storage is temporarily not available" : "ساقلاش ۋاقتىنى ۋاقىتلىق ئىشلەتكىلى بولمايدۇ",
+ "Unexpected error: {error}" : "ئويلىمىغان خاتالىق: {error}",
+ "Filename must not be empty." : "ھۆججەت ئىسمى بوش بولماسلىقى كېرەك.",
+ "\"{char}\" is not allowed inside a filename." : "ھۆججەت نامىدا \"{char}\" رۇخسەت قىلىنمايدۇ.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" زاپاس ئىسىم بولۇپ ، ھۆججەت نامىغا رۇخسەت قىلىنمايدۇ.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" رۇخسەت قىلىنغان ھۆججەت تىپى ئەمەس.",
+ "Filenames must not end with \"{extension}\"." : "ھۆججەت ئىسمى «{extension}» بىلەن ئاخىرلاشماسلىقى كېرەك.",
+ "List of favorite files and folders." : "ياقتۇرىدىغان ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "No favorites yet" : "ياقتۇرىدىغانلار تېخى يوق",
+ "Files and folders you mark as favorite will show up here" : "سىز ياقتۇرىدىغان ھۆججەت ۋە ھۆججەت قىسقۇچلار بۇ يەردە كۆرۈنىدۇ",
+ "List of your files and folders." : "ھۆججەت ۋە ھۆججەت قىسقۇچلىرىڭىزنىڭ تىزىملىكى.",
+ "List of your files and folders that are not shared." : "ئورتاقلاشمىغان ھۆججەت ۋە ھۆججەت قىسقۇچلىرىڭىزنىڭ تىزىملىكى.",
+ "No personal files found" : "شەخسىي ھۆججەت تېپىلمىدى",
+ "Files that are not shared will show up here." : "ئورتاقلاشمىغان ھۆججەتلەر بۇ يەردە كۆرۈنىدۇ.",
+ "Recent" : "يېقىنقى",
+ "List of recently modified files and folders." : "يېقىندا ئۆزگەرتىلگەن ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "No recently modified files" : "يېقىندا ئۆزگەرتىلگەن ھۆججەت يوق",
+ "Files and folders you recently modified will show up here." : "سىز يېقىندا ئۆزگەرتكەن ھۆججەت ۋە ھۆججەت قىسقۇچلار بۇ يەردە كۆرۈنىدۇ.",
+ "Search" : "ئىزدەش",
+ "No entries found in this folder" : "بۇ ھۆججەت قىسقۇچتا ھېچقانداق مەزمۇن تېپىلمىدى",
+ "Select all" : "ھەممىنى تاللاڭ",
"Upload too large" : "يۈكلەندىغىنى بەك چوڭ",
- "Text file" : "تېكىست ھۆججەت"
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "سىز يۈكلىمەكچى بولغان ھۆججەتلەر بۇ مۇلازىمېتىردا ھۆججەت يوللاشنىڭ ئەڭ چوڭ چوڭلۇقىدىن ئېشىپ كەتتى.",
+ "File could not be found" : "ھۆججەت تېپىلمىدى",
+ "Show list view" : "تىزىملىك كۆرۈنۈشىنى كۆرسىتىش",
+ "Show grid view" : "كاتەكچە كۆرۈنۈشنى كۆرسىتىش",
+ "Close" : "ياپ",
+ "Could not create folder \"{dir}\"" : "\"{dir}\" ھۆججەت قىسقۇچى قۇرالمىدى",
+ "This will stop your current uploads." : "بۇ سىزنىڭ نۆۋەتتىكى يۈكلىنىشىڭىزنى توختىتىدۇ.",
+ "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.",
+ "Processing files …" : "ھۆججەتلەرنى بىر تەرەپ قىلىش…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "مۇندەرىجە ياكى 0 بايىت بولغانلىقى ئۈچۈن {filename} نامىنى يۈكلىيەلمىدى",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "يېتەرلىك بوشلۇق يوق ، سىز {size1} نى يۈكلەۋاتىسىز ، ئەمما پەقەت {size2} قالدى",
+ "Target folder \"{dir}\" does not exist any more" : "نىشان ھۆججەت قىسقۇچ \"{dir}\" ئەمدى مەۋجۇت ئەمەس",
+ "An unknown error has occurred" : "نامەلۇم خاتالىق كۆرۈلدى",
+ "File could not be uploaded" : "ھۆججەت يۈكلەشكە بولمىدى",
+ "Uploading …" : "يۈكلەش…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber} / {total})",
+ "Uploading … ({currentNumber}/{total})" : "يۈكلەش… ({currentNumber} / {total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "ئۇ نەرسىنى يۈكلەشنى قوللىمايدۇ",
+ "Error when assembling chunks, status code {status}" : "پارچىلارنى قۇرغاندا خاتالىق ، ھالەت كودى {status}",
+ "Choose target folder" : "نىشان ھۆججەت قىسقۇچىنى تاللاڭ",
+ "Set reminder" : "ئەسكەرتىش بەلگىلەڭ",
+ "Edit locally" : "يەرلىكتە تەھرىرلەڭ",
+ "Open" : "ئېچىڭ",
+ "Could not load info for file \"{file}\"" : "\"{file}\" ھۆججىتىگە ئۇچۇر يۈكلىيەلمىدى",
+ "Please select tag(s) to add to the selection" : "تاللاشقا قوشۇش ئۈچۈن بەلگە (لەرنى) تاللاڭ",
+ "Apply tag(s) to selection" : "تاللاشقا بەلگە (لەر) نى ئىشلىتىڭ",
+ "Select directory \"{dirName}\"" : "مۇندەرىجە \"{dirName}\" نى تاللاڭ",
+ "Select file \"{fileName}\"" : "ھۆججەت \"{fileName}\" نى تاللاڭ",
+ "Unable to determine date" : "چېسلانى بەلگىلىيەلمىدى",
+ "This directory is unavailable, please check the logs or contact the administrator" : "بۇ مۇندەرىجىنى ئىشلەتكىلى بولمايدۇ ، خاتىرىلەرنى تەكشۈرۈپ بېقىڭ ياكى باشقۇرغۇچى بىلەن ئالاقىلىشىڭ",
+ "Could not move \"{file}\", target exists" : "\"{file}\" نى يۆتكىگىلى بولمىدى ، نىشان مەۋجۇت",
+ "Could not move \"{file}\"" : "\"{file}\" نى يۆتكىگىلى بولمىدى",
+ "copy" : "كۆپەيتىلگەن",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" نى كۆچۈرەلمىدى ، نىشان مەۋجۇت",
+ "Could not copy \"{file}\"" : "\"{file}\" نى كۆچۈرەلمىدى",
+ "Copied {origin} inside {destination}" : "كۆچۈرۈلگەن {origin} ئىچىدىكى {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ئىچىدىكى {destination} ۋە {nbfiles} باشقا ھۆججەتلەر كۆچۈرۈلگەن",
+ "{newName} already exists" : "{newName} مەۋجۇت",
+ "Could not create file \"{file}\"" : "\"{file}\" ھۆججىتىنى قۇرالمىدى",
+ "Could not create file \"{file}\" because it already exists" : "«{file}» ھۆججىتىنى قۇرالمىدى ، چۈنكى ئۇ مەۋجۇت",
+ "Could not create folder \"{dir}\" because it already exists" : "«{dir}» ھۆججەت قىسقۇچى قۇرالمىدى ، چۈنكى ئۇ مەۋجۇت",
+ "Could not fetch file details \"{file}\"" : "ھۆججەت تەپسىلاتلىرىنى \"{file}\" غا ئېرىشەلمىدى",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" ھۆججىتىنى ئۆچۈرۈشتە خاتالىق.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "باشقا ھۆججەت قىسقۇچلاردا {tag} {filter} {endtag} دىن ئىزدەش نەتىجىسى يوق",
+ "Enter more than two characters to search in other folders" : "باشقا ھۆججەت قىسقۇچلاردىن ئىزدەش ئۈچۈن ئىككىدىن ئارتۇق ھەرپ كىرگۈزۈڭ",
+ "{dirs} and {files}" : "{dirs} ۋە {files}",
+ "You do not have permission to upload or create files here" : "بۇ يەرگە ھۆججەت يوللاش ياكى قۇرۇش ھوقۇقىڭىز يوق",
+ "New" : "يېڭى",
+ "New file/folder menu" : "يېڭى ھۆججەت / ھۆججەت قىسقۇچ تىزىملىكى",
+ "Select file range" : "ھۆججەت دائىرىسىنى تاللاڭ",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} ئىشلىتىلگەن",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ئىناۋەتسىز ھۆججەت ئىسمى.",
+ "File name cannot be empty." : "ھۆججەت ئىسمى قۇرۇق بولمايدۇ.",
+ "\"/\" is not allowed inside a file name." : "ھۆججەت نامىدا \"/\" رۇخسەت قىلىنمايدۇ.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" رۇخسەت قىلىنغان ھۆججەت شەكلى ئەمەس",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} نىڭ ساقلاش بوشلۇقى تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "گۇرۇپپا قىسقۇچ \"{mountPoint}\" تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "سىرتقى ساقلاش \"{mountPoint}\" تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "ساقلاش بوشلۇقىڭىز تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} نىڭ ساقلاش بوشلۇقى تولۇق ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "گۇرۇپپا قىسقۇچ \"{mountPoint}\" ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "سىرتقى ساقلاش \"{mountPoint}\" ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "ساقلاش بوشلۇقىڭىز ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "بىۋاسىتە ئۇلىنىش كۆچۈرۈلدى (پەقەت بۇ ھۆججەت / ھۆججەت قىسقۇچنى زىيارەت قىلىدىغان كىشىلەر ئۈچۈن ئىشلەيدۇ)",
+ "Path" : "Path",
+ "Favored" : "ياخشى كۆرىدۇ",
+ "Favor" : "ياق",
+ "Copy direct link (only works for people who have access to this file/folder)" : "بىۋاسىتە ئۇلىنىشنى كۆچۈرۈڭ (پەقەت بۇ ھۆججەت / ھۆججەت قىسقۇچنى زىيارەت قىلالايدىغان كىشىلەر ئۈچۈن ئىشلەيدۇ)",
+ "Upload file" : "Upload file",
+ "Not favored" : "ياقتۇرمايدۇ",
+ "An error occurred while trying to update the tags" : "خەتكۈچلەرنى يېڭىلىماقچى بولغاندا خاتالىق كۆرۈلدى",
+ "Upload (max. %s)" : "يۈكلەش (max.% S)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ھەرىكىتى مۇۋەپپەقىيەتلىك ئىجرا قىلىندى",
+ "\"{displayName}\" action failed" : "\"{displayName}\" ھەرىكىتى مەغلۇپ بولدى",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" تۈركۈمدىكى ھەرىكەت مۇۋەپپەقىيەتلىك ئىجرا قىلىندى",
+ "Submitting fields…" : "يول يوللاش…",
+ "Filter filenames…" : "ھۆججەت نامىنى سۈزۈڭ…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL چاپلاش تاختىسىغا كۆچۈرۈلدى",
+ "Enable the grid view" : "كاتەكچە كۆرۈنۈشىنى قوزغىتىڭ",
+ "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
+ "Copy to clipboard" : "چاپلاش تاختىسىغا كۆچۈرۈڭ",
+ "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
+ "Deletion cancelled" : "ئۆچۈرۈش ئەمەلدىن قالدۇرۇلدى",
+ "Move cancelled" : "يۆتكەش ئەمەلدىن قالدۇرۇلدى",
+ "Cancelled move or copy of \"{filename}\"." : "«{filename} ئىسمى}» نىڭ يۆتكىلىشى ياكى كۆپەيتىلگەن نۇسخىسى.",
+ "Cancelled move or copy operation" : "يۆتكەش ياكى كۆچۈرۈش مەشغۇلاتى ئەمەلدىن قالدۇرۇلدى",
+ "Open details" : "تەپسىلاتلارنى ئېچىڭ",
+ "Photos and images" : "رەسىم ۋە رەسىم",
+ "New folder creation cancelled" : "يېڭى ھۆججەت قىسقۇچ قۇرۇش ئەمەلدىن قالدۇرۇلدى",
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ھۆججەتلىرى ۋە {folderCount} ھۆججەت قىسقۇچلىرى",
+ "All folders" : "بارلىق ھۆججەت قىسقۇچلار",
+ "Personal Files" : "شەخسىي ھۆججەتلەر",
+ "Text file" : "تېكىست ھۆججەت",
+ "New text file.txt" : "يېڭى تېكىست ھۆججىتى. Txt"
},
-"nplurals=1; plural=0;");
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json
index e4e6e32e1c5..311a3e923d6 100644
--- a/apps/files/l10n/ug.json
+++ b/apps/files/l10n/ug.json
@@ -1,35 +1,378 @@
{ "translations": {
- "Unknown error" : "يوچۇن خاتالىق",
- "No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق",
- "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى",
- "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.",
- "Failed to write to disk" : "دىسكىغا يازالمىدى",
- "Not enough storage available" : "يېتەرلىك ساقلاش بوشلۇقى يوق",
+ "Added to favorites" : "ياقتۇرىدىغانلارغا قوشۇلدى",
+ "Removed from favorites" : "ياقتۇرىدىغانلاردىن ئۆچۈرۈلدى",
+ "You added {file} to your favorites" : "ياقتۇرىدىغانلىرىڭىزغا {file} قوشتىڭىز",
+ "You removed {file} from your favorites" : "ياقتۇرىدىغانلىرىڭىزدىن {file} نى ئۆچۈردىڭىز",
+ "Favorites" : "يىغقۇچ",
+ "File changes" : "ھۆججەت ئۆزگەرتىش",
+ "Created by {user}" : "{user} قۇرغان",
+ "Changed by {user}" : "{user} تەرىپىدىن ئۆزگەرتىلدى",
+ "Deleted by {user}" : "{user} by تەرىپىدىن ئۆچۈرۈلدى",
+ "Restored by {user}" : "{user} تەرىپىدىن ئەسلىگە كەلتۈرۈلدى",
+ "Renamed by {user}" : "{user} تەرىپىدىن ئۆزگەرتىلدى",
+ "Moved by {user}" : "{user} تەرىپىدىن يۆتكەلدى",
+ "\"remote account\"" : "\"يىراقتىكى ھېسابات\"",
+ "You created {file}" : "سىز {file} قۇردىڭىز",
+ "You created an encrypted file in {file}" : "سىز {file} دە شىفىرلانغان ھۆججەت قۇردىڭىز",
+ "{user} created {file}" : "{user} قۇرغان {file}",
+ "{user} created an encrypted file in {file}" : "{user} {file} شىفىرلانغان ھۆججەت قۇردى",
+ "{file} was created in a public folder" : "{file} public ئاممىۋى ھۆججەت قىسقۇچتا قۇرۇلدى",
+ "You changed {file}" : "{file} ئۆزگەرتتىڭىز",
+ "You changed an encrypted file in {file}" : "سىز شىفىرلانغان ھۆججەتنى {file} گە ئۆزگەرتتىڭىز",
+ "{user} changed {file}" : "{user} ئۆزگەرتىلگەن {file}",
+ "{user} changed an encrypted file in {file}" : "{user} شىفىرلانغان ھۆججەتنى {file} گە ئۆزگەرتتى",
+ "You deleted {file}" : "{file} ئۆچۈردىڭىز",
+ "You deleted an encrypted file in {file}" : "سىز {file} دىكى شىفىرلانغان ھۆججەتنى ئۆچۈردىڭىز",
+ "{user} deleted {file}" : "{user} ئۆچۈرۈلگەن {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} شىفىرلانغان ھۆججەتنى {file} ئۆچۈردى",
+ "You restored {file}" : "{file} ئەسلىگە كەلتۈردىڭىز",
+ "{user} restored {file}" : "{user} ئەسلىگە كەلتۈرۈلگەن {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "سىز {oldfile} (يوشۇرۇن) نى {newfile} (يوشۇرۇن) غا ئۆزگەرتتىڭىز",
+ "You renamed {oldfile} (hidden) to {newfile}" : "سىز {oldfile} (يوشۇرۇن) نى {newfile} غا ئۆزگەرتتىڭىز",
+ "You renamed {oldfile} to {newfile} (hidden)" : "سىز {oldfile} غا {newfile} (يوشۇرۇن) دەپ ئىسىم قويدىڭىز",
+ "You renamed {oldfile} to {newfile}" : "سىز {oldfile} غا {newfile} غا ئۆزگەرتتىڭىز",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} ئۆزگەرتىلگەن {oldfile} (يوشۇرۇن) {newfile} (يوشۇرۇن)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} ئۆزگەرتىلگەن {oldfile} (يوشۇرۇن) {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} ئۆزگەرتىلگەن {oldfile} دىن {newfile} (يوشۇرۇن)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} ئۆزگەرتىلگەن {oldfile} دىن {newfile}",
+ "You moved {oldfile} to {newfile}" : "سىز {oldfile} نى {newfile} غا يۆتكىدىڭىز",
+ "{user} moved {oldfile} to {newfile}" : "{user} {oldfile} نى {newfile} غا يۆتكىدى",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "ھۆججەتلىرىڭىز <strong> ياقتۇرىدىغان </ strong> غا قوشۇلدى ياكى ئۆچۈرۈلدى",
"Files" : "ھۆججەتلەر",
+ "A file or folder has been <strong>changed</strong>" : "ھۆججەت ياكى ھۆججەت قىسقۇچ <strong> ئۆزگەرتىلدى </ strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "ياقتۇرىدىغان ھۆججەت ياكى ھۆججەت قىسقۇچ <strong> ئۆزگەرتىلدى </ strong>",
+ "Failed to authorize" : "ھوقۇق بېرىش مەغلۇب بولدى",
+ "Invalid folder path" : "ھۆججەت قىسقۇچ يولى ئىناۋەتسىز",
+ "Folder not found" : "ھۆججەت قىسقۇچ تېپىلمىدى",
+ "Accept" : "قوبۇل قىلىڭ",
+ "Reject" : "رەت قىلىش",
+ "Incoming ownership transfer from {user}" : "{user} دىن كەلگەن ئىگىدارلىق ھوقۇقىنى يۆتكەش",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "{path} نى قوبۇل قىلامسىز؟\n\nئەسكەرتىش: قوبۇل قىلغاندىن كېيىن يۆتكىلىش جەريانى 1 سائەتكە يېتىشى مۇمكىن.",
+ "Ownership transfer denied" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش رەت قىلىندى",
+ "Your ownership transfer of {path} was denied by {user}." : "{path} نىڭ ئىگىدارلىق ھوقۇقىڭىزنى {user} رەت قىلدى.",
+ "Ownership transfer failed" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش مەغلۇب بولدى",
+ "Your ownership transfer of {path} to {user} failed." : "ئىگىدارلىق ھوقۇقىڭىز {path} دىن {user} غا يۆتكەلدى.",
+ "The ownership transfer of {path} from {user} failed." : "{path} نىڭ {user} دىن ئىگىدارلىق ھوقۇقىنى يۆتكەش مەغلۇب بولدى.",
+ "Ownership transfer done" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش ئېلىپ بېرىلدى",
+ "Your ownership transfer of {path} to {user} has completed." : "ئىگىدارلىق ھوقۇقىڭىزنى {path} دىن {user} غا يۆتكەش تاماملاندى.",
+ "The ownership transfer of {path} from {user} has completed." : "{path} نىڭ {user} دىن ئىگىدارلىق ھوقۇقىنى يۆتكەش تاماملاندى.",
+ "in %s" : "% s",
+ "Transferred from %1$s on %2$s" : "%2 $ s دىكى%1 $ s دىن يۆتكەلدى",
+ "Files compatibility" : "ھۆججەتلەرنىڭ ماسلىشىشچانلىقى",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ھۆججەت نامىنى چەكلەشكە يول قويۇڭ ، ھۆججەتلەرنىڭ بارلىق خېرىدارلار بىلەن ماسقەدەملىنىشىگە كاپالەتلىك قىلىڭ. سۈكۈتتىكى ھالەتتە POSIX (ئىناۋەتلىك Linux ياكى macOS) دىكى بارلىق ھۆججەت ئىسمى رۇخسەت قىلىنىدۇ.",
+ "Enforce Windows compatibility" : "Windows ماسلىشىشچانلىقىنى كۈچەيتىڭ",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "بۇ Windows سىستېمىسىدا كۈچكە ئىگە بولمىغان ھۆججەت نامىنى چەكلەيدۇ ، مەسىلەن زاپاس ئىسىم ياكى ئالاھىدە ھەرپلەرنى ئىشلىتىش دېگەندەك. ئەمما بۇ ئەھۋال سەزگۈرلۈكىنىڭ ماسلىشىشچانلىقىنى ئىجرا قىلمايدۇ.",
+ "File Management" : "ھۆججەت باشقۇرۇش",
"Home" : "ئۆي",
- "Close" : "ياپ",
- "Favorites" : "يىغقۇچ",
- "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.",
- "Uploading..." : "يۈكلەۋاتىدۇ…",
- "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.",
- "Actions" : "مەشغۇلاتلار",
- "Download" : "چۈشۈر",
- "Rename" : "ئات ئۆزگەرت",
- "Delete" : "ئۆچۈر",
- "Unshare" : "ھەمبەھىرلىمە",
+ "Target folder does not exist any more" : "نىشان ھۆججەت قىسقۇچ ئەمدى مەۋجۇت ئەمەس",
+ "Reload current directory" : "نۆۋەتتىكى مۇندەرىجىنى قايتا يۈكلەڭ",
+ "Go to the \"{dir}\" directory" : "\"{dir}\" مۇندەرىجىسىگە كىرىڭ",
+ "Current directory path" : "نۆۋەتتىكى مۇندەرىجە يولى",
+ "Your have used your space quota and cannot upload files anymore" : "بوشلۇق نورمىسىنى ئىشلىتىپ ، ھۆججەتلەرنى ئەمدى يۈكلىيەلمەيسىز",
+ "Drag and drop files here to upload" : "ھۆججەتلەرنى بۇ يەرگە سۆرەپ تاشلاڭ",
+ "Favorite" : "يىغقۇچ",
+ "Back" : "قايتىش",
+ "Toggle selection for file \"{displayName}\"" : "«{displayName}» ھۆججىتىنى تاللاڭ.",
+ "Toggle selection for folder \"{displayName}\"" : "ھۆججەت قىسقۇچنى تاللاش \"{displayName}\"",
+ "File is loading" : "ھۆججەت يۈكلىنىۋاتىدۇ",
+ "Folder is loading" : "ھۆججەت قىسقۇچ يۈكلىنىۋاتىدۇ",
+ "Filename" : "ھۆججەت ئىسمى",
+ "Folder name" : "قىسقۇچ ئاتى",
+ "This node is unavailable" : "بۇ تۈگۈننى ئىشلەتكىلى بولمايدۇ",
+ "Another entry with the same name already exists." : "ئوخشاش ئىسىمدىكى يەنە بىر تۈر بار.",
+ "Invalid filename." : "ئىناۋەتسىز ھۆججەت ئىسمى.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" غا \"{newName}\" غا ئۆزگەرتىلدى",
+ "Rename file" : "ھۆججەتنىڭ نامىنى ئۆزگەرتىش",
+ "Folder" : "قىسقۇچ",
"Pending" : "كۈتۈۋاتىدۇ",
+ "Clear filter" : "سۈزگۈچنى تازىلاش",
+ "Modified" : "ئۆزگەرتكەن",
+ "Search everywhere" : "ھەممە يەردىن ئىزدەڭ",
+ "Type" : "تىپ",
+ "Active filters" : "ئاكتىپ سۈزگۈچ",
+ "Remove filter" : "سۈزگۈچنى ئۆچۈرۈڭ",
+ "Total rows summary" : "ئومۇمىي قۇر خۇلاسىسى",
+ "Toggle selection for all files and folders" : "بارلىق ھۆججەت ۋە ھۆججەت قىسقۇچلارنى تاللاڭ",
"Name" : "ئاتى",
"Size" : "چوڭلۇقى",
- "Modified" : "ئۆزگەرتكەن",
- "New" : "يېڭى",
- "Favorite" : "يىغقۇچ",
- "Folder" : "قىسقۇچ",
+ "Actions" : "مەشغۇلاتلار",
+ "(selected)" : "(تاللانغان)",
+ "List of files and folders." : "ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "Column headers with buttons are sortable." : "كۇنۇپكىلار بار ئىستون ماۋزۇلىرى تەرتىپلىك.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "بۇ تىزىملىك ئىقتىدار سەۋەبىدىن تولۇق كۆرسىتىلمىگەن. ھۆججەتلەر تىزىملىكتىن ئۆتكەندە كۆرسىتىلىدۇ.",
+ "File not found" : "ھۆججەت تېپىلمىدى",
+ "{usedQuotaByte} used" : "{usedQuotaByte} ئىشلىتىلگەن",
+ "{used} of {quota} used" : "{used} {quota} ئىشلىتىلگەن",
+ "{relative}% used" : "{relative}% ئىشلىتىلگەن",
+ "Could not refresh storage stats" : "ساقلاش سانلىق مەلۇماتلىرىنى يېڭىلىيالمىدى",
+ "Your storage is full, files can not be updated or synced anymore!" : "ساقلاش بوشلۇقىڭىز تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Storage information" : "ساقلاش ئۇچۇرى",
+ "Storage quota" : "ساقلاش نورمىسى",
"New folder" : "يېڭى قىسقۇچ",
- "Upload" : "يۈكلە",
- "Save" : "ساقلا",
- "Settings" : "تەڭشەكلەر",
+ "Create new folder" : "يېڭى ھۆججەت قىسقۇچ قۇر",
+ "This name is already in use." : "بۇ ئىسىم ئاللىقاچان ئىشلىتىلىۋاتىدۇ.",
+ "Create" : "قۇر",
+ "Fill template fields" : "قېلىپ بۆلەكلىرىنى تولدۇرۇڭ",
+ "Submit" : "يوللاڭ",
+ "Choose a file or folder to transfer" : "يۆتكەش ئۈچۈن ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Transfer" : "يۆتكەش",
+ "Transfer {path} to {userid}" : "{path} نى {userid} غا يۆتكەڭ",
+ "Invalid path selected" : "ئىناۋەتسىز يول تاللانغان",
+ "Unknown error" : "يوچۇن خاتالىق",
+ "Ownership transfer request sent" : "ئىگىدارلىق ھوقۇقىنى يۆتكەش ئىلتىماسى ئەۋەتىلدى",
+ "Cannot transfer ownership of a file or folder you do not own" : "سىز ئىگە بولمىغان ھۆججەت ياكى ھۆججەت قىسقۇچنىڭ ئىگىدارلىق ھوقۇقىنى يۆتكىگىلى بولمايدۇ",
+ "Transfer ownership of a file or folder" : "ھۆججەت ياكى ھۆججەت قىسقۇچنىڭ ئىگىدارلىق ھوقۇقىنى يۆتكەڭ",
+ "Choose file or folder to transfer" : "يۆتكەش ئۈچۈن ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Change" : "ئۆزگەرتىش",
+ "New owner" : "يېڭى خوجايىن",
+ "Select file or folder to link to" : "ئۇلىنىدىغان ھۆججەت ياكى ھۆججەت قىسقۇچنى تاللاڭ",
+ "Choose {file}" : "{file} نى تاللاڭ",
+ "Share" : "ھەمبەھىرلەش",
+ "Shared by link" : "ئۇلىنىش ئارقىلىق ئورتاقلاشتى",
+ "Shared" : "ئورتاقلاشتى",
+ "Switch to list view" : "تىزىملىك كۆرۈنۈشىگە ئالماشتۇرۇڭ",
+ "Switch to grid view" : "كاتەكچە كۆرۈنۈشكە ئالماشتۇرۇڭ",
+ "Upload was cancelled by user" : "ئىشلەتكۈچى يوللاش ئەمەلدىن قالدۇرۇلدى",
+ "Not enough free space" : "يېتەرلىك بوشلۇق يوق",
+ "Operation is blocked by access control" : "زىيارەتنى كونترول قىلىش ئارقىلىق مەشغۇلات توسۇلۇپ قالىدۇ",
+ "Error during upload: {message}" : "يوللاشتىكى خاتالىق: {message}",
+ "Error during upload, status code {status}" : "يوللاش جەريانىدا خاتالىق ، ھالەت كودى {status}",
+ "Unknown error during upload" : "يوللاش جەريانىدا نامەلۇم خاتالىق",
+ "Loading current folder" : "نۆۋەتتىكى ھۆججەت قىسقۇچنى يۈكلەۋاتىدۇ",
+ "Retry" : "قايتا سىناڭ",
+ "No files in here" : "بۇ يەردە ھۆججەت يوق",
+ "Upload some content or sync with your devices!" : "بەزى مەزمۇنلارنى يۈكلەڭ ياكى ئۈسكۈنىڭىز بىلەن ماسقەدەملەڭ!",
+ "Go back" : "قايتىڭ",
+ "Views" : "كۆرۈنۈشلەر",
+ "Files settings" : "ھۆججەت تەڭشىكى",
+ "Your files" : "ھۆججەتلىرىڭىز",
+ "Open in files" : "ھۆججەتلەرنى ئېچىڭ",
+ "File cannot be accessed" : "ھۆججەتنى زىيارەت قىلغىلى بولمايدۇ",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "ھۆججەت تېپىلمىدى ياكى ئۇنى كۆرۈش ھوقۇقىڭىز يوق. ئەۋەتكۈچىدىن ئورتاقلىشىشنى سوراڭ.",
+ "Clipboard is not available" : "چاپلاش تاختىسى يوق",
+ "General" : "General",
+ "All files" : "بارلىق ھۆججەتلەر",
+ "Personal files" : "شەخسىي ھۆججەتلەر",
+ "Sort favorites first" : "ياقتۇرىدىغانلارنى رەتلەڭ",
+ "Sort folders before files" : "ھۆججەتلەرنى ھۆججەتتىن بۇرۇن تەرتىپلەڭ",
+ "Appearance" : "كۆرۈنۈش",
+ "Show hidden files" : "يوشۇرۇن ھۆججەتلەرنى كۆرسەت",
+ "Crop image previews" : "رەسىمنى ئالدىن كۆرۈش",
+ "Additional settings" : "قوشۇمچە تەڭشەكلەر",
"WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "كۆچۈرۈڭ",
+ "Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى",
+ "File actions" : "ھۆججەت ھەرىكىتى",
+ "Rename" : "ئات ئۆزگەرت",
+ "Delete" : "ئۆچۈر",
+ "Manage tags" : "خەتكۈچلەرنى باشقۇرۇش",
+ "Selection" : "تاللاش",
+ "Deselect all" : "ھەممىنى تاللاڭ",
+ "Navigation" : "يول باشلاش",
+ "View" : "كۆرۈش",
+ "You" : "سەن",
+ "Shared multiple times with different people" : "ئوخشىمىغان كىشىلەر بىلەن كۆپ قېتىم ئورتاقلاشتى",
+ "Error while loading the file data" : "ھۆججەت سانلىق مەلۇماتلىرىنى يۈكلەۋاتقاندا خاتالىق",
+ "Owner" : "ئىگىسى",
+ "Remove from favorites" : "Remove from favorites",
+ "Add to favorites" : "Add to favorites",
+ "Tags" : "بەلگەلەر",
+ "Blank" : "ئوچۇق",
+ "Unable to create new file from template" : "قېلىپتىن يېڭى ھۆججەت قۇرالمىدى",
+ "Pick a template for {name}" : "{name} for نىڭ قېلىپىنى تاللاڭ",
+ "Create a new file with the selected template" : "تاللانغان قېلىپ بىلەن يېڭى ھۆججەت قۇر",
+ "Creating file" : "ھۆججەت قۇرۇش",
+ "Leave this share" : "بۇ ئۈلۈشنى قالدۇرۇڭ",
+ "Leave these shares" : "بۇ پايلارنى قالدۇرۇڭ",
+ "Disconnect storage" : "ساقلاشنى ئۈزۈڭ",
+ "Disconnect storages" : "دۇكانلارنى ئۈزۈڭ",
+ "Delete permanently" : "مەڭگۈلۈك ئۆچۈر",
+ "Delete and unshare" : "ئۆچۈرۈش ۋە ئورتاقلىشىش",
+ "Delete file" : "ھۆججەتنى ئۆچۈرۈڭ",
+ "Delete files" : "ھۆججەتلەرنى ئۆچۈرۈڭ",
+ "Delete folder" : "ھۆججەت قىسقۇچنى ئۆچۈرۈڭ",
+ "Delete folders" : "ھۆججەت قىسقۇچلارنى ئۆچۈرۈڭ",
+ "Confirm deletion" : "ئۆچۈرۈشنى جەزملەشتۈرۈڭ",
+ "Cancel" : "ۋاز كەچ",
+ "Download" : "چۈشۈر",
+ "Moving \"{source}\" to \"{destination}\" …" : "\"{source}\" نى \"{destination}\" غا يۆتكەش…",
+ "Copying \"{source}\" to \"{destination}\" …" : "\"{source}\" نى \"{destination}\" غا كۆچۈرۈش…",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "ھۆججەت ياكى ھۆججەت قىسقۇچنى ئۆزىڭىزگە ياكى تارماق قىسقۇچقا يۆتكىيەلمەيسىز",
+ "(copy)" : "(كۆپەيتىلگەن نۇسخىسى)",
+ "(copy %n)" : "(% n)",
+ "A file or folder with that name already exists in this folder" : "بۇ ھۆججەت قىسقۇچتا بۇ ئىسىم بار ھۆججەت ياكى ھۆججەت قىسقۇچ بار",
+ "The files are locked" : "ھۆججەتلەر قۇلۇپلاندى",
+ "The file does not exist anymore" : "بۇ ھۆججەت ئەمدى مەۋجۇت ئەمەس",
+ "Choose destination" : "مەنزىلنى تاللاڭ",
+ "Copy to {target}" : "{target} غا كۆچۈرۈڭ",
+ "Move to {target}" : "{target} يۆتكەڭ",
+ "Move" : "Move",
+ "Move or copy operation failed" : "يۆتكەش ياكى كۆچۈرۈش مەشغۇلاتى مەغلۇپ بولدى",
+ "Move or copy" : "يۆتكەش ياكى كۆچۈرۈش",
+ "Open folder {displayName}" : "ھۆججەت قىسقۇچ {displayName}",
+ "Open in Files" : "ھۆججەتلەرنى ئېچىڭ",
+ "Open locally" : "يەرلىكتە ئېچىڭ",
+ "Failed to redirect to client" : "خېرىدارغا قايتا نىشانلاش مەغلۇپ بولدى",
+ "Open file locally" : "ھۆججەتنى يەرلىكتە ئېچىڭ",
+ "Details" : "تەپسىلاتى",
+ "View in folder" : "قىسقۇچتا كۆرۈش",
+ "Today" : "بۈگۈن",
+ "Last 7 days" : "ئاخىرقى 7 كۈن",
+ "Last 30 days" : "ئاخىرقى 30 كۈن",
+ "This year ({year})" : "بۇ يىل ({year})",
+ "Last year ({year})" : "ئۆتكەن يىلى ({year})",
+ "Documents" : "ھۆججەتلەر",
+ "Spreadsheets" : "ئېلېكترونلۇق جەدۋەل",
+ "Presentations" : "Presentations",
+ "PDFs" : "PDF",
+ "Folders" : "ھۆججەت قىسقۇچ",
+ "Audio" : "Audio",
+ "Images" : "سۈرەتلەر",
+ "Videos" : "سىنلار",
+ "Created new folder \"{name}\"" : "يېڭى ھۆججەت قىسقۇچ \"{name}\" قۇرۇلدى",
+ "Unable to initialize the templates directory" : "قېلىپ مۇندەرىجىسىنى قوزغىتالمىدى",
+ "Create templates folder" : "قېلىپ ھۆججەت قىسقۇچى قۇرۇش",
+ "Templates" : "قېلىپلار",
+ "New template folder" : "يېڭى قېلىپ ھۆججەت قىسقۇچى",
+ "In folder" : "ھۆججەت قىسقۇچتا",
+ "Search in folder: {folder}" : "ھۆججەت قىسقۇچتىن ئىزدەش: {folder} قىسقۇچ}",
+ "One of the dropped files could not be processed" : "تاشلانغان ھۆججەتلەرنىڭ بىرىنى بىر تەرەپ قىلالمىدى",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "توركۆرگۈڭىز Filesystem API نى قوللىمايدۇ. مۇندەرىجە يۈكلەنمەيدۇ",
+ "No files to upload" : "يۈكلەيدىغان ھۆججەت يوق",
+ "Unable to create the directory {directory}" : "مۇندەرىجە {directory} قۇرالمىدى",
+ "Some files could not be uploaded" : "بەزى ھۆججەتلەرنى يۈكلەشكە بولمىدى",
+ "Files uploaded successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك يۈكلەندى",
+ "No files to process" : "بىر تەرەپ قىلىدىغان ھۆججەت يوق",
+ "Some files could not be copied" : "بەزى ھۆججەتلەرنى كۆچۈرگىلى بولمىدى",
+ "Some files could not be moved" : "بەزى ھۆججەتلەرنى يۆتكىگىلى بولمىدى",
+ "Files copied successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك كۆچۈرۈلدى",
+ "Files moved successfully" : "ھۆججەتلەر مۇۋەپپەقىيەتلىك يۆتكەلدى",
+ "Conflicts resolution skipped" : "زىددىيەتنىڭ ھەل قىلىنىشى ئاتلاپ كەتتى",
+ "Upload cancelled" : "يۈكلەش ئەمەلدىن قالدۇرۇلدى",
+ "Could not rename \"{oldName}\", it does not exist any more" : "\"{oldName}\" نىڭ نامىنى ئۆزگەرتەلمىدى ، ئۇ ئەمدى مەۋجۇت ئەمەس",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{dir}\" ھۆججەت قىسقۇچىدا \"{newName}\" ئىسمى ئاللىبۇرۇن ئىشلىتىلگەن. باشقا ئىسىمنى تاللاڭ.",
+ "Could not rename \"{oldName}\"" : "\"{oldName}\" نىڭ نامىنى ئۆزگەرتەلمىدى",
+ "This operation is forbidden" : "بۇ مەشغۇلات مەنئى قىلىنىدۇ",
+ "Storage is temporarily not available" : "ساقلاش ۋاقتىنى ۋاقىتلىق ئىشلەتكىلى بولمايدۇ",
+ "Unexpected error: {error}" : "ئويلىمىغان خاتالىق: {error}",
+ "Filename must not be empty." : "ھۆججەت ئىسمى بوش بولماسلىقى كېرەك.",
+ "\"{char}\" is not allowed inside a filename." : "ھۆججەت نامىدا \"{char}\" رۇخسەت قىلىنمايدۇ.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" زاپاس ئىسىم بولۇپ ، ھۆججەت نامىغا رۇخسەت قىلىنمايدۇ.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" رۇخسەت قىلىنغان ھۆججەت تىپى ئەمەس.",
+ "Filenames must not end with \"{extension}\"." : "ھۆججەت ئىسمى «{extension}» بىلەن ئاخىرلاشماسلىقى كېرەك.",
+ "List of favorite files and folders." : "ياقتۇرىدىغان ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "No favorites yet" : "ياقتۇرىدىغانلار تېخى يوق",
+ "Files and folders you mark as favorite will show up here" : "سىز ياقتۇرىدىغان ھۆججەت ۋە ھۆججەت قىسقۇچلار بۇ يەردە كۆرۈنىدۇ",
+ "List of your files and folders." : "ھۆججەت ۋە ھۆججەت قىسقۇچلىرىڭىزنىڭ تىزىملىكى.",
+ "List of your files and folders that are not shared." : "ئورتاقلاشمىغان ھۆججەت ۋە ھۆججەت قىسقۇچلىرىڭىزنىڭ تىزىملىكى.",
+ "No personal files found" : "شەخسىي ھۆججەت تېپىلمىدى",
+ "Files that are not shared will show up here." : "ئورتاقلاشمىغان ھۆججەتلەر بۇ يەردە كۆرۈنىدۇ.",
+ "Recent" : "يېقىنقى",
+ "List of recently modified files and folders." : "يېقىندا ئۆزگەرتىلگەن ھۆججەت ۋە ھۆججەت قىسقۇچلارنىڭ تىزىملىكى.",
+ "No recently modified files" : "يېقىندا ئۆزگەرتىلگەن ھۆججەت يوق",
+ "Files and folders you recently modified will show up here." : "سىز يېقىندا ئۆزگەرتكەن ھۆججەت ۋە ھۆججەت قىسقۇچلار بۇ يەردە كۆرۈنىدۇ.",
+ "Search" : "ئىزدەش",
+ "No entries found in this folder" : "بۇ ھۆججەت قىسقۇچتا ھېچقانداق مەزمۇن تېپىلمىدى",
+ "Select all" : "ھەممىنى تاللاڭ",
"Upload too large" : "يۈكلەندىغىنى بەك چوڭ",
- "Text file" : "تېكىست ھۆججەت"
-},"pluralForm" :"nplurals=1; plural=0;"
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "سىز يۈكلىمەكچى بولغان ھۆججەتلەر بۇ مۇلازىمېتىردا ھۆججەت يوللاشنىڭ ئەڭ چوڭ چوڭلۇقىدىن ئېشىپ كەتتى.",
+ "File could not be found" : "ھۆججەت تېپىلمىدى",
+ "Show list view" : "تىزىملىك كۆرۈنۈشىنى كۆرسىتىش",
+ "Show grid view" : "كاتەكچە كۆرۈنۈشنى كۆرسىتىش",
+ "Close" : "ياپ",
+ "Could not create folder \"{dir}\"" : "\"{dir}\" ھۆججەت قىسقۇچى قۇرالمىدى",
+ "This will stop your current uploads." : "بۇ سىزنىڭ نۆۋەتتىكى يۈكلىنىشىڭىزنى توختىتىدۇ.",
+ "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.",
+ "Processing files …" : "ھۆججەتلەرنى بىر تەرەپ قىلىش…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "مۇندەرىجە ياكى 0 بايىت بولغانلىقى ئۈچۈن {filename} نامىنى يۈكلىيەلمىدى",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "يېتەرلىك بوشلۇق يوق ، سىز {size1} نى يۈكلەۋاتىسىز ، ئەمما پەقەت {size2} قالدى",
+ "Target folder \"{dir}\" does not exist any more" : "نىشان ھۆججەت قىسقۇچ \"{dir}\" ئەمدى مەۋجۇت ئەمەس",
+ "An unknown error has occurred" : "نامەلۇم خاتالىق كۆرۈلدى",
+ "File could not be uploaded" : "ھۆججەت يۈكلەشكە بولمىدى",
+ "Uploading …" : "يۈكلەش…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber} / {total})",
+ "Uploading … ({currentNumber}/{total})" : "يۈكلەش… ({currentNumber} / {total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "ئۇ نەرسىنى يۈكلەشنى قوللىمايدۇ",
+ "Error when assembling chunks, status code {status}" : "پارچىلارنى قۇرغاندا خاتالىق ، ھالەت كودى {status}",
+ "Choose target folder" : "نىشان ھۆججەت قىسقۇچىنى تاللاڭ",
+ "Set reminder" : "ئەسكەرتىش بەلگىلەڭ",
+ "Edit locally" : "يەرلىكتە تەھرىرلەڭ",
+ "Open" : "ئېچىڭ",
+ "Could not load info for file \"{file}\"" : "\"{file}\" ھۆججىتىگە ئۇچۇر يۈكلىيەلمىدى",
+ "Please select tag(s) to add to the selection" : "تاللاشقا قوشۇش ئۈچۈن بەلگە (لەرنى) تاللاڭ",
+ "Apply tag(s) to selection" : "تاللاشقا بەلگە (لەر) نى ئىشلىتىڭ",
+ "Select directory \"{dirName}\"" : "مۇندەرىجە \"{dirName}\" نى تاللاڭ",
+ "Select file \"{fileName}\"" : "ھۆججەت \"{fileName}\" نى تاللاڭ",
+ "Unable to determine date" : "چېسلانى بەلگىلىيەلمىدى",
+ "This directory is unavailable, please check the logs or contact the administrator" : "بۇ مۇندەرىجىنى ئىشلەتكىلى بولمايدۇ ، خاتىرىلەرنى تەكشۈرۈپ بېقىڭ ياكى باشقۇرغۇچى بىلەن ئالاقىلىشىڭ",
+ "Could not move \"{file}\", target exists" : "\"{file}\" نى يۆتكىگىلى بولمىدى ، نىشان مەۋجۇت",
+ "Could not move \"{file}\"" : "\"{file}\" نى يۆتكىگىلى بولمىدى",
+ "copy" : "كۆپەيتىلگەن",
+ "Could not copy \"{file}\", target exists" : "\"{file}\" نى كۆچۈرەلمىدى ، نىشان مەۋجۇت",
+ "Could not copy \"{file}\"" : "\"{file}\" نى كۆچۈرەلمىدى",
+ "Copied {origin} inside {destination}" : "كۆچۈرۈلگەن {origin} ئىچىدىكى {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ئىچىدىكى {destination} ۋە {nbfiles} باشقا ھۆججەتلەر كۆچۈرۈلگەن",
+ "{newName} already exists" : "{newName} مەۋجۇت",
+ "Could not create file \"{file}\"" : "\"{file}\" ھۆججىتىنى قۇرالمىدى",
+ "Could not create file \"{file}\" because it already exists" : "«{file}» ھۆججىتىنى قۇرالمىدى ، چۈنكى ئۇ مەۋجۇت",
+ "Could not create folder \"{dir}\" because it already exists" : "«{dir}» ھۆججەت قىسقۇچى قۇرالمىدى ، چۈنكى ئۇ مەۋجۇت",
+ "Could not fetch file details \"{file}\"" : "ھۆججەت تەپسىلاتلىرىنى \"{file}\" غا ئېرىشەلمىدى",
+ "Error deleting file \"{fileName}\"." : "\"{fileName}\" ھۆججىتىنى ئۆچۈرۈشتە خاتالىق.",
+ "No search results in other folders for {tag}{filter}{endtag}" : "باشقا ھۆججەت قىسقۇچلاردا {tag} {filter} {endtag} دىن ئىزدەش نەتىجىسى يوق",
+ "Enter more than two characters to search in other folders" : "باشقا ھۆججەت قىسقۇچلاردىن ئىزدەش ئۈچۈن ئىككىدىن ئارتۇق ھەرپ كىرگۈزۈڭ",
+ "{dirs} and {files}" : "{dirs} ۋە {files}",
+ "You do not have permission to upload or create files here" : "بۇ يەرگە ھۆججەت يوللاش ياكى قۇرۇش ھوقۇقىڭىز يوق",
+ "New" : "يېڭى",
+ "New file/folder menu" : "يېڭى ھۆججەت / ھۆججەت قىسقۇچ تىزىملىكى",
+ "Select file range" : "ھۆججەت دائىرىسىنى تاللاڭ",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} ئىشلىتىلگەن",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ئىناۋەتسىز ھۆججەت ئىسمى.",
+ "File name cannot be empty." : "ھۆججەت ئىسمى قۇرۇق بولمايدۇ.",
+ "\"/\" is not allowed inside a file name." : "ھۆججەت نامىدا \"/\" رۇخسەت قىلىنمايدۇ.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" رۇخسەت قىلىنغان ھۆججەت شەكلى ئەمەس",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} نىڭ ساقلاش بوشلۇقى تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "گۇرۇپپا قىسقۇچ \"{mountPoint}\" تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "سىرتقى ساقلاش \"{mountPoint}\" تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "ساقلاش بوشلۇقىڭىز تولۇق ، ھۆججەتلەرنى يېڭىلاشقا ياكى ماسقەدەملەشكە بولمايدۇ!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} نىڭ ساقلاش بوشلۇقى تولۇق ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "گۇرۇپپا قىسقۇچ \"{mountPoint}\" ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "سىرتقى ساقلاش \"{mountPoint}\" ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "ساقلاش بوشلۇقىڭىز ئاساسەن دېگۈدەك تولۇق ({usedSpacePercent}%).",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "بىۋاسىتە ئۇلىنىش كۆچۈرۈلدى (پەقەت بۇ ھۆججەت / ھۆججەت قىسقۇچنى زىيارەت قىلىدىغان كىشىلەر ئۈچۈن ئىشلەيدۇ)",
+ "Path" : "Path",
+ "Favored" : "ياخشى كۆرىدۇ",
+ "Favor" : "ياق",
+ "Copy direct link (only works for people who have access to this file/folder)" : "بىۋاسىتە ئۇلىنىشنى كۆچۈرۈڭ (پەقەت بۇ ھۆججەت / ھۆججەت قىسقۇچنى زىيارەت قىلالايدىغان كىشىلەر ئۈچۈن ئىشلەيدۇ)",
+ "Upload file" : "Upload file",
+ "Not favored" : "ياقتۇرمايدۇ",
+ "An error occurred while trying to update the tags" : "خەتكۈچلەرنى يېڭىلىماقچى بولغاندا خاتالىق كۆرۈلدى",
+ "Upload (max. %s)" : "يۈكلەش (max.% S)",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" ھەرىكىتى مۇۋەپپەقىيەتلىك ئىجرا قىلىندى",
+ "\"{displayName}\" action failed" : "\"{displayName}\" ھەرىكىتى مەغلۇپ بولدى",
+ "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" تۈركۈمدىكى ھەرىكەت مۇۋەپپەقىيەتلىك ئىجرا قىلىندى",
+ "Submitting fields…" : "يول يوللاش…",
+ "Filter filenames…" : "ھۆججەت نامىنى سۈزۈڭ…",
+ "WebDAV URL copied to clipboard" : "WebDAV URL چاپلاش تاختىسىغا كۆچۈرۈلدى",
+ "Enable the grid view" : "كاتەكچە كۆرۈنۈشىنى قوزغىتىڭ",
+ "Enable folder tree" : "ھۆججەت قىسقۇچنى قوزغىتىڭ",
+ "Copy to clipboard" : "چاپلاش تاختىسىغا كۆچۈرۈڭ",
+ "Use this address to access your Files via WebDAV" : "بۇ ئادرېسنى ئىشلىتىپ WebDAV ئارقىلىق ھۆججەتلىرىڭىزنى زىيارەت قىلىڭ",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "ئەگەر سىز 2FA نى قوزغىتىپ قويغان بولسىڭىز ، بۇ يەرنى چېكىپ چوقۇم يېڭى ئەپ پارولى قۇرالايسىز ۋە ئىشلىتىڭ.",
+ "Deletion cancelled" : "ئۆچۈرۈش ئەمەلدىن قالدۇرۇلدى",
+ "Move cancelled" : "يۆتكەش ئەمەلدىن قالدۇرۇلدى",
+ "Cancelled move or copy of \"{filename}\"." : "«{filename} ئىسمى}» نىڭ يۆتكىلىشى ياكى كۆپەيتىلگەن نۇسخىسى.",
+ "Cancelled move or copy operation" : "يۆتكەش ياكى كۆچۈرۈش مەشغۇلاتى ئەمەلدىن قالدۇرۇلدى",
+ "Open details" : "تەپسىلاتلارنى ئېچىڭ",
+ "Photos and images" : "رەسىم ۋە رەسىم",
+ "New folder creation cancelled" : "يېڭى ھۆججەت قىسقۇچ قۇرۇش ئەمەلدىن قالدۇرۇلدى",
+ "{fileCount} files and {folderCount} folders" : "{fileCount} ھۆججەتلىرى ۋە {folderCount} ھۆججەت قىسقۇچلىرى",
+ "All folders" : "بارلىق ھۆججەت قىسقۇچلار",
+ "Personal Files" : "شەخسىي ھۆججەتلەر",
+ "Text file" : "تېكىست ھۆججەت",
+ "New text file.txt" : "يېڭى تېكىست ھۆججىتى. Txt"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index 7ab56fa937a..806bf1ed94d 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -1,188 +1,502 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "Сховище тимчасово недоступне",
- "Storage invalid" : "Невірне сховище",
+ "Added to favorites" : "Додано зірочку",
+ "Removed from favorites" : "Вилучено зірочку",
+ "You added {file} to your favorites" : "Ви додали зірочку для {file}",
+ "You removed {file} from your favorites" : "Ви прибрали зірочку для {file}",
+ "Favorites" : "Із зірочкою",
+ "File changes" : "Зміни у файлах",
+ "Created by {user}" : "Створено користувачем {user}",
+ "Changed by {user}" : "Змінено користувачем {user}",
+ "Deleted by {user}" : "Вилучено користувачем {user}",
+ "Restored by {user}" : "Відновлено користувачем {user}",
+ "Renamed by {user}" : "Перейменовано користувачем {user}",
+ "Moved by {user}" : "Переміщено користувачем {user}",
+ "\"remote account\"" : "\"віддалений обліковий запис\"",
+ "You created {file}" : "Ви створили {file}",
+ "You created an encrypted file in {file}" : "Ви створили зашифрований файл у {file}",
+ "{user} created {file}" : "{user} створив(-ла) файл {file}",
+ "{user} created an encrypted file in {file}" : "{user} створив(-ла) зашифрований файл у {file}",
+ "{file} was created in a public folder" : "Файл {file} створено у публічному каталозі",
+ "You changed {file}" : "Ви змінили файл {file}",
+ "You changed an encrypted file in {file}" : "Ви змінили зашифрований файл у {file}",
+ "{user} changed {file}" : "{user} змінив(-ла) файл {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змінив(-ла) зашифрований файл {file}",
+ "You deleted {file}" : "Ви вилучили {file}",
+ "You deleted an encrypted file in {file}" : "Ви вилучити зашифрований файл у {file}",
+ "{user} deleted {file}" : "{user} вилучив(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} вилучив зашифрований файл у {file}",
+ "You restored {file}" : "Ви відновили {file}",
+ "{user} restored {file}" : "{user} відновив(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Ви перейменували файл {oldfile} (прихований) на {newfile} (прихований)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Ви перейменували файл {oldfile} (прихований) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Ви перейменували файл {oldfile} на {newfile} (прихований)",
+ "You renamed {oldfile} to {newfile}" : "Ви перейменували файл {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перейменував {oldfile} (прихований) у {newfile} (прихований)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перейменував {oldfile} (прихований) у {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перейменував {oldfile} у {newfile} (прихований)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перейменував(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Ви перемістили {oldfile} до {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перемістив(-ла) {oldfile} до {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл було додано або вилучено з ваших документів <strong>із зірочкою</strong>",
+ "Files" : "Файли",
+ "A file or folder has been <strong>changed</strong>" : "Файл або каталог було <strong> змінено </strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Файл або каталог із зірочкою було <strong>змінено</strong>",
+ "Failed to authorize" : "Не вдалося авторизуватися",
+ "Invalid folder path" : "Недійсний шлях до каталогу",
+ "Folder not found" : "Каталог не знайдено",
+ "The file cannot be found" : "Цей файл неможливо знайти",
+ "The destination path does not exist: %1$s" : "Шлях призначення відсутній: %1$s",
+ "You do not have permission to create a file at the specified location" : "У вас відсутні права на створення файлу у визначеному розташуванні",
+ "The file could not be converted." : "Файл неможливо конвертувати",
+ "Could not get relative path to converted file" : "Не вдалося отримати відносний шлях до сконвертованого файлу",
+ "Favorite files" : "Файли із зіркою",
+ "No favorites" : "Немає улюблених",
+ "More favorites" : "Ще файли із зіркою",
+ "Accept" : "Прийняти",
+ "Reject" : "Відхилити",
+ "Incoming ownership transfer from {user}" : "Запит від користувача {user} на передавання прав власника",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Прийняти {path}?\n\nУвага: Процес передавання після прийняття запиту може тривати до 1 години.",
+ "Ownership transfer denied" : "Перенесення прав власності відхилено",
+ "Your ownership transfer of {path} was denied by {user}." : "Перенесення прав на ваші дані {path} відхилено користувачем {user}.",
+ "Ownership transfer failed" : "Не вдалося передати право власності",
+ "Your ownership transfer of {path} to {user} failed." : "Не вдалося перадати ваші права власника на {path} користувачеві {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Не вдалося передати права власника на {path} від користувача {user}.",
+ "Ownership transfer done" : "Право власності передано",
+ "Your ownership transfer of {path} to {user} has completed." : "Ваші права власника на {path} успішно передано користувачеві {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Завершено передавання права власника на {path} від користувача {user}.",
+ "in %s" : "в %s",
+ "Transferred from %1$s on %2$s" : "Перенесено від %1$s до %2$s",
+ "Files compatibility" : "Сумісність файлів",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозволити обмежувати імена файлів для забезпечення сумісності з різними клієнтами. Типово всі імена файлів, які відповідають моделі POSIX (напр., Linux, macOS), дозволені.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Також можлива автоматична міграція файлів після увімкнення цих налаштувань. Ознайомтеся з документацією відповідної команди occ.",
+ "Enforce Windows compatibility" : "Увімкнути сумісність із Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Це унеможливить використання імен файлів, які не сумісні з системами Windows, напр., використанння зарезервованих імен або спеціальних символів. Зауважте, що це не обмежить сумісність за регістром символів.",
+ "File Management" : "Керування файлами",
+ "Home" : "Домівка",
+ "Target folder does not exist any more" : "Каталог призначення більше не дійсний",
+ "Reload current directory" : "Перезавантажити поточний каталог",
+ "Go to the \"{dir}\" directory" : "Перейти до каталогу \"{dir}\"",
+ "Current directory path" : "Шлях до поточного каталогу",
+ "Your have used your space quota and cannot upload files anymore" : "Ви вже використали квоту на місце та не можете завантажувати файли",
+ "You do not have permission to upload or create files here." : "У вас відсутній дозвіл завантажувати або створювати тут файли.",
+ "Drag and drop files here to upload" : "Перетягніть файли сюди для завантаження",
+ "Favorite" : "Додати зірочку",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Перемкнути вибір для файлу \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Перемкнути вибір для каталогу \"{displayName}\"",
+ "File is loading" : "Завантаження файлу",
+ "Folder is loading" : "Завантаження каталогу",
+ "Filename" : "Ім'я файлу",
+ "Folder name" : "Назва каталогу",
+ "This node is unavailable" : "Цей вузол не доступний",
+ "Another entry with the same name already exists." : "Інший запис з таким же ім'ям вже присутній",
+ "Invalid filename." : "Недійсне ім'я файлу.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Перейменовано \"{oldName}\" на \"{newName}\"",
+ "Rename file" : "Перейменувати файл",
+ "Folder" : "Каталог",
+ "Unknown file type" : "Невідомий тип файлу",
+ "{ext} image" : "{ext} зображення",
+ "{ext} video" : "{ext} відео",
+ "{ext} audio" : "{ext} аудіо",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "Очікування",
+ "Unknown date" : "Невідома дата",
+ "Clear filter" : "Очистити фільтр",
+ "Modified" : "Змінено",
+ "Search everywhere" : "Шукати всюди",
+ "Type" : "Тип",
+ "Active filters" : "Активні фільтри",
+ "Remove filter" : "Вилучити фільтр",
+ "Total rows summary" : "Загалом рядків",
+ "Toggle selection for all files and folders" : "Перемкнути вибір для всіх файлів та каталогів",
+ "Name" : "Ім'я",
+ "File type" : "Тип файлу",
+ "Size" : "Розмір",
+ "{displayName}: failed on some elements" : "{displayName}: не вдалося виконати деякі елементи",
+ "{displayName}: done" : "{displayName}: готово",
+ "{displayName}: failed" : "{displayName}: не вдалося",
+ "Actions" : "Дії",
+ "(selected)" : "(вибрано)",
+ "List of files and folders." : "Список файлів та каталогів",
+ "You have used your space quota and cannot upload files anymore." : "Ви вже використали ліміт сховища та більше не зможете завантажувати файли.",
+ "Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
+ "File not found" : "Файл не знайдено",
+ "_{count} selected_::_{count} selected_" : ["Вибрано {count}","Вибрано {count}","Вибрано {count} ","Вибрано {count} "],
+ "Search everywhere …" : "Шукати всюди ...",
+ "Search here …" : "Шукати тут …",
+ "Search scope options" : "Визначити місце пошуку",
+ "Search here" : "Шукати тут",
+ "{usedQuotaByte} used" : "{usedQuotaByte} використано",
+ "{used} of {quota} used" : "Використано {used} із {quota}",
+ "{relative}% used" : "{relative}% використано",
+ "Could not refresh storage stats" : "Неможливо оновити статистику сховища",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані!",
+ "Storage information" : "Інформація про сховище",
+ "Storage quota" : "Квота сховища",
+ "New folder" : "Новий каталог",
+ "Create new folder" : "Створити новий каталог",
+ "This name is already in use." : "Це ім'я вже використовується",
+ "Create" : "Створити",
+ "Files starting with a dot are hidden by default" : "Файли, що починаються з крапки, типово приховано",
+ "Fill template fields" : "Заповнити поля шаблону",
+ "Submitting fields …" : "Надсилання полів ...",
+ "Submit" : "Відправити",
+ "Choose a file or folder to transfer" : "Виберіть файл або каталог",
+ "Transfer" : "Передати",
+ "Transfer {path} to {userid}" : "Передати {path} користувачеві {userid}",
+ "Invalid path selected" : "Вибрано неправильний шлях",
"Unknown error" : "Невідома помилка",
- "File could not be found" : "Неможливо знайти файл",
- "Move or copy" : "Перенести або копіювати",
- "Download" : "Завантажити",
+ "Ownership transfer request sent" : "Запит на передавання прав власника надіслано",
+ "Cannot transfer ownership of a file or folder you do not own" : "Неможливо передати права власності на файл або каталог, якими ви не володієте",
+ "Transfer ownership of a file or folder" : "Передавання прав власника на файл або каталог",
+ "Choose file or folder to transfer" : "Виберіть цільовий файл або каталог",
+ "Change" : "Змінити",
+ "New owner" : "Новий власник",
+ "Keep {old}" : "Зберегти {old}",
+ "Keep without extension" : "Зберегти без розширення",
+ "Use {new}" : "Використовувати {new}",
+ "Remove extension" : "Вилучити розширення файлу",
+ "Change file extension" : "Змінити розширення файлу",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Заміна розширення файлу з \"{old}\" на \"{new}\" може зробити файл недоступним.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Вилучення розширення файлу \"{old}\" може зробити файл недоступним.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Додавання розширення до файлу \"{new}\" може зробити файл недоступним.",
+ "Do not show this dialog again." : "Не показувати цей діялог подалі.",
+ "Select file or folder to link to" : "Виберіть файл або каталог, до якого потрібно застосувати посилання",
+ "Choose {file}" : "Виберіть {file}",
+ "Share" : "Поширити",
+ "Shared by link" : "Доступ за посиланням",
+ "Shared" : "Спільне",
+ "Switch to list view" : "У вигляді списку",
+ "Switch to grid view" : "У вигляді сітки",
+ "The file could not be found" : "Неможливо знайти файл",
+ "Upload was cancelled by user" : "Завантаження скасовано користувачем",
+ "Not enough free space" : "Недостатньо вільного місця",
+ "Operation is blocked by access control" : "Операцію заблоковано через контроль доступу",
+ "Error during upload: {message}" : "Помилка під час завантаження: {message}",
+ "Error during upload, status code {status}" : "Помилка під час завантаження, код стану {status}",
+ "Unknown error during upload" : "Невідома помилка під час завантаження",
+ "Loading current folder" : "Отримання поточного каталогу",
+ "Retry" : "Ще раз",
+ "No files in here" : "Тут немає файлів",
+ "Upload some content or sync with your devices!" : "Завантажте вміст або синхронізуйтеся з вашими пристроями!",
+ "Go back" : "Повернутися назад",
+ "Views" : "Подання",
+ "Files settings" : "Налаштування",
+ "Your files" : "Ваші файли",
+ "Open in files" : "Відкрити у файлах",
+ "File cannot be accessed" : "Неможливо отримати доступ до файлу",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Не вдалося знайти файл або у вас відсутній дозвіл на перегляд файлу. Попросіть поділитися цим файлом.",
+ "No search results for “{query}”" : "Відсутні результати для \"{query}\"",
+ "Search for files" : "Шукати файли",
+ "Clipboard is not available" : "Буфер обміну недоступний",
+ "WebDAV URL copied" : "URL-адреса WebDAV скопійована",
+ "General" : "Загальне",
+ "Default view" : "Типовий вигляд",
+ "All files" : "Усі файли",
+ "Personal files" : "Мої документи",
+ "Sort favorites first" : "Спочатку показувати із зірочкою",
+ "Sort folders before files" : "Показувати каталоги перед файлами",
+ "Folder tree" : "Дерево каталогів",
+ "Appearance" : "Вигляд",
+ "Show hidden files" : "Показувати приховані файли",
+ "Show file type column" : "Показувати стовпець з типом файлу",
+ "Show file extensions" : "Show file extensions",
+ "Crop image previews" : "Попередній перегляд перед кадруванням",
+ "Additional settings" : "Додатково",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адреса WebDAV",
+ "Copy" : "Копіювати",
+ "How to access files using WebDAV" : "Як отримати доступ до файлів за допомогою WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашого облікового запису увімкнено двофакторну авторизацію, таким чином вам потрібно буде використовувати пароль для застосунку для з'єднання із зовнішнім клієнтом WebDAV.",
+ "Warnings" : "Застереження",
+ "Warn before changing a file extension" : "Попереджати перед зміною розширення файлу",
+ "Warn before deleting files" : "Попереджати перед видаленням файлів",
+ "Keyboard shortcuts" : "Скорочення",
+ "File actions" : "Дії з файлами",
+ "Rename" : "Перейменувати",
"Delete" : "Вилучити",
- "Home" : "Домівка",
+ "Add or remove favorite" : "Додати або видалити з улюблених",
+ "Manage tags" : "Керування мітками",
+ "Selection" : "Вибір",
+ "Select all files" : "Вибрати всі файли",
+ "Deselect all" : "Зняти всі мітки",
+ "Select or deselect" : "Вибрати або скасувати вибір",
+ "Select a range" : "Виберіть діапазон",
+ "Navigation" : "Навігація",
+ "Go to parent folder" : "Перейти до батьківської папки",
+ "Go to file above" : "Перейти до файлу вище",
+ "Go to file below" : "Перейти до файлу нижче",
+ "Go left in grid" : "Перейти ліворуч у сітці",
+ "Go right in grid" : "Перейти праворуч у сітці",
+ "View" : "Подання",
+ "Toggle grid view" : "Перемкнути подання сіткою",
+ "Open file sidebar" : "Відкрити бічну панель файлів",
+ "Show those shortcuts" : "Показувати ці скорочення",
+ "You" : "Ви",
+ "Shared multiple times with different people" : "Поділилися кілька разів з різними людьми",
+ "Unable to change the favorite state of the file" : "Неможливо змінити статус вподобаного файлу",
+ "Error while loading the file data" : "Помилка під час отримання даних щодо файлу",
+ "Owner" : "Власник",
+ "Remove from favorites" : "Прибрати зірочку",
+ "Add to favorites" : "Додати зірочку",
+ "Tags" : "Мітки",
+ "Blank" : "Порожньо",
+ "Unable to create new file from template" : "Неможливо створити новий файл з шаблону",
+ "Pick a template for {name}" : "Вибрати шаблон для {name}",
+ "Create a new file with the selected template" : "Створити новий файл на основі вибраного шаблону",
+ "Creating file" : "Створення файлу",
+ "Save as {displayName}" : "Зберегти як {displayName}",
+ "Save as …" : "Зберегти як ...",
+ "Converting files …" : "Конвертування файлів ...",
+ "Failed to convert files: {message}" : "Не вдалося конвертувати файли: {message}",
+ "All files failed to be converted" : "Не вдалося конвертувати жодний файл",
+ "One file could not be converted: {message}" : "Неможливо конвертувати один файл: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Неможливо конвертувати 1 файл","Неможливо конвертувати %n файли","Неможливо конвертувати %n файлів","Неможливо конвертувати %n файлів"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Успішно конвертовано 1 файл","Успішно конвертовано %n файли","Успішно конвертовано %n файлів","Успішно конвертовано %n файлів"],
+ "Files successfully converted" : "Файли успішно конвертовано",
+ "Failed to convert files" : "Не вдалося конвертувати файли",
+ "Converting file …" : "Конвертування файлу ...",
+ "File successfully converted" : "Файл успішно конвертовано",
+ "Failed to convert file: {message}" : "Не вдалося конвертувати файл: {message}",
+ "Failed to convert file" : "Не вдалося конвертувати файл",
+ "Leave this share" : "Вийти зі спільного доступу",
+ "Leave these shares" : "Вийти зі спільного доступу",
+ "Disconnect storage" : "Від’єднати сховище",
+ "Disconnect storages" : "Від'єднати сховища",
+ "Delete permanently" : "Вилучити назавжди",
+ "Delete and unshare" : "Вилучити та прибрати спільний доступ",
+ "Delete file" : "Вилучити файл",
+ "Delete files" : "Вилучити файли",
+ "Delete folder" : "Вилучити каталог",
+ "Delete folders" : "Вилучити каталоги",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Ви намагаєтеся назавжли вилучити {count} ресурс","Ви намагаєтеся назавжли вилучити {count} ресурси","Ви намагаєтеся назавжли вилучити {count} ресурсів","Ви намагаєтеся назавжли вилучити {count} ресурсів"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Ви намагаєтеся вилучити {count} ресурс","Ви намагаєтеся вилучити {count} ресурси","Ви намагаєтеся вилучити {count} ресурсів","Ви намагаєтеся вилучити {count} ресурсів"],
+ "Confirm deletion" : "Підтвердіть вилучення",
+ "Cancel" : "Скасувати",
+ "Download" : "Звантажити",
+ "Moving \"{source}\" to \"{destination}\" …" : "Переміщення \"{source}\" до \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Копіювання \"{source}\" до \"{destination}\" …",
+ "Destination is not a folder" : "Місце призначення не є каталогом",
+ "This file/folder is already in that directory" : "Такий файл чи каталог вже присутні в цьому каталозі",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Неможливо перемістити файл чи каталог до самого себе або у цей саме підкаталог",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "A file or folder with that name already exists in this folder" : "Файл чи каталог з таким ім'ям вже присутній в цьому каталозі",
+ "The files are locked" : "Файли заблоковано",
+ "The file does not exist anymore" : "Цей файл більше недоступний",
+ "Choose destination" : "Виберіть каталог призначення",
+ "Copy to {target}" : "Копіювати до {target}",
+ "Move to {target}" : "Перемістити до {target}",
+ "Move" : "Перемістити",
+ "Move or copy operation failed" : "Не вдалося скопіювати або перемістити",
+ "Move or copy" : "Перемістити або копіювати",
+ "Open folder {displayName}" : "Відкрити каталог {displayName}",
+ "Open in Files" : "Відкрити у Файлах",
+ "Open locally" : "Відкрити локально",
+ "Failed to redirect to client" : "Не вдалося перенаправити на клієнта",
+ "Open file locally" : "Відкрити файл локально",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Тепер файл можна відкрити на вашому пристрої. Якщо він не відкривається, перевірте, що у вас встановлено настільний клієнт синхронізації.",
+ "Retry and close" : "Спробувати ще раз",
+ "Open online" : "Відкрити віддалено",
+ "Details" : "Деталі",
+ "View in folder" : "Переглянути у каталозі",
+ "Today" : "Сьогодні",
+ "Last 7 days" : "За останні 7 днів",
+ "Last 30 days" : "За останні 30 днів",
+ "This year ({year})" : "Цього року ({year})",
+ "Last year ({year})" : "Минулого року ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Електронні таблиці",
+ "Presentations" : "Презентації",
+ "PDFs" : "Файли PDF",
+ "Folders" : "Каталоги",
+ "Audio" : "Аудіо",
+ "Images" : "Зображення",
+ "Videos" : "Відео",
+ "Created new folder \"{name}\"" : "Створив(-ла) новий каталог \"{name}\"",
+ "Unable to initialize the templates directory" : "Неможливо встановити каталог з шаблонами",
+ "Create templates folder" : "Створити каталог для шаблонів",
+ "Templates" : "Шаблони",
+ "New template folder" : "Новий каталог шаблонів",
+ "In folder" : "У каталозі",
+ "Search in all files" : "Пошук у всіх файлах",
+ "Search in folder: {folder}" : "Шукати у каталозі: {folder}",
+ "One of the dropped files could not be processed" : "Один із завантажених файлів не вдалося обробити",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш бравзер не підтримує Filesystem API. Каталоги не буде завантажено",
+ "No files to upload" : "Відсутні файли для завантаження",
+ "Unable to create the directory {directory}" : "Неможливо створити каталог {directory}",
+ "Some files could not be uploaded" : "Не вдалося завантажити окремі файли",
+ "Files uploaded successfully" : "Файли успішно завантажено",
+ "No files to process" : "Відсутні файли для обробки",
+ "Some files could not be copied" : "Неможливо скопіювати окремі файли",
+ "Some files could not be moved" : "Окремі файли неможливо перемістити",
+ "Files copied successfully" : "Файли успішно скопійовано",
+ "Files moved successfully" : "Файли успішно переміщено",
+ "Conflicts resolution skipped" : "Пропущено розв'язання конфліктів",
+ "Upload cancelled" : "Завантаження скасовано",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не вдалося перейментувати \"{oldName}\", оскільки він вже відсутній",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ім'я \"{newName}\" вже використовується у каталозі \"{dir}\". Виберіть інше ім'я.",
+ "Could not rename \"{oldName}\"" : "Не вдалося перейменувати \"{oldName}\"",
+ "This operation is forbidden" : "Операцію заборонено",
+ "This folder is unavailable, please try again later or contact the administration" : "Ця папка недоступна, спробуйте пізніше або зверніться до адміністрації.",
+ "Storage is temporarily not available" : "Сховище тимчасово недоступне",
+ "Unexpected error: {error}" : "Неочікувана помилка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файли","%n файлів","%n файлів"],
+ "_%n folder_::_%n folders_" : ["%n каталог ","%n каталоги ","%n каталогів ","%n каталогів"],
+ "_%n hidden_::_%n hidden_" : ["%n приховано","%n приховано","%n приховано","%n приховано"],
+ "Filename must not be empty." : "Імена файлів не мають бути порожні.",
+ "\"{char}\" is not allowed inside a filename." : "Символ \"{char}\" не дозволено у імені файлу.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" є зарезервованим ім'ям і не дозволяється у іменах файлів.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" не є дозволеним типом файлів.",
+ "Filenames must not end with \"{extension}\"." : "Імена файлів не мають закінчуватися на \"{extension}\".",
+ "List of favorite files and folders." : "Список файлів та каталогів із зірочкою.",
+ "No favorites yet" : "Поки немає нічого, позначеного зірочкою",
+ "Files and folders you mark as favorite will show up here" : "Файли та каталоги із зірочкою з’являться тут",
+ "List of your files and folders." : "Список ваших файлів та каталогів.",
+ "List of your files and folders that are not shared." : "Перелік ваших файлів та каталогів, які не є у спільному доступі.",
+ "No personal files found" : "Мої документи не знайдено",
+ "Files that are not shared will show up here." : "Тут показуватимуться файли, які не є у спільному доступі.",
+ "Recent" : "Останні",
+ "List of recently modified files and folders." : "Список нещодавно змінених файлів та каталогів.",
+ "No recently modified files" : "Відсутні файли із нещодавними змінами",
+ "Files and folders you recently modified will show up here." : "Тут показуватимуться файли та каталоги, які було нещодавно змінено.",
+ "Search" : "Пошук",
+ "Search results within your files." : "Шукати результати серед ваших файлів.",
+ "No entries found in this folder" : "В цьому каталозі нічого не знайдено",
+ "Select all" : "Вибрати все",
+ "Upload too large" : "Файл занадто великий",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли, які ви намагаєтеся завантажити, перевищують максимально дозволений розмір завантаження файлів на сервер.",
+ "File could not be found" : "Неможливо знайти файл",
+ "Show list view" : "Подання списком",
+ "Show grid view" : "Подання сіткою",
"Close" : "Закрити",
- "Favorites" : "Улюблені",
- "Could not create folder \"{dir}\"" : "Неможливо створити теку \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "Неможливо створити каталог \"{dir}\"",
"This will stop your current uploads." : "Ця дія призведе до зупинки поточних завантажень на сервер.",
"Upload cancelled." : "Завантаження скасовано.",
- "Processing files …" : "Обробка файлів ...",
+ "Processing files …" : "Триває обробка файлів...",
"…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки це каталог або файл має розмір 0 байт.",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки він є або каталогом, або файл має розмір 0 байт.",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви завантажуєте {size1}, а залишилося лише {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Теки призначення \"{dir}\" більше не існує.",
- "Not enough free space" : "Недостатньо вільного місця",
+ "Target folder \"{dir}\" does not exist any more" : "Каталог призначення \"{dir}\" більше не дійсний.",
"An unknown error has occurred" : "Сталася невідома помилка",
- "Uploading …" : "Завантаження …",
+ "File could not be uploaded" : "Неможливо завантажити файл",
+ "Uploading …" : "Завантаження…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber} із {total})",
+ "Uploading … ({currentNumber}/{total})" : "Завантаження ... ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Завантаження цього елемента не підтримується",
- "Target folder does not exist any more" : "Тека призначення більше не існує",
"Error when assembling chunks, status code {status}" : "Помилка під час збірки частин, код помилки {status}",
- "Actions" : "Дії",
- "Rename" : "Перейменувати",
- "Copy" : "Скопіювати",
- "Choose target folder" : "Виберіть теку призначення",
+ "Choose target folder" : "Виберіть каталог призначення",
+ "Set reminder" : "Встановити нагадування",
+ "Edit locally" : "Відкрити на пристрої",
"Open" : "Відкрити",
- "Delete file" : "Вилучити файл",
- "Delete folder" : "Вилучити теку",
- "Disconnect storage" : "Від’єднати сховище",
- "Could not load info for file \"{file}\"" : "Не вдалося завантажити інформацію для файлу \"{file}\"",
- "Files" : "Файли",
- "Details" : "Деталі",
- "Select" : "Вибрати",
- "Pending" : "Очікування",
+ "Could not load info for file \"{file}\"" : "Не вдалося отримати дані щодо файлу \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Виберіть мітки, які ви додасте до вибраного",
+ "Apply tag(s) to selection" : "Додатки мітки до вибраного",
+ "Select directory \"{dirName}\"" : "Виберіть каталог \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Вибрати файл \"{fileName}\"",
"Unable to determine date" : "Неможливо визначити дату",
- "This operation is forbidden" : "Ця операція заборонена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Директорія недоступна, будь ласка, перевірте файл журналу або зверніться до адміністратора ",
- "Could not move \"{file}\", target exists" : "Не вдається перемістити файл \"{file}\", він вже існує в точці призначення",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Каталог недоступний, будь ласка, перевірте файл журналу або зверніться до адміністратора ",
+ "Could not move \"{file}\", target exists" : "Не вдалося перемістити файл \"{file}\", оскільки файл з таким ім'ям вже присутній",
"Could not move \"{file}\"" : "Неможливо перемістити файл \"{file}\"",
"copy" : "копія",
- "Could not copy \"{file}\", target exists" : "Не вдається скопіювати файл \"{file}\", він вже існує в точці призначення",
+ "Could not copy \"{file}\", target exists" : "Не вдалося скопіювати файл \"{file}\", оскільки файл з таким ім'ям вже присутній",
"Could not copy \"{file}\"" : "Неможливо скопіювати \"{file}\"",
"Copied {origin} inside {destination}" : "Скопійовано {origin} до {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ті {nbfiles} інших файлів скопійовано в {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} та {nbfiles} інших файлів скопійовано до {destination}",
"{newName} already exists" : "{newName} вже існує",
- "Could not rename \"{fileName}\", it does not exist any more" : "Неможливо перейменувати \"{fileName}\", він більше не існує",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ім'я \"{targetName}\" вже використовується у теці \"{dir}\". Будь-ласка, виберіть іншу назву.",
- "Could not rename \"{fileName}\"" : "Неможливо перейменувати \"{fileName}\"",
"Could not create file \"{file}\"" : "Неможливо створити файл \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Неможливо створити файл \"{file}\", оскільки він вже існує.",
- "Could not create folder \"{dir}\" because it already exists" : "Неможливо створити теку \"{dir}\", оскільки вона вже існує.",
+ "Could not create file \"{file}\" because it already exists" : "Неможливо створити файл \"{file}\", оскільки файл з таким ім'ям вже присутній.",
+ "Could not create folder \"{dir}\" because it already exists" : "Неможливо створити каталог \"{dir}\", оскільки каталог з таким ім'ям він вже присутній.",
"Could not fetch file details \"{file}\"" : "Неможливо отримати деталі файлу \"{file}\"",
"Error deleting file \"{fileName}\"." : "Помилка вилучення файлу \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нічого не знайдено в інших теках за запитом {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Для пошуку в інших теках потрібно зазначити більше двох символів",
- "Name" : "Ім'я",
- "Size" : "Розмір",
- "Modified" : "Змінено",
- "_%n folder_::_%n folders_" : ["%n тека ","теки : %n ","теки : %n ","теки : %n "],
- "_%n file_::_%n files_" : ["%n файл ","файли : %n ","файли : %n ","файли : %n "],
- "{dirs} and {files}" : "{dirs} і {files}",
- "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включаючи %n прихованих"],
- "You don’t have permission to upload or create files here" : "У вас недостатньо прав для завантаження або створення тут файлів",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нічого не знайдено в інших каталогах за запитом {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Для пошуку в інших каталогах потрібно зазначити більше двох символів",
+ "{dirs} and {files}" : "{dirs} та {files}",
+ "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включно %n прихованих"],
+ "You do not have permission to upload or create files here" : "У вас відсутні повноваження для завантаження або створення файлів тут",
"_Uploading %n file_::_Uploading %n files_" : ["Вивантаження %n файлу","Вивантаження %n файлів","Вивантаження %n файлів","Завантаження %n файлів"],
"New" : "Створити",
- "Select file range" : "Виберіть набір файлів",
- "{used} of {quota} used" : "Використано {used} з {quota}",
+ "New file/folder menu" : "Меню з новим файлом/каталогом",
+ "Select file range" : "Вибрати кілька файлів",
+ "{used}%" : "{used}%",
"{used} used" : "Використано {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" - некоректне ім'я файлу.",
+ "\"{name}\" is an invalid file name." : "\"{name}\" є некоректним ім'ям файлу.",
"File name cannot be empty." : " Ім'я файлу не може бути порожнім.",
- "\"/\" is not allowed inside a file name." : "Символ \"/\" не дозволений в іменах файлів.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" є недопустимим типом файлу",
- "View in folder" : "Переглянути у теці",
- "Copied!" : "Скопійовано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Скопіювати пряме посилання (працює лише для користувачів, які мають доступ до цього файлу чи теки)",
+ "\"/\" is not allowed inside a file name." : "Символ \"/\" не дозволено в імені файлу.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" є неприпустимим типом файлу",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Сховище {owner} переповнено, подальша синхронізація файлів неможлива!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповий каталог \"{mountPoint}\" переповнено, подальша синхронізація файлів неможлива!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Зовнішнє сховище \"{mountPoint}\" переповнено, подальша синхронізація файлів не можлива!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше сховище переповнено, подальша синхронізація файлів неможлива!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Сховище користувача {owner} майже заповнений ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповий каталог \"{mountPoint}\" майже заповнений ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Зовнішнє сховище \"{mountPoint}\" майже заповнено ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ваше сховище майже заповнено ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["відповідає \"{filter}\"","відповідає \"{filter}\"","відповідає \"{filter}\"","відповідає \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Пряме посилання було скопійовано (дійсне лише для користувачів, які мають відповідні права доступу)",
"Path" : "Шлях",
- "_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байт","%n байт"],
- "Favorited" : "Улюблений",
- "Favorite" : "В улюблене",
- "You can only favorite a single file or folder at a time" : "Одночасно можна вподобати лише один файл або теку",
- "New folder" : "Нова тека",
+ "_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байт","%n байт(ів)"],
+ "Favored" : "Із зірочкою",
+ "Favor" : "Додати зірочку",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копіювати пряме посилання (дійсне лише для користувачів, які мають відповідні права доступу)",
"Upload file" : "Завантажити файл",
- "Recent" : "Нещодавні",
- "Not favorited" : "Не улюблене",
- "Remove from favorites" : "Вилучити з улюбленого",
- "Add to favorites" : "Додати до улюбленого",
+ "Not favored" : "Без зірочки",
"An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки",
- "Added to favorites" : "Додано до улюбленого",
- "Removed from favorites" : "Вилучено з улюбленого",
- "You added {file} to your favorites" : "Ви додали {file} до вашого улюбленого",
- "You removed {file} from your favorites" : "Ви вилучили {file} з улюбленого",
- "File changes" : "Зміни файлу",
- "Created by {user}" : "Створено користувачем {user}",
- "Changed by {user}" : "Змінено користувачем {user}",
- "Deleted by {user}" : "Вилучено користувачем {user}",
- "Restored by {user}" : "Відновлено користувачем {user}",
- "Renamed by {user}" : "Перейменовано користувачем {user}",
- "Moved by {user}" : "Переміщено користувачем {user}",
- "\"remote user\"" : "\"віддалений користувач\"",
- "You created {file}" : "Ви створили {file}",
- "You created an encrypted file in {file}" : "Ви створили зашифрований файл у {file}",
- "{user} created {file}" : "Користувач {user} створив {file}",
- "{user} created an encrypted file in {file}" : "{user} створив зашифрований файл у {file}",
- "{file} was created in a public folder" : "Файл {file} створено у спільній теці",
- "You changed {file}" : "Ви змінили {file}",
- "You changed an encrypted file in {file}" : "Ви змінили зашифрований файл у {file}",
- "{user} changed {file}" : "Користувач {user} змінив {file}",
- "{user} changed an encrypted file in {file}" : "{user} змінив зашифрований файл у {file}",
- "You deleted {file}" : "Ви вилучили {file}",
- "You deleted an encrypted file in {file}" : "Ви вилучити зашифрований файл у {file}",
- "{user} deleted {file}" : "Користувач {user} вилучив {file}",
- "{user} deleted an encrypted file in {file}" : "{user} вилучив зашифрований файл у {file}",
- "You restored {file}" : "Ви відновили {file}",
- "{user} restored {file}" : "Користувач {user} відновив {file}",
- "You renamed {oldfile} to {newfile}" : "Ви перейменували {oldfile} в {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "Користувач {user} перейменував {oldfile} у {newfile}",
- "You moved {oldfile} to {newfile}" : "Ви перемістили {oldfile} до {newfile}",
- "{user} moved {oldfile} to {newfile}" : "Користувач {user} перемістив {oldfile} до {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Файл був доданий до або або вилучений з вашого <strong>улюбленого</strong>",
- "A file or folder has been <strong>changed</strong>" : "Файл або теку було <strong> змінено </strong>",
- "All files" : "Усі файли",
- "Unlimited" : "Необмежено",
"Upload (max. %s)" : "Завантаження (макс. %s)",
- "Accept" : "Прийняти",
- "Reject" : "Скасувати",
- "Incoming ownership transfer from {user}" : "Запит від користувача {user} на передачу прав власності",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Прийняти {path}?\n\nУвага: процес передачі після прийняття може тривати до 1 години.",
- "Ownership transfer failed" : "Не вдалося передати права власності",
- "Your ownership transfer of {path} to {user} failed." : "Передача ваших прав на {path} користувачеві {user} не вдалася.",
- "The ownership transfer of {path} from {user} failed." : "Передача прав на {path} від користувача {user} не вдалася.",
- "Ownership transfer done" : "Права власності передано",
- "Your ownership transfer of {path} to {user} has completed." : "Передачу ваших прав на {path} користувачеві {user} виконано.",
- "The ownership transfer of {path} from {user} has completed." : "Передачу прав на {path} від користувача {user} завершено.",
- "in %s" : "в %s",
- "File Management" : "Керування файлами",
- "Transfer ownership of a file or folder" : "Передача прав власності на файл або теку",
- "Choose file or folder to transfer" : "Виберіть файл або теку для передачі",
- "Change" : "Змінити",
- "New owner" : "Новий власник",
- "Search users" : "Пошук користувачів",
- "Choose a file or folder to transfer" : "Виберіть файл або теку для передачі",
- "Transfer" : "Передати",
- "Transfer {path} to {userid}" : "Передати {path} користувачеві {userid}",
- "Invalid path selected" : "Вибрано неправильний шлях",
- "Ownership transfer request sent" : "Запит на передачу прав власності надіслано",
- "Cannot transfer ownership of a file or folder you don't own" : "Неможливо передати права власності на файл або теку, що вам не належить",
- "Tags" : "Позначки",
- "Unable to change the favourite state of the file" : "Неможливо змінити стан \"улюблене\" для цього файлу",
- "Error while loading the file data" : "Помилка під час завантаження даних про файл",
- "Cancel" : "Скасувати",
- "Create" : "Створити",
- "%s used" : "%s використано",
- "%s%% of %s used" : "%s%% з %s використано",
- "%1$s of %2$s used" : "Використано %1$s з %2$s",
- "Settings" : "Налаштування",
- "Show hidden files" : "Показувати приховані файли",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Використовуйте цю адресу для доступу до ваших Файлів за допомогою WebDAV",
- "Toggle grid view" : "Показати плитками",
- "No files in here" : "Тут немає файлів",
- "Upload some content or sync with your devices!" : "Завантажте щось або синхронізуйте з пристроями!",
- "No entries found in this folder" : "В цій теці нічого немає",
- "Select all" : "Вибрати всі",
- "Upload too large" : "Файл занадто великий",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли, які ви намагаєтеся завантажити, перевищують максимально дозволений розмір файлів для завантаження на цьому сервері.",
- "No favorites yet" : "Ще немає улюблених",
- "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут",
- "Deleted files" : "Кошик",
- "Shares" : "Спільний доступ",
- "Shared with others" : "Поділились з іншими",
- "Shared with you" : "Поділились з вами",
- "Shared by link" : "Доступне за посиланням",
- "Deleted shares" : "Вилучено зі спільного доступу",
- "Pending shares" : "Спільні ресурси в очікуванні",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" успішно виконано",
+ "\"{displayName}\" action failed" : "Не вдалося виконати \"{displayName}\"",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" не спрацював у деяких елементах",
+ "\"{displayName}\" batch action executed successfully" : "Операцію \"{displayName}\" успішно виконано",
+ "Submitting fields…" : "Поля для надсилання...",
+ "Filter filenames…" : "Вибрати файли за ім'ям ...",
+ "WebDAV URL copied to clipboard" : "Послиання WebDAV скопійовано до буферу обміну",
+ "Enable the grid view" : "Увімкнути подання сіткою",
+ "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Copy to clipboard" : "Копіювати до буферу обміну",
+ "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
+ "Deletion cancelled" : "Вилучення скасовано",
+ "Move cancelled" : "Переміщення скасовано",
+ "Cancelled move or copy of \"{filename}\"." : "Скасовано переміщення або копіювання \"{filename}\".",
+ "Cancelled move or copy operation" : "Переміщення або копіювання скасовано",
+ "Open details" : "Показати деталі",
+ "Photos and images" : "Зображення",
+ "New folder creation cancelled" : "Створення нового каталогу скасовано",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} каталог","{folderCount} каталоги","{folderCount} каталогів","{folderCount} каталогів"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файли","{fileCount} файлів","{fileCount} файлів"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл та {folderCount} каталог","1 файл та {folderCount} каталоги","1 файл та {folderCount} каталогів","1 файл та {folderCount} каталогів"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл та 1 каталог","{fileCount} файли та 1 каталог","{fileCount} файлів та 1 каталог","{fileCount} файлів та 1 каталог"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} файлів та {folderCount} каталогів",
+ "All folders" : "Усі каталоги",
+ "Personal Files" : "Мої документи",
"Text file" : "Текстовий файл",
- "New text file.txt" : "Новий текстовий файл file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Сховище користувача {owner} переповнене, файли більше не можуть бути оновлені або синхронізовані!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані!",
- "_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"]
+ "New text file.txt" : "Новий текстовий файл.txt",
+ "%1$s (renamed)" : "%1$s (перейменовано)",
+ "renamed file" : "перейменовано файл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.",
+ "Filter file names …" : "Фільтр за іменем файлу ...",
+ "Prevent warning dialogs from open or reenable them." : "Не дозволяти показувати діялоги застережень або повторно увімкнути їх.",
+ "Show a warning dialog when changing a file extension." : "Показувати діялог застереження у разі зміни розширення файлу.",
+ "Speed up your Files experience with these quick shortcuts." : "Пришвідшіть взаємодію у застосунку \"Файли\" за скорочень",
+ "Open the actions menu for a file" : "Відкрити меню дій для файлу",
+ "Rename a file" : "Перейменувати файл",
+ "Delete a file" : "Вилучити файл",
+ "Favorite or remove a file from favorites" : "Додати або прибрати зірочку з файлу",
+ "Manage tags for a file" : "Керувати мітками файлу",
+ "Deselect all files" : "Прибрати вибір всіх файлів",
+ "Select or deselect a file" : "Вибрати чи прибрати вибір файлу",
+ "Select a range of files" : "Вибрати кілька файлів",
+ "Navigate to the parent folder" : "Перейти до каталогу вищого рівня",
+ "Navigate to the file above" : "Перейти до файлу вище",
+ "Navigate to the file below" : "Перейти до фйлу нижче",
+ "Navigate to the file on the left (in grid mode)" : "Перейти до файлу ліворуч (подання сіткою)",
+ "Navigate to the file on the right (in grid mode)" : "Перейти до файлу праворуч (подання сіткою)",
+ "Toggle the grid view" : "Перемкнути у подання сіткою",
+ "Open the sidebar for a file" : "Відкрити бокове меню для файлу"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index 0b2b52518b2..6033dfe979d 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -1,186 +1,500 @@
{ "translations": {
- "Storage is temporarily not available" : "Сховище тимчасово недоступне",
- "Storage invalid" : "Невірне сховище",
+ "Added to favorites" : "Додано зірочку",
+ "Removed from favorites" : "Вилучено зірочку",
+ "You added {file} to your favorites" : "Ви додали зірочку для {file}",
+ "You removed {file} from your favorites" : "Ви прибрали зірочку для {file}",
+ "Favorites" : "Із зірочкою",
+ "File changes" : "Зміни у файлах",
+ "Created by {user}" : "Створено користувачем {user}",
+ "Changed by {user}" : "Змінено користувачем {user}",
+ "Deleted by {user}" : "Вилучено користувачем {user}",
+ "Restored by {user}" : "Відновлено користувачем {user}",
+ "Renamed by {user}" : "Перейменовано користувачем {user}",
+ "Moved by {user}" : "Переміщено користувачем {user}",
+ "\"remote account\"" : "\"віддалений обліковий запис\"",
+ "You created {file}" : "Ви створили {file}",
+ "You created an encrypted file in {file}" : "Ви створили зашифрований файл у {file}",
+ "{user} created {file}" : "{user} створив(-ла) файл {file}",
+ "{user} created an encrypted file in {file}" : "{user} створив(-ла) зашифрований файл у {file}",
+ "{file} was created in a public folder" : "Файл {file} створено у публічному каталозі",
+ "You changed {file}" : "Ви змінили файл {file}",
+ "You changed an encrypted file in {file}" : "Ви змінили зашифрований файл у {file}",
+ "{user} changed {file}" : "{user} змінив(-ла) файл {file}",
+ "{user} changed an encrypted file in {file}" : "{user} змінив(-ла) зашифрований файл {file}",
+ "You deleted {file}" : "Ви вилучили {file}",
+ "You deleted an encrypted file in {file}" : "Ви вилучити зашифрований файл у {file}",
+ "{user} deleted {file}" : "{user} вилучив(-ла) {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} вилучив зашифрований файл у {file}",
+ "You restored {file}" : "Ви відновили {file}",
+ "{user} restored {file}" : "{user} відновив(-ла) {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Ви перейменували файл {oldfile} (прихований) на {newfile} (прихований)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Ви перейменували файл {oldfile} (прихований) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Ви перейменували файл {oldfile} на {newfile} (прихований)",
+ "You renamed {oldfile} to {newfile}" : "Ви перейменували файл {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} перейменував {oldfile} (прихований) у {newfile} (прихований)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} перейменував {oldfile} (прихований) у {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} перейменував {oldfile} у {newfile} (прихований)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} перейменував(-ла) {oldfile} у {newfile}",
+ "You moved {oldfile} to {newfile}" : "Ви перемістили {oldfile} до {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} перемістив(-ла) {oldfile} до {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Файл було додано або вилучено з ваших документів <strong>із зірочкою</strong>",
+ "Files" : "Файли",
+ "A file or folder has been <strong>changed</strong>" : "Файл або каталог було <strong> змінено </strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Файл або каталог із зірочкою було <strong>змінено</strong>",
+ "Failed to authorize" : "Не вдалося авторизуватися",
+ "Invalid folder path" : "Недійсний шлях до каталогу",
+ "Folder not found" : "Каталог не знайдено",
+ "The file cannot be found" : "Цей файл неможливо знайти",
+ "The destination path does not exist: %1$s" : "Шлях призначення відсутній: %1$s",
+ "You do not have permission to create a file at the specified location" : "У вас відсутні права на створення файлу у визначеному розташуванні",
+ "The file could not be converted." : "Файл неможливо конвертувати",
+ "Could not get relative path to converted file" : "Не вдалося отримати відносний шлях до сконвертованого файлу",
+ "Favorite files" : "Файли із зіркою",
+ "No favorites" : "Немає улюблених",
+ "More favorites" : "Ще файли із зіркою",
+ "Accept" : "Прийняти",
+ "Reject" : "Відхилити",
+ "Incoming ownership transfer from {user}" : "Запит від користувача {user} на передавання прав власника",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Прийняти {path}?\n\nУвага: Процес передавання після прийняття запиту може тривати до 1 години.",
+ "Ownership transfer denied" : "Перенесення прав власності відхилено",
+ "Your ownership transfer of {path} was denied by {user}." : "Перенесення прав на ваші дані {path} відхилено користувачем {user}.",
+ "Ownership transfer failed" : "Не вдалося передати право власності",
+ "Your ownership transfer of {path} to {user} failed." : "Не вдалося перадати ваші права власника на {path} користувачеві {user}.",
+ "The ownership transfer of {path} from {user} failed." : "Не вдалося передати права власника на {path} від користувача {user}.",
+ "Ownership transfer done" : "Право власності передано",
+ "Your ownership transfer of {path} to {user} has completed." : "Ваші права власника на {path} успішно передано користувачеві {user}.",
+ "The ownership transfer of {path} from {user} has completed." : "Завершено передавання права власника на {path} від користувача {user}.",
+ "in %s" : "в %s",
+ "Transferred from %1$s on %2$s" : "Перенесено від %1$s до %2$s",
+ "Files compatibility" : "Сумісність файлів",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозволити обмежувати імена файлів для забезпечення сумісності з різними клієнтами. Типово всі імена файлів, які відповідають моделі POSIX (напр., Linux, macOS), дозволені.",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Також можлива автоматична міграція файлів після увімкнення цих налаштувань. Ознайомтеся з документацією відповідної команди occ.",
+ "Enforce Windows compatibility" : "Увімкнути сумісність із Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Це унеможливить використання імен файлів, які не сумісні з системами Windows, напр., використанння зарезервованих імен або спеціальних символів. Зауважте, що це не обмежить сумісність за регістром символів.",
+ "File Management" : "Керування файлами",
+ "Home" : "Домівка",
+ "Target folder does not exist any more" : "Каталог призначення більше не дійсний",
+ "Reload current directory" : "Перезавантажити поточний каталог",
+ "Go to the \"{dir}\" directory" : "Перейти до каталогу \"{dir}\"",
+ "Current directory path" : "Шлях до поточного каталогу",
+ "Your have used your space quota and cannot upload files anymore" : "Ви вже використали квоту на місце та не можете завантажувати файли",
+ "You do not have permission to upload or create files here." : "У вас відсутній дозвіл завантажувати або створювати тут файли.",
+ "Drag and drop files here to upload" : "Перетягніть файли сюди для завантаження",
+ "Favorite" : "Додати зірочку",
+ "Back" : "Назад",
+ "Toggle selection for file \"{displayName}\"" : "Перемкнути вибір для файлу \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Перемкнути вибір для каталогу \"{displayName}\"",
+ "File is loading" : "Завантаження файлу",
+ "Folder is loading" : "Завантаження каталогу",
+ "Filename" : "Ім'я файлу",
+ "Folder name" : "Назва каталогу",
+ "This node is unavailable" : "Цей вузол не доступний",
+ "Another entry with the same name already exists." : "Інший запис з таким же ім'ям вже присутній",
+ "Invalid filename." : "Недійсне ім'я файлу.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Перейменовано \"{oldName}\" на \"{newName}\"",
+ "Rename file" : "Перейменувати файл",
+ "Folder" : "Каталог",
+ "Unknown file type" : "Невідомий тип файлу",
+ "{ext} image" : "{ext} зображення",
+ "{ext} video" : "{ext} відео",
+ "{ext} audio" : "{ext} аудіо",
+ "{ext} text" : "{ext} текст",
+ "Pending" : "Очікування",
+ "Unknown date" : "Невідома дата",
+ "Clear filter" : "Очистити фільтр",
+ "Modified" : "Змінено",
+ "Search everywhere" : "Шукати всюди",
+ "Type" : "Тип",
+ "Active filters" : "Активні фільтри",
+ "Remove filter" : "Вилучити фільтр",
+ "Total rows summary" : "Загалом рядків",
+ "Toggle selection for all files and folders" : "Перемкнути вибір для всіх файлів та каталогів",
+ "Name" : "Ім'я",
+ "File type" : "Тип файлу",
+ "Size" : "Розмір",
+ "{displayName}: failed on some elements" : "{displayName}: не вдалося виконати деякі елементи",
+ "{displayName}: done" : "{displayName}: готово",
+ "{displayName}: failed" : "{displayName}: не вдалося",
+ "Actions" : "Дії",
+ "(selected)" : "(вибрано)",
+ "List of files and folders." : "Список файлів та каталогів",
+ "You have used your space quota and cannot upload files anymore." : "Ви вже використали ліміт сховища та більше не зможете завантажувати файли.",
+ "Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
+ "File not found" : "Файл не знайдено",
+ "_{count} selected_::_{count} selected_" : ["Вибрано {count}","Вибрано {count}","Вибрано {count} ","Вибрано {count} "],
+ "Search everywhere …" : "Шукати всюди ...",
+ "Search here …" : "Шукати тут …",
+ "Search scope options" : "Визначити місце пошуку",
+ "Search here" : "Шукати тут",
+ "{usedQuotaByte} used" : "{usedQuotaByte} використано",
+ "{used} of {quota} used" : "Використано {used} із {quota}",
+ "{relative}% used" : "{relative}% використано",
+ "Could not refresh storage stats" : "Неможливо оновити статистику сховища",
+ "Your storage is full, files can not be updated or synced anymore!" : "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані!",
+ "Storage information" : "Інформація про сховище",
+ "Storage quota" : "Квота сховища",
+ "New folder" : "Новий каталог",
+ "Create new folder" : "Створити новий каталог",
+ "This name is already in use." : "Це ім'я вже використовується",
+ "Create" : "Створити",
+ "Files starting with a dot are hidden by default" : "Файли, що починаються з крапки, типово приховано",
+ "Fill template fields" : "Заповнити поля шаблону",
+ "Submitting fields …" : "Надсилання полів ...",
+ "Submit" : "Відправити",
+ "Choose a file or folder to transfer" : "Виберіть файл або каталог",
+ "Transfer" : "Передати",
+ "Transfer {path} to {userid}" : "Передати {path} користувачеві {userid}",
+ "Invalid path selected" : "Вибрано неправильний шлях",
"Unknown error" : "Невідома помилка",
- "File could not be found" : "Неможливо знайти файл",
- "Move or copy" : "Перенести або копіювати",
- "Download" : "Завантажити",
+ "Ownership transfer request sent" : "Запит на передавання прав власника надіслано",
+ "Cannot transfer ownership of a file or folder you do not own" : "Неможливо передати права власності на файл або каталог, якими ви не володієте",
+ "Transfer ownership of a file or folder" : "Передавання прав власника на файл або каталог",
+ "Choose file or folder to transfer" : "Виберіть цільовий файл або каталог",
+ "Change" : "Змінити",
+ "New owner" : "Новий власник",
+ "Keep {old}" : "Зберегти {old}",
+ "Keep without extension" : "Зберегти без розширення",
+ "Use {new}" : "Використовувати {new}",
+ "Remove extension" : "Вилучити розширення файлу",
+ "Change file extension" : "Змінити розширення файлу",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Заміна розширення файлу з \"{old}\" на \"{new}\" може зробити файл недоступним.",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "Вилучення розширення файлу \"{old}\" може зробити файл недоступним.",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "Додавання розширення до файлу \"{new}\" може зробити файл недоступним.",
+ "Do not show this dialog again." : "Не показувати цей діялог подалі.",
+ "Select file or folder to link to" : "Виберіть файл або каталог, до якого потрібно застосувати посилання",
+ "Choose {file}" : "Виберіть {file}",
+ "Share" : "Поширити",
+ "Shared by link" : "Доступ за посиланням",
+ "Shared" : "Спільне",
+ "Switch to list view" : "У вигляді списку",
+ "Switch to grid view" : "У вигляді сітки",
+ "The file could not be found" : "Неможливо знайти файл",
+ "Upload was cancelled by user" : "Завантаження скасовано користувачем",
+ "Not enough free space" : "Недостатньо вільного місця",
+ "Operation is blocked by access control" : "Операцію заблоковано через контроль доступу",
+ "Error during upload: {message}" : "Помилка під час завантаження: {message}",
+ "Error during upload, status code {status}" : "Помилка під час завантаження, код стану {status}",
+ "Unknown error during upload" : "Невідома помилка під час завантаження",
+ "Loading current folder" : "Отримання поточного каталогу",
+ "Retry" : "Ще раз",
+ "No files in here" : "Тут немає файлів",
+ "Upload some content or sync with your devices!" : "Завантажте вміст або синхронізуйтеся з вашими пристроями!",
+ "Go back" : "Повернутися назад",
+ "Views" : "Подання",
+ "Files settings" : "Налаштування",
+ "Your files" : "Ваші файли",
+ "Open in files" : "Відкрити у файлах",
+ "File cannot be accessed" : "Неможливо отримати доступ до файлу",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Не вдалося знайти файл або у вас відсутній дозвіл на перегляд файлу. Попросіть поділитися цим файлом.",
+ "No search results for “{query}”" : "Відсутні результати для \"{query}\"",
+ "Search for files" : "Шукати файли",
+ "Clipboard is not available" : "Буфер обміну недоступний",
+ "WebDAV URL copied" : "URL-адреса WebDAV скопійована",
+ "General" : "Загальне",
+ "Default view" : "Типовий вигляд",
+ "All files" : "Усі файли",
+ "Personal files" : "Мої документи",
+ "Sort favorites first" : "Спочатку показувати із зірочкою",
+ "Sort folders before files" : "Показувати каталоги перед файлами",
+ "Folder tree" : "Дерево каталогів",
+ "Appearance" : "Вигляд",
+ "Show hidden files" : "Показувати приховані файли",
+ "Show file type column" : "Показувати стовпець з типом файлу",
+ "Show file extensions" : "Show file extensions",
+ "Crop image previews" : "Попередній перегляд перед кадруванням",
+ "Additional settings" : "Додатково",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "URL-адреса WebDAV",
+ "Copy" : "Копіювати",
+ "How to access files using WebDAV" : "Як отримати доступ до файлів за допомогою WebDAV",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Для вашого облікового запису увімкнено двофакторну авторизацію, таким чином вам потрібно буде використовувати пароль для застосунку для з'єднання із зовнішнім клієнтом WebDAV.",
+ "Warnings" : "Застереження",
+ "Warn before changing a file extension" : "Попереджати перед зміною розширення файлу",
+ "Warn before deleting files" : "Попереджати перед видаленням файлів",
+ "Keyboard shortcuts" : "Скорочення",
+ "File actions" : "Дії з файлами",
+ "Rename" : "Перейменувати",
"Delete" : "Вилучити",
- "Home" : "Домівка",
+ "Add or remove favorite" : "Додати або видалити з улюблених",
+ "Manage tags" : "Керування мітками",
+ "Selection" : "Вибір",
+ "Select all files" : "Вибрати всі файли",
+ "Deselect all" : "Зняти всі мітки",
+ "Select or deselect" : "Вибрати або скасувати вибір",
+ "Select a range" : "Виберіть діапазон",
+ "Navigation" : "Навігація",
+ "Go to parent folder" : "Перейти до батьківської папки",
+ "Go to file above" : "Перейти до файлу вище",
+ "Go to file below" : "Перейти до файлу нижче",
+ "Go left in grid" : "Перейти ліворуч у сітці",
+ "Go right in grid" : "Перейти праворуч у сітці",
+ "View" : "Подання",
+ "Toggle grid view" : "Перемкнути подання сіткою",
+ "Open file sidebar" : "Відкрити бічну панель файлів",
+ "Show those shortcuts" : "Показувати ці скорочення",
+ "You" : "Ви",
+ "Shared multiple times with different people" : "Поділилися кілька разів з різними людьми",
+ "Unable to change the favorite state of the file" : "Неможливо змінити статус вподобаного файлу",
+ "Error while loading the file data" : "Помилка під час отримання даних щодо файлу",
+ "Owner" : "Власник",
+ "Remove from favorites" : "Прибрати зірочку",
+ "Add to favorites" : "Додати зірочку",
+ "Tags" : "Мітки",
+ "Blank" : "Порожньо",
+ "Unable to create new file from template" : "Неможливо створити новий файл з шаблону",
+ "Pick a template for {name}" : "Вибрати шаблон для {name}",
+ "Create a new file with the selected template" : "Створити новий файл на основі вибраного шаблону",
+ "Creating file" : "Створення файлу",
+ "Save as {displayName}" : "Зберегти як {displayName}",
+ "Save as …" : "Зберегти як ...",
+ "Converting files …" : "Конвертування файлів ...",
+ "Failed to convert files: {message}" : "Не вдалося конвертувати файли: {message}",
+ "All files failed to be converted" : "Не вдалося конвертувати жодний файл",
+ "One file could not be converted: {message}" : "Неможливо конвертувати один файл: {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["Неможливо конвертувати 1 файл","Неможливо конвертувати %n файли","Неможливо конвертувати %n файлів","Неможливо конвертувати %n файлів"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["Успішно конвертовано 1 файл","Успішно конвертовано %n файли","Успішно конвертовано %n файлів","Успішно конвертовано %n файлів"],
+ "Files successfully converted" : "Файли успішно конвертовано",
+ "Failed to convert files" : "Не вдалося конвертувати файли",
+ "Converting file …" : "Конвертування файлу ...",
+ "File successfully converted" : "Файл успішно конвертовано",
+ "Failed to convert file: {message}" : "Не вдалося конвертувати файл: {message}",
+ "Failed to convert file" : "Не вдалося конвертувати файл",
+ "Leave this share" : "Вийти зі спільного доступу",
+ "Leave these shares" : "Вийти зі спільного доступу",
+ "Disconnect storage" : "Від’єднати сховище",
+ "Disconnect storages" : "Від'єднати сховища",
+ "Delete permanently" : "Вилучити назавжди",
+ "Delete and unshare" : "Вилучити та прибрати спільний доступ",
+ "Delete file" : "Вилучити файл",
+ "Delete files" : "Вилучити файли",
+ "Delete folder" : "Вилучити каталог",
+ "Delete folders" : "Вилучити каталоги",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Ви намагаєтеся назавжли вилучити {count} ресурс","Ви намагаєтеся назавжли вилучити {count} ресурси","Ви намагаєтеся назавжли вилучити {count} ресурсів","Ви намагаєтеся назавжли вилучити {count} ресурсів"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Ви намагаєтеся вилучити {count} ресурс","Ви намагаєтеся вилучити {count} ресурси","Ви намагаєтеся вилучити {count} ресурсів","Ви намагаєтеся вилучити {count} ресурсів"],
+ "Confirm deletion" : "Підтвердіть вилучення",
+ "Cancel" : "Скасувати",
+ "Download" : "Звантажити",
+ "Moving \"{source}\" to \"{destination}\" …" : "Переміщення \"{source}\" до \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Копіювання \"{source}\" до \"{destination}\" …",
+ "Destination is not a folder" : "Місце призначення не є каталогом",
+ "This file/folder is already in that directory" : "Такий файл чи каталог вже присутні в цьому каталозі",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Неможливо перемістити файл чи каталог до самого себе або у цей саме підкаталог",
+ "(copy)" : "(копія)",
+ "(copy %n)" : "(копія %n)",
+ "A file or folder with that name already exists in this folder" : "Файл чи каталог з таким ім'ям вже присутній в цьому каталозі",
+ "The files are locked" : "Файли заблоковано",
+ "The file does not exist anymore" : "Цей файл більше недоступний",
+ "Choose destination" : "Виберіть каталог призначення",
+ "Copy to {target}" : "Копіювати до {target}",
+ "Move to {target}" : "Перемістити до {target}",
+ "Move" : "Перемістити",
+ "Move or copy operation failed" : "Не вдалося скопіювати або перемістити",
+ "Move or copy" : "Перемістити або копіювати",
+ "Open folder {displayName}" : "Відкрити каталог {displayName}",
+ "Open in Files" : "Відкрити у Файлах",
+ "Open locally" : "Відкрити локально",
+ "Failed to redirect to client" : "Не вдалося перенаправити на клієнта",
+ "Open file locally" : "Відкрити файл локально",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Тепер файл можна відкрити на вашому пристрої. Якщо він не відкривається, перевірте, що у вас встановлено настільний клієнт синхронізації.",
+ "Retry and close" : "Спробувати ще раз",
+ "Open online" : "Відкрити віддалено",
+ "Details" : "Деталі",
+ "View in folder" : "Переглянути у каталозі",
+ "Today" : "Сьогодні",
+ "Last 7 days" : "За останні 7 днів",
+ "Last 30 days" : "За останні 30 днів",
+ "This year ({year})" : "Цього року ({year})",
+ "Last year ({year})" : "Минулого року ({year})",
+ "Documents" : "Документи",
+ "Spreadsheets" : "Електронні таблиці",
+ "Presentations" : "Презентації",
+ "PDFs" : "Файли PDF",
+ "Folders" : "Каталоги",
+ "Audio" : "Аудіо",
+ "Images" : "Зображення",
+ "Videos" : "Відео",
+ "Created new folder \"{name}\"" : "Створив(-ла) новий каталог \"{name}\"",
+ "Unable to initialize the templates directory" : "Неможливо встановити каталог з шаблонами",
+ "Create templates folder" : "Створити каталог для шаблонів",
+ "Templates" : "Шаблони",
+ "New template folder" : "Новий каталог шаблонів",
+ "In folder" : "У каталозі",
+ "Search in all files" : "Пошук у всіх файлах",
+ "Search in folder: {folder}" : "Шукати у каталозі: {folder}",
+ "One of the dropped files could not be processed" : "Один із завантажених файлів не вдалося обробити",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Ваш бравзер не підтримує Filesystem API. Каталоги не буде завантажено",
+ "No files to upload" : "Відсутні файли для завантаження",
+ "Unable to create the directory {directory}" : "Неможливо створити каталог {directory}",
+ "Some files could not be uploaded" : "Не вдалося завантажити окремі файли",
+ "Files uploaded successfully" : "Файли успішно завантажено",
+ "No files to process" : "Відсутні файли для обробки",
+ "Some files could not be copied" : "Неможливо скопіювати окремі файли",
+ "Some files could not be moved" : "Окремі файли неможливо перемістити",
+ "Files copied successfully" : "Файли успішно скопійовано",
+ "Files moved successfully" : "Файли успішно переміщено",
+ "Conflicts resolution skipped" : "Пропущено розв'язання конфліктів",
+ "Upload cancelled" : "Завантаження скасовано",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Не вдалося перейментувати \"{oldName}\", оскільки він вже відсутній",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ім'я \"{newName}\" вже використовується у каталозі \"{dir}\". Виберіть інше ім'я.",
+ "Could not rename \"{oldName}\"" : "Не вдалося перейменувати \"{oldName}\"",
+ "This operation is forbidden" : "Операцію заборонено",
+ "This folder is unavailable, please try again later or contact the administration" : "Ця папка недоступна, спробуйте пізніше або зверніться до адміністрації.",
+ "Storage is temporarily not available" : "Сховище тимчасово недоступне",
+ "Unexpected error: {error}" : "Неочікувана помилка: {error}",
+ "_%n file_::_%n files_" : ["%n файл","%n файли","%n файлів","%n файлів"],
+ "_%n folder_::_%n folders_" : ["%n каталог ","%n каталоги ","%n каталогів ","%n каталогів"],
+ "_%n hidden_::_%n hidden_" : ["%n приховано","%n приховано","%n приховано","%n приховано"],
+ "Filename must not be empty." : "Імена файлів не мають бути порожні.",
+ "\"{char}\" is not allowed inside a filename." : "Символ \"{char}\" не дозволено у імені файлу.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" є зарезервованим ім'ям і не дозволяється у іменах файлів.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" не є дозволеним типом файлів.",
+ "Filenames must not end with \"{extension}\"." : "Імена файлів не мають закінчуватися на \"{extension}\".",
+ "List of favorite files and folders." : "Список файлів та каталогів із зірочкою.",
+ "No favorites yet" : "Поки немає нічого, позначеного зірочкою",
+ "Files and folders you mark as favorite will show up here" : "Файли та каталоги із зірочкою з’являться тут",
+ "List of your files and folders." : "Список ваших файлів та каталогів.",
+ "List of your files and folders that are not shared." : "Перелік ваших файлів та каталогів, які не є у спільному доступі.",
+ "No personal files found" : "Мої документи не знайдено",
+ "Files that are not shared will show up here." : "Тут показуватимуться файли, які не є у спільному доступі.",
+ "Recent" : "Останні",
+ "List of recently modified files and folders." : "Список нещодавно змінених файлів та каталогів.",
+ "No recently modified files" : "Відсутні файли із нещодавними змінами",
+ "Files and folders you recently modified will show up here." : "Тут показуватимуться файли та каталоги, які було нещодавно змінено.",
+ "Search" : "Пошук",
+ "Search results within your files." : "Шукати результати серед ваших файлів.",
+ "No entries found in this folder" : "В цьому каталозі нічого не знайдено",
+ "Select all" : "Вибрати все",
+ "Upload too large" : "Файл занадто великий",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли, які ви намагаєтеся завантажити, перевищують максимально дозволений розмір завантаження файлів на сервер.",
+ "File could not be found" : "Неможливо знайти файл",
+ "Show list view" : "Подання списком",
+ "Show grid view" : "Подання сіткою",
"Close" : "Закрити",
- "Favorites" : "Улюблені",
- "Could not create folder \"{dir}\"" : "Неможливо створити теку \"{dir}\"",
+ "Could not create folder \"{dir}\"" : "Неможливо створити каталог \"{dir}\"",
"This will stop your current uploads." : "Ця дія призведе до зупинки поточних завантажень на сервер.",
"Upload cancelled." : "Завантаження скасовано.",
- "Processing files …" : "Обробка файлів ...",
+ "Processing files …" : "Триває обробка файлів...",
"…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки це каталог або файл має розмір 0 байт.",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки він є або каталогом, або файл має розмір 0 байт.",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви завантажуєте {size1}, а залишилося лише {size2}",
- "Target folder \"{dir}\" does not exist any more" : "Теки призначення \"{dir}\" більше не існує.",
- "Not enough free space" : "Недостатньо вільного місця",
+ "Target folder \"{dir}\" does not exist any more" : "Каталог призначення \"{dir}\" більше не дійсний.",
"An unknown error has occurred" : "Сталася невідома помилка",
- "Uploading …" : "Завантаження …",
+ "File could not be uploaded" : "Неможливо завантажити файл",
+ "Uploading …" : "Завантаження…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber} із {total})",
+ "Uploading … ({currentNumber}/{total})" : "Завантаження ... ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} з {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Завантаження цього елемента не підтримується",
- "Target folder does not exist any more" : "Тека призначення більше не існує",
"Error when assembling chunks, status code {status}" : "Помилка під час збірки частин, код помилки {status}",
- "Actions" : "Дії",
- "Rename" : "Перейменувати",
- "Copy" : "Скопіювати",
- "Choose target folder" : "Виберіть теку призначення",
+ "Choose target folder" : "Виберіть каталог призначення",
+ "Set reminder" : "Встановити нагадування",
+ "Edit locally" : "Відкрити на пристрої",
"Open" : "Відкрити",
- "Delete file" : "Вилучити файл",
- "Delete folder" : "Вилучити теку",
- "Disconnect storage" : "Від’єднати сховище",
- "Could not load info for file \"{file}\"" : "Не вдалося завантажити інформацію для файлу \"{file}\"",
- "Files" : "Файли",
- "Details" : "Деталі",
- "Select" : "Вибрати",
- "Pending" : "Очікування",
+ "Could not load info for file \"{file}\"" : "Не вдалося отримати дані щодо файлу \"{file}\"",
+ "Please select tag(s) to add to the selection" : "Виберіть мітки, які ви додасте до вибраного",
+ "Apply tag(s) to selection" : "Додатки мітки до вибраного",
+ "Select directory \"{dirName}\"" : "Виберіть каталог \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Вибрати файл \"{fileName}\"",
"Unable to determine date" : "Неможливо визначити дату",
- "This operation is forbidden" : "Ця операція заборонена",
- "This directory is unavailable, please check the logs or contact the administrator" : "Директорія недоступна, будь ласка, перевірте файл журналу або зверніться до адміністратора ",
- "Could not move \"{file}\", target exists" : "Не вдається перемістити файл \"{file}\", він вже існує в точці призначення",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Каталог недоступний, будь ласка, перевірте файл журналу або зверніться до адміністратора ",
+ "Could not move \"{file}\", target exists" : "Не вдалося перемістити файл \"{file}\", оскільки файл з таким ім'ям вже присутній",
"Could not move \"{file}\"" : "Неможливо перемістити файл \"{file}\"",
"copy" : "копія",
- "Could not copy \"{file}\", target exists" : "Не вдається скопіювати файл \"{file}\", він вже існує в точці призначення",
+ "Could not copy \"{file}\", target exists" : "Не вдалося скопіювати файл \"{file}\", оскільки файл з таким ім'ям вже присутній",
"Could not copy \"{file}\"" : "Неможливо скопіювати \"{file}\"",
"Copied {origin} inside {destination}" : "Скопійовано {origin} до {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} ті {nbfiles} інших файлів скопійовано в {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} та {nbfiles} інших файлів скопійовано до {destination}",
"{newName} already exists" : "{newName} вже існує",
- "Could not rename \"{fileName}\", it does not exist any more" : "Неможливо перейменувати \"{fileName}\", він більше не існує",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Ім'я \"{targetName}\" вже використовується у теці \"{dir}\". Будь-ласка, виберіть іншу назву.",
- "Could not rename \"{fileName}\"" : "Неможливо перейменувати \"{fileName}\"",
"Could not create file \"{file}\"" : "Неможливо створити файл \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "Неможливо створити файл \"{file}\", оскільки він вже існує.",
- "Could not create folder \"{dir}\" because it already exists" : "Неможливо створити теку \"{dir}\", оскільки вона вже існує.",
+ "Could not create file \"{file}\" because it already exists" : "Неможливо створити файл \"{file}\", оскільки файл з таким ім'ям вже присутній.",
+ "Could not create folder \"{dir}\" because it already exists" : "Неможливо створити каталог \"{dir}\", оскільки каталог з таким ім'ям він вже присутній.",
"Could not fetch file details \"{file}\"" : "Неможливо отримати деталі файлу \"{file}\"",
"Error deleting file \"{fileName}\"." : "Помилка вилучення файлу \"{fileName}\".",
- "No search results in other folders for {tag}{filter}{endtag}" : "Нічого не знайдено в інших теках за запитом {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "Для пошуку в інших теках потрібно зазначити більше двох символів",
- "Name" : "Ім'я",
- "Size" : "Розмір",
- "Modified" : "Змінено",
- "_%n folder_::_%n folders_" : ["%n тека ","теки : %n ","теки : %n ","теки : %n "],
- "_%n file_::_%n files_" : ["%n файл ","файли : %n ","файли : %n ","файли : %n "],
- "{dirs} and {files}" : "{dirs} і {files}",
- "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включаючи %n прихованих"],
- "You don’t have permission to upload or create files here" : "У вас недостатньо прав для завантаження або створення тут файлів",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Нічого не знайдено в інших каталогах за запитом {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Для пошуку в інших каталогах потрібно зазначити більше двох символів",
+ "{dirs} and {files}" : "{dirs} та {files}",
+ "_including %n hidden_::_including %n hidden_" : ["включаючи %n прихований","включаючи %n прихованих","включаючи %n прихованих","включно %n прихованих"],
+ "You do not have permission to upload or create files here" : "У вас відсутні повноваження для завантаження або створення файлів тут",
"_Uploading %n file_::_Uploading %n files_" : ["Вивантаження %n файлу","Вивантаження %n файлів","Вивантаження %n файлів","Завантаження %n файлів"],
"New" : "Створити",
- "Select file range" : "Виберіть набір файлів",
- "{used} of {quota} used" : "Використано {used} з {quota}",
+ "New file/folder menu" : "Меню з новим файлом/каталогом",
+ "Select file range" : "Вибрати кілька файлів",
+ "{used}%" : "{used}%",
"{used} used" : "Використано {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" - некоректне ім'я файлу.",
+ "\"{name}\" is an invalid file name." : "\"{name}\" є некоректним ім'ям файлу.",
"File name cannot be empty." : " Ім'я файлу не може бути порожнім.",
- "\"/\" is not allowed inside a file name." : "Символ \"/\" не дозволений в іменах файлів.",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" є недопустимим типом файлу",
- "View in folder" : "Переглянути у теці",
- "Copied!" : "Скопійовано!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Скопіювати пряме посилання (працює лише для користувачів, які мають доступ до цього файлу чи теки)",
+ "\"/\" is not allowed inside a file name." : "Символ \"/\" не дозволено в імені файлу.",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" є неприпустимим типом файлу",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Сховище {owner} переповнено, подальша синхронізація файлів неможлива!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповий каталог \"{mountPoint}\" переповнено, подальша синхронізація файлів неможлива!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Зовнішнє сховище \"{mountPoint}\" переповнено, подальша синхронізація файлів не можлива!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше сховище переповнено, подальша синхронізація файлів неможлива!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Сховище користувача {owner} майже заповнений ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповий каталог \"{mountPoint}\" майже заповнений ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Зовнішнє сховище \"{mountPoint}\" майже заповнено ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Ваше сховище майже заповнено ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["відповідає \"{filter}\"","відповідає \"{filter}\"","відповідає \"{filter}\"","відповідає \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Пряме посилання було скопійовано (дійсне лише для користувачів, які мають відповідні права доступу)",
"Path" : "Шлях",
- "_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байт","%n байт"],
- "Favorited" : "Улюблений",
- "Favorite" : "В улюблене",
- "You can only favorite a single file or folder at a time" : "Одночасно можна вподобати лише один файл або теку",
- "New folder" : "Нова тека",
+ "_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байт","%n байт(ів)"],
+ "Favored" : "Із зірочкою",
+ "Favor" : "Додати зірочку",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Копіювати пряме посилання (дійсне лише для користувачів, які мають відповідні права доступу)",
"Upload file" : "Завантажити файл",
- "Recent" : "Нещодавні",
- "Not favorited" : "Не улюблене",
- "Remove from favorites" : "Вилучити з улюбленого",
- "Add to favorites" : "Додати до улюбленого",
+ "Not favored" : "Без зірочки",
"An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки",
- "Added to favorites" : "Додано до улюбленого",
- "Removed from favorites" : "Вилучено з улюбленого",
- "You added {file} to your favorites" : "Ви додали {file} до вашого улюбленого",
- "You removed {file} from your favorites" : "Ви вилучили {file} з улюбленого",
- "File changes" : "Зміни файлу",
- "Created by {user}" : "Створено користувачем {user}",
- "Changed by {user}" : "Змінено користувачем {user}",
- "Deleted by {user}" : "Вилучено користувачем {user}",
- "Restored by {user}" : "Відновлено користувачем {user}",
- "Renamed by {user}" : "Перейменовано користувачем {user}",
- "Moved by {user}" : "Переміщено користувачем {user}",
- "\"remote user\"" : "\"віддалений користувач\"",
- "You created {file}" : "Ви створили {file}",
- "You created an encrypted file in {file}" : "Ви створили зашифрований файл у {file}",
- "{user} created {file}" : "Користувач {user} створив {file}",
- "{user} created an encrypted file in {file}" : "{user} створив зашифрований файл у {file}",
- "{file} was created in a public folder" : "Файл {file} створено у спільній теці",
- "You changed {file}" : "Ви змінили {file}",
- "You changed an encrypted file in {file}" : "Ви змінили зашифрований файл у {file}",
- "{user} changed {file}" : "Користувач {user} змінив {file}",
- "{user} changed an encrypted file in {file}" : "{user} змінив зашифрований файл у {file}",
- "You deleted {file}" : "Ви вилучили {file}",
- "You deleted an encrypted file in {file}" : "Ви вилучити зашифрований файл у {file}",
- "{user} deleted {file}" : "Користувач {user} вилучив {file}",
- "{user} deleted an encrypted file in {file}" : "{user} вилучив зашифрований файл у {file}",
- "You restored {file}" : "Ви відновили {file}",
- "{user} restored {file}" : "Користувач {user} відновив {file}",
- "You renamed {oldfile} to {newfile}" : "Ви перейменували {oldfile} в {newfile}",
- "{user} renamed {oldfile} to {newfile}" : "Користувач {user} перейменував {oldfile} у {newfile}",
- "You moved {oldfile} to {newfile}" : "Ви перемістили {oldfile} до {newfile}",
- "{user} moved {oldfile} to {newfile}" : "Користувач {user} перемістив {oldfile} до {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Файл був доданий до або або вилучений з вашого <strong>улюбленого</strong>",
- "A file or folder has been <strong>changed</strong>" : "Файл або теку було <strong> змінено </strong>",
- "All files" : "Усі файли",
- "Unlimited" : "Необмежено",
"Upload (max. %s)" : "Завантаження (макс. %s)",
- "Accept" : "Прийняти",
- "Reject" : "Скасувати",
- "Incoming ownership transfer from {user}" : "Запит від користувача {user} на передачу прав власності",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Прийняти {path}?\n\nУвага: процес передачі після прийняття може тривати до 1 години.",
- "Ownership transfer failed" : "Не вдалося передати права власності",
- "Your ownership transfer of {path} to {user} failed." : "Передача ваших прав на {path} користувачеві {user} не вдалася.",
- "The ownership transfer of {path} from {user} failed." : "Передача прав на {path} від користувача {user} не вдалася.",
- "Ownership transfer done" : "Права власності передано",
- "Your ownership transfer of {path} to {user} has completed." : "Передачу ваших прав на {path} користувачеві {user} виконано.",
- "The ownership transfer of {path} from {user} has completed." : "Передачу прав на {path} від користувача {user} завершено.",
- "in %s" : "в %s",
- "File Management" : "Керування файлами",
- "Transfer ownership of a file or folder" : "Передача прав власності на файл або теку",
- "Choose file or folder to transfer" : "Виберіть файл або теку для передачі",
- "Change" : "Змінити",
- "New owner" : "Новий власник",
- "Search users" : "Пошук користувачів",
- "Choose a file or folder to transfer" : "Виберіть файл або теку для передачі",
- "Transfer" : "Передати",
- "Transfer {path} to {userid}" : "Передати {path} користувачеві {userid}",
- "Invalid path selected" : "Вибрано неправильний шлях",
- "Ownership transfer request sent" : "Запит на передачу прав власності надіслано",
- "Cannot transfer ownership of a file or folder you don't own" : "Неможливо передати права власності на файл або теку, що вам не належить",
- "Tags" : "Позначки",
- "Unable to change the favourite state of the file" : "Неможливо змінити стан \"улюблене\" для цього файлу",
- "Error while loading the file data" : "Помилка під час завантаження даних про файл",
- "Cancel" : "Скасувати",
- "Create" : "Створити",
- "%s used" : "%s використано",
- "%s%% of %s used" : "%s%% з %s використано",
- "%1$s of %2$s used" : "Використано %1$s з %2$s",
- "Settings" : "Налаштування",
- "Show hidden files" : "Показувати приховані файли",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "Використовуйте цю адресу для доступу до ваших Файлів за допомогою WebDAV",
- "Toggle grid view" : "Показати плитками",
- "No files in here" : "Тут немає файлів",
- "Upload some content or sync with your devices!" : "Завантажте щось або синхронізуйте з пристроями!",
- "No entries found in this folder" : "В цій теці нічого немає",
- "Select all" : "Вибрати всі",
- "Upload too large" : "Файл занадто великий",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли, які ви намагаєтеся завантажити, перевищують максимально дозволений розмір файлів для завантаження на цьому сервері.",
- "No favorites yet" : "Ще немає улюблених",
- "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут",
- "Deleted files" : "Кошик",
- "Shares" : "Спільний доступ",
- "Shared with others" : "Поділились з іншими",
- "Shared with you" : "Поділились з вами",
- "Shared by link" : "Доступне за посиланням",
- "Deleted shares" : "Вилучено зі спільного доступу",
- "Pending shares" : "Спільні ресурси в очікуванні",
+ "\"{displayName}\" action executed successfully" : "\"{displayName}\" успішно виконано",
+ "\"{displayName}\" action failed" : "Не вдалося виконати \"{displayName}\"",
+ "\"{displayName}\" failed on some elements" : "\"{displayName}\" не спрацював у деяких елементах",
+ "\"{displayName}\" batch action executed successfully" : "Операцію \"{displayName}\" успішно виконано",
+ "Submitting fields…" : "Поля для надсилання...",
+ "Filter filenames…" : "Вибрати файли за ім'ям ...",
+ "WebDAV URL copied to clipboard" : "Послиання WebDAV скопійовано до буферу обміну",
+ "Enable the grid view" : "Увімкнути подання сіткою",
+ "Enable folder tree" : "Увімкнути дерево каталогів",
+ "Copy to clipboard" : "Копіювати до буферу обміну",
+ "Use this address to access your Files via WebDAV" : "Адреса для доступу до файлів за допомогою протоколу WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Якщо увімкнено двофакторної авторизацію, вам потрібно створити та використовувати окремий пароль на застосунок. Для цього клацніть тут.",
+ "Deletion cancelled" : "Вилучення скасовано",
+ "Move cancelled" : "Переміщення скасовано",
+ "Cancelled move or copy of \"{filename}\"." : "Скасовано переміщення або копіювання \"{filename}\".",
+ "Cancelled move or copy operation" : "Переміщення або копіювання скасовано",
+ "Open details" : "Показати деталі",
+ "Photos and images" : "Зображення",
+ "New folder creation cancelled" : "Створення нового каталогу скасовано",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} каталог","{folderCount} каталоги","{folderCount} каталогів","{folderCount} каталогів"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} файл","{fileCount} файли","{fileCount} файлів","{fileCount} файлів"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 файл та {folderCount} каталог","1 файл та {folderCount} каталоги","1 файл та {folderCount} каталогів","1 файл та {folderCount} каталогів"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} файл та 1 каталог","{fileCount} файли та 1 каталог","{fileCount} файлів та 1 каталог","{fileCount} файлів та 1 каталог"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} файлів та {folderCount} каталогів",
+ "All folders" : "Усі каталоги",
+ "Personal Files" : "Мої документи",
"Text file" : "Текстовий файл",
- "New text file.txt" : "Новий текстовий файл file.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Сховище користувача {owner} переповнене, файли більше не можуть бути оновлені або синхронізовані!",
- "Your storage is full, files can not be updated or synced anymore!" : "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані!",
- "_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"]
+ "New text file.txt" : "Новий текстовий файл.txt",
+ "%1$s (renamed)" : "%1$s (перейменовано)",
+ "renamed file" : "перейменовано файл",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.",
+ "Filter file names …" : "Фільтр за іменем файлу ...",
+ "Prevent warning dialogs from open or reenable them." : "Не дозволяти показувати діялоги застережень або повторно увімкнути їх.",
+ "Show a warning dialog when changing a file extension." : "Показувати діялог застереження у разі зміни розширення файлу.",
+ "Speed up your Files experience with these quick shortcuts." : "Пришвідшіть взаємодію у застосунку \"Файли\" за скорочень",
+ "Open the actions menu for a file" : "Відкрити меню дій для файлу",
+ "Rename a file" : "Перейменувати файл",
+ "Delete a file" : "Вилучити файл",
+ "Favorite or remove a file from favorites" : "Додати або прибрати зірочку з файлу",
+ "Manage tags for a file" : "Керувати мітками файлу",
+ "Deselect all files" : "Прибрати вибір всіх файлів",
+ "Select or deselect a file" : "Вибрати чи прибрати вибір файлу",
+ "Select a range of files" : "Вибрати кілька файлів",
+ "Navigate to the parent folder" : "Перейти до каталогу вищого рівня",
+ "Navigate to the file above" : "Перейти до файлу вище",
+ "Navigate to the file below" : "Перейти до фйлу нижче",
+ "Navigate to the file on the left (in grid mode)" : "Перейти до файлу ліворуч (подання сіткою)",
+ "Navigate to the file on the right (in grid mode)" : "Перейти до файлу праворуч (подання сіткою)",
+ "Toggle the grid view" : "Перемкнути у подання сіткою",
+ "Open the sidebar for a file" : "Відкрити бокове меню для файлу"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js
deleted file mode 100644
index 094511db425..00000000000
--- a/apps/files/l10n/ur_PK.js
+++ /dev/null
@@ -1,13 +0,0 @@
-OC.L10N.register(
- "files",
- {
- "Unknown error" : "غیر معروف خرابی",
- "Close" : "بند ",
- "Download" : "ڈاؤن لوڈ،",
- "Delete" : "حذف کریں",
- "Unshare" : "شئیرنگ ختم کریں",
- "Name" : "اسم",
- "Save" : "حفظ",
- "Settings" : "ترتیبات"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json
deleted file mode 100644
index 3c859bb452d..00000000000
--- a/apps/files/l10n/ur_PK.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ "translations": {
- "Unknown error" : "غیر معروف خرابی",
- "Close" : "بند ",
- "Download" : "ڈاؤن لوڈ،",
- "Delete" : "حذف کریں",
- "Unshare" : "شئیرنگ ختم کریں",
- "Name" : "اسم",
- "Save" : "حفظ",
- "Settings" : "ترتیبات"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js
index 4c38f0fd48a..5517e324d05 100644
--- a/apps/files/l10n/vi.js
+++ b/apps/files/l10n/vi.js
@@ -1,16 +1,285 @@
OC.L10N.register(
"files",
{
+ "Added to favorites" : "Đã thêm vào mục ưa thích",
+ "Removed from favorites" : "Đã xóa khỏi mục ưa thích",
+ "You added {file} to your favorites" : "Bạn đã thêm {file} vào mục ưa thích của bạn",
+ "You removed {file} from your favorites" : "Bạn đã xóa {file} khỏi mục ưa thích của mình",
+ "Favorites" : "Ưa thích",
+ "File changes" : "Những thay đổi của tệp",
+ "Created by {user}" : "Được tạo bởi {user}",
+ "Changed by {user}" : "Thay đổi bởi {user}",
+ "Deleted by {user}" : "Đã xóa bởi {user}",
+ "Restored by {user}" : "Được khôi phục bởi {user}",
+ "Renamed by {user}" : "Đã đổi tên bởi {user}",
+ "Moved by {user}" : "Đã di chuyển bởi {user}",
+ "\"remote account\"" : "\"tài khoản từ xa\"",
+ "You created {file}" : "Bạn đã tạo {file}",
+ "You created an encrypted file in {file}" : "Bạn đã tạo một tệp được mã hóa trong {file}",
+ "{user} created {file}" : "{user} đã tạo {file}",
+ "{user} created an encrypted file in {file}" : "{user} đã tạo một tệp được mã hóa trong {file}",
+ "{file} was created in a public folder" : "{file} đã được tạo trong một thư mục công khai",
+ "You changed {file}" : "Bạn đã thay đổi {file}",
+ "You changed an encrypted file in {file}" : "Bạn đã thay đổi tệp được mã hóa trong {file}",
+ "{user} changed {file}" : "{user} đã thay đổi {file}",
+ "{user} changed an encrypted file in {file}" : "{user} đã thay đổi tệp được mã hóa trong {file}",
+ "You deleted {file}" : "Bạn đã xóa {file}",
+ "You deleted an encrypted file in {file}" : "Bạn đã xóa một tệp được mã hóa trong {file}",
+ "{user} deleted {file}" : "{user} đã xóa {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} đã xóa một tệp được mã hóa trong {file}",
+ "You restored {file}" : "Bạn đã khôi phục {file}",
+ "{user} restored {file}" : "{user} đã khôi phục {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Bạn đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Bạn đã đổi tên {oldfile} (ẩn) thành {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Bạn đã đổi tên {oldfile} thành {newfile} (ẩn)",
+ "You renamed {oldfile} to {newfile}" : "Bạn đã đổi tên {oldfile} thành {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} đã đổi tên {oldfile} (ẩn) thành {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} đã đổi tên {oldfile} thành {newfile} (ẩn)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} đã đổi tên {oldfile} thành {newfile}",
+ "You moved {oldfile} to {newfile}" : "Bạn đã di chuyển {oldfile} tới {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} đã di chuyển {oldfile} tới {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Một tệp đã được thêm hoặc bị xóa khỏi <strong>mục ưa thích của bạn</strong>",
+ "Files" : "Tệp tin",
+ "A file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục đã được <strong>thay đổi</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục ưa thích đã được <strong>thay đổi</strong>",
+ "Failed to authorize" : "Không thể xác minh",
+ "Invalid folder path" : "Đường dẫn tới thư mục không hợp lệ",
+ "Folder not found" : "Không thể tìm thấy thư mục",
+ "No favorites" : "Không có mục ưa thích nào",
+ "Accept" : "Đồng ý",
+ "Reject" : "Từ chối",
+ "Incoming ownership transfer from {user}" : "Có yêu cầu chuyển quyền sở hữu từ {user} ",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Bạn có đồng ý chuyển quyền cho {path}? \n\nLưu ý: Quá trình chuyển quyền sau khi chấp nhận có thể mất tới 1 giờ.",
+ "Ownership transfer denied" : "Yêu cầu chuyển quyền sở hữu đã bị từ chối",
+ "Your ownership transfer of {path} was denied by {user}." : "Yêu cầu chuyển quyền sở hữu của bạn đối với {path} đã bị từ chối bởi{user}.",
+ "Ownership transfer failed" : "Việc chuyển quyền sở hữu đã thất bại",
+ "Your ownership transfer of {path} to {user} failed." : "Việc chuyển quyền sở hữu {path} sang {user} đã thất bại.",
+ "The ownership transfer of {path} from {user} failed." : "Không thể chuyển quyền sở hữu {path} từ {user}.",
+ "Ownership transfer done" : "Việc chuyển quyền sở hữu đã được thực hiện",
+ "Your ownership transfer of {path} to {user} has completed." : "Việc chuyển quyền sở hữu {path} sang {user} đã hoàn tất.",
+ "The ownership transfer of {path} from {user} has completed." : "Việc chuyển quyền sở hữu {path} từ {user} đã hoàn tất.",
+ "in %s" : "trong %s",
+ "Transferred from %1$s on %2$s" : "Chuyển từ %1$s tại %2$s",
+ "Files compatibility" : "Khả năng tương thích của tập tin",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Giới hạn tên tệp để đảm bảo tệp có thể đáp ứng với toàn bộ người dùng. Mặc định hệ thống sẽ cho phép các tập tin có tên hợp lệ trên hệ POSIX (vd. Linux hoặc macOS).",
+ "Enforce Windows compatibility" : "Bắt buộc tên tệp phải tương thích với Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Tính năng này sẽ chặn tên tệp không hợp lệ trên hệ thống Windows, như sử dụng tên dành riêng hoặc ký tự đặc biệt. Tuy nhiên, tính năng này sẽ không bắt buộc với chữ in hoa và in thường.",
+ "File Management" : "Quản lý tệp tin",
+ "Home" : "Trang nhà",
+ "Target folder does not exist any more" : "Thư mục đích không còn tồn tại",
+ "Reload current directory" : "Tải lại thư mục hiện tại",
+ "Go to the \"{dir}\" directory" : "Đi đến thư mục \"{dir}\"",
+ "Current directory path" : "Đường dẫn hiện tại",
+ "Your have used your space quota and cannot upload files anymore" : "Bạn đã sử dụng hết hạn mức dung lượng và không thể tải tệp lên nữa",
+ "Drag and drop files here to upload" : "Kéo thả file vào đây để tải lên",
+ "Favorite" : "Ưa thích",
+ "Back" : "Trở lại",
+ "Toggle selection for file \"{displayName}\"" : "Lựa chọn tập tin \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Lựa chọn thư mục \"{displayName}\"",
+ "File is loading" : "Đang tải tập tin",
+ "Folder is loading" : "Đang tải thư mục",
+ "Filename" : "Tên tập tin",
+ "Folder name" : "Tên thư mục",
+ "This node is unavailable" : "Node này không có sẵn",
+ "Another entry with the same name already exists." : "Đã tồn tại mục cùng tên",
+ "Invalid filename." : "Tên tập tin không hợp lệ.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Đã đổi tên \"{oldName}\" thành \"{newName}\"",
+ "Rename file" : "Đổi tên tệp tin",
+ "Folder" : "Thư mục",
+ "Pending" : "Đang chờ",
+ "Clear filter" : "Xóa bộ lọc",
+ "Modified" : "Đã thay đổi vào:",
+ "Search everywhere" : "Tìm ở bất kì đâu",
+ "Type" : "Loại",
+ "Active filters" : "Bộ lọc đang hoạt động",
+ "Remove filter" : "Xoá bộ lọc",
+ "Total rows summary" : "Tổng số hàng",
+ "Toggle selection for all files and folders" : "Lựa chọn toàn bộ tập tin và thư mục",
+ "Name" : "Tên",
+ "Size" : "Kích cỡ",
+ "Actions" : "Hành động",
+ "(selected)" : "(đã chọn)",
+ "List of files and folders." : "Danh sách các tập tin và thư mục.",
+ "Column headers with buttons are sortable." : "Tiêu đề cột có thể sắp xếp được.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Danh sách này không được hiển thị đầy đủ để tăng hiệu năng. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
+ "File not found" : "Không tìm thấy tập tin",
+ "{usedQuotaByte} used" : "{usedQuotaByte} đã được sử dụng",
+ "{used} of {quota} used" : "{used} trong {quota} đã được sử dụng",
+ "{relative}% used" : "đã sử dụng {relative}%",
+ "Could not refresh storage stats" : "Không thể làm mới số liệu bộ nhớ",
+ "Your storage is full, files can not be updated or synced anymore!" : "Bộ nhớ của bạn đã đầy, các tập tin không thể cập nhật hoặc đồng bộ hóa nữa!",
+ "Storage information" : "Thông tin bộ nhớ",
+ "Storage quota" : "Thông tin dung lượng",
+ "New folder" : "Thư mục mới",
+ "Create new folder" : "Tạo thư mục mới",
+ "This name is already in use." : "Tên này đã được sử dụng.",
+ "Create" : "Tạo",
+ "Fill template fields" : "Tự động điền các trường thông tin",
+ "Submit" : "Gửi",
+ "Choose a file or folder to transfer" : "Chọn tệp hoặc thư mục cần chuyển",
+ "Transfer" : "Chuyển",
+ "Transfer {path} to {userid}" : "Chuyển {path} sang {userid}",
+ "Invalid path selected" : "Đường dẫn không hợp lệ",
+ "Unknown error" : "Lỗi không xác định",
+ "Ownership transfer request sent" : "Yêu cầu chuyển quyền sở hữu đã được gửi",
+ "Cannot transfer ownership of a file or folder you do not own" : "Không thể chuyển quyền sở hữu tệp hoặc thư mục mà bạn không sở hữu",
+ "Transfer ownership of a file or folder" : "Chuyển quyền sở hữu tệp hoặc thư mục",
+ "Choose file or folder to transfer" : "Chọn tệp hoặc thư mục để chuyển",
+ "Change" : "Thay đổi",
+ "New owner" : "Chủ sở hữu mới",
+ "Select file or folder to link to" : "Chọn tập tin hoặc thư mục để liên kết tới",
+ "Choose {file}" : "Chọn {file}",
+ "Share" : "Chia sẻ",
+ "Shared by link" : "Được chia sẻ với liên kết",
+ "Shared" : "Đã chia sẻ",
+ "Switch to list view" : "Chuyển sang chế độ xem danh sách",
+ "Switch to grid view" : "Chuyển sang chế độ xem dạng lưới",
+ "Upload was cancelled by user" : "Tải lên bị hủy bởi người dùng",
+ "Not enough free space" : "Không đủ dung lượng trống",
+ "Operation is blocked by access control" : "Thao tác bị chặn bởi kiểm soát truy cập",
+ "Error during upload: {message}" : "Lỗi khi đang tải lên: {message}",
+ "Error during upload, status code {status}" : "Lỗi khi đang tải lên, mã lỗi {status}",
+ "Unknown error during upload" : "Lỗi không xác định trong quá trình tải lên",
+ "Loading current folder" : "Đang tải thư mục hiện tại",
+ "Retry" : "Thử lại",
+ "No files in here" : "Không có tệp nào",
+ "Upload some content or sync with your devices!" : "Tải lên một số nội dung hoặc đồng bộ với thiết bị của bạn!",
+ "Go back" : "Quay lại",
+ "Views" : "Lượt xem",
+ "Files settings" : "Cài đặt tập tin",
+ "Your files" : "Tập tin của bạn",
+ "Open in files" : "Mở trong Tệp",
+ "File cannot be accessed" : "Không thể truy cập tập tin",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Không thể tìm thấy tệp hoặc bạn không có quyền xem tệp. Hãy yêu cầu người gửi cấp quyền truy cập.",
+ "Clipboard is not available" : "Bộ nhớ tạm không có sẵn",
+ "General" : "Cài đặt chung",
+ "All files" : "Tất cả tệp tin",
+ "Sort favorites first" : "Sắp xếp mục yêu thích trước",
+ "Sort folders before files" : "Sắp xếp thư mục trước tập tin",
+ "Appearance" : "Giao diện",
+ "Show hidden files" : "Hiển thị các tệp ẩn",
+ "Crop image previews" : "Xén ảnh xem trước",
+ "Additional settings" : "Cài đặt bổ sung",
+ "Copy" : "Sao chép",
+ "Keyboard shortcuts" : "Phím tắt",
+ "Rename" : "Đổi tên",
+ "Delete" : "Xóa",
+ "Manage tags" : "Quản lý nhãn",
+ "Selection" : "Lựa chọn",
+ "Deselect all" : "Bỏ chọn tất cả",
+ "Navigation" : "Điều hướng",
+ "View" : "Xem",
+ "You" : "Bạn",
+ "Shared multiple times with different people" : "Được chia sẻ nhiều lần với những người khác nhau",
+ "Error while loading the file data" : "Lỗi xảy ra trong khi tải dữ liệu tệp",
+ "Owner" : "Chủ sở hữu",
+ "Remove from favorites" : "Xóa khỏi ưa thích",
+ "Add to favorites" : "Thêm vào ưa thích",
+ "Tags" : "Nhãn",
+ "Blank" : "Trống",
+ "Unable to create new file from template" : "Không thể tạo tệp mới từ mẫu",
+ "Pick a template for {name}" : "Hãy chọn một mẫu cho {name}",
+ "Create a new file with the selected template" : "Tạo tệp mới với mẫu đã chọn",
+ "Creating file" : "Tạo tệp",
+ "Leave this share" : "Rời khỏi mục chia sẻ này",
+ "Leave these shares" : "Rời khỏi mục chia sẻ",
+ "Disconnect storage" : "Ngắt kết nối bộ nhớ",
+ "Disconnect storages" : "Ngắt kết nối các bộ nhớ",
+ "Delete permanently" : "Xoá vĩnh viễn",
+ "Delete and unshare" : "Xoá và dừng chia sẻ",
+ "Delete file" : "Xoá tập tin",
+ "Delete files" : "Xoá các tập tin",
+ "Delete folder" : "Xoá thư mục",
+ "Delete folders" : "Xoá các thư mục",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Bặn sắp xoá vĩnh viễn {count} mục"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Bạn sắp xoá {count} mục"],
+ "Confirm deletion" : "Xác nhận xoá",
+ "Cancel" : "Hủy bỏ",
+ "Download" : "Tải về",
+ "Moving \"{source}\" to \"{destination}\" …" : "Di chuyển \"{source}\" đến \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Sao chéo \"{source}\" đến \"{destination}\" …",
+ "Destination is not a folder" : "Đích đến không phải là một thư mục",
+ "This file/folder is already in that directory" : "Tệp/thư mục này đã có trong thư mục đó",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Bạn không thể di chuyển một tập tin/thư mục vào chính nó hoặc vào một thư mục con của chính nó",
+ "(copy)" : "(sao chép)",
+ "(copy %n)" : "(sao chép %n)",
+ "A file or folder with that name already exists in this folder" : "Tệp hoặc thư mục có tên đó đã tồn tại trong thư mục này",
+ "The files are locked" : "Tập tin bị khoá",
+ "The file does not exist anymore" : "Tập tin không tồn tại nữa",
+ "Choose destination" : "Lựa chọn điểm đến",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Di chuyển đến {target}",
+ "Move" : "Dịch chuyển",
+ "Move or copy operation failed" : "Thao tác di chuyển hoặc sao chép thất bại",
+ "Move or copy" : "Di chuyển hoặc sao chép",
+ "Open folder {displayName}" : "Mở thư mục {displayName}",
+ "Open in Files" : "Mở trong Tệp",
+ "Open locally" : "Mở cục bộ (local)/ ngoại tuyến",
+ "Failed to redirect to client" : "Không thể chuyển hướng đến ứng dụng khách",
+ "Open file locally" : "Mở tệp cục bộ (local)/ ngoại tuyến",
+ "Details" : "Chi tiết",
+ "View in folder" : "Xem trong thư mục",
+ "Today" : "Hôm nay",
+ "Last 7 days" : "7 ngày trước",
+ "Last 30 days" : "30 ngày trước",
+ "Documents" : "Tài liệu",
+ "Spreadsheets" : "Bảng tính",
+ "Presentations" : "Bản trình chiếu",
+ "Folders" : "Thư mục",
+ "Audio" : "Âm thanh",
+ "Images" : "Hình ảnh",
+ "Videos" : "Phim",
+ "Created new folder \"{name}\"" : "Đã tạo thư mục mới \"{name}\"",
+ "Unable to initialize the templates directory" : "Không thể khởi tạo thư mục mẫu",
+ "Create templates folder" : "Tạo thư mục mẫu",
+ "Templates" : "Mẫu",
+ "New template folder" : "Thư mục mẫu mới",
+ "In folder" : "Trong thư mục",
+ "Search in folder: {folder}" : "Tìm trong thư mục: {folder}",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Trình duyệt của bạn không hỗ trợ Filesystem API. Thư mục không thể tải lên.",
+ "No files to upload" : "Không có tệp để tải lên",
+ "Unable to create the directory {directory}" : "Không thể tạo đường dẫn {directory}",
+ "Some files could not be uploaded" : "Một số tệp tin không thể tải lên",
+ "Files uploaded successfully" : "Tệp tin được tải lên thành công",
+ "Some files could not be copied" : "Một số tập tin không thể sao chép",
+ "Some files could not be moved" : "Một số tập tin không thể dịch chuyển",
+ "Files copied successfully" : "Tệp tin được sao chép thành công",
+ "Files moved successfully" : "Tệp tin được di chuyển thành công",
+ "Conflicts resolution skipped" : "Đã bỏ qua giải quyết xung đột",
+ "Upload cancelled" : "Hủy tải lên",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Không thể đổi tên \"{oldName}\", tệp tin không còn tồn tại",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tên \"{newName}\" đã được sử dụng trong thư mục \"{dir}\". Vui lòng chọn một tên khác.",
+ "Could not rename \"{oldName}\"" : "Không thể đổi tên \"{oldName}\"",
+ "This operation is forbidden" : "Thao tác bị cấm",
"Storage is temporarily not available" : "Kho lưu trữ tạm thời không khả dụng",
- "Storage invalid" : "Lưu trữ không hợp lệ",
- "Unknown error" : "Lỗi chưa biết",
+ "_%n file_::_%n files_" : ["%n tập tin"],
+ "_%n folder_::_%n folders_" : ["%n thư mục"],
+ "Filename must not be empty." : "Tên tập tin không thể trống",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" không được phép bên trong tên tệp.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" là tên dành riêng và không được phép cho tên tệp.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" không phải là loại tệp được phép.",
+ "Filenames must not end with \"{extension}\"." : "Tên tệp không được phép kết thúc bởi \"{extension}\".",
+ "List of favorite files and folders." : "Danh sách tệp và thư mục yêu thích.",
+ "No favorites yet" : "Chưa có yêu thích nào",
+ "Files and folders you mark as favorite will show up here" : "Các tệp và thư mục mà bạn đánh dấu là yêu thích sẽ hiển thị ở đây",
+ "List of your files and folders." : "Danh sách các tập tin và thư mục của bạn.",
+ "List of your files and folders that are not shared." : "Danh sách tệp tin và thư mục không được chia sẻ của bạn.",
+ "No personal files found" : "Không có tệp cá nhân nào được tìm thấy",
+ "Files that are not shared will show up here." : "Các tệp và thư mục bạn đã không chia sẻ sẽ hiện thị ở đây.",
+ "Recent" : "Gần đây",
+ "List of recently modified files and folders." : "Danh sách các tập tin và thư mục được sửa đổi gần đây.",
+ "No recently modified files" : "Không có tập tin được sửa đổi gần đây",
+ "Files and folders you recently modified will show up here." : "Các tập tin và thư mục bạn sửa đổi gần đây sẽ hiển thị ở đây.",
+ "Search" : "Tìm kiếm",
+ "No entries found in this folder" : "Chưa có mục nào trong thư mục",
+ "Select all" : "Chọn tất cả",
+ "Upload too large" : "Tập tin tải lên quá lớn",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"File could not be found" : "Tệp tin không tồn tại",
- "Move or copy" : "Di chuyển hoặc sao chép",
- "Download" : "Tải về",
- "Delete" : "Xóa",
- "Home" : "Nhà",
+ "Show list view" : "Hiển thị chế độ xem danh sách",
+ "Show grid view" : "Hiển thị chế độ xem lưới",
"Close" : "Đóng",
- "Favorites" : "Ưa thích",
"Could not create folder \"{dir}\"" : "Không thể tạo thư mục “{dir}”",
"This will stop your current uploads." : "Hành động này sẽ dừng các tải lên hiện hành.",
"Upload cancelled." : "Hủy tải lên",
@@ -19,32 +288,23 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Không đủ dung lượng trống, bạn đang tải {size1} nhưng chỉ còn {size2} trống",
"Target folder \"{dir}\" does not exist any more" : "Thư mục đích \"{dir}\" không còn tồn tại",
- "Not enough free space" : "Không đủ dung lượng trống",
"An unknown error has occurred" : "Một lỗi không rõ đã xảy ra",
+ "File could not be uploaded" : "Không thể tải lên tập tin",
"Uploading …" : "Đang tải lên …",
+ "Uploading … ({currentNumber}/{total})" : "Đang tải lên … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} trong tổng số {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "‎Tải lên mục ‎‎đó không‎‎ được hỗ trợ‎",
- "Target folder does not exist any more" : "‎Thư mục đích‎‎ không còn tồn tại nữa‎",
- "Operation is blocked by access control" : "‎Thao tác bị chặn bởi kiểm ‎‎soát truy cập‎",
- "Error when assembling chunks, status code {status}" : "‎Lỗi‎‎ khi lắp ráp khối, mã trạng thái {status}‎",
- "Actions" : "Actions",
- "Rename" : "Sửa tên",
- "Copy" : "Sao chép",
- "Choose target folder" : "‎Chọn thư‎‎ ‎‎mục đích‎",
+ "Uploading that item is not supported" : "Tải lên mục đó không được hỗ trợ",
+ "Error when assembling chunks, status code {status}" : "Lỗi khi lắp ráp khối, mã trạng thái {status}",
+ "Choose target folder" : "Chọn thư mục đích",
+ "Set reminder" : "Thiết lập nhắc nhở",
+ "Edit locally" : "Chỉnh sửa cục bộ/ngoại tuyến",
"Open" : "Mở",
- "Delete file" : "Xóa tệp",
- "Delete folder" : "Xóa thư mục",
- "Disconnect storage" : "Bộ lưu trữ đã ngắt kết nối",
- "Leave this share" : "Rời khỏi mục chia sẻ này‎",
"Could not load info for file \"{file}\"" : "Không thể tải thông tin cho tệp \"{file}\"",
- "Files" : "Tập tin",
- "Details" : "Chi tiết",
"Please select tag(s) to add to the selection" : "Vui lòng chọn (các) thẻ để thêm vào lựa chọn",
"Apply tag(s) to selection" : "Áp dụng (các) thẻ cho lựa chọn",
- "Select" : "Chọn",
- "Pending" : "Đang chờ",
+ "Select directory \"{dirName}\"" : "Chọn thư mục \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Chọn tệp tin \"{fileName}\"",
"Unable to determine date" : "Không thể xác định ngày",
- "This operation is forbidden" : "Thao tác bị cấm",
"This directory is unavailable, please check the logs or contact the administrator" : "Thư mục này không sẵn có, hãy kiểm tra log hoặc liên hệ người quản lý",
"Could not move \"{file}\", target exists" : "Không thể di chuyển \"{file}\", trùng đích đến",
"Could not move \"{file}\"" : "Không thể di chuyển \"{file}\"",
@@ -54,166 +314,69 @@ OC.L10N.register(
"Copied {origin} inside {destination}" : "Được sao chép {origin} vào trong {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Đã sao chép {origin} và {nbfiles} các file vào trong {destination}",
"{newName} already exists" : "{newName} đã có",
- "Could not rename \"{fileName}\", it does not exist any more" : "Không thể đổi tên \"{fileName}\", tập tin không tồn tại",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tên \"{targetName}\" đã được dùng trong thư mục \"{dir}\". Hãy thử tên khác",
- "Could not rename \"{fileName}\"" : "Không thể đổi tên \"{fileName}\"",
"Could not create file \"{file}\"" : "Không thể tạo tập tin \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Không thể tạo tập tin \"{file}\" vì đã có ",
"Could not create folder \"{dir}\" because it already exists" : "Không thể tạo thư mục “{dir}” vì đã có",
- "Could not fetch file details \"{file}\"" : "‎Không thể lấy chi tiết tệp \"{file}\"‎",
+ "Could not fetch file details \"{file}\"" : "Không thể lấy chi tiết tệp \"{file}\"",
"Error deleting file \"{fileName}\"." : "Lỗi khi xóa tập tin \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Không có kết quả tìm kiếm trong các thư mục khác cho {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "‎Nhập nhiều hơn hai ký tự để tìm kiếm trong các thư mục khác‎",
- "Name" : "Tên",
- "Size" : "Kích cỡ",
- "Modified" : "Thay đổi",
- "_%n folder_::_%n folders_" : ["%n thư mục"],
- "_%n file_::_%n files_" : ["%n tập tin"],
+ "Enter more than two characters to search in other folders" : "Nhập nhiều hơn hai ký tự để tìm kiếm trong các thư mục khác",
"{dirs} and {files}" : "{dirs} và {files}",
"_including %n hidden_::_including %n hidden_" : ["Bao gồm %n ẩn"],
- "You don’t have permission to upload or create files here" : "Bạn không có quyền upload hoặc tạo files ở đây",
+ "You do not have permission to upload or create files here" : "Bạn không đủ quyền để Tải lên hoặc Tạo tập tin ở đây",
"_Uploading %n file_::_Uploading %n files_" : ["Đang tải lên %n tập tin"],
"New" : "Tạo mới",
- "Select file range" : "‎Chọn phạm vi tệp‎",
- "{used} of {quota} used" : "‎{used} trong { quota } ‎‎được‎‎ sử dụng‎",
- "{used} used" : "{used} được sử dụng‎",
+ "New file/folder menu" : "Menu tập tin/thư mục mới",
+ "Select file range" : "Chọn phạm vi tệp",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} được sử dụng",
"\"{name}\" is an invalid file name." : "\"{name}\" không được chấp nhận",
"File name cannot be empty." : "Tên file không được rỗng",
- "\"/\" is not allowed inside a file name." : "\"/\" ‎không được phép có trong tên tệp.‎",
+ "\"/\" is not allowed inside a file name." : "\"/\" không được phép có trong tên tệp.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" không phải là loại tập tin được cho phép",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Bộ nhớ của {owner} đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Thư mục nhóm \"{mountPoint}\" đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Bộ nhớ ngoài \"{mountPoint}\" đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"Your storage is full, files cannot be updated or synced anymore!" : "Bộ nhớ của bạn đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "‎Dung lượng lưu trữ {owner} gần đầy ({usedSpacePercent}%).‎",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "‎Thư mục nhóm \"{mountPoint}\" gần đầy ({usedSpacePercent}%).‎",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "‎Bộ nhớ ngoài \"{mountPoint}\" gần đầy ({usedSpacePercent}%).‎",
- "Your storage is almost full ({usedSpacePercent}%)." : "‎Dung lượng lưu trữ của bạn gần đầy rồi ({usedSpacePercent}%).‎",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Dung lượng lưu trữ {owner} gần đầy ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Thư mục nhóm \"{mountPoint}\" gần đầy ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Bộ nhớ ngoài \"{mountPoint}\" gần đầy ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Dung lượng lưu trữ của bạn gần đầy rồi ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["khớp với \"{filter}\""],
- "View in folder" : "Xem trong thư mục",
- "Copied!" : "Đã sao chép!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Sao chép liên kết trực tiếp (chỉ hoạt động đối với những người dùng có quyền truy cập vào tệp / thư mục này)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Đã sao chép đường dẫn trực tiếp(Chỉ áp dụng đối với người dùng có quyền truy cập vào thư mục/tệp tin)",
"Path" : "Đường dẫn",
- "_%n byte_::_%n bytes_" : ["%n bytes"],
- "Favorited" : "Được ưa thích",
- "Favorite" : "Ưa thích",
- "You can only favorite a single file or folder at a time" : "‎Bạn chỉ có thể chọn yêu thích một tệp hoặc thư mục duy nhất tại một thời điểm‎",
- "New folder" : "Tạo thư mục",
+ "Favored" : "Được ưa thích",
+ "Favor" : "Ưa thích",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Sao chép liên kết trực tiếp (chỉ hoạt động đối với những người dùng có quyền truy cập vào tệp / thư mục này)",
"Upload file" : "Tải lên tập tin",
- "Recent" : "Gần đây",
- "Not favorited" : "‎Không được yêu thích‎",
- "Remove from favorites" : "Xóa khỏi ưa thích",
- "Add to favorites" : "Thêm vào ưa thích",
- "An error occurred while trying to update the tags" : "Đã xảy ra lỗi khi cố gắng cập nhật tags",
- "Added to favorites" : "Đã thêm vào mục yêu thích",
- "Removed from favorites" : "Đã xóa khỏi mục ưa thích",
- "You added {file} to your favorites" : "Bạn đã thêm {file} vào mục ưa thích của bạn",
- "You removed {file} from your favorites" : "Bạn đã xóa {file} khỏi mục ưa thích của mình",
- "File changes" : "Tệp thay đổi",
- "Created by {user}" : "Được tạo bởi {user}",
- "Changed by {user}" : "Thay đổi bởi {user}",
- "Deleted by {user}" : "Đã xóa bởi {user}",
- "Restored by {user}" : "Được khôi phục bởi {user}",
- "Renamed by {user}" : "Đã đổi tên bởi {user}",
- "Moved by {user}" : "Đã di chuyển bởi {user}",
- "\"remote user\"" : "\"người dùng từ xa\"",
- "You created {file}" : "Bạn đã tạo {file}",
- "You created an encrypted file in {file}" : "‎Bạn đã tạo một tệp được mã hóa trong {file}‎",
- "{user} created {file}" : "{user} đã tạo {file}",
- "{user} created an encrypted file in {file}" : "‎{user} đã tạo một tệp được mã hóa trong {file}‎",
- "{file} was created in a public folder" : "{file} đã được tạo trong một thư mục công khai",
- "You changed {file}" : "Bạn đã thay đổi {file}",
- "You changed an encrypted file in {file}" : "‎Bạn đã thay đổi tệp được mã hóa trong {file}‎",
- "{user} changed {file}" : "{user} đã thay đổi {file}",
- "{user} changed an encrypted file in {file}" : "‎{user} đã thay đổi tệp được mã hóa trong {file}‎",
- "You deleted {file}" : "Bạn đã xóa {file}",
- "You deleted an encrypted file in {file}" : "‎Bạn đã xóa một tệp được mã hóa trong {file}‎",
- "{user} deleted {file}" : "{user} đã xóa {file}",
- "{user} deleted an encrypted file in {file}" : "‎{user} đã xóa một tệp được mã hóa trong {file}‎",
- "You restored {file}" : "Bạn đã khôi phục {file}",
- "{user} restored {file}" : "{user} đã khôi phục {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "‎Bạn đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)‎",
- "You renamed {oldfile} (hidden) to {newfile}" : "‎Bạn đã đổi tên {oldfile} (ẩn) thành {newfile}‎",
- "You renamed {oldfile} to {newfile} (hidden)" : "‎Bạn đã đổi tên {oldfile} thành {newfile} (ẩn)‎",
- "You renamed {oldfile} to {newfile}" : "Bạn đã đổi tên {oldfile} thành {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "‎{user} được đổi tên thành {oldfile} (ẩn) thành {newfile} (ẩn)‎",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "‎{user} được đổi tên thành {oldfile} (ẩn) thành {newfile}‎",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "‎{user} được đổi tên thành {oldfile} thành {newfile} (ẩn)‎",
- "{user} renamed {oldfile} to {newfile}" : "{user} đổi tên thành {oldfile} thành {newfile}",
- "You moved {oldfile} to {newfile}" : "Bạn đã chuyển {oldfile} tới {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} đã chuyển {oldfile} tới {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Một tệp đã được thêm hoặc bị xóa khỏi <strong>mục yêu thích của bạn</strong>",
- "A file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục đã được <strong>thay đổi</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "‎Tệp hoặc thư mục yêu thích đã được ‎<strong>‎thay đổi‎</strong>",
- "All files" : "Tất cả tệp tin",
- "Unlimited" : "Không giới hạn",
- "Upload (max. %s)" : "Tải lên (tối đa. %s)",
- "Accept" : "Đồng ý",
- "Reject" : "‎Từ chối‎",
- "Incoming ownership transfer from {user}" : "‎Chuyển quyền sở hữu đến từ {user}‎",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "‎Bạn có muốn chấp nhận {path}? ‎\n\n‎Lưu ý: Quá trình chuyển quyền sau khi chấp nhận có thể mất tới 1 ‎‎giờ.‎",
- "Ownership transfer failed" : "‎Chuyển quyền sở hữu không thành công‎",
- "Your ownership transfer of {path} to {user} failed." : "‎Việc chuyển quyền sở hữu {path} sang {user} của bạn đã thất bại.‎",
- "The ownership transfer of {path} from {user} failed." : "‎Việc chuyển quyền sở hữu {path} từ {user} không thành công.‎",
- "Ownership transfer done" : "‎Chuyển quyền sở hữu được thực hiện‎",
- "Your ownership transfer of {path} to {user} has completed." : "‎Việc chuyển quyền sở hữu {path} sang {user} của bạn đã hoàn tất.‎",
- "The ownership transfer of {path} from {user} has completed." : "‎Việc chuyển quyền sở hữu {path} từ {user} đã hoàn tất.‎",
- "in %s" : "trong %s",
- "File Management" : "‎Quản lý tệp‎ tin",
- "Transfer ownership of a file or folder" : "‎Chuyển quyền sở hữu tệp hoặc thư mục‎",
- "Choose file or folder to transfer" : "‎Chọn tệp hoặc cặp để chuyển‎",
- "Change" : "Chỉnh sửa",
- "New owner" : "‎Chủ sở hữu mới‎",
- "Search users" : "‎Tìm kiếm người dùng‎",
- "Choose a file or folder to transfer" : "‎Chọn tệp hoặc thư mục cần chuyển‎",
- "Transfer" : "‎Chuyển‎",
- "Transfer {path} to {userid}" : "‎Chuyển {path} sang {userid}‎",
- "Invalid path selected" : "‎Đường dẫn không hợp lệ được chọn‎",
- "Ownership transfer request sent" : "‎Yêu cầu chuyển quyền sở hữu đã được gửi‎",
- "Cannot transfer ownership of a file or folder you don't own" : "‎Không thể chuyển quyền sở hữu tệp hoặc thư mục bạn không sở hữu‎",
- "Tags" : "Nhãn",
- "Unable to change the favourite state of the file" : "‎Không thể thay đổi trạng thái yêu thích của tệp‎",
- "Error while loading the file data" : "‎Lỗi xảy ra trong khi tải dữ liệu tệp‎",
- "Pick a template for {name}" : "‎Chọn một mẫu cho {name}‎",
- "Cancel" : "‎Hủy bỏ‎",
- "Create" : "‎Tạo‎",
- "Create a new file with the selected template" : "‎Tạo tệp mới với mẫu đã chọn‎",
- "Creating file" : "‎Tạo tệp‎",
- "Blank" : "‎Trống‎",
- "Unable to create new file from template" : "‎Không thể tạo tệp mới từ mẫu‎",
- "Set up templates folder" : "‎Thiết lập thư mục mẫu‎",
- "Templates" : "‎Mẫu‎",
- "Unable to initialize the templates directory" : "‎Không thể khởi tạo thư mục mẫu‎",
- "%s used" : "%s ‎đã sử dụng‎",
- "%s%% of %s used" : "%s%% trong %s đã sử dụng",
- "%1$s of %2$s used" : "%1$s trên %2$s đã sử dụng",
- "Settings" : "Cài đặt",
- "Show hidden files" : "Hiển thị các file bị ẩn",
- "Crop image previews" : "‎Xén ảnh ‎bản xem trước",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "‎Sử dụng địa chỉ này để truy cập tệp của bạn thông qua WebDAV‎",
- "Toggle grid view" : "‎Chuyển đổi dạng xem lưới‎",
- "No files in here" : "Không có tệp nào",
- "Upload some content or sync with your devices!" : "Tải lên một số nội dung hoặc đồng bộ với thiết bị của bạn!",
- "No entries found in this folder" : "Chưa có mục nào trong thư mục",
- "Select all" : "Chọn tất cả",
- "Upload too large" : "Tập tin tải lên quá lớn",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
- "No favorites yet" : "‎Chưa có yêu thích nào‎",
- "Files and folders you mark as favorite will show up here" : "Các tệp và thư mục mà bạn đánh dấu là yêu thích sẽ hiển thị ở đây",
- "Deleted files" : "Thùng rác",
- "Shares" : "Chia sẻ",
- "Shared with others" : "Chia sẻ với người khác",
- "Shared with you" : "Đã chia sẻ với bạn",
- "Shared by link" : "Được chia sẻ bởi liên kết",
- "Deleted shares" : "‎Chia sẻ đã xóa‎",
- "Pending shares" : "Chia sẻ đang chờ xử lý‎",
+ "Not favored" : "Không được ưa thích",
+ "An error occurred while trying to update the tags" : "Đã xảy ra lỗi khi cố gắng cập nhật tags",
+ "Upload (max. %s)" : "Tải lên (tối đa %s)",
+ "\"{displayName}\" action executed successfully" : "Hành động \"{displayName}\" đã thực thi thành công",
+ "\"{displayName}\" action failed" : "Hành động \"{displayName}\" đã thực thi thất bại",
+ "\"{displayName}\" batch action executed successfully" : "Chỉnh sửa hàng loạt \"{displayName}\" được thực hiện thành công",
+ "Filter filenames…" : "Lọc tên tệp…",
+ "WebDAV URL copied to clipboard" : "Đã sao chép URL WebDAV vào bộ nhớ tạm",
+ "Enable the grid view" : "Bật chế độ xem lưới",
+ "Enable folder tree" : "Bật cây thư mục",
+ "Copy to clipboard" : "Sao chép vào bộ nhớ tạm",
+ "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
+ "Deletion cancelled" : "Thao tác xóa bị hủy",
+ "Move cancelled" : "Di chuyển bị dừng",
+ "Cancelled move or copy of \"{filename}\"." : "Đã huỷ việc di chuyển hoặc sao chép của \"{filename}\".",
+ "Cancelled move or copy operation" : "Đã hủy thao tác di chuyển hoặc sao chép",
+ "Open details" : "Mở chi tiết",
+ "Photos and images" : "Ảnh",
+ "New folder creation cancelled" : "Lỗi tạo thư mục",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["thư mục {folderCount}"],
+ "_{fileCount} file_::_{fileCount} files_" : ["tệp {fileCount}"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tệp và thư mục {folderCount}"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["tệp {fileCount} và 1 thư mục"],
+ "{fileCount} files and {folderCount} folders" : "Tệp {fileCount} và thư mục {folderCount}",
+ "All folders" : "Tất cả tệp tin",
+ "Personal Files" : "Tệp tin cá nhân",
"Text file" : "Tập tin văn bản",
- "New text file.txt" : "‎Tệp văn bản mới.txt‎",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Dung lượng của {owner} đã hết, không thể tải hay đồng bộ dữ liệu mới!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "‎Thư mục nhóm \"{mountPoint}\" đã đầy, các tệp không thể được cập nhật hoặc đồng bộ hóa nữa!‎",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "‎Bộ nhớ ngoài \"{mountPoint}\" đã đầy, các tệp không thể được cập nhật hoặc đồng bộ hóa nữa!‎",
- "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
- "_matches '{filter}'_::_match '{filter}'_" : ["khớp '{filter}'"]
+ "New text file.txt" : "Tệp văn bản mới.txt"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json
index 0a3e95d9f5f..b31dea59879 100644
--- a/apps/files/l10n/vi.json
+++ b/apps/files/l10n/vi.json
@@ -1,14 +1,283 @@
{ "translations": {
+ "Added to favorites" : "Đã thêm vào mục ưa thích",
+ "Removed from favorites" : "Đã xóa khỏi mục ưa thích",
+ "You added {file} to your favorites" : "Bạn đã thêm {file} vào mục ưa thích của bạn",
+ "You removed {file} from your favorites" : "Bạn đã xóa {file} khỏi mục ưa thích của mình",
+ "Favorites" : "Ưa thích",
+ "File changes" : "Những thay đổi của tệp",
+ "Created by {user}" : "Được tạo bởi {user}",
+ "Changed by {user}" : "Thay đổi bởi {user}",
+ "Deleted by {user}" : "Đã xóa bởi {user}",
+ "Restored by {user}" : "Được khôi phục bởi {user}",
+ "Renamed by {user}" : "Đã đổi tên bởi {user}",
+ "Moved by {user}" : "Đã di chuyển bởi {user}",
+ "\"remote account\"" : "\"tài khoản từ xa\"",
+ "You created {file}" : "Bạn đã tạo {file}",
+ "You created an encrypted file in {file}" : "Bạn đã tạo một tệp được mã hóa trong {file}",
+ "{user} created {file}" : "{user} đã tạo {file}",
+ "{user} created an encrypted file in {file}" : "{user} đã tạo một tệp được mã hóa trong {file}",
+ "{file} was created in a public folder" : "{file} đã được tạo trong một thư mục công khai",
+ "You changed {file}" : "Bạn đã thay đổi {file}",
+ "You changed an encrypted file in {file}" : "Bạn đã thay đổi tệp được mã hóa trong {file}",
+ "{user} changed {file}" : "{user} đã thay đổi {file}",
+ "{user} changed an encrypted file in {file}" : "{user} đã thay đổi tệp được mã hóa trong {file}",
+ "You deleted {file}" : "Bạn đã xóa {file}",
+ "You deleted an encrypted file in {file}" : "Bạn đã xóa một tệp được mã hóa trong {file}",
+ "{user} deleted {file}" : "{user} đã xóa {file}",
+ "{user} deleted an encrypted file in {file}" : "{user} đã xóa một tệp được mã hóa trong {file}",
+ "You restored {file}" : "Bạn đã khôi phục {file}",
+ "{user} restored {file}" : "{user} đã khôi phục {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Bạn đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Bạn đã đổi tên {oldfile} (ẩn) thành {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Bạn đã đổi tên {oldfile} thành {newfile} (ẩn)",
+ "You renamed {oldfile} to {newfile}" : "Bạn đã đổi tên {oldfile} thành {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} đã đổi tên {oldfile} (ẩn) thành {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} đã đổi tên {oldfile} thành {newfile} (ẩn)",
+ "{user} renamed {oldfile} to {newfile}" : "{user} đã đổi tên {oldfile} thành {newfile}",
+ "You moved {oldfile} to {newfile}" : "Bạn đã di chuyển {oldfile} tới {newfile}",
+ "{user} moved {oldfile} to {newfile}" : "{user} đã di chuyển {oldfile} tới {newfile}",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "Một tệp đã được thêm hoặc bị xóa khỏi <strong>mục ưa thích của bạn</strong>",
+ "Files" : "Tệp tin",
+ "A file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục đã được <strong>thay đổi</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục ưa thích đã được <strong>thay đổi</strong>",
+ "Failed to authorize" : "Không thể xác minh",
+ "Invalid folder path" : "Đường dẫn tới thư mục không hợp lệ",
+ "Folder not found" : "Không thể tìm thấy thư mục",
+ "No favorites" : "Không có mục ưa thích nào",
+ "Accept" : "Đồng ý",
+ "Reject" : "Từ chối",
+ "Incoming ownership transfer from {user}" : "Có yêu cầu chuyển quyền sở hữu từ {user} ",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Bạn có đồng ý chuyển quyền cho {path}? \n\nLưu ý: Quá trình chuyển quyền sau khi chấp nhận có thể mất tới 1 giờ.",
+ "Ownership transfer denied" : "Yêu cầu chuyển quyền sở hữu đã bị từ chối",
+ "Your ownership transfer of {path} was denied by {user}." : "Yêu cầu chuyển quyền sở hữu của bạn đối với {path} đã bị từ chối bởi{user}.",
+ "Ownership transfer failed" : "Việc chuyển quyền sở hữu đã thất bại",
+ "Your ownership transfer of {path} to {user} failed." : "Việc chuyển quyền sở hữu {path} sang {user} đã thất bại.",
+ "The ownership transfer of {path} from {user} failed." : "Không thể chuyển quyền sở hữu {path} từ {user}.",
+ "Ownership transfer done" : "Việc chuyển quyền sở hữu đã được thực hiện",
+ "Your ownership transfer of {path} to {user} has completed." : "Việc chuyển quyền sở hữu {path} sang {user} đã hoàn tất.",
+ "The ownership transfer of {path} from {user} has completed." : "Việc chuyển quyền sở hữu {path} từ {user} đã hoàn tất.",
+ "in %s" : "trong %s",
+ "Transferred from %1$s on %2$s" : "Chuyển từ %1$s tại %2$s",
+ "Files compatibility" : "Khả năng tương thích của tập tin",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Giới hạn tên tệp để đảm bảo tệp có thể đáp ứng với toàn bộ người dùng. Mặc định hệ thống sẽ cho phép các tập tin có tên hợp lệ trên hệ POSIX (vd. Linux hoặc macOS).",
+ "Enforce Windows compatibility" : "Bắt buộc tên tệp phải tương thích với Windows",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Tính năng này sẽ chặn tên tệp không hợp lệ trên hệ thống Windows, như sử dụng tên dành riêng hoặc ký tự đặc biệt. Tuy nhiên, tính năng này sẽ không bắt buộc với chữ in hoa và in thường.",
+ "File Management" : "Quản lý tệp tin",
+ "Home" : "Trang nhà",
+ "Target folder does not exist any more" : "Thư mục đích không còn tồn tại",
+ "Reload current directory" : "Tải lại thư mục hiện tại",
+ "Go to the \"{dir}\" directory" : "Đi đến thư mục \"{dir}\"",
+ "Current directory path" : "Đường dẫn hiện tại",
+ "Your have used your space quota and cannot upload files anymore" : "Bạn đã sử dụng hết hạn mức dung lượng và không thể tải tệp lên nữa",
+ "Drag and drop files here to upload" : "Kéo thả file vào đây để tải lên",
+ "Favorite" : "Ưa thích",
+ "Back" : "Trở lại",
+ "Toggle selection for file \"{displayName}\"" : "Lựa chọn tập tin \"{displayName}\"",
+ "Toggle selection for folder \"{displayName}\"" : "Lựa chọn thư mục \"{displayName}\"",
+ "File is loading" : "Đang tải tập tin",
+ "Folder is loading" : "Đang tải thư mục",
+ "Filename" : "Tên tập tin",
+ "Folder name" : "Tên thư mục",
+ "This node is unavailable" : "Node này không có sẵn",
+ "Another entry with the same name already exists." : "Đã tồn tại mục cùng tên",
+ "Invalid filename." : "Tên tập tin không hợp lệ.",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "Đã đổi tên \"{oldName}\" thành \"{newName}\"",
+ "Rename file" : "Đổi tên tệp tin",
+ "Folder" : "Thư mục",
+ "Pending" : "Đang chờ",
+ "Clear filter" : "Xóa bộ lọc",
+ "Modified" : "Đã thay đổi vào:",
+ "Search everywhere" : "Tìm ở bất kì đâu",
+ "Type" : "Loại",
+ "Active filters" : "Bộ lọc đang hoạt động",
+ "Remove filter" : "Xoá bộ lọc",
+ "Total rows summary" : "Tổng số hàng",
+ "Toggle selection for all files and folders" : "Lựa chọn toàn bộ tập tin và thư mục",
+ "Name" : "Tên",
+ "Size" : "Kích cỡ",
+ "Actions" : "Hành động",
+ "(selected)" : "(đã chọn)",
+ "List of files and folders." : "Danh sách các tập tin và thư mục.",
+ "Column headers with buttons are sortable." : "Tiêu đề cột có thể sắp xếp được.",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Danh sách này không được hiển thị đầy đủ để tăng hiệu năng. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
+ "File not found" : "Không tìm thấy tập tin",
+ "{usedQuotaByte} used" : "{usedQuotaByte} đã được sử dụng",
+ "{used} of {quota} used" : "{used} trong {quota} đã được sử dụng",
+ "{relative}% used" : "đã sử dụng {relative}%",
+ "Could not refresh storage stats" : "Không thể làm mới số liệu bộ nhớ",
+ "Your storage is full, files can not be updated or synced anymore!" : "Bộ nhớ của bạn đã đầy, các tập tin không thể cập nhật hoặc đồng bộ hóa nữa!",
+ "Storage information" : "Thông tin bộ nhớ",
+ "Storage quota" : "Thông tin dung lượng",
+ "New folder" : "Thư mục mới",
+ "Create new folder" : "Tạo thư mục mới",
+ "This name is already in use." : "Tên này đã được sử dụng.",
+ "Create" : "Tạo",
+ "Fill template fields" : "Tự động điền các trường thông tin",
+ "Submit" : "Gửi",
+ "Choose a file or folder to transfer" : "Chọn tệp hoặc thư mục cần chuyển",
+ "Transfer" : "Chuyển",
+ "Transfer {path} to {userid}" : "Chuyển {path} sang {userid}",
+ "Invalid path selected" : "Đường dẫn không hợp lệ",
+ "Unknown error" : "Lỗi không xác định",
+ "Ownership transfer request sent" : "Yêu cầu chuyển quyền sở hữu đã được gửi",
+ "Cannot transfer ownership of a file or folder you do not own" : "Không thể chuyển quyền sở hữu tệp hoặc thư mục mà bạn không sở hữu",
+ "Transfer ownership of a file or folder" : "Chuyển quyền sở hữu tệp hoặc thư mục",
+ "Choose file or folder to transfer" : "Chọn tệp hoặc thư mục để chuyển",
+ "Change" : "Thay đổi",
+ "New owner" : "Chủ sở hữu mới",
+ "Select file or folder to link to" : "Chọn tập tin hoặc thư mục để liên kết tới",
+ "Choose {file}" : "Chọn {file}",
+ "Share" : "Chia sẻ",
+ "Shared by link" : "Được chia sẻ với liên kết",
+ "Shared" : "Đã chia sẻ",
+ "Switch to list view" : "Chuyển sang chế độ xem danh sách",
+ "Switch to grid view" : "Chuyển sang chế độ xem dạng lưới",
+ "Upload was cancelled by user" : "Tải lên bị hủy bởi người dùng",
+ "Not enough free space" : "Không đủ dung lượng trống",
+ "Operation is blocked by access control" : "Thao tác bị chặn bởi kiểm soát truy cập",
+ "Error during upload: {message}" : "Lỗi khi đang tải lên: {message}",
+ "Error during upload, status code {status}" : "Lỗi khi đang tải lên, mã lỗi {status}",
+ "Unknown error during upload" : "Lỗi không xác định trong quá trình tải lên",
+ "Loading current folder" : "Đang tải thư mục hiện tại",
+ "Retry" : "Thử lại",
+ "No files in here" : "Không có tệp nào",
+ "Upload some content or sync with your devices!" : "Tải lên một số nội dung hoặc đồng bộ với thiết bị của bạn!",
+ "Go back" : "Quay lại",
+ "Views" : "Lượt xem",
+ "Files settings" : "Cài đặt tập tin",
+ "Your files" : "Tập tin của bạn",
+ "Open in files" : "Mở trong Tệp",
+ "File cannot be accessed" : "Không thể truy cập tập tin",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Không thể tìm thấy tệp hoặc bạn không có quyền xem tệp. Hãy yêu cầu người gửi cấp quyền truy cập.",
+ "Clipboard is not available" : "Bộ nhớ tạm không có sẵn",
+ "General" : "Cài đặt chung",
+ "All files" : "Tất cả tệp tin",
+ "Sort favorites first" : "Sắp xếp mục yêu thích trước",
+ "Sort folders before files" : "Sắp xếp thư mục trước tập tin",
+ "Appearance" : "Giao diện",
+ "Show hidden files" : "Hiển thị các tệp ẩn",
+ "Crop image previews" : "Xén ảnh xem trước",
+ "Additional settings" : "Cài đặt bổ sung",
+ "Copy" : "Sao chép",
+ "Keyboard shortcuts" : "Phím tắt",
+ "Rename" : "Đổi tên",
+ "Delete" : "Xóa",
+ "Manage tags" : "Quản lý nhãn",
+ "Selection" : "Lựa chọn",
+ "Deselect all" : "Bỏ chọn tất cả",
+ "Navigation" : "Điều hướng",
+ "View" : "Xem",
+ "You" : "Bạn",
+ "Shared multiple times with different people" : "Được chia sẻ nhiều lần với những người khác nhau",
+ "Error while loading the file data" : "Lỗi xảy ra trong khi tải dữ liệu tệp",
+ "Owner" : "Chủ sở hữu",
+ "Remove from favorites" : "Xóa khỏi ưa thích",
+ "Add to favorites" : "Thêm vào ưa thích",
+ "Tags" : "Nhãn",
+ "Blank" : "Trống",
+ "Unable to create new file from template" : "Không thể tạo tệp mới từ mẫu",
+ "Pick a template for {name}" : "Hãy chọn một mẫu cho {name}",
+ "Create a new file with the selected template" : "Tạo tệp mới với mẫu đã chọn",
+ "Creating file" : "Tạo tệp",
+ "Leave this share" : "Rời khỏi mục chia sẻ này",
+ "Leave these shares" : "Rời khỏi mục chia sẻ",
+ "Disconnect storage" : "Ngắt kết nối bộ nhớ",
+ "Disconnect storages" : "Ngắt kết nối các bộ nhớ",
+ "Delete permanently" : "Xoá vĩnh viễn",
+ "Delete and unshare" : "Xoá và dừng chia sẻ",
+ "Delete file" : "Xoá tập tin",
+ "Delete files" : "Xoá các tập tin",
+ "Delete folder" : "Xoá thư mục",
+ "Delete folders" : "Xoá các thư mục",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["Bặn sắp xoá vĩnh viễn {count} mục"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["Bạn sắp xoá {count} mục"],
+ "Confirm deletion" : "Xác nhận xoá",
+ "Cancel" : "Hủy bỏ",
+ "Download" : "Tải về",
+ "Moving \"{source}\" to \"{destination}\" …" : "Di chuyển \"{source}\" đến \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Sao chéo \"{source}\" đến \"{destination}\" …",
+ "Destination is not a folder" : "Đích đến không phải là một thư mục",
+ "This file/folder is already in that directory" : "Tệp/thư mục này đã có trong thư mục đó",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Bạn không thể di chuyển một tập tin/thư mục vào chính nó hoặc vào một thư mục con của chính nó",
+ "(copy)" : "(sao chép)",
+ "(copy %n)" : "(sao chép %n)",
+ "A file or folder with that name already exists in this folder" : "Tệp hoặc thư mục có tên đó đã tồn tại trong thư mục này",
+ "The files are locked" : "Tập tin bị khoá",
+ "The file does not exist anymore" : "Tập tin không tồn tại nữa",
+ "Choose destination" : "Lựa chọn điểm đến",
+ "Copy to {target}" : "Copy to {target}",
+ "Move to {target}" : "Di chuyển đến {target}",
+ "Move" : "Dịch chuyển",
+ "Move or copy operation failed" : "Thao tác di chuyển hoặc sao chép thất bại",
+ "Move or copy" : "Di chuyển hoặc sao chép",
+ "Open folder {displayName}" : "Mở thư mục {displayName}",
+ "Open in Files" : "Mở trong Tệp",
+ "Open locally" : "Mở cục bộ (local)/ ngoại tuyến",
+ "Failed to redirect to client" : "Không thể chuyển hướng đến ứng dụng khách",
+ "Open file locally" : "Mở tệp cục bộ (local)/ ngoại tuyến",
+ "Details" : "Chi tiết",
+ "View in folder" : "Xem trong thư mục",
+ "Today" : "Hôm nay",
+ "Last 7 days" : "7 ngày trước",
+ "Last 30 days" : "30 ngày trước",
+ "Documents" : "Tài liệu",
+ "Spreadsheets" : "Bảng tính",
+ "Presentations" : "Bản trình chiếu",
+ "Folders" : "Thư mục",
+ "Audio" : "Âm thanh",
+ "Images" : "Hình ảnh",
+ "Videos" : "Phim",
+ "Created new folder \"{name}\"" : "Đã tạo thư mục mới \"{name}\"",
+ "Unable to initialize the templates directory" : "Không thể khởi tạo thư mục mẫu",
+ "Create templates folder" : "Tạo thư mục mẫu",
+ "Templates" : "Mẫu",
+ "New template folder" : "Thư mục mẫu mới",
+ "In folder" : "Trong thư mục",
+ "Search in folder: {folder}" : "Tìm trong thư mục: {folder}",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Trình duyệt của bạn không hỗ trợ Filesystem API. Thư mục không thể tải lên.",
+ "No files to upload" : "Không có tệp để tải lên",
+ "Unable to create the directory {directory}" : "Không thể tạo đường dẫn {directory}",
+ "Some files could not be uploaded" : "Một số tệp tin không thể tải lên",
+ "Files uploaded successfully" : "Tệp tin được tải lên thành công",
+ "Some files could not be copied" : "Một số tập tin không thể sao chép",
+ "Some files could not be moved" : "Một số tập tin không thể dịch chuyển",
+ "Files copied successfully" : "Tệp tin được sao chép thành công",
+ "Files moved successfully" : "Tệp tin được di chuyển thành công",
+ "Conflicts resolution skipped" : "Đã bỏ qua giải quyết xung đột",
+ "Upload cancelled" : "Hủy tải lên",
+ "Could not rename \"{oldName}\", it does not exist any more" : "Không thể đổi tên \"{oldName}\", tệp tin không còn tồn tại",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tên \"{newName}\" đã được sử dụng trong thư mục \"{dir}\". Vui lòng chọn một tên khác.",
+ "Could not rename \"{oldName}\"" : "Không thể đổi tên \"{oldName}\"",
+ "This operation is forbidden" : "Thao tác bị cấm",
"Storage is temporarily not available" : "Kho lưu trữ tạm thời không khả dụng",
- "Storage invalid" : "Lưu trữ không hợp lệ",
- "Unknown error" : "Lỗi chưa biết",
+ "_%n file_::_%n files_" : ["%n tập tin"],
+ "_%n folder_::_%n folders_" : ["%n thư mục"],
+ "Filename must not be empty." : "Tên tập tin không thể trống",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" không được phép bên trong tên tệp.",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" là tên dành riêng và không được phép cho tên tệp.",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" không phải là loại tệp được phép.",
+ "Filenames must not end with \"{extension}\"." : "Tên tệp không được phép kết thúc bởi \"{extension}\".",
+ "List of favorite files and folders." : "Danh sách tệp và thư mục yêu thích.",
+ "No favorites yet" : "Chưa có yêu thích nào",
+ "Files and folders you mark as favorite will show up here" : "Các tệp và thư mục mà bạn đánh dấu là yêu thích sẽ hiển thị ở đây",
+ "List of your files and folders." : "Danh sách các tập tin và thư mục của bạn.",
+ "List of your files and folders that are not shared." : "Danh sách tệp tin và thư mục không được chia sẻ của bạn.",
+ "No personal files found" : "Không có tệp cá nhân nào được tìm thấy",
+ "Files that are not shared will show up here." : "Các tệp và thư mục bạn đã không chia sẻ sẽ hiện thị ở đây.",
+ "Recent" : "Gần đây",
+ "List of recently modified files and folders." : "Danh sách các tập tin và thư mục được sửa đổi gần đây.",
+ "No recently modified files" : "Không có tập tin được sửa đổi gần đây",
+ "Files and folders you recently modified will show up here." : "Các tập tin và thư mục bạn sửa đổi gần đây sẽ hiển thị ở đây.",
+ "Search" : "Tìm kiếm",
+ "No entries found in this folder" : "Chưa có mục nào trong thư mục",
+ "Select all" : "Chọn tất cả",
+ "Upload too large" : "Tập tin tải lên quá lớn",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"File could not be found" : "Tệp tin không tồn tại",
- "Move or copy" : "Di chuyển hoặc sao chép",
- "Download" : "Tải về",
- "Delete" : "Xóa",
- "Home" : "Nhà",
+ "Show list view" : "Hiển thị chế độ xem danh sách",
+ "Show grid view" : "Hiển thị chế độ xem lưới",
"Close" : "Đóng",
- "Favorites" : "Ưa thích",
"Could not create folder \"{dir}\"" : "Không thể tạo thư mục “{dir}”",
"This will stop your current uploads." : "Hành động này sẽ dừng các tải lên hiện hành.",
"Upload cancelled." : "Hủy tải lên",
@@ -17,32 +286,23 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Không đủ dung lượng trống, bạn đang tải {size1} nhưng chỉ còn {size2} trống",
"Target folder \"{dir}\" does not exist any more" : "Thư mục đích \"{dir}\" không còn tồn tại",
- "Not enough free space" : "Không đủ dung lượng trống",
"An unknown error has occurred" : "Một lỗi không rõ đã xảy ra",
+ "File could not be uploaded" : "Không thể tải lên tập tin",
"Uploading …" : "Đang tải lên …",
+ "Uploading … ({currentNumber}/{total})" : "Đang tải lên … ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} trong tổng số {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "‎Tải lên mục ‎‎đó không‎‎ được hỗ trợ‎",
- "Target folder does not exist any more" : "‎Thư mục đích‎‎ không còn tồn tại nữa‎",
- "Operation is blocked by access control" : "‎Thao tác bị chặn bởi kiểm ‎‎soát truy cập‎",
- "Error when assembling chunks, status code {status}" : "‎Lỗi‎‎ khi lắp ráp khối, mã trạng thái {status}‎",
- "Actions" : "Actions",
- "Rename" : "Sửa tên",
- "Copy" : "Sao chép",
- "Choose target folder" : "‎Chọn thư‎‎ ‎‎mục đích‎",
+ "Uploading that item is not supported" : "Tải lên mục đó không được hỗ trợ",
+ "Error when assembling chunks, status code {status}" : "Lỗi khi lắp ráp khối, mã trạng thái {status}",
+ "Choose target folder" : "Chọn thư mục đích",
+ "Set reminder" : "Thiết lập nhắc nhở",
+ "Edit locally" : "Chỉnh sửa cục bộ/ngoại tuyến",
"Open" : "Mở",
- "Delete file" : "Xóa tệp",
- "Delete folder" : "Xóa thư mục",
- "Disconnect storage" : "Bộ lưu trữ đã ngắt kết nối",
- "Leave this share" : "Rời khỏi mục chia sẻ này‎",
"Could not load info for file \"{file}\"" : "Không thể tải thông tin cho tệp \"{file}\"",
- "Files" : "Tập tin",
- "Details" : "Chi tiết",
"Please select tag(s) to add to the selection" : "Vui lòng chọn (các) thẻ để thêm vào lựa chọn",
"Apply tag(s) to selection" : "Áp dụng (các) thẻ cho lựa chọn",
- "Select" : "Chọn",
- "Pending" : "Đang chờ",
+ "Select directory \"{dirName}\"" : "Chọn thư mục \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Chọn tệp tin \"{fileName}\"",
"Unable to determine date" : "Không thể xác định ngày",
- "This operation is forbidden" : "Thao tác bị cấm",
"This directory is unavailable, please check the logs or contact the administrator" : "Thư mục này không sẵn có, hãy kiểm tra log hoặc liên hệ người quản lý",
"Could not move \"{file}\", target exists" : "Không thể di chuyển \"{file}\", trùng đích đến",
"Could not move \"{file}\"" : "Không thể di chuyển \"{file}\"",
@@ -52,166 +312,69 @@
"Copied {origin} inside {destination}" : "Được sao chép {origin} vào trong {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Đã sao chép {origin} và {nbfiles} các file vào trong {destination}",
"{newName} already exists" : "{newName} đã có",
- "Could not rename \"{fileName}\", it does not exist any more" : "Không thể đổi tên \"{fileName}\", tập tin không tồn tại",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Tên \"{targetName}\" đã được dùng trong thư mục \"{dir}\". Hãy thử tên khác",
- "Could not rename \"{fileName}\"" : "Không thể đổi tên \"{fileName}\"",
"Could not create file \"{file}\"" : "Không thể tạo tập tin \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Không thể tạo tập tin \"{file}\" vì đã có ",
"Could not create folder \"{dir}\" because it already exists" : "Không thể tạo thư mục “{dir}” vì đã có",
- "Could not fetch file details \"{file}\"" : "‎Không thể lấy chi tiết tệp \"{file}\"‎",
+ "Could not fetch file details \"{file}\"" : "Không thể lấy chi tiết tệp \"{file}\"",
"Error deleting file \"{fileName}\"." : "Lỗi khi xóa tập tin \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Không có kết quả tìm kiếm trong các thư mục khác cho {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "‎Nhập nhiều hơn hai ký tự để tìm kiếm trong các thư mục khác‎",
- "Name" : "Tên",
- "Size" : "Kích cỡ",
- "Modified" : "Thay đổi",
- "_%n folder_::_%n folders_" : ["%n thư mục"],
- "_%n file_::_%n files_" : ["%n tập tin"],
+ "Enter more than two characters to search in other folders" : "Nhập nhiều hơn hai ký tự để tìm kiếm trong các thư mục khác",
"{dirs} and {files}" : "{dirs} và {files}",
"_including %n hidden_::_including %n hidden_" : ["Bao gồm %n ẩn"],
- "You don’t have permission to upload or create files here" : "Bạn không có quyền upload hoặc tạo files ở đây",
+ "You do not have permission to upload or create files here" : "Bạn không đủ quyền để Tải lên hoặc Tạo tập tin ở đây",
"_Uploading %n file_::_Uploading %n files_" : ["Đang tải lên %n tập tin"],
"New" : "Tạo mới",
- "Select file range" : "‎Chọn phạm vi tệp‎",
- "{used} of {quota} used" : "‎{used} trong { quota } ‎‎được‎‎ sử dụng‎",
- "{used} used" : "{used} được sử dụng‎",
+ "New file/folder menu" : "Menu tập tin/thư mục mới",
+ "Select file range" : "Chọn phạm vi tệp",
+ "{used}%" : "{used}%",
+ "{used} used" : "{used} được sử dụng",
"\"{name}\" is an invalid file name." : "\"{name}\" không được chấp nhận",
"File name cannot be empty." : "Tên file không được rỗng",
- "\"/\" is not allowed inside a file name." : "\"/\" ‎không được phép có trong tên tệp.‎",
+ "\"/\" is not allowed inside a file name." : "\"/\" không được phép có trong tên tệp.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" không phải là loại tập tin được cho phép",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Bộ nhớ của {owner} đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Thư mục nhóm \"{mountPoint}\" đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Bộ nhớ ngoài \"{mountPoint}\" đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
"Your storage is full, files cannot be updated or synced anymore!" : "Bộ nhớ của bạn đã đầy, không thể cập nhật hoặc đồng bộ hóa tệp được nữa!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "‎Dung lượng lưu trữ {owner} gần đầy ({usedSpacePercent}%).‎",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "‎Thư mục nhóm \"{mountPoint}\" gần đầy ({usedSpacePercent}%).‎",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "‎Bộ nhớ ngoài \"{mountPoint}\" gần đầy ({usedSpacePercent}%).‎",
- "Your storage is almost full ({usedSpacePercent}%)." : "‎Dung lượng lưu trữ của bạn gần đầy rồi ({usedSpacePercent}%).‎",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Dung lượng lưu trữ {owner} gần đầy ({usedSpacePercent}%).",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Thư mục nhóm \"{mountPoint}\" gần đầy ({usedSpacePercent}%).",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Bộ nhớ ngoài \"{mountPoint}\" gần đầy ({usedSpacePercent}%).",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Dung lượng lưu trữ của bạn gần đầy rồi ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["khớp với \"{filter}\""],
- "View in folder" : "Xem trong thư mục",
- "Copied!" : "Đã sao chép!",
- "Copy direct link (only works for users who have access to this file/folder)" : "Sao chép liên kết trực tiếp (chỉ hoạt động đối với những người dùng có quyền truy cập vào tệp / thư mục này)",
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Đã sao chép đường dẫn trực tiếp(Chỉ áp dụng đối với người dùng có quyền truy cập vào thư mục/tệp tin)",
"Path" : "Đường dẫn",
- "_%n byte_::_%n bytes_" : ["%n bytes"],
- "Favorited" : "Được ưa thích",
- "Favorite" : "Ưa thích",
- "You can only favorite a single file or folder at a time" : "‎Bạn chỉ có thể chọn yêu thích một tệp hoặc thư mục duy nhất tại một thời điểm‎",
- "New folder" : "Tạo thư mục",
+ "Favored" : "Được ưa thích",
+ "Favor" : "Ưa thích",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Sao chép liên kết trực tiếp (chỉ hoạt động đối với những người dùng có quyền truy cập vào tệp / thư mục này)",
"Upload file" : "Tải lên tập tin",
- "Recent" : "Gần đây",
- "Not favorited" : "‎Không được yêu thích‎",
- "Remove from favorites" : "Xóa khỏi ưa thích",
- "Add to favorites" : "Thêm vào ưa thích",
- "An error occurred while trying to update the tags" : "Đã xảy ra lỗi khi cố gắng cập nhật tags",
- "Added to favorites" : "Đã thêm vào mục yêu thích",
- "Removed from favorites" : "Đã xóa khỏi mục ưa thích",
- "You added {file} to your favorites" : "Bạn đã thêm {file} vào mục ưa thích của bạn",
- "You removed {file} from your favorites" : "Bạn đã xóa {file} khỏi mục ưa thích của mình",
- "File changes" : "Tệp thay đổi",
- "Created by {user}" : "Được tạo bởi {user}",
- "Changed by {user}" : "Thay đổi bởi {user}",
- "Deleted by {user}" : "Đã xóa bởi {user}",
- "Restored by {user}" : "Được khôi phục bởi {user}",
- "Renamed by {user}" : "Đã đổi tên bởi {user}",
- "Moved by {user}" : "Đã di chuyển bởi {user}",
- "\"remote user\"" : "\"người dùng từ xa\"",
- "You created {file}" : "Bạn đã tạo {file}",
- "You created an encrypted file in {file}" : "‎Bạn đã tạo một tệp được mã hóa trong {file}‎",
- "{user} created {file}" : "{user} đã tạo {file}",
- "{user} created an encrypted file in {file}" : "‎{user} đã tạo một tệp được mã hóa trong {file}‎",
- "{file} was created in a public folder" : "{file} đã được tạo trong một thư mục công khai",
- "You changed {file}" : "Bạn đã thay đổi {file}",
- "You changed an encrypted file in {file}" : "‎Bạn đã thay đổi tệp được mã hóa trong {file}‎",
- "{user} changed {file}" : "{user} đã thay đổi {file}",
- "{user} changed an encrypted file in {file}" : "‎{user} đã thay đổi tệp được mã hóa trong {file}‎",
- "You deleted {file}" : "Bạn đã xóa {file}",
- "You deleted an encrypted file in {file}" : "‎Bạn đã xóa một tệp được mã hóa trong {file}‎",
- "{user} deleted {file}" : "{user} đã xóa {file}",
- "{user} deleted an encrypted file in {file}" : "‎{user} đã xóa một tệp được mã hóa trong {file}‎",
- "You restored {file}" : "Bạn đã khôi phục {file}",
- "{user} restored {file}" : "{user} đã khôi phục {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "‎Bạn đã đổi tên {oldfile} (ẩn) thành {newfile} (ẩn)‎",
- "You renamed {oldfile} (hidden) to {newfile}" : "‎Bạn đã đổi tên {oldfile} (ẩn) thành {newfile}‎",
- "You renamed {oldfile} to {newfile} (hidden)" : "‎Bạn đã đổi tên {oldfile} thành {newfile} (ẩn)‎",
- "You renamed {oldfile} to {newfile}" : "Bạn đã đổi tên {oldfile} thành {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "‎{user} được đổi tên thành {oldfile} (ẩn) thành {newfile} (ẩn)‎",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "‎{user} được đổi tên thành {oldfile} (ẩn) thành {newfile}‎",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "‎{user} được đổi tên thành {oldfile} thành {newfile} (ẩn)‎",
- "{user} renamed {oldfile} to {newfile}" : "{user} đổi tên thành {oldfile} thành {newfile}",
- "You moved {oldfile} to {newfile}" : "Bạn đã chuyển {oldfile} tới {newfile}",
- "{user} moved {oldfile} to {newfile}" : "{user} đã chuyển {oldfile} tới {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "Một tệp đã được thêm hoặc bị xóa khỏi <strong>mục yêu thích của bạn</strong>",
- "A file or folder has been <strong>changed</strong>" : "Tệp hoặc thư mục đã được <strong>thay đổi</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "‎Tệp hoặc thư mục yêu thích đã được ‎<strong>‎thay đổi‎</strong>",
- "All files" : "Tất cả tệp tin",
- "Unlimited" : "Không giới hạn",
- "Upload (max. %s)" : "Tải lên (tối đa. %s)",
- "Accept" : "Đồng ý",
- "Reject" : "‎Từ chối‎",
- "Incoming ownership transfer from {user}" : "‎Chuyển quyền sở hữu đến từ {user}‎",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "‎Bạn có muốn chấp nhận {path}? ‎\n\n‎Lưu ý: Quá trình chuyển quyền sau khi chấp nhận có thể mất tới 1 ‎‎giờ.‎",
- "Ownership transfer failed" : "‎Chuyển quyền sở hữu không thành công‎",
- "Your ownership transfer of {path} to {user} failed." : "‎Việc chuyển quyền sở hữu {path} sang {user} của bạn đã thất bại.‎",
- "The ownership transfer of {path} from {user} failed." : "‎Việc chuyển quyền sở hữu {path} từ {user} không thành công.‎",
- "Ownership transfer done" : "‎Chuyển quyền sở hữu được thực hiện‎",
- "Your ownership transfer of {path} to {user} has completed." : "‎Việc chuyển quyền sở hữu {path} sang {user} của bạn đã hoàn tất.‎",
- "The ownership transfer of {path} from {user} has completed." : "‎Việc chuyển quyền sở hữu {path} từ {user} đã hoàn tất.‎",
- "in %s" : "trong %s",
- "File Management" : "‎Quản lý tệp‎ tin",
- "Transfer ownership of a file or folder" : "‎Chuyển quyền sở hữu tệp hoặc thư mục‎",
- "Choose file or folder to transfer" : "‎Chọn tệp hoặc cặp để chuyển‎",
- "Change" : "Chỉnh sửa",
- "New owner" : "‎Chủ sở hữu mới‎",
- "Search users" : "‎Tìm kiếm người dùng‎",
- "Choose a file or folder to transfer" : "‎Chọn tệp hoặc thư mục cần chuyển‎",
- "Transfer" : "‎Chuyển‎",
- "Transfer {path} to {userid}" : "‎Chuyển {path} sang {userid}‎",
- "Invalid path selected" : "‎Đường dẫn không hợp lệ được chọn‎",
- "Ownership transfer request sent" : "‎Yêu cầu chuyển quyền sở hữu đã được gửi‎",
- "Cannot transfer ownership of a file or folder you don't own" : "‎Không thể chuyển quyền sở hữu tệp hoặc thư mục bạn không sở hữu‎",
- "Tags" : "Nhãn",
- "Unable to change the favourite state of the file" : "‎Không thể thay đổi trạng thái yêu thích của tệp‎",
- "Error while loading the file data" : "‎Lỗi xảy ra trong khi tải dữ liệu tệp‎",
- "Pick a template for {name}" : "‎Chọn một mẫu cho {name}‎",
- "Cancel" : "‎Hủy bỏ‎",
- "Create" : "‎Tạo‎",
- "Create a new file with the selected template" : "‎Tạo tệp mới với mẫu đã chọn‎",
- "Creating file" : "‎Tạo tệp‎",
- "Blank" : "‎Trống‎",
- "Unable to create new file from template" : "‎Không thể tạo tệp mới từ mẫu‎",
- "Set up templates folder" : "‎Thiết lập thư mục mẫu‎",
- "Templates" : "‎Mẫu‎",
- "Unable to initialize the templates directory" : "‎Không thể khởi tạo thư mục mẫu‎",
- "%s used" : "%s ‎đã sử dụng‎",
- "%s%% of %s used" : "%s%% trong %s đã sử dụng",
- "%1$s of %2$s used" : "%1$s trên %2$s đã sử dụng",
- "Settings" : "Cài đặt",
- "Show hidden files" : "Hiển thị các file bị ẩn",
- "Crop image previews" : "‎Xén ảnh ‎bản xem trước",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "‎Sử dụng địa chỉ này để truy cập tệp của bạn thông qua WebDAV‎",
- "Toggle grid view" : "‎Chuyển đổi dạng xem lưới‎",
- "No files in here" : "Không có tệp nào",
- "Upload some content or sync with your devices!" : "Tải lên một số nội dung hoặc đồng bộ với thiết bị của bạn!",
- "No entries found in this folder" : "Chưa có mục nào trong thư mục",
- "Select all" : "Chọn tất cả",
- "Upload too large" : "Tập tin tải lên quá lớn",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
- "No favorites yet" : "‎Chưa có yêu thích nào‎",
- "Files and folders you mark as favorite will show up here" : "Các tệp và thư mục mà bạn đánh dấu là yêu thích sẽ hiển thị ở đây",
- "Deleted files" : "Thùng rác",
- "Shares" : "Chia sẻ",
- "Shared with others" : "Chia sẻ với người khác",
- "Shared with you" : "Đã chia sẻ với bạn",
- "Shared by link" : "Được chia sẻ bởi liên kết",
- "Deleted shares" : "‎Chia sẻ đã xóa‎",
- "Pending shares" : "Chia sẻ đang chờ xử lý‎",
+ "Not favored" : "Không được ưa thích",
+ "An error occurred while trying to update the tags" : "Đã xảy ra lỗi khi cố gắng cập nhật tags",
+ "Upload (max. %s)" : "Tải lên (tối đa %s)",
+ "\"{displayName}\" action executed successfully" : "Hành động \"{displayName}\" đã thực thi thành công",
+ "\"{displayName}\" action failed" : "Hành động \"{displayName}\" đã thực thi thất bại",
+ "\"{displayName}\" batch action executed successfully" : "Chỉnh sửa hàng loạt \"{displayName}\" được thực hiện thành công",
+ "Filter filenames…" : "Lọc tên tệp…",
+ "WebDAV URL copied to clipboard" : "Đã sao chép URL WebDAV vào bộ nhớ tạm",
+ "Enable the grid view" : "Bật chế độ xem lưới",
+ "Enable folder tree" : "Bật cây thư mục",
+ "Copy to clipboard" : "Sao chép vào bộ nhớ tạm",
+ "Use this address to access your Files via WebDAV" : "Sử dụng địa chỉ này để truy cập Tệp của bạn qua WebDAV",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Nếu bạn đã bật 2FA, bạn phải tạo và sử dụng mật khẩu ứng dụng mới bằng cách nhấp vào đây.",
+ "Deletion cancelled" : "Thao tác xóa bị hủy",
+ "Move cancelled" : "Di chuyển bị dừng",
+ "Cancelled move or copy of \"{filename}\"." : "Đã huỷ việc di chuyển hoặc sao chép của \"{filename}\".",
+ "Cancelled move or copy operation" : "Đã hủy thao tác di chuyển hoặc sao chép",
+ "Open details" : "Mở chi tiết",
+ "Photos and images" : "Ảnh",
+ "New folder creation cancelled" : "Lỗi tạo thư mục",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["thư mục {folderCount}"],
+ "_{fileCount} file_::_{fileCount} files_" : ["tệp {fileCount}"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 tệp và thư mục {folderCount}"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["tệp {fileCount} và 1 thư mục"],
+ "{fileCount} files and {folderCount} folders" : "Tệp {fileCount} và thư mục {folderCount}",
+ "All folders" : "Tất cả tệp tin",
+ "Personal Files" : "Tệp tin cá nhân",
"Text file" : "Tập tin văn bản",
- "New text file.txt" : "‎Tệp văn bản mới.txt‎",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "Dung lượng của {owner} đã hết, không thể tải hay đồng bộ dữ liệu mới!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "‎Thư mục nhóm \"{mountPoint}\" đã đầy, các tệp không thể được cập nhật hoặc đồng bộ hóa nữa!‎",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "‎Bộ nhớ ngoài \"{mountPoint}\" đã đầy, các tệp không thể được cập nhật hoặc đồng bộ hóa nữa!‎",
- "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!",
- "_matches '{filter}'_::_match '{filter}'_" : ["khớp '{filter}'"]
+ "New text file.txt" : "Tệp văn bản mới.txt"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 7cb11341078..a160a86f978 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -1,122 +1,19 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "存储空间暂时不可用",
- "Storage invalid" : "存储空间无效",
- "Unknown error" : "未知错误",
- "File could not be found" : "文件未找到",
- "Move or copy" : "移动或复制",
- "Download" : "下载",
- "Delete" : "删除",
- "Home" : "首页",
- "Close" : "关闭",
- "Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
- "This will stop your current uploads." : "这会终止您当前的上传。",
- "Upload cancelled." : "上传已取消。",
- "Processing files …" : "正在处理文件…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传 {filename},因为它是一个目录或者是大小为 0 的空文件",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足,您上传的文件大小为 {size1} ,但可用空间仅剩 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
- "Not enough free space" : "可用空间不足",
- "An unknown error has occurred" : "发生了未知错误。",
- "Uploading …" : "正在上传...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "不支持上传此项目",
- "Target folder does not exist any more" : "目标文件夹已不存在",
- "Operation is blocked by access control" : "访问控制阻止此操作",
- "Error when assembling chunks, status code {status}" : "组装块时发生错误,状态码 {status}",
- "Actions" : "操作",
- "Rename" : "重命名",
- "Copy" : "复制",
- "Choose target folder" : "选择目标文件夹",
- "Open" : "打开",
- "Delete file" : "删除文件",
- "Delete folder" : "删除文件夹",
- "Disconnect storage" : "断开与存储空间的连接",
- "Leave this share" : "离开这个共享",
- "Could not load info for file \"{file}\"" : "无法加载文件 \"{file}\" 的信息",
- "Files" : "文件",
- "Details" : "详细信息",
- "Please select tag(s) to add to the selection" : "请选择要添加到所选项目的标签",
- "Apply tag(s) to selection" : "将标签应用到所选项目",
- "Select" : "选择",
- "Pending" : "等待",
- "Unable to determine date" : "无法确定日期",
- "This operation is forbidden" : "该操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "无法移动 \"{file}\",目标已存在",
- "Could not move \"{file}\"" : "无法移动 \"{file}\"",
- "copy" : "复制",
- "Could not copy \"{file}\", target exists" : "无法复制“{file}”,目标已存在",
- "Could not copy \"{file}\"" : "无法复制 \"{file}\"",
- "Copied {origin} inside {destination}" : "在 {destination} 内复制 {origin}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "在 {destination} 内复制了 {origin} 和 {nbfiles} 个其他文件",
- "{newName} already exists" : "{newName} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\"。请尝试其他的名称。",
- "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\",因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\",因为它已经存在",
- "Could not fetch file details \"{file}\"" : "无法获取文件详细信息 “{file}”",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其它的文件夹里没有关于 {tag}{filter}{endtag} 的搜索结果",
- "Enter more than two characters to search in other folders" : "输入至少三个字符,以搜索其他文件夹",
- "Name" : "名称",
- "Size" : "大小",
- "Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 个文件夹"],
- "_%n file_::_%n files_" : ["%n 个文件"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
- "You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"],
- "New" : "新建",
- "Select file range" : "选择文件范围",
- "{used} of {quota} used" : "已使用 {used} / {quota}",
- "{used} used" : "已使用 {used} 存储空间",
- "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "\"/\" is not allowed inside a file name." : "文件名不能包含“/”",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" 不是允许的文件类型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的存储已满,无法再更新或同步文件了!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群组文件夹 “{mountPoint}” 已满,无法再更新或同步文件!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部存储器 \"{mountPoint}\" 已满,无法再更新或同步文件!",
- "Your storage is full, files cannot be updated or synced anymore!" : "你的存储已满,无法再更新或同步文件!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "组文件夹 \"{mountPoint}\" 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部存储 \"{mountPoint}\" 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的存储空间几乎已满({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["匹配 \"{filter}\""],
- "View in folder" : "在文件夹中查看",
- "Copied!" : "已复制",
- "Copy direct link (only works for users who have access to this file/folder)" : "复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
- "Path" : "路径",
- "_%n byte_::_%n bytes_" : ["%n 字节"],
- "Favorited" : "已收藏",
- "Favorite" : "收藏",
- "You can only favorite a single file or folder at a time" : "您一次只能收藏一个文件或文件夹",
- "New folder" : "新建文件夹",
- "Upload file" : "上传文件",
- "Recent" : "最近",
- "Not favorited" : "未收藏",
- "Remove from favorites" : "从收藏中移除",
- "Add to favorites" : "添加到收藏夹",
- "An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "已添加到收藏夹",
"Removed from favorites" : "从收藏夹移除",
"You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
"You removed {file} from your favorites" : "您已从收藏夹中移除 {file}",
- "File changes" : "文件发生变化",
+ "Favorites" : "收藏",
+ "File changes" : "文件变动",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
"Deleted by {user}" : "由 {user} 删除",
"Restored by {user}" : "由 {user} 恢复",
"Renamed by {user}" : "由 {user} 重命名",
"Moved by {user}" : "由 {user} 移动",
- "\"remote user\"" : "\"远程用户\"",
+ "\"remote account\"" : "远程账号",
"You created {file}" : "您创建了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 创建了一个加密文件",
"{user} created {file}" : "{user} 创建了 {file}",
@@ -132,89 +29,452 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} 在 {file} 删除了加密文件",
"You restored {file}" : "您恢复了{file}",
"{user} restored {file}" : "{user} 恢复了 {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "你将 {oldfile} (隐藏的) 重命名为了 {newfile} (隐藏的)",
- "You renamed {oldfile} (hidden) to {newfile}" : "你将 {oldfile} (隐藏的) 重命名为了 {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "你将 {oldfile} 重命名为了 {newfile} (隐藏的)",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "您将 {oldfile}(隐藏)重命名为 {newfile}(隐藏)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "您将 {oldfile}(隐藏)重命名为 {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "您将 {oldfile} 重命名为了 {newfile}(隐藏)",
"You renamed {oldfile} to {newfile}" : "您将 {oldfile} 改名为 {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} 将 {oldfile} (隐藏的) 重命名为了 {newfile} (隐藏的)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} 将 {oldfile} (隐藏的) 重命名为了 {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} 将 {oldfile} 重命名为了 {newfile} (隐藏的)",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} 将 {oldfile}(隐藏)重命名为 {newfile}(隐藏)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} 将 {oldfile}(隐藏)重命名为 {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} 将 {oldfile} 重命名为 {newfile}(隐藏)",
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
- "You moved {oldfile} to {newfile}" : "你将 {oldfile} 移动到了 {newfile}",
+ "You moved {oldfile} to {newfile}" : "您将 {oldfile} 移动到了 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 将 {oldfile} 移动到了 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
- "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "一个文件或文件夹已<strong>修改</strong>。",
- "All files" : "全部文件",
- "Unlimited" : "无限制",
- "Upload (max. %s)" : "上传 (最大 %s)",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的<strong>收藏夹</strong> 中",
+ "Files" : "文件",
+ "A file or folder has been <strong>changed</strong>" : "文件或文件夹已经被<strong>修改</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "一个收藏的文件或文件夹已经被<strong>修改</strong>",
+ "Failed to authorize" : "授权失败",
+ "Invalid folder path" : "无效文件夹路径",
+ "Folder not found" : "未找到文件夹",
+ "The file cannot be found" : "找不到文件",
+ "The destination path does not exist: %1$s" : "目标路径不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您没有在指定位置创建文件的权限",
+ "The file could not be converted." : "无法转换文件。",
+ "Could not get relative path to converted file" : "无法获取转换文件的相对路径",
+ "Favorite files" : "收藏的文件",
+ "No favorites" : "无收藏",
+ "More favorites" : "更多收藏",
"Accept" : "接受",
"Reject" : "拒绝",
- "Incoming ownership transfer from {user}" : "来自{user}的所有权转移",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您要接受{path}吗?\n\n注意:接受后转移过程可能长达1小时。",
+ "Incoming ownership transfer from {user}" : "来自 {user} 的所有权转移",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您要接受 {path} 吗?\n\n注意:接受后转移过程可能长达1小时。",
+ "Ownership transfer denied" : "所有权转移被拒绝",
+ "Your ownership transfer of {path} was denied by {user}." : "你路径 {path} 下的文件所属权转移被 {user} 拒绝。",
"Ownership transfer failed" : "所有权转移失败",
- "Your ownership transfer of {path} to {user} failed." : "您{path}的所有权向{user}转移失败。",
- "The ownership transfer of {path} from {user} failed." : "来自{user}的{path}的所有权转移失败。",
+ "Your ownership transfer of {path} to {user} failed." : "您 {path} 的所有权向 {user} 转移失败。",
+ "The ownership transfer of {path} from {user} failed." : "来自 {user} 的 {path} 的所有权转移失败。",
"Ownership transfer done" : "所有权转移完成",
- "Your ownership transfer of {path} to {user} has completed." : "您的{path}向{user}的所有权转移已完成。",
- "The ownership transfer of {path} from {user} has completed." : "来自{user}的{path}的所有权转移已完成。",
+ "Your ownership transfer of {path} to {user} has completed." : "您的 {path} 向 {user} 的所有权转移已完成。",
+ "The ownership transfer of {path} from {user} has completed." : "来自 {user} 的 {path} 的所有权转移已完成。",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "从 %1$s 转移至 %2$s",
+ "Files compatibility" : "文件兼容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允许限制文件名称以确保文件可以与所有客户端同步。默认状态下,所有POSIX(例如 Linux 或 macOS)系统有效的文件名都是被允许的。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "启用与 Windows 兼容的文件名后,无法再修改现有文件,但可以由其所有者重命名为有效的新名称。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "启用此设置后,也可以自动迁移文件,请参阅有关 occ 命令的文档。",
+ "Enforce Windows compatibility" : "强制 Windows 兼容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "这将阻止在 Windows 系统中无效的文件名称,比如使用保留字符。但这不会强制大小写敏感性兼容。",
"File Management" : "文件管理",
- "Transfer ownership of a file or folder" : "转移文件或文件夹的所有权",
- "Choose file or folder to transfer" : "选择要转移的文件或文件夹",
- "Change" : "修改",
- "New owner" : "新的拥有者",
- "Search users" : "搜索用户",
+ "Home" : "首页",
+ "Target folder does not exist any more" : "目标文件夹已不存在",
+ "Reload current directory" : "重新载入当前目录",
+ "Go to the \"{dir}\" directory" : "前往“{dir}”目录",
+ "Current directory path" : "当前文件目录",
+ "Your have used your space quota and cannot upload files anymore" : "你已用完你的空间配额,无法再上传更多文件",
+ "You do not have permission to upload or create files here." : "您没有在此处上传或创建文件的权限。",
+ "Drag and drop files here to upload" : "将文件拖放至此处以上传",
+ "Favorite" : "收藏",
+ "Back" : "返回",
+ "Toggle selection for file \"{displayName}\"" : "切换文件 “{displayName}” 的选择",
+ "Toggle selection for folder \"{displayName}\"" : "切换文件夹 “{displayName}” 的选择",
+ "File is loading" : "正在加载文件",
+ "Folder is loading" : "正在加载文件夹",
+ "Filename" : "文件名",
+ "Folder name" : "文件夹名称",
+ "This node is unavailable" : "此节点不可用",
+ "Another entry with the same name already exists." : "另一相同名称的条目已存在。",
+ "Invalid filename." : "无效文件名称。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已将“{oldName}”重命名为“{newName}”",
+ "Rename file" : "重命名文件",
+ "Folder" : "文件夹",
+ "Unknown file type" : "未知文件类型",
+ "{ext} image" : "{ext} 图片",
+ "{ext} video" : "{ext} 视频",
+ "{ext} audio" : "{ext} 音频",
+ "{ext} text" : "{ext} 文本",
+ "Pending" : "等待",
+ "Unknown date" : "未知日期",
+ "Clear filter" : "清除筛选",
+ "Modified" : "修改日期",
+ "Search everywhere" : "在所有位置搜索",
+ "Type" : "类型",
+ "Active filters" : "已开启的过滤器",
+ "Remove filter" : "移除过滤条件",
+ "Total rows summary" : "总行摘要",
+ "Toggle selection for all files and folders" : "切换所有文件和文件夹的选择",
+ "Name" : "名称",
+ "File type" : "文件类型",
+ "Size" : "大小",
+ "Actions" : "操作",
+ "(selected)" : "(已选择)",
+ "List of files and folders." : "文件与文件夹列表。",
+ "You have used your space quota and cannot upload files anymore." : "您的剩余空间配额不足以继续上传文件。",
+ "Column headers with buttons are sortable." : "带有按钮的列标题可进行排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出于性能考虑,此列表未完全呈现。文件将在您浏览列表时呈现。",
+ "File not found" : "文件未找到",
+ "_{count} selected_::_{count} selected_" : ["已选择 {count} 个"],
+ "Search scope options" : "搜索范围选项",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
+ "{used} of {quota} used" : "已使用 {used}(共 {quota})",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "无法刷新存储统计数据",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "Storage information" : "存储信息",
+ "Storage quota" : "存储配额",
+ "New folder" : "新建文件夹",
+ "Create new folder" : "创建新文件夹",
+ "This name is already in use." : "此名称已被使用。",
+ "Create" : "创建",
+ "Files starting with a dot are hidden by default" : "以点开头的文件默认是隐藏的",
+ "Fill template fields" : "填写模板字段",
+ "Submitting fields …" : "正在提交字段…",
+ "Submit" : "使用",
"Choose a file or folder to transfer" : "选择要转移的文件或文件夹",
"Transfer" : "转移",
"Transfer {path} to {userid}" : "将 {path} 转移给 {userid}",
"Invalid path selected" : "选择的路径无效",
+ "Unknown error" : "未知错误",
"Ownership transfer request sent" : "所有权转移请求已发送",
- "Cannot transfer ownership of a file or folder you don't own" : "无法转让您未拥有的文件或文件夹的所有权",
- "Tags" : "标签",
- "Unable to change the favourite state of the file" : "无法修改文件的收藏状态",
+ "Cannot transfer ownership of a file or folder you do not own" : "无法转让您未拥有的文件或文件夹的所有权",
+ "Transfer ownership of a file or folder" : "转移文件或文件夹的所有权",
+ "Choose file or folder to transfer" : "选择要转移的文件或文件夹",
+ "Change" : "修改",
+ "New owner" : "新的所有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含扩展名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除扩展名",
+ "Change file extension" : "更改文件扩展名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "将文件扩展名从 \"{old}\" 更改为 \"{new}\" 可能会导致文件无法读取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "删除文件扩展名 \"{old}\" 可能会导致文件无法读取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "添加文件扩展名 \"{new}\" 可能会导致文件无法读取。",
+ "Do not show this dialog again." : "不再显示此对话框。",
+ "Select file or folder to link to" : "选择需要链接的文件或文件夹",
+ "Choose {file}" : "选择 {file}",
+ "Share" : "共享",
+ "Shared by link" : "通过链接共享",
+ "Shared" : "已共享",
+ "Switch to list view" : "切换为列表视图",
+ "Switch to grid view" : "切换到网格视图",
+ "The file could not be found" : "找不到文件",
+ "Upload was cancelled by user" : "用户已取消上传",
+ "Not enough free space" : "可用空间不足",
+ "Operation is blocked by access control" : "访问控制阻止此操作",
+ "Error during upload: {message}" : "上传时发生错误: {message}",
+ "Error during upload, status code {status}" : "上传时发生错误,状态码 {status}",
+ "Unknown error during upload" : "上传时发生未知错误",
+ "Loading current folder" : "正在载入当前文件夹",
+ "Retry" : "重试",
+ "No files in here" : "这里没有文件",
+ "Upload some content or sync with your devices!" : "上传一些内容或与您的设备同步!",
+ "Go back" : "返回",
+ "Views" : "视图",
+ "Files settings" : "文件设置",
+ "Your files" : "你的文件",
+ "Open in files" : "在文件中打开",
+ "File cannot be accessed" : "文件无法访问",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到该文件,或是您没有查看该文件的权限。请要求发送者分享它。",
+ "No search results for “{query}”" : "没有“{query}”的搜索结果",
+ "Search for files" : "搜索文件",
+ "Clipboard is not available" : "剪贴板不可用",
+ "General" : "常规",
+ "Default view" : "默认视图",
+ "All files" : "全部文件",
+ "Personal files" : "个人文件",
+ "Sort favorites first" : "收藏排序优先",
+ "Sort folders before files" : "将文件夹排在文件前面",
+ "Folder tree" : "文件夹树",
+ "Appearance" : "外观",
+ "Show hidden files" : "显示隐藏文件",
+ "Show file type column" : "显示文件类型列",
+ "Crop image previews" : "裁剪图片预览",
+ "Additional settings" : "其他设置",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "复制",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的账号已启用双因素身份验证,因此您需要使用应用密码来连接外部 WebDAV 客户端。",
+ "Warnings" : "警告",
+ "Keyboard shortcuts" : "键盘快捷键",
+ "Rename" : "重命名",
+ "Delete" : "删除",
+ "Manage tags" : "管理标签",
+ "Selection" : "选择",
+ "Select all files" : "选择所有文件",
+ "Deselect all" : "全部取消选择",
+ "Navigation" : "导航",
+ "View" : "查看",
+ "Toggle grid view" : "切换网格视图",
+ "Show those shortcuts" : "显示快捷键",
+ "You" : "您",
+ "Shared multiple times with different people" : "与不同的用户多次分享",
+ "Unable to change the favorite state of the file" : "无法更改文件的收藏状态",
"Error while loading the file data" : "加载文件数据时出错",
+ "Owner" : "拥有者",
+ "Remove from favorites" : "从收藏中移除",
+ "Add to favorites" : "添加到收藏夹",
+ "Tags" : "标签",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "无法从模板创建新文件",
"Pick a template for {name}" : "给 {name} 挑选一个模板",
- "Cancel" : "取消",
- "Create" : "创建",
"Create a new file with the selected template" : "用所选模板创建一个新文件",
"Creating file" : "正在创建文件",
- "Blank" : "空白",
- "Unable to create new file from template" : "无法从模板创建新文件",
- "Set up templates folder" : "设置模板文件夹",
- "Templates" : "模板",
+ "Save as {displayName}" : "保存为 {displayName}",
+ "Save as …" : "保存为…",
+ "Converting files …" : "正在转换文件…",
+ "Failed to convert files: {message}" : "无法转换文件:{message}",
+ "All files failed to be converted" : "无法转换全部文件",
+ "One file could not be converted: {message}" : "有一个文件无法转换:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["无法转换 %n 个文件"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["已成功转换 %n 个文件"],
+ "Files successfully converted" : "文件已成功转换",
+ "Failed to convert files" : "无法转换文件",
+ "Converting file …" : "正在转换文件…",
+ "File successfully converted" : "文件已成功转换",
+ "Failed to convert file: {message}" : "无法转换文件:{message}",
+ "Failed to convert file" : "无法转换文件",
+ "Leave this share" : "离开此共享",
+ "Leave these shares" : "离开此分享",
+ "Disconnect storage" : "断开与存储空间的连接",
+ "Disconnect storages" : "断开与存储空间的连接",
+ "Delete permanently" : "彻底删除",
+ "Delete and unshare" : "删除并取消分享",
+ "Delete file" : "删除文件",
+ "Delete files" : "删除文件",
+ "Delete folder" : "删除文件夹",
+ "Delete folders" : "删除文件夹",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您正要永久删除 {count} 个项目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您正要删除 {count} 个项目"],
+ "Confirm deletion" : "确认删除",
+ "Cancel" : "取消",
+ "Download" : "下载",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移动 “{source}” 至 “{destination}” ...",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在复制 “{source}” 至 “{destination}” ...",
+ "Destination is not a folder" : "目标不是一个文件夹",
+ "This file/folder is already in that directory" : "该文件/文件夹已经存在与该目录中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "你无法将文件/文件夹移动至其自身或子文件夹中",
+ "(copy)" : "(复制)",
+ "(copy %n)" : "(复制 %n)",
+ "A file or folder with that name already exists in this folder" : "相同的文件/文件夹已存在于该文件夹中",
+ "The files are locked" : "文件已锁定",
+ "The file does not exist anymore" : "文件不存在",
+ "Choose destination" : "选择目标路径",
+ "Copy to {target}" : "复制到 {target}",
+ "Move to {target}" : "移动到 {target}",
+ "Move" : "移动",
+ "Move or copy operation failed" : "移动或复制失败",
+ "Move or copy" : "移动或复制",
+ "Open folder {displayName}" : "打开文件夹{displayName}",
+ "Open in Files" : "在文件中打开",
+ "Open locally" : "本地打开",
+ "Failed to redirect to client" : "重定向到客户端失败",
+ "Open file locally" : "在本地打开文件",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "该文件现在应该在你的设备上打开。如果没有,请检查你是否安装了桌面应用程序。",
+ "Retry and close" : "重试并关闭",
+ "Open online" : "在线打开",
+ "Details" : "详细信息",
+ "View in folder" : "在文件夹中查看",
+ "Today" : "今日",
+ "Last 7 days" : "过去 7 天",
+ "Last 30 days" : "过去 30 天",
+ "This year ({year})" : "今年({year})",
+ "Last year ({year})" : "去年({year})",
+ "Documents" : "文档",
+ "Spreadsheets" : "表格",
+ "Presentations" : "幻灯片",
+ "PDFs" : "PDF",
+ "Folders" : "文件夹",
+ "Audio" : "音频",
+ "Images" : "图片",
+ "Videos" : "视频",
+ "Created new folder \"{name}\"" : "已创建新文件夹“{name}”",
"Unable to initialize the templates directory" : "无法初始化模板目录",
- "%s used" : "已使用 %s",
- "%s%% of %s used" : "%s 已使用 %s 中的 %%",
- "%1$s of %2$s used" : "已使用 %2$s 中的 %1$s",
- "Settings" : "设置",
- "Show hidden files" : "显示隐藏文件",
- "Crop image previews" : "裁剪图片预览",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
- "Toggle %1$s sublist" : "切换 %1$s 子列表",
- "Toggle grid view" : "切换网格视图",
- "No files in here" : "这里没有文件",
- "Upload some content or sync with your devices!" : "上传一些内容或与您的设备同步!",
+ "Create templates folder" : "创建模板文件夹",
+ "Templates" : "模板",
+ "New template folder" : "新建模板文件夹",
+ "In folder" : "文件夹内",
+ "Search in all files" : "在所有文件中搜索",
+ "Search in folder: {folder}" : "在文件夹内搜索:{folder}",
+ "One of the dropped files could not be processed" : "无法处理其中一个已删除的文件",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "你的浏览器不支持文件系统API。目录不会被上传",
+ "No files to upload" : "没有需要上传的文件",
+ "Unable to create the directory {directory}" : "无法创建目录 {directory}",
+ "Some files could not be uploaded" : "部分文件无法上传",
+ "Files uploaded successfully" : "上传文件成功",
+ "No files to process" : "没有需要处理的文件",
+ "Some files could not be copied" : "无法复制某些文件",
+ "Some files could not be moved" : "某些文件无法被移动",
+ "Files copied successfully" : "复制文件成功",
+ "Files moved successfully" : "移动文件成功",
+ "Conflicts resolution skipped" : "已跳过冲突解决",
+ "Upload cancelled" : "已取消上传",
+ "Could not rename \"{oldName}\", it does not exist any more" : "无法重命名“{oldName}”,此文件已经不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名称“{newName}”在这个文件夹“{dir}”已经被使用。请选择其他名称。",
+ "Could not rename \"{oldName}\"" : "无法重命名“{oldName}”",
+ "This operation is forbidden" : "该操作被禁止",
+ "Storage is temporarily not available" : "存储空间暂时不可用",
+ "Unexpected error: {error}" : "意外错误:{error}",
+ "_%n file_::_%n files_" : ["%n 个文件"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
+ "_%n hidden_::_%n hidden_" : ["%n 已隐藏"],
+ "Filename must not be empty." : "文件名不能为空。",
+ "\"{char}\" is not allowed inside a filename." : "文件名中不允许出现 “{char}”",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "“{segment}” 是一个保留名称,不允许用在文件名中。",
+ "\"{extension}\" is not an allowed filetype." : "“{extension}” 文件类型不被允许。",
+ "Filenames must not end with \"{extension}\"." : "文件名不能以 “{extension}” 结尾。",
+ "List of favorite files and folders." : "收藏的文件和文件夹列表。",
+ "No favorites yet" : "暂无收藏",
+ "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
+ "List of your files and folders." : "您的文件与文件件列表。",
+ "List of your files and folders that are not shared." : "尚未分享的文件与文件夹",
+ "No personal files found" : "找不到个人文件",
+ "Files that are not shared will show up here." : "尚未分享的文件会显示在此处",
+ "Recent" : "最近",
+ "List of recently modified files and folders." : "最近修改的文件与文件夹列表。",
+ "No recently modified files" : "近期无修改文件",
+ "Files and folders you recently modified will show up here." : "你最近修改的文件与文件夹将会显示在此处。",
+ "Search" : "搜索",
+ "Search results within your files." : "在您的文件中搜索结果。",
"No entries found in this folder" : "在此文件夹中找不到项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
- "No favorites yet" : "暂无收藏",
- "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
- "Deleted files" : "已删除的文件",
- "Shares" : "共享",
- "Shared with others" : "已与他人共享",
- "Shared with you" : "已与您共享",
- "Shared by link" : "已通过链接共享",
- "Deleted shares" : "已删除的共享",
- "Pending shares" : "待定共享",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您尝试上传的文件大小超过了服务器的限制。",
+ "File could not be found" : "文件未找到",
+ "Show list view" : "显示列表视图",
+ "Show grid view" : "显示网格视图",
+ "Close" : "关闭",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹“{dir}”",
+ "This will stop your current uploads." : "这会终止您当前的上传。",
+ "Upload cancelled." : "上传已取消。",
+ "Processing files …" : "正在处理文件 ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传 {filename},因为它是一个目录或者是大小为 0 的空文件",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足,您上传的文件大小为 {size1} ,但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标文件夹“{dir}”不存在",
+ "An unknown error has occurred" : "发生了未知错误。",
+ "File could not be uploaded" : "文件无法上传",
+ "Uploading …" : "正在上传 ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "上传中 ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "不支持上传此项目",
+ "Error when assembling chunks, status code {status}" : "组装块时发生错误,状态码 {status}",
+ "Choose target folder" : "选择目标文件夹",
+ "Set reminder" : "设置提醒",
+ "Edit locally" : "本地编辑",
+ "Open" : "打开",
+ "Could not load info for file \"{file}\"" : "无法加载文件“{file}”的信息",
+ "Please select tag(s) to add to the selection" : "请选择要添加到所选项目的标签",
+ "Apply tag(s) to selection" : "将标签应用到所选项目",
+ "Select directory \"{dirName}\"" : "选择目录“{dirName}”",
+ "Select file \"{fileName}\"" : "选择文件“{fileName}”",
+ "Unable to determine date" : "无法确定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动“{file}”,目标已存在",
+ "Could not move \"{file}\"" : "无法移动“{file}”",
+ "copy" : "复制",
+ "Could not copy \"{file}\", target exists" : "无法复制“{file}”,目标已存在",
+ "Could not copy \"{file}\"" : "无法复制“{file}”",
+ "Copied {origin} inside {destination}" : "在 {destination} 内复制 {origin}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "在 {destination} 内复制了 {origin} 和 {nbfiles} 个其他文件",
+ "{newName} already exists" : "{newName} 已经存在",
+ "Could not create file \"{file}\"" : "无法创建文件“{file}”",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件“{file}”,因为它已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹“{dir}”,因为它已经存在",
+ "Could not fetch file details \"{file}\"" : "无法获取文件详细信息“{file}”",
+ "Error deleting file \"{fileName}\"." : "删除文件“{fileName}”时出错。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其它的文件夹里没有关于 {tag}{filter}{endtag} 的搜索结果",
+ "Enter more than two characters to search in other folders" : "输入至少三个字符,以搜索其他文件夹",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
+ "You do not have permission to upload or create files here" : "您没有在此上传或创建文件的权限",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"],
+ "New" : "新建",
+ "New file/folder menu" : "新建文件/文件夹菜单",
+ "Select file range" : "选择文件范围",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used} 存储空间",
+ "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
+ "File name cannot be empty." : "文件名不能为空。",
+ "\"/\" is not allowed inside a file name." : "文件名不能包含“/”。",
+ "\"{name}\" is not an allowed filetype" : "“{name}”不是允许的文件类型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的存储已满,无法再更新或同步文件了!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群组文件夹“{mountPoint}”已满,无法再更新或同步文件!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部存储器“{mountPoint}”已满,无法再更新或同步文件!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的的存储已满,无法继续更新或同步文件!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "组文件夹“{mountPoint}”的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部存储“{mountPoint}”的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的存储空间几乎已满({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["匹配“{filter}”"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
+ "Path" : "路径",
+ "_%n byte_::_%n bytes_" : ["%n 字节"],
+ "Favored" : "已加入收藏",
+ "Favor" : "收藏",
+ "Copy direct link (only works for people who have access to this file/folder)" : "复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
+ "Upload file" : "上传文件",
+ "Not favored" : "未收藏",
+ "An error occurred while trying to update the tags" : "更新标签时出错",
+ "Upload (max. %s)" : "上传 (最大 %s)",
+ "\"{displayName}\" action executed successfully" : "“{displayName}”操作执行成功",
+ "\"{displayName}\" action failed" : "“{displayName}”操作执行失败",
+ "\"{displayName}\" failed on some elements" : "“{displayName}”在某些元素上失败",
+ "\"{displayName}\" batch action executed successfully" : "批量操作“{displayName}”运行成功",
+ "Submitting fields…" : "提交字段...",
+ "Filter filenames…" : "过滤文件名...",
+ "WebDAV URL copied to clipboard" : "WebDAV 链接已复制到剪贴板",
+ "Enable the grid view" : "启用网格视图",
+ "Enable folder tree" : "启用文件夹树",
+ "Copy to clipboard" : "复制到剪贴板",
+ "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
+ "Deletion cancelled" : "已取消删除",
+ "Move cancelled" : "已取消移动",
+ "Cancelled move or copy of \"{filename}\"." : "取消移动或复制“{filename}”.",
+ "Cancelled move or copy operation" : "已取消移动或复制操作",
+ "Open details" : "打开详情",
+ "Photos and images" : "照片和图像",
+ "New folder creation cancelled" : "取消创建新文件夹",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 个文件夹"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 个文件"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 个文件夹及 {folderCount} 个文件夹"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 个文件及 1 个文件夹"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 个文件及 {folderCount} 个文件夹",
+ "All folders" : "所有文件夹",
+ "Personal Files" : "个人文件",
"Text file" : "文本文件",
- "New text file.txt" : "新建文本文档.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : " \"{mountPoint}\"组文件夹已满,文件无法继续更新或同步!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部存储 \"{mountPoint}\" 已满,无法再更新或同步文件!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"]
+ "New text file.txt" : "新建文本文件.txt",
+ "%1$s (renamed)" : "%1$s(已重命名)",
+ "renamed file" : "已重命名文件",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "启用与 Windows 兼容的文件名后,无法再修改现有文件,但可以由其所有者重命名为有效的新名称。",
+ "Filter file names …" : "筛选文件名…",
+ "Prevent warning dialogs from open or reenable them." : "防止打开或重新启用警告对话框。",
+ "Show a warning dialog when changing a file extension." : "更改文件扩展名时显示警告对话框。",
+ "Speed up your Files experience with these quick shortcuts." : "这些快捷键可以加快你的“文件”体验。",
+ "Open the actions menu for a file" : "打开文件的操作菜单",
+ "Rename a file" : "重命名文件",
+ "Delete a file" : "删除文件",
+ "Favorite or remove a file from favorites" : "把文件添加或移除出收藏夹",
+ "Manage tags for a file" : "管理文件的标签",
+ "Deselect all files" : "取消选择所有文件",
+ "Select or deselect a file" : "选择或取消选择文件",
+ "Select a range of files" : "选择一系列文件",
+ "Navigate to the parent folder" : "前往上一级文件夹",
+ "Navigate to the file above" : "跳转至以上文件",
+ "Navigate to the file below" : "跳转至以下文件",
+ "Navigate to the file on the left (in grid mode)" : "跳转至左侧文件(在网格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "跳转至右侧文件(在网格模式下)",
+ "Toggle the grid view" : "切换网格视图",
+ "Open the sidebar for a file" : "在侧边栏打开文件"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index f695a865b82..661f89e775a 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -1,120 +1,17 @@
{ "translations": {
- "Storage is temporarily not available" : "存储空间暂时不可用",
- "Storage invalid" : "存储空间无效",
- "Unknown error" : "未知错误",
- "File could not be found" : "文件未找到",
- "Move or copy" : "移动或复制",
- "Download" : "下载",
- "Delete" : "删除",
- "Home" : "首页",
- "Close" : "关闭",
- "Favorites" : "收藏",
- "Could not create folder \"{dir}\"" : "无法创建文件夹 \"{dir}\"",
- "This will stop your current uploads." : "这会终止您当前的上传。",
- "Upload cancelled." : "上传已取消。",
- "Processing files …" : "正在处理文件…",
- "…" : "…",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传 {filename},因为它是一个目录或者是大小为 0 的空文件",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足,您上传的文件大小为 {size1} ,但可用空间仅剩 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
- "Not enough free space" : "可用空间不足",
- "An unknown error has occurred" : "发生了未知错误。",
- "Uploading …" : "正在上传...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
- "Uploading that item is not supported" : "不支持上传此项目",
- "Target folder does not exist any more" : "目标文件夹已不存在",
- "Operation is blocked by access control" : "访问控制阻止此操作",
- "Error when assembling chunks, status code {status}" : "组装块时发生错误,状态码 {status}",
- "Actions" : "操作",
- "Rename" : "重命名",
- "Copy" : "复制",
- "Choose target folder" : "选择目标文件夹",
- "Open" : "打开",
- "Delete file" : "删除文件",
- "Delete folder" : "删除文件夹",
- "Disconnect storage" : "断开与存储空间的连接",
- "Leave this share" : "离开这个共享",
- "Could not load info for file \"{file}\"" : "无法加载文件 \"{file}\" 的信息",
- "Files" : "文件",
- "Details" : "详细信息",
- "Please select tag(s) to add to the selection" : "请选择要添加到所选项目的标签",
- "Apply tag(s) to selection" : "将标签应用到所选项目",
- "Select" : "选择",
- "Pending" : "等待",
- "Unable to determine date" : "无法确定日期",
- "This operation is forbidden" : "该操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
- "Could not move \"{file}\", target exists" : "无法移动 \"{file}\",目标已存在",
- "Could not move \"{file}\"" : "无法移动 \"{file}\"",
- "copy" : "复制",
- "Could not copy \"{file}\", target exists" : "无法复制“{file}”,目标已存在",
- "Could not copy \"{file}\"" : "无法复制 \"{file}\"",
- "Copied {origin} inside {destination}" : "在 {destination} 内复制 {origin}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "在 {destination} 内复制了 {origin} 和 {nbfiles} 个其他文件",
- "{newName} already exists" : "{newName} 已经存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "无法重命名 \"{fileName}\",此文件已经不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "文件夹 \"{dir}\" 中已经存在 \"{targetName}\"。请尝试其他的名称。",
- "Could not rename \"{fileName}\"" : "无法重命名 \"{fileName}\"",
- "Could not create file \"{file}\"" : "无法创建文件 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "无法创建文件 \"{file}\",因为它已经存在",
- "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹 \"{dir}\",因为它已经存在",
- "Could not fetch file details \"{file}\"" : "无法获取文件详细信息 “{file}”",
- "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其它的文件夹里没有关于 {tag}{filter}{endtag} 的搜索结果",
- "Enter more than two characters to search in other folders" : "输入至少三个字符,以搜索其他文件夹",
- "Name" : "名称",
- "Size" : "大小",
- "Modified" : "修改日期",
- "_%n folder_::_%n folders_" : ["%n 个文件夹"],
- "_%n file_::_%n files_" : ["%n 个文件"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
- "You don’t have permission to upload or create files here" : "您没有权限在此上传或创建文件",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"],
- "New" : "新建",
- "Select file range" : "选择文件范围",
- "{used} of {quota} used" : "已使用 {used} / {quota}",
- "{used} used" : "已使用 {used} 存储空间",
- "\"{name}\" is an invalid file name." : "\"{name}\" 是一个无效的文件名。",
- "File name cannot be empty." : "文件名不能为空。",
- "\"/\" is not allowed inside a file name." : "文件名不能包含“/”",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" 不是允许的文件类型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的存储已满,无法再更新或同步文件了!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群组文件夹 “{mountPoint}” 已满,无法再更新或同步文件!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部存储器 \"{mountPoint}\" 已满,无法再更新或同步文件!",
- "Your storage is full, files cannot be updated or synced anymore!" : "你的存储已满,无法再更新或同步文件!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "组文件夹 \"{mountPoint}\" 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部存储 \"{mountPoint}\" 的存储空间几乎已满 ({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的存储空间几乎已满({usedSpacePercent}%)",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["匹配 \"{filter}\""],
- "View in folder" : "在文件夹中查看",
- "Copied!" : "已复制",
- "Copy direct link (only works for users who have access to this file/folder)" : "复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
- "Path" : "路径",
- "_%n byte_::_%n bytes_" : ["%n 字节"],
- "Favorited" : "已收藏",
- "Favorite" : "收藏",
- "You can only favorite a single file or folder at a time" : "您一次只能收藏一个文件或文件夹",
- "New folder" : "新建文件夹",
- "Upload file" : "上传文件",
- "Recent" : "最近",
- "Not favorited" : "未收藏",
- "Remove from favorites" : "从收藏中移除",
- "Add to favorites" : "添加到收藏夹",
- "An error occurred while trying to update the tags" : "更新标签时出错",
"Added to favorites" : "已添加到收藏夹",
"Removed from favorites" : "从收藏夹移除",
"You added {file} to your favorites" : "您已经添加 {file} 到您的收藏夹",
"You removed {file} from your favorites" : "您已从收藏夹中移除 {file}",
- "File changes" : "文件发生变化",
+ "Favorites" : "收藏",
+ "File changes" : "文件变动",
"Created by {user}" : "由 {user} 创建",
"Changed by {user}" : "由 {user} 更改",
"Deleted by {user}" : "由 {user} 删除",
"Restored by {user}" : "由 {user} 恢复",
"Renamed by {user}" : "由 {user} 重命名",
"Moved by {user}" : "由 {user} 移动",
- "\"remote user\"" : "\"远程用户\"",
+ "\"remote account\"" : "远程账号",
"You created {file}" : "您创建了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 创建了一个加密文件",
"{user} created {file}" : "{user} 创建了 {file}",
@@ -130,89 +27,452 @@
"{user} deleted an encrypted file in {file}" : "{user} 在 {file} 删除了加密文件",
"You restored {file}" : "您恢复了{file}",
"{user} restored {file}" : "{user} 恢复了 {file}",
- "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "你将 {oldfile} (隐藏的) 重命名为了 {newfile} (隐藏的)",
- "You renamed {oldfile} (hidden) to {newfile}" : "你将 {oldfile} (隐藏的) 重命名为了 {newfile}",
- "You renamed {oldfile} to {newfile} (hidden)" : "你将 {oldfile} 重命名为了 {newfile} (隐藏的)",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "您将 {oldfile}(隐藏)重命名为 {newfile}(隐藏)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "您将 {oldfile}(隐藏)重命名为 {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "您将 {oldfile} 重命名为了 {newfile}(隐藏)",
"You renamed {oldfile} to {newfile}" : "您将 {oldfile} 改名为 {newfile}",
- "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} 将 {oldfile} (隐藏的) 重命名为了 {newfile} (隐藏的)",
- "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} 将 {oldfile} (隐藏的) 重命名为了 {newfile}",
- "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} 将 {oldfile} 重命名为了 {newfile} (隐藏的)",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} 将 {oldfile}(隐藏)重命名为 {newfile}(隐藏)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} 将 {oldfile}(隐藏)重命名为 {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} 将 {oldfile} 重命名为 {newfile}(隐藏)",
"{user} renamed {oldfile} to {newfile}" : "{user} 将 {oldfile} 改名为 {newfile}",
- "You moved {oldfile} to {newfile}" : "你将 {oldfile} 移动到了 {newfile}",
+ "You moved {oldfile} to {newfile}" : "您将 {oldfile} 移动到了 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 将 {oldfile} 移动到了 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的 <strong>收藏夹</strong> 中",
- "A file or folder has been <strong>changed</strong>" : "文件/文件夹已经 <strong>修改</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "一个文件或文件夹已<strong>修改</strong>。",
- "All files" : "全部文件",
- "Unlimited" : "无限制",
- "Upload (max. %s)" : "上传 (最大 %s)",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "文件已经添加或删除到您的<strong>收藏夹</strong> 中",
+ "Files" : "文件",
+ "A file or folder has been <strong>changed</strong>" : "文件或文件夹已经被<strong>修改</strong>",
+ "A favorite file or folder has been <strong>changed</strong>" : "一个收藏的文件或文件夹已经被<strong>修改</strong>",
+ "Failed to authorize" : "授权失败",
+ "Invalid folder path" : "无效文件夹路径",
+ "Folder not found" : "未找到文件夹",
+ "The file cannot be found" : "找不到文件",
+ "The destination path does not exist: %1$s" : "目标路径不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您没有在指定位置创建文件的权限",
+ "The file could not be converted." : "无法转换文件。",
+ "Could not get relative path to converted file" : "无法获取转换文件的相对路径",
+ "Favorite files" : "收藏的文件",
+ "No favorites" : "无收藏",
+ "More favorites" : "更多收藏",
"Accept" : "接受",
"Reject" : "拒绝",
- "Incoming ownership transfer from {user}" : "来自{user}的所有权转移",
- "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您要接受{path}吗?\n\n注意:接受后转移过程可能长达1小时。",
+ "Incoming ownership transfer from {user}" : "来自 {user} 的所有权转移",
+ "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您要接受 {path} 吗?\n\n注意:接受后转移过程可能长达1小时。",
+ "Ownership transfer denied" : "所有权转移被拒绝",
+ "Your ownership transfer of {path} was denied by {user}." : "你路径 {path} 下的文件所属权转移被 {user} 拒绝。",
"Ownership transfer failed" : "所有权转移失败",
- "Your ownership transfer of {path} to {user} failed." : "您{path}的所有权向{user}转移失败。",
- "The ownership transfer of {path} from {user} failed." : "来自{user}的{path}的所有权转移失败。",
+ "Your ownership transfer of {path} to {user} failed." : "您 {path} 的所有权向 {user} 转移失败。",
+ "The ownership transfer of {path} from {user} failed." : "来自 {user} 的 {path} 的所有权转移失败。",
"Ownership transfer done" : "所有权转移完成",
- "Your ownership transfer of {path} to {user} has completed." : "您的{path}向{user}的所有权转移已完成。",
- "The ownership transfer of {path} from {user} has completed." : "来自{user}的{path}的所有权转移已完成。",
+ "Your ownership transfer of {path} to {user} has completed." : "您的 {path} 向 {user} 的所有权转移已完成。",
+ "The ownership transfer of {path} from {user} has completed." : "来自 {user} 的 {path} 的所有权转移已完成。",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "从 %1$s 转移至 %2$s",
+ "Files compatibility" : "文件兼容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允许限制文件名称以确保文件可以与所有客户端同步。默认状态下,所有POSIX(例如 Linux 或 macOS)系统有效的文件名都是被允许的。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "启用与 Windows 兼容的文件名后,无法再修改现有文件,但可以由其所有者重命名为有效的新名称。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "启用此设置后,也可以自动迁移文件,请参阅有关 occ 命令的文档。",
+ "Enforce Windows compatibility" : "强制 Windows 兼容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "这将阻止在 Windows 系统中无效的文件名称,比如使用保留字符。但这不会强制大小写敏感性兼容。",
"File Management" : "文件管理",
- "Transfer ownership of a file or folder" : "转移文件或文件夹的所有权",
- "Choose file or folder to transfer" : "选择要转移的文件或文件夹",
- "Change" : "修改",
- "New owner" : "新的拥有者",
- "Search users" : "搜索用户",
+ "Home" : "首页",
+ "Target folder does not exist any more" : "目标文件夹已不存在",
+ "Reload current directory" : "重新载入当前目录",
+ "Go to the \"{dir}\" directory" : "前往“{dir}”目录",
+ "Current directory path" : "当前文件目录",
+ "Your have used your space quota and cannot upload files anymore" : "你已用完你的空间配额,无法再上传更多文件",
+ "You do not have permission to upload or create files here." : "您没有在此处上传或创建文件的权限。",
+ "Drag and drop files here to upload" : "将文件拖放至此处以上传",
+ "Favorite" : "收藏",
+ "Back" : "返回",
+ "Toggle selection for file \"{displayName}\"" : "切换文件 “{displayName}” 的选择",
+ "Toggle selection for folder \"{displayName}\"" : "切换文件夹 “{displayName}” 的选择",
+ "File is loading" : "正在加载文件",
+ "Folder is loading" : "正在加载文件夹",
+ "Filename" : "文件名",
+ "Folder name" : "文件夹名称",
+ "This node is unavailable" : "此节点不可用",
+ "Another entry with the same name already exists." : "另一相同名称的条目已存在。",
+ "Invalid filename." : "无效文件名称。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已将“{oldName}”重命名为“{newName}”",
+ "Rename file" : "重命名文件",
+ "Folder" : "文件夹",
+ "Unknown file type" : "未知文件类型",
+ "{ext} image" : "{ext} 图片",
+ "{ext} video" : "{ext} 视频",
+ "{ext} audio" : "{ext} 音频",
+ "{ext} text" : "{ext} 文本",
+ "Pending" : "等待",
+ "Unknown date" : "未知日期",
+ "Clear filter" : "清除筛选",
+ "Modified" : "修改日期",
+ "Search everywhere" : "在所有位置搜索",
+ "Type" : "类型",
+ "Active filters" : "已开启的过滤器",
+ "Remove filter" : "移除过滤条件",
+ "Total rows summary" : "总行摘要",
+ "Toggle selection for all files and folders" : "切换所有文件和文件夹的选择",
+ "Name" : "名称",
+ "File type" : "文件类型",
+ "Size" : "大小",
+ "Actions" : "操作",
+ "(selected)" : "(已选择)",
+ "List of files and folders." : "文件与文件夹列表。",
+ "You have used your space quota and cannot upload files anymore." : "您的剩余空间配额不足以继续上传文件。",
+ "Column headers with buttons are sortable." : "带有按钮的列标题可进行排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出于性能考虑,此列表未完全呈现。文件将在您浏览列表时呈现。",
+ "File not found" : "文件未找到",
+ "_{count} selected_::_{count} selected_" : ["已选择 {count} 个"],
+ "Search scope options" : "搜索范围选项",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
+ "{used} of {quota} used" : "已使用 {used}(共 {quota})",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "无法刷新存储统计数据",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
+ "Storage information" : "存储信息",
+ "Storage quota" : "存储配额",
+ "New folder" : "新建文件夹",
+ "Create new folder" : "创建新文件夹",
+ "This name is already in use." : "此名称已被使用。",
+ "Create" : "创建",
+ "Files starting with a dot are hidden by default" : "以点开头的文件默认是隐藏的",
+ "Fill template fields" : "填写模板字段",
+ "Submitting fields …" : "正在提交字段…",
+ "Submit" : "使用",
"Choose a file or folder to transfer" : "选择要转移的文件或文件夹",
"Transfer" : "转移",
"Transfer {path} to {userid}" : "将 {path} 转移给 {userid}",
"Invalid path selected" : "选择的路径无效",
+ "Unknown error" : "未知错误",
"Ownership transfer request sent" : "所有权转移请求已发送",
- "Cannot transfer ownership of a file or folder you don't own" : "无法转让您未拥有的文件或文件夹的所有权",
- "Tags" : "标签",
- "Unable to change the favourite state of the file" : "无法修改文件的收藏状态",
+ "Cannot transfer ownership of a file or folder you do not own" : "无法转让您未拥有的文件或文件夹的所有权",
+ "Transfer ownership of a file or folder" : "转移文件或文件夹的所有权",
+ "Choose file or folder to transfer" : "选择要转移的文件或文件夹",
+ "Change" : "修改",
+ "New owner" : "新的所有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含扩展名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除扩展名",
+ "Change file extension" : "更改文件扩展名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "将文件扩展名从 \"{old}\" 更改为 \"{new}\" 可能会导致文件无法读取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "删除文件扩展名 \"{old}\" 可能会导致文件无法读取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "添加文件扩展名 \"{new}\" 可能会导致文件无法读取。",
+ "Do not show this dialog again." : "不再显示此对话框。",
+ "Select file or folder to link to" : "选择需要链接的文件或文件夹",
+ "Choose {file}" : "选择 {file}",
+ "Share" : "共享",
+ "Shared by link" : "通过链接共享",
+ "Shared" : "已共享",
+ "Switch to list view" : "切换为列表视图",
+ "Switch to grid view" : "切换到网格视图",
+ "The file could not be found" : "找不到文件",
+ "Upload was cancelled by user" : "用户已取消上传",
+ "Not enough free space" : "可用空间不足",
+ "Operation is blocked by access control" : "访问控制阻止此操作",
+ "Error during upload: {message}" : "上传时发生错误: {message}",
+ "Error during upload, status code {status}" : "上传时发生错误,状态码 {status}",
+ "Unknown error during upload" : "上传时发生未知错误",
+ "Loading current folder" : "正在载入当前文件夹",
+ "Retry" : "重试",
+ "No files in here" : "这里没有文件",
+ "Upload some content or sync with your devices!" : "上传一些内容或与您的设备同步!",
+ "Go back" : "返回",
+ "Views" : "视图",
+ "Files settings" : "文件设置",
+ "Your files" : "你的文件",
+ "Open in files" : "在文件中打开",
+ "File cannot be accessed" : "文件无法访问",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到该文件,或是您没有查看该文件的权限。请要求发送者分享它。",
+ "No search results for “{query}”" : "没有“{query}”的搜索结果",
+ "Search for files" : "搜索文件",
+ "Clipboard is not available" : "剪贴板不可用",
+ "General" : "常规",
+ "Default view" : "默认视图",
+ "All files" : "全部文件",
+ "Personal files" : "个人文件",
+ "Sort favorites first" : "收藏排序优先",
+ "Sort folders before files" : "将文件夹排在文件前面",
+ "Folder tree" : "文件夹树",
+ "Appearance" : "外观",
+ "Show hidden files" : "显示隐藏文件",
+ "Show file type column" : "显示文件类型列",
+ "Crop image previews" : "裁剪图片预览",
+ "Additional settings" : "其他设置",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "复制",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的账号已启用双因素身份验证,因此您需要使用应用密码来连接外部 WebDAV 客户端。",
+ "Warnings" : "警告",
+ "Keyboard shortcuts" : "键盘快捷键",
+ "Rename" : "重命名",
+ "Delete" : "删除",
+ "Manage tags" : "管理标签",
+ "Selection" : "选择",
+ "Select all files" : "选择所有文件",
+ "Deselect all" : "全部取消选择",
+ "Navigation" : "导航",
+ "View" : "查看",
+ "Toggle grid view" : "切换网格视图",
+ "Show those shortcuts" : "显示快捷键",
+ "You" : "您",
+ "Shared multiple times with different people" : "与不同的用户多次分享",
+ "Unable to change the favorite state of the file" : "无法更改文件的收藏状态",
"Error while loading the file data" : "加载文件数据时出错",
+ "Owner" : "拥有者",
+ "Remove from favorites" : "从收藏中移除",
+ "Add to favorites" : "添加到收藏夹",
+ "Tags" : "标签",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "无法从模板创建新文件",
"Pick a template for {name}" : "给 {name} 挑选一个模板",
- "Cancel" : "取消",
- "Create" : "创建",
"Create a new file with the selected template" : "用所选模板创建一个新文件",
"Creating file" : "正在创建文件",
- "Blank" : "空白",
- "Unable to create new file from template" : "无法从模板创建新文件",
- "Set up templates folder" : "设置模板文件夹",
- "Templates" : "模板",
+ "Save as {displayName}" : "保存为 {displayName}",
+ "Save as …" : "保存为…",
+ "Converting files …" : "正在转换文件…",
+ "Failed to convert files: {message}" : "无法转换文件:{message}",
+ "All files failed to be converted" : "无法转换全部文件",
+ "One file could not be converted: {message}" : "有一个文件无法转换:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["无法转换 %n 个文件"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["已成功转换 %n 个文件"],
+ "Files successfully converted" : "文件已成功转换",
+ "Failed to convert files" : "无法转换文件",
+ "Converting file …" : "正在转换文件…",
+ "File successfully converted" : "文件已成功转换",
+ "Failed to convert file: {message}" : "无法转换文件:{message}",
+ "Failed to convert file" : "无法转换文件",
+ "Leave this share" : "离开此共享",
+ "Leave these shares" : "离开此分享",
+ "Disconnect storage" : "断开与存储空间的连接",
+ "Disconnect storages" : "断开与存储空间的连接",
+ "Delete permanently" : "彻底删除",
+ "Delete and unshare" : "删除并取消分享",
+ "Delete file" : "删除文件",
+ "Delete files" : "删除文件",
+ "Delete folder" : "删除文件夹",
+ "Delete folders" : "删除文件夹",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您正要永久删除 {count} 个项目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您正要删除 {count} 个项目"],
+ "Confirm deletion" : "确认删除",
+ "Cancel" : "取消",
+ "Download" : "下载",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移动 “{source}” 至 “{destination}” ...",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在复制 “{source}” 至 “{destination}” ...",
+ "Destination is not a folder" : "目标不是一个文件夹",
+ "This file/folder is already in that directory" : "该文件/文件夹已经存在与该目录中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "你无法将文件/文件夹移动至其自身或子文件夹中",
+ "(copy)" : "(复制)",
+ "(copy %n)" : "(复制 %n)",
+ "A file or folder with that name already exists in this folder" : "相同的文件/文件夹已存在于该文件夹中",
+ "The files are locked" : "文件已锁定",
+ "The file does not exist anymore" : "文件不存在",
+ "Choose destination" : "选择目标路径",
+ "Copy to {target}" : "复制到 {target}",
+ "Move to {target}" : "移动到 {target}",
+ "Move" : "移动",
+ "Move or copy operation failed" : "移动或复制失败",
+ "Move or copy" : "移动或复制",
+ "Open folder {displayName}" : "打开文件夹{displayName}",
+ "Open in Files" : "在文件中打开",
+ "Open locally" : "本地打开",
+ "Failed to redirect to client" : "重定向到客户端失败",
+ "Open file locally" : "在本地打开文件",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "该文件现在应该在你的设备上打开。如果没有,请检查你是否安装了桌面应用程序。",
+ "Retry and close" : "重试并关闭",
+ "Open online" : "在线打开",
+ "Details" : "详细信息",
+ "View in folder" : "在文件夹中查看",
+ "Today" : "今日",
+ "Last 7 days" : "过去 7 天",
+ "Last 30 days" : "过去 30 天",
+ "This year ({year})" : "今年({year})",
+ "Last year ({year})" : "去年({year})",
+ "Documents" : "文档",
+ "Spreadsheets" : "表格",
+ "Presentations" : "幻灯片",
+ "PDFs" : "PDF",
+ "Folders" : "文件夹",
+ "Audio" : "音频",
+ "Images" : "图片",
+ "Videos" : "视频",
+ "Created new folder \"{name}\"" : "已创建新文件夹“{name}”",
"Unable to initialize the templates directory" : "无法初始化模板目录",
- "%s used" : "已使用 %s",
- "%s%% of %s used" : "%s 已使用 %s 中的 %%",
- "%1$s of %2$s used" : "已使用 %2$s 中的 %1$s",
- "Settings" : "设置",
- "Show hidden files" : "显示隐藏文件",
- "Crop image previews" : "裁剪图片预览",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
- "Toggle %1$s sublist" : "切换 %1$s 子列表",
- "Toggle grid view" : "切换网格视图",
- "No files in here" : "这里没有文件",
- "Upload some content or sync with your devices!" : "上传一些内容或与您的设备同步!",
+ "Create templates folder" : "创建模板文件夹",
+ "Templates" : "模板",
+ "New template folder" : "新建模板文件夹",
+ "In folder" : "文件夹内",
+ "Search in all files" : "在所有文件中搜索",
+ "Search in folder: {folder}" : "在文件夹内搜索:{folder}",
+ "One of the dropped files could not be processed" : "无法处理其中一个已删除的文件",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "你的浏览器不支持文件系统API。目录不会被上传",
+ "No files to upload" : "没有需要上传的文件",
+ "Unable to create the directory {directory}" : "无法创建目录 {directory}",
+ "Some files could not be uploaded" : "部分文件无法上传",
+ "Files uploaded successfully" : "上传文件成功",
+ "No files to process" : "没有需要处理的文件",
+ "Some files could not be copied" : "无法复制某些文件",
+ "Some files could not be moved" : "某些文件无法被移动",
+ "Files copied successfully" : "复制文件成功",
+ "Files moved successfully" : "移动文件成功",
+ "Conflicts resolution skipped" : "已跳过冲突解决",
+ "Upload cancelled" : "已取消上传",
+ "Could not rename \"{oldName}\", it does not exist any more" : "无法重命名“{oldName}”,此文件已经不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名称“{newName}”在这个文件夹“{dir}”已经被使用。请选择其他名称。",
+ "Could not rename \"{oldName}\"" : "无法重命名“{oldName}”",
+ "This operation is forbidden" : "该操作被禁止",
+ "Storage is temporarily not available" : "存储空间暂时不可用",
+ "Unexpected error: {error}" : "意外错误:{error}",
+ "_%n file_::_%n files_" : ["%n 个文件"],
+ "_%n folder_::_%n folders_" : ["%n 个文件夹"],
+ "_%n hidden_::_%n hidden_" : ["%n 已隐藏"],
+ "Filename must not be empty." : "文件名不能为空。",
+ "\"{char}\" is not allowed inside a filename." : "文件名中不允许出现 “{char}”",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "“{segment}” 是一个保留名称,不允许用在文件名中。",
+ "\"{extension}\" is not an allowed filetype." : "“{extension}” 文件类型不被允许。",
+ "Filenames must not end with \"{extension}\"." : "文件名不能以 “{extension}” 结尾。",
+ "List of favorite files and folders." : "收藏的文件和文件夹列表。",
+ "No favorites yet" : "暂无收藏",
+ "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
+ "List of your files and folders." : "您的文件与文件件列表。",
+ "List of your files and folders that are not shared." : "尚未分享的文件与文件夹",
+ "No personal files found" : "找不到个人文件",
+ "Files that are not shared will show up here." : "尚未分享的文件会显示在此处",
+ "Recent" : "最近",
+ "List of recently modified files and folders." : "最近修改的文件与文件夹列表。",
+ "No recently modified files" : "近期无修改文件",
+ "Files and folders you recently modified will show up here." : "你最近修改的文件与文件夹将会显示在此处。",
+ "Search" : "搜索",
+ "Search results within your files." : "在您的文件中搜索结果。",
"No entries found in this folder" : "在此文件夹中找不到项目",
"Select all" : "全部选择",
"Upload too large" : "上传文件过大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "正在上传的文件超过了此服务器允许上传的最大容量限制",
- "No favorites yet" : "暂无收藏",
- "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示",
- "Deleted files" : "已删除的文件",
- "Shares" : "共享",
- "Shared with others" : "已与他人共享",
- "Shared with you" : "已与您共享",
- "Shared by link" : "已通过链接共享",
- "Deleted shares" : "已删除的共享",
- "Pending shares" : "待定共享",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您尝试上传的文件大小超过了服务器的限制。",
+ "File could not be found" : "文件未找到",
+ "Show list view" : "显示列表视图",
+ "Show grid view" : "显示网格视图",
+ "Close" : "关闭",
+ "Could not create folder \"{dir}\"" : "无法创建文件夹“{dir}”",
+ "This will stop your current uploads." : "这会终止您当前的上传。",
+ "Upload cancelled." : "上传已取消。",
+ "Processing files …" : "正在处理文件 ...",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "无法上传 {filename},因为它是一个目录或者是大小为 0 的空文件",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空间不足,您上传的文件大小为 {size1} ,但可用空间仅剩 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目标文件夹“{dir}”不存在",
+ "An unknown error has occurred" : "发生了未知错误。",
+ "File could not be uploaded" : "文件无法上传",
+ "Uploading …" : "正在上传 ...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "上传中 ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "不支持上传此项目",
+ "Error when assembling chunks, status code {status}" : "组装块时发生错误,状态码 {status}",
+ "Choose target folder" : "选择目标文件夹",
+ "Set reminder" : "设置提醒",
+ "Edit locally" : "本地编辑",
+ "Open" : "打开",
+ "Could not load info for file \"{file}\"" : "无法加载文件“{file}”的信息",
+ "Please select tag(s) to add to the selection" : "请选择要添加到所选项目的标签",
+ "Apply tag(s) to selection" : "将标签应用到所选项目",
+ "Select directory \"{dirName}\"" : "选择目录“{dirName}”",
+ "Select file \"{fileName}\"" : "选择文件“{fileName}”",
+ "Unable to determine date" : "无法确定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员",
+ "Could not move \"{file}\", target exists" : "无法移动“{file}”,目标已存在",
+ "Could not move \"{file}\"" : "无法移动“{file}”",
+ "copy" : "复制",
+ "Could not copy \"{file}\", target exists" : "无法复制“{file}”,目标已存在",
+ "Could not copy \"{file}\"" : "无法复制“{file}”",
+ "Copied {origin} inside {destination}" : "在 {destination} 内复制 {origin}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "在 {destination} 内复制了 {origin} 和 {nbfiles} 个其他文件",
+ "{newName} already exists" : "{newName} 已经存在",
+ "Could not create file \"{file}\"" : "无法创建文件“{file}”",
+ "Could not create file \"{file}\" because it already exists" : "无法创建文件“{file}”,因为它已经存在",
+ "Could not create folder \"{dir}\" because it already exists" : "无法创建文件夹“{dir}”,因为它已经存在",
+ "Could not fetch file details \"{file}\"" : "无法获取文件详细信息“{file}”",
+ "Error deleting file \"{fileName}\"." : "删除文件“{fileName}”时出错。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其它的文件夹里没有关于 {tag}{filter}{endtag} 的搜索结果",
+ "Enter more than two characters to search in other folders" : "输入至少三个字符,以搜索其他文件夹",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 个隐藏文件"],
+ "You do not have permission to upload or create files here" : "您没有在此上传或创建文件的权限",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上传 %n 个文件"],
+ "New" : "新建",
+ "New file/folder menu" : "新建文件/文件夹菜单",
+ "Select file range" : "选择文件范围",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used} 存储空间",
+ "\"{name}\" is an invalid file name." : "“{name}”是一个无效的文件名。",
+ "File name cannot be empty." : "文件名不能为空。",
+ "\"/\" is not allowed inside a file name." : "文件名不能包含“/”。",
+ "\"{name}\" is not an allowed filetype" : "“{name}”不是允许的文件类型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的存储已满,无法再更新或同步文件了!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群组文件夹“{mountPoint}”已满,无法再更新或同步文件!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部存储器“{mountPoint}”已满,无法再更新或同步文件!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的的存储已满,无法继续更新或同步文件!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "组文件夹“{mountPoint}”的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部存储“{mountPoint}”的存储空间几乎已满 ({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的存储空间几乎已满({usedSpacePercent}%)",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["匹配“{filter}”"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
+ "Path" : "路径",
+ "_%n byte_::_%n bytes_" : ["%n 字节"],
+ "Favored" : "已加入收藏",
+ "Favor" : "收藏",
+ "Copy direct link (only works for people who have access to this file/folder)" : "复制直接链接(仅适用于有权访问此文件/文件夹的用户)",
+ "Upload file" : "上传文件",
+ "Not favored" : "未收藏",
+ "An error occurred while trying to update the tags" : "更新标签时出错",
+ "Upload (max. %s)" : "上传 (最大 %s)",
+ "\"{displayName}\" action executed successfully" : "“{displayName}”操作执行成功",
+ "\"{displayName}\" action failed" : "“{displayName}”操作执行失败",
+ "\"{displayName}\" failed on some elements" : "“{displayName}”在某些元素上失败",
+ "\"{displayName}\" batch action executed successfully" : "批量操作“{displayName}”运行成功",
+ "Submitting fields…" : "提交字段...",
+ "Filter filenames…" : "过滤文件名...",
+ "WebDAV URL copied to clipboard" : "WebDAV 链接已复制到剪贴板",
+ "Enable the grid view" : "启用网格视图",
+ "Enable folder tree" : "启用文件夹树",
+ "Copy to clipboard" : "复制到剪贴板",
+ "Use this address to access your Files via WebDAV" : "使用此地址通过 WebDAV 访问您的文件",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果启用两步验证,您必须点击此处来创建和使用一个新的应用程序密码。",
+ "Deletion cancelled" : "已取消删除",
+ "Move cancelled" : "已取消移动",
+ "Cancelled move or copy of \"{filename}\"." : "取消移动或复制“{filename}”.",
+ "Cancelled move or copy operation" : "已取消移动或复制操作",
+ "Open details" : "打开详情",
+ "Photos and images" : "照片和图像",
+ "New folder creation cancelled" : "取消创建新文件夹",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 个文件夹"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 个文件"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 个文件夹及 {folderCount} 个文件夹"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 个文件及 1 个文件夹"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 个文件及 {folderCount} 个文件夹",
+ "All folders" : "所有文件夹",
+ "Personal Files" : "个人文件",
"Text file" : "文本文件",
- "New text file.txt" : "新建文本文档.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的存储空间已满,文件将无法更新或同步!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : " \"{mountPoint}\"组文件夹已满,文件无法继续更新或同步!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部存储 \"{mountPoint}\" 已满,无法再更新或同步文件!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的存储空间已满,文件将无法更新或同步!",
- "_matches '{filter}'_::_match '{filter}'_" : ["匹配 '{filter}'"]
+ "New text file.txt" : "新建文本文件.txt",
+ "%1$s (renamed)" : "%1$s(已重命名)",
+ "renamed file" : "已重命名文件",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "启用与 Windows 兼容的文件名后,无法再修改现有文件,但可以由其所有者重命名为有效的新名称。",
+ "Filter file names …" : "筛选文件名…",
+ "Prevent warning dialogs from open or reenable them." : "防止打开或重新启用警告对话框。",
+ "Show a warning dialog when changing a file extension." : "更改文件扩展名时显示警告对话框。",
+ "Speed up your Files experience with these quick shortcuts." : "这些快捷键可以加快你的“文件”体验。",
+ "Open the actions menu for a file" : "打开文件的操作菜单",
+ "Rename a file" : "重命名文件",
+ "Delete a file" : "删除文件",
+ "Favorite or remove a file from favorites" : "把文件添加或移除出收藏夹",
+ "Manage tags for a file" : "管理文件的标签",
+ "Deselect all files" : "取消选择所有文件",
+ "Select or deselect a file" : "选择或取消选择文件",
+ "Select a range of files" : "选择一系列文件",
+ "Navigate to the parent folder" : "前往上一级文件夹",
+ "Navigate to the file above" : "跳转至以上文件",
+ "Navigate to the file below" : "跳转至以下文件",
+ "Navigate to the file on the left (in grid mode)" : "跳转至左侧文件(在网格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "跳转至右侧文件(在网格模式下)",
+ "Toggle the grid view" : "切换网格视图",
+ "Open the sidebar for a file" : "在侧边栏打开文件"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js
index da833d4ee3a..395318ef440 100644
--- a/apps/files/l10n/zh_HK.js
+++ b/apps/files/l10n/zh_HK.js
@@ -1,114 +1,11 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "儲存空間暫時無法使用",
- "Storage invalid" : "無效的儲存空間",
- "Unknown error" : "未知錯誤",
- "File could not be found" : "找不到檔案",
- "Move or copy" : "移動或複製",
- "Download" : "下載",
- "Delete" : "刪除",
- "Home" : "主目錄",
- "Close" : "關閉",
- "Favorites" : "最愛",
- "Could not create folder \"{dir}\"" : "無法建立資料夾 \"{dir}\"",
- "This will stop your current uploads." : "這會終止目前任何的上傳。",
- "Upload cancelled." : "上傳已取消",
- "Processing files …" : "正在處理檔案…",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "資料夾 \"{dir}\" 不存在",
- "Not enough free space" : "空間不足",
- "An unknown error has occurred" : "發生了未知的錯誤",
- "Uploading …" : "上傳中...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize}({bitrate})",
- "Uploading that item is not supported" : "不支援上傳該項目",
- "Target folder does not exist any more" : "目標資料夾已經不存在了",
- "Operation is blocked by access control" : "操作已被存取控制封鎖",
- "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
- "Actions" : "操作",
- "Rename" : "重新命名",
- "Copy" : "複製",
- "Choose target folder" : "選擇目標資料夾",
- "Open" : "開啟",
- "Delete file" : "刪除檔案",
- "Delete folder" : "刪除資料夾",
- "Disconnect storage" : "解除連結儲存空間",
- "Leave this share" : "保留該共用",
- "Could not load info for file \"{file}\"" : "無法讀取 \"{file}\" 的詳細資料",
- "Files" : "檔案",
- "Details" : "詳細資料",
- "Please select tag(s) to add to the selection" : "請選擇要添加到所選項目中的標籤",
- "Apply tag(s) to selection" : "將標籤應用於所選項目",
- "Select" : "選擇",
- "Pending" : "待定的",
- "Unable to determine date" : "無法確定日期",
- "This operation is forbidden" : "此操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
- "Could not move \"{file}\"" : "無法移動 \"{file}\"",
- "copy" : "複製",
- "Could not copy \"{file}\", target exists" : "無法複製\"{file}\",目標已存在",
- "Could not copy \"{file}\"" : "無法複製\"{file}\"",
- "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
- "{newName} already exists" : "{newName} 已經存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "無法命名檔案 \"{fileName}\",因為此檔案已經不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱 \"{targetName}\" 在這資料夾 \"{dir}\" 已經被使用。請重新選擇不同的名稱",
- "Could not rename \"{fileName}\"" : "無法重新命名「{fileName}」",
- "Could not create file \"{file}\"" : "無法建立檔案 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
- "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾 \"{dir}\",因為此資料夾已存在",
- "Could not fetch file details \"{file}\"" : "不能取得檔案細節\"{file}\"",
- "Error deleting file \"{fileName}\"." : "刪除 \"{fileName}\" 出錯",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其它資料夾中沒有找到 {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其它資料夾搜尋",
- "Name" : "名稱",
- "Size" : "大小",
- "Modified" : "修改時間",
- "_%n folder_::_%n folders_" : ["%n 個資料夾"],
- "_%n file_::_%n files_" : ["%n 個檔案"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"],
- "You don’t have permission to upload or create files here" : "您無權限上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
- "New" : "新增",
- "Select file range" : "選擇多個檔案",
- "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
- "{used} used" : "已使用 {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" 是無效的檔案名稱。",
- "File name cannot be empty." : "檔名不能為空",
- "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" 是不允許的檔案類型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿({usedSpacePercent}%)。",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
- "View in folder" : "在資料夾中檢視",
- "Copied!" : "已複製",
- "Copy direct link (only works for users who have access to this file/folder)" : "複製直接連結(只對能存取的用戶有用)",
- "Path" : "路徑",
- "_%n byte_::_%n bytes_" : ["%n 位元組"],
- "Favorited" : "已加入最愛",
- "Favorite" : "我的最愛",
- "You can only favorite a single file or folder at a time" : "您一次只能為一個檔案或資料夾加星號",
- "New folder" : "新資料夾",
- "Upload file" : "上傳檔案",
- "Recent" : "最新",
- "Not favorited" : "未加入至最愛",
- "Remove from favorites" : "從最愛中移除",
- "Add to favorites" : "加到我的最愛",
- "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
"Added to favorites" : "已加到我的最愛",
"Removed from favorites" : "已從最愛中移除",
"You added {file} to your favorites" : "你已添加 {file} 至最愛",
"You removed {file} from your favorites" : "你已移除 {file} 從最愛",
+ "Favorites" : "最愛",
"File changes" : "檔案更動",
"Created by {user}" : "由 {user} 建立",
"Changed by {user}" : "由 {user} 改動",
@@ -116,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "由 {user} 還原",
"Renamed by {user}" : "由 {user} 重新命名",
"Moved by {user}" : "由 {user} 移動",
- "\"remote user\"" : "「遠端用戶」",
+ "\"remote account\"" : "「遠端帳戶」",
"You created {file}" : "您建立了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 建立了一個加密的檔案",
"{user} created {file}" : "{user} 建立了 {file}",
@@ -143,15 +40,26 @@ OC.L10N.register(
"You moved {oldfile} to {newfile}" : "您將 {oldfile} 移到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 將 {oldfile} 移到 {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "已將檔案添加到<strong>我的最愛</strong>收藏夾中或從其中刪除",
+ "Files" : "檔案",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾有所<strong>更改</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "收藏的檔案或資料夾有所<strong>更改</strong>",
- "All files" : "所有檔案",
- "Unlimited" : "無限制",
- "Upload (max. %s)" : "上傳(上限 %s)",
+ "Failed to authorize" : "無法授權",
+ "Invalid folder path" : "無效的資料夾路徑",
+ "Folder not found" : "找不到資料夾",
+ "The file cannot be found" : "無法找到此檔案",
+ "The destination path does not exist: %1$s" : "目的途徑不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您無權在指定的位置創建檔案",
+ "The file could not be converted." : "無法轉換檔案。",
+ "Could not get relative path to converted file" : "無法取得轉換檔案的相對路徑",
+ "Favorite files" : "最愛的檔案",
+ "No favorites" : "沒有最愛",
+ "More favorites" : "更多最愛",
"Accept" : "接受",
"Reject" : "拒絕",
"Incoming ownership transfer from {user}" : "來自 {user} 的擁有權轉移",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您想要接收 \"{path}\" 嗎?\n\n註:所有權轉移的流程最多需要一小時",
+ "Ownership transfer denied" : "擁有權轉移被拒絕",
+ "Your ownership transfer of {path} was denied by {user}." : "您 \"{path}\" 的擁有權轉移被 {user} 拒絕",
"Ownership transfer failed" : "擁有權轉讓失敗",
"Your ownership transfer of {path} to {user} failed." : "您將 \"{path}\" 的擁有權轉移給 {user} 失敗",
"The ownership transfer of {path} from {user} failed." : "來自 {user} 的 \"{path}\" 擁有權轉移失敗",
@@ -159,62 +67,436 @@ OC.L10N.register(
"Your ownership transfer of {path} to {user} has completed." : "您將 \"{path}\" 的所有權轉移給 {user} 已經完成",
"The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 \"{path}\" 所有權轉移已經完成",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "於 %2$s 從 %1$s 轉移",
+ "Files compatibility" : "檔案兼容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允許限製檔案名稱以確保檔案可以與所有客戶端同步。默認情況下,允許 POSIX(例如 Linux 或 macOS)上有效的所有檔案名稱。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用 Windows 兼容檔案名後,現有的檔案無法再被修改,但其擁有者可以將其重新命名為有效的新名稱。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "啟用此設定後,還可以自動遷移檔案,請參考有關 occ 指令的說明書。",
+ "Enforce Windows compatibility" : "實施 Windows 兼容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "這將阻止在 Windows 系統上無效的檔案名,例如使用保留名稱或特殊字元。但這不會強制區分大小寫的兼容性。",
"File Management" : "檔案管理",
- "Transfer ownership of a file or folder" : "轉移檔案或資料夾的擁有權",
- "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
- "Change" : "更改",
- "New owner" : "新的擁有者",
- "Search users" : "搜尋用戶",
+ "Home" : "主目錄",
+ "Target folder does not exist any more" : "目標資料夾已經不存在了",
+ "Reload current directory" : "重新加載目前目錄",
+ "Go to the \"{dir}\" directory" : "前往「{dir}」目錄",
+ "Current directory path" : "目前目錄途徑",
+ "Your have used your space quota and cannot upload files anymore" : "您已用完您的空間配額,無法再上傳檔案",
+ "You do not have permission to upload or create files here." : "您無權在此上傳或建立檔案。",
+ "Drag and drop files here to upload" : "將檔案拖拽到此處即可上傳",
+ "Favorite" : "我的最愛",
+ "Back" : "上星期",
+ "Toggle selection for file \"{displayName}\"" : "切換對檔案 \"{displayName}\" 的選擇",
+ "Toggle selection for folder \"{displayName}\"" : "切換對資料夾 \"{displayName}\" 的選擇",
+ "File is loading" : "正在加載檔案",
+ "Folder is loading" : "正在加載資料夾",
+ "Filename" : "檔案名稱",
+ "Folder name" : "資料夾名稱",
+ "This node is unavailable" : "此節點不可用",
+ "Another entry with the same name already exists." : "另一個同名的條目已經存在。",
+ "Invalid filename." : "檔案名稱無效。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」",
+ "Rename file" : "重新命名檔案",
+ "Folder" : "資料夾",
+ "Unknown file type" : "檔案類型不詳",
+ "{ext} image" : "{ext} 圖像",
+ "{ext} video" : "{ext} 視像",
+ "{ext} audio" : "{ext} 音頻",
+ "{ext} text" : "{ext} 文字",
+ "Pending" : "待定的",
+ "Unknown date" : "日期不詳",
+ "Clear filter" : "清空過濾器",
+ "Modified" : "修改時間",
+ "Search everywhere" : "到處搜尋",
+ "Type" : "類型",
+ "Active filters" : "有效的過濾器",
+ "Remove filter" : "移除過濾",
+ "Total rows summary" : "總列摘要",
+ "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選擇",
+ "Name" : "名稱",
+ "File type" : "檔案類型",
+ "Size" : "大小",
+ "{displayName}: failed on some elements" : "{displayName}:在部份元素上失敗",
+ "{displayName}: done" : "{displayName}:完成",
+ "{displayName}: failed" : "{displayName}:失敗",
+ "Actions" : "操作",
+ "(selected)" : "(已選擇)",
+ "List of files and folders." : "檔案與資料夾清單。",
+ "You have used your space quota and cannot upload files anymore." : "您已用完您的空間配額,無法再上傳檔案。",
+ "Column headers with buttons are sortable." : "具有按鈕的縱列標題可排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
+ "File not found" : "找不到檔案",
+ "_{count} selected_::_{count} selected_" : ["已選擇 {count} 項"],
+ "Search everywhere …" : "搜尋各處 …",
+ "Search here …" : "搜尋此處 …",
+ "Search scope options" : "搜尋範圍選項",
+ "Search here" : "搜尋此處",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte} ",
+ "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "無法更新儲存統計數據",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage information" : "儲存資訊",
+ "Storage quota" : "儲存配額",
+ "New folder" : "新資料夾",
+ "Create new folder" : "新增資料夾",
+ "This name is already in use." : "這個用戶名稱已經有人使用了。",
+ "Create" : "創建",
+ "Files starting with a dot are hidden by default" : "以點開頭的檔案默認為隱藏檔案",
+ "Fill template fields" : "填寫模板欄位",
+ "Submitting fields …" : "正在遞交欄位 …",
+ "Submit" : "遞交",
"Choose a file or folder to transfer" : "選擇要轉移的檔案或資料夾",
"Transfer" : "轉移",
"Transfer {path} to {userid}" : "轉移 \"{path}\" 給 {userid}",
"Invalid path selected" : "所選的路徑無效",
+ "Unknown error" : "錯誤不詳",
"Ownership transfer request sent" : "已送出擁有權轉移的請求",
- "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權。",
- "Tags" : "標籤",
- "Unable to change the favourite state of the file" : "無法更改檔案的最愛狀態",
+ "Cannot transfer ownership of a file or folder you do not own" : "無法轉移您未擁有的檔案或是資料夾所有權",
+ "Transfer ownership of a file or folder" : "轉移檔案或資料夾的擁有權",
+ "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
+ "Change" : "更改",
+ "New owner" : "新的擁有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含副檔名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除副檔名",
+ "Change file extension" : "變更檔案副檔名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "將檔案副檔名從「{old}」改為「{new}」可能會導致檔案無法讀取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "移除檔案副檔名「{old}」可能會導致檔案無法讀取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "加入檔案副檔名「{new}」可能會導致檔案無法讀取。",
+ "Do not show this dialog again." : "不要再次顯示此對話框。",
+ "Select file or folder to link to" : "選擇要連結的檔案或資料夾",
+ "Choose {file}" : "選擇 {file}",
+ "Share" : "分享",
+ "Shared by link" : "由連結分享",
+ "Shared" : "已分享",
+ "Switch to list view" : "切換到列表檢視",
+ "Switch to grid view" : "切換到網格檢視",
+ "The file could not be found" : "找不到檔案",
+ "Upload was cancelled by user" : "用戶已取消上傳",
+ "Not enough free space" : "空間不足",
+ "Operation is blocked by access control" : "操作已被存取控制封鎖",
+ "Error during upload: {message}" : "上傳時發生錯誤:{message}",
+ "Error during upload, status code {status}" : "上傳期間發生錯誤,狀態代碼 {status}",
+ "Unknown error during upload" : "上傳時發生未知的錯誤",
+ "Loading current folder" : "目前資料夾加載中",
+ "Retry" : "重試",
+ "No files in here" : "沒有任何檔案",
+ "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Go back" : "返回",
+ "Views" : "視圖",
+ "Files settings" : "檔案設定",
+ "Your files" : "您的檔案",
+ "Open in files" : "在「檔案」應用程式中打開",
+ "File cannot be accessed" : "檔案無法存取",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到該檔案,或是您沒有檢視該檔案的權限。請要求寄件者分享。",
+ "No search results for “{query}”" : "沒有結果符合「{query}」",
+ "Search for files" : "搜尋檔案",
+ "Clipboard is not available" : "剪貼板不可用",
+ "WebDAV URL copied" : "已複製 WebDAV URL",
+ "General" : "一般",
+ "Default view" : "默認檢視",
+ "All files" : "所有檔案",
+ "Personal files" : "個人檔案",
+ "Sort favorites first" : "先排序最愛",
+ "Sort folders before files" : "將資料夾在檔案之前排序",
+ "Folder tree" : "資料夾樹",
+ "Appearance" : "外觀",
+ "Show hidden files" : "顯示隱藏檔案",
+ "Show file type column" : "顯示檔案類型縱列",
+ "Show file extensions" : "顯示副檔名",
+ "Crop image previews" : "圖片裁剪預覽",
+ "Additional settings" : "其他設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "複製",
+ "How to access files using WebDAV" : "如何使用 WebDAV 存取檔案",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
+ "Warnings" : "警告",
+ "Warn before changing a file extension" : "變更副檔名前警告",
+ "Warn before deleting files" : "刪除檔案前警告",
+ "Keyboard shortcuts" : "鍵盤快捷鍵",
+ "File actions" : "檔案操作",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Add or remove favorite" : "新增或移除最愛",
+ "Manage tags" : "管理標籤",
+ "Selection" : "選擇",
+ "Select all files" : "選擇所有檔案",
+ "Deselect all" : "取消全選",
+ "Select or deselect" : "選取或取消選取",
+ "Select a range" : "選取範圍",
+ "Navigation" : "導覽列",
+ "Go to parent folder" : "前往上層資料夾",
+ "Go to file above" : "前往以上檔案",
+ "Go to file below" : "前往以下檔案",
+ "Go left in grid" : "在網格中向左",
+ "Go right in grid" : "在網格中向右",
+ "View" : "檢視",
+ "Toggle grid view" : "切換網格檢視",
+ "Open file sidebar" : "開啟檔案側邊欄",
+ "Show those shortcuts" : "顯示這些快捷鍵",
+ "You" : "您",
+ "Shared multiple times with different people" : "與不同的人多次分享",
+ "Unable to change the favorite state of the file" : "無法更改檔案的最愛狀態",
"Error while loading the file data" : "載入檔案資料失敗",
+ "Owner" : "擁有者",
+ "Remove from favorites" : "從最愛中移除",
+ "Add to favorites" : "加到我的最愛",
+ "Tags" : "標籤",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "無法從模板創建新檔案",
"Pick a template for {name}" : "為 {name} 選擇一個模板",
- "Cancel" : "取消",
- "Create" : "創建",
"Create a new file with the selected template" : "使用所選模板創建一個新檔案",
"Creating file" : "創建檔案中",
- "Blank" : "空白",
- "Unable to create new file from template" : "無法從模板創建新檔案",
- "Set up templates folder" : "設定範本料夾",
- "Templates" : "模板",
+ "Save as {displayName}" : "保存為 {displayName}",
+ "Save as …" : "另存為 ...",
+ "Converting files …" : "正在轉換檔案 …",
+ "Failed to convert files: {message}" : "無法轉換檔案:{message}",
+ "All files failed to be converted" : "所有檔案轉換失敗",
+ "One file could not be converted: {message}" : "有一個檔案無法轉換:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n 個檔案無法轉換"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n 個檔案成功轉換"],
+ "Files successfully converted" : "成功轉換檔案",
+ "Failed to convert files" : "無法轉換檔案",
+ "Converting file …" : "正在轉換檔案 …",
+ "File successfully converted" : "成功轉換檔案",
+ "Failed to convert file: {message}" : "無法轉換檔案:{message}",
+ "Failed to convert file" : "無法轉換檔案",
+ "Leave this share" : "保留該共用",
+ "Leave these shares" : "保留這些分享",
+ "Disconnect storage" : "解除連結儲存空間",
+ "Disconnect storages" : "解除連結儲存空間",
+ "Delete permanently" : "永久刪除",
+ "Delete and unshare" : "刪除並取消分享",
+ "Delete file" : "刪除檔案",
+ "Delete files" : "刪除檔案",
+ "Delete folder" : "刪除資料夾",
+ "Delete folders" : "刪除資料夾",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您即將永久刪除 {count} 個項目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您即將刪除 {count} 個項目"],
+ "Confirm deletion" : "確認刪除",
+ "Cancel" : "取消",
+ "Download" : "下載",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」…",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」…",
+ "Destination is not a folder" : "目標地不是資料夾",
+ "This file/folder is already in that directory" : "此檔案/資料夾已在該目錄中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
+ "(copy)" : "(複本)",
+ "(copy %n)" : "(複本 %n)",
+ "A file or folder with that name already exists in this folder" : "此資料夾中已存在同名的檔案或資料夾",
+ "The files are locked" : "檔案已被上鎖",
+ "The file does not exist anymore" : "檔案已不存在",
+ "Choose destination" : "選擇目標地",
+ "Copy to {target}" : "複製到 {target}",
+ "Move to {target}" : "移動到 {target}",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動或複製操作失敗",
+ "Move or copy" : "移動或複製",
+ "Open folder {displayName}" : "打開資料夾 {displayName}",
+ "Open in Files" : "在「檔案」應用程式中打開",
+ "Open locally" : "在近端打開",
+ "Failed to redirect to client" : "無法重定向到客戶端",
+ "Open file locally" : "在近端打開檔案",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "檔案現在應該在您的裝置上打開。如果沒有,請檢查您是否已安裝桌面應用程式。",
+ "Retry and close" : "重試和關閉",
+ "Open online" : "線上開啟",
+ "Details" : "詳細資料",
+ "View in folder" : "在資料夾中檢視",
+ "Today" : "今日",
+ "Last 7 days" : "過去7日",
+ "Last 30 days" : "過去30日",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "文件",
+ "Spreadsheets" : "試算表",
+ "Presentations" : "簡報",
+ "PDFs" : "PDF",
+ "Folders" : "資料夾",
+ "Audio" : "音頻",
+ "Images" : "圖像",
+ "Videos" : "影片",
+ "Created new folder \"{name}\"" : "創建了新資料夾 \"{name}\"",
"Unable to initialize the templates directory" : "無法初始化模板目錄",
- "%s used" : "使用了 %s 的存儲空間",
- "%s%% of %s used" : "%s 在 %s 中使用了 %%",
- "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s",
- "Settings" : "設定",
- "Show hidden files" : "顯示隱藏檔",
- "Crop image previews" : "圖片裁剪預覽",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
- "Toggle %1$s sublist" : "切換 %1$s 子列表",
- "Toggle grid view" : "切換網格檢視",
- "No files in here" : "沒有任何檔案",
- "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Create templates folder" : "創建模板資料夾",
+ "Templates" : "模板",
+ "New template folder" : "新範本資料夾",
+ "In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
+ "Search in folder: {folder}" : "搜尋資料夾: {folder}",
+ "One of the dropped files could not be processed" : "無法處理其中一個投放的檔案",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
+ "No files to upload" : "沒有要上傳的檔案",
+ "Unable to create the directory {directory}" : "無法建立目錄 {directory}",
+ "Some files could not be uploaded" : "無法上傳某些檔案",
+ "Files uploaded successfully" : "成功上傳檔案",
+ "No files to process" : "沒有要處理的檔案",
+ "Some files could not be copied" : "無法複製部份檔案",
+ "Some files could not be moved" : "有些檔案無法被移動",
+ "Files copied successfully" : "檔案複製成功",
+ "Files moved successfully" : "檔案移動成功",
+ "Conflicts resolution skipped" : "已略過衝突解決",
+ "Upload cancelled" : "上傳已取消",
+ "Could not rename \"{oldName}\", it does not exist any more" : "無法命名檔案「{oldName}」,因為此檔案已經不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{newName}」在這資料夾「{dir}」已經被使用。請選擇其他名稱。",
+ "Could not rename \"{oldName}\"" : "無法重新命名「{oldName}」",
+ "This operation is forbidden" : "此操作被禁止",
+ "This folder is unavailable, please try again later or contact the administration" : "此資料夾無法使用,請稍後再試或聯絡管理員",
+ "Storage is temporarily not available" : "儲存空間暫時無法使用",
+ "Unexpected error: {error}" : "意外錯誤:{error}",
+ "_%n file_::_%n files_" : ["%n 個檔案"],
+ "_%n folder_::_%n folders_" : ["%n 個資料夾"],
+ "_%n hidden_::_%n hidden_" : ["%n 個隱藏"],
+ "Filename must not be empty." : "檔案名稱不能為空。",
+ "\"{char}\" is not allowed inside a filename." : "檔案名稱中不允許出現「{char}」",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "「{segment}」是保留名稱,不允許用在檔案名稱。",
+ "\"{extension}\" is not an allowed filetype." : "「{extension}」是不允許的檔案類型。",
+ "Filenames must not end with \"{extension}\"." : "檔案名稱不能以「{extension}」結尾。",
+ "List of favorite files and folders." : "最愛檔案與資料夾的清單。",
+ "No favorites yet" : "尚無最愛",
+ "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
+ "List of your files and folders." : "您的檔案與資料夾清單。",
+ "List of your files and folders that are not shared." : "未分享的檔案與資料夾清單。",
+ "No personal files found" : "找不到個人檔案",
+ "Files that are not shared will show up here." : "尚未分享的檔案將會顯示在此處。",
+ "Recent" : "最新",
+ "List of recently modified files and folders." : "最近修改的檔案和資料夾的清單。",
+ "No recently modified files" : "近期無修改檔案",
+ "Files and folders you recently modified will show up here." : "您最近修改的檔案和資料夾將顯示在此處。",
+ "Search" : "搜尋",
+ "Search results within your files." : "在您的檔案中搜尋結果",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"Upload too large" : "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
- "No favorites yet" : "尚無最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
- "Deleted files" : "回收桶",
- "Shares" : "分享",
- "Shared with others" : "與其他人分享",
- "Shared with you" : "與您分享",
- "Shared by link" : "由連結分享",
- "Deleted shares" : "已刪除的分享",
- "Pending shares" : "等待分享",
+ "File could not be found" : "找不到檔案",
+ "Show list view" : "顯示清單視圖",
+ "Show grid view" : "顯示網格視圖",
+ "Close" : "關閉",
+ "Could not create folder \"{dir}\"" : "無法建立資料夾 \"{dir}\"",
+ "This will stop your current uploads." : "這會終止目前任何的上傳。",
+ "Upload cancelled." : "上傳已取消",
+ "Processing files …" : "正在處理檔案…",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "資料夾 \"{dir}\" 不存在",
+ "An unknown error has occurred" : "發生了不詳的錯誤",
+ "File could not be uploaded" : "檔案無法上傳",
+ "Uploading …" : "上傳中...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "上傳中 ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize}({bitrate})",
+ "Uploading that item is not supported" : "不支援上傳該項目",
+ "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
+ "Choose target folder" : "選擇目標資料夾",
+ "Set reminder" : "設定提醒",
+ "Edit locally" : "在近端編輯",
+ "Open" : "開啟",
+ "Could not load info for file \"{file}\"" : "無法讀取 \"{file}\" 的詳細資料",
+ "Please select tag(s) to add to the selection" : "請選擇要添加到所選項目中的標籤",
+ "Apply tag(s) to selection" : "將標籤應用於所選項目",
+ "Select directory \"{dirName}\"" : "選擇目錄「{dirName}」",
+ "Select file \"{fileName}\"" : "選擇檔案「{fileName}」",
+ "Unable to determine date" : "無法確定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
+ "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
+ "Could not move \"{file}\"" : "無法移動 \"{file}\"",
+ "copy" : "複製",
+ "Could not copy \"{file}\", target exists" : "無法複製\"{file}\",目標已存在",
+ "Could not copy \"{file}\"" : "無法複製\"{file}\"",
+ "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
+ "{newName} already exists" : "{newName} 已經存在",
+ "Could not create file \"{file}\"" : "無法建立檔案 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
+ "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾 \"{dir}\",因為此資料夾已存在",
+ "Could not fetch file details \"{file}\"" : "不能取得檔案細節\"{file}\"",
+ "Error deleting file \"{fileName}\"." : "刪除 \"{fileName}\" 出錯",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其它資料夾中沒有找到 {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其它資料夾搜尋",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"],
+ "You do not have permission to upload or create files here" : "您無權限上傳或建立檔案",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
+ "New" : "新",
+ "New file/folder menu" : "新檔案/資料夾選項單",
+ "Select file range" : "選擇多個檔案",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是無效的檔案名稱。",
+ "File name cannot be empty." : "檔名不能為空",
+ "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" 是不允許的檔案類型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿({usedSpacePercent}%)。",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已複製直接連結(僅適用於有權訪問此檔案/資料夾的人仕)",
+ "Path" : "路徑",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Favored" : "已加入最愛",
+ "Favor" : "加入最愛",
+ "Copy direct link (only works for people who have access to this file/folder)" : "複製直接連結(只對能存取的人仕有用)",
+ "Upload file" : "上傳檔案",
+ "Not favored" : "未加入最愛",
+ "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
+ "Upload (max. %s)" : "上傳(上限 %s)",
+ "\"{displayName}\" action executed successfully" : "成功執行 “{displayName}” 操作",
+ "\"{displayName}\" action failed" : "“{displayName}” 操作失敗",
+ "\"{displayName}\" failed on some elements" : "“{displayName}” 在某些元素上失敗",
+ "\"{displayName}\" batch action executed successfully" : "成功執行 “{displayName}” 批處理操作",
+ "Submitting fields…" : "正在遞交欄位 …",
+ "Filter filenames…" : "過濾檔案名 ...",
+ "WebDAV URL copied to clipboard" : "WebDAV 連結已複製到剪貼板",
+ "Enable the grid view" : "啟用網格檢視",
+ "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Copy to clipboard" : "複製到剪貼板",
+ "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
+ "Deletion cancelled" : "刪除已取消",
+ "Move cancelled" : "移動已取消",
+ "Cancelled move or copy of \"{filename}\"." : "已取消移動或複製 \"{filename}\"。",
+ "Cancelled move or copy operation" : "已取消移動或複製操作",
+ "Open details" : "開啟細節",
+ "Photos and images" : "照片與圖像",
+ "New folder creation cancelled" : "已取消建立新資料夾",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 個檔案與 1 個資料夾"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 個檔案與 {folderCount} 個資料夾",
+ "All folders" : "所有資料夾",
+ "Personal Files" : "個人檔案",
"Text file" : "文字檔",
"New text file.txt" : "新文字檔.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "_matches '{filter}'_::_match '{filter}'_" : ["符合「{filter}」"]
+ "%1$s (renamed)" : "%1$s(已重新命名)",
+ "renamed file" : "已重新命名的檔案",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用 Windows 兼容檔案名後,現有的檔案無法再被修改,但其擁有者可以將其重新命名為有效的新名稱。",
+ "Filter file names …" : "過濾檔案名稱 …",
+ "Prevent warning dialogs from open or reenable them." : "避免開啟警告對話框或重新啟用它們。",
+ "Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話框。",
+ "Speed up your Files experience with these quick shortcuts." : "這些快速捷徑可加快您的 Files 體驗。",
+ "Open the actions menu for a file" : "開啟檔案的操作選項單",
+ "Rename a file" : "重新命名檔案",
+ "Delete a file" : "刪除檔案",
+ "Favorite or remove a file from favorites" : "加入最愛或從最愛移除檔案",
+ "Manage tags for a file" : "管理檔案的標籤",
+ "Deselect all files" : "取消選擇所有檔案",
+ "Select or deselect a file" : "選擇或取消選擇檔案",
+ "Select a range of files" : "選擇一系列檔案",
+ "Navigate to the parent folder" : "前往上層資料夾",
+ "Navigate to the file above" : "前往以上檔案",
+ "Navigate to the file below" : "前往以下檔案",
+ "Navigate to the file on the left (in grid mode)" : "前往左側的檔案(在網格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "前往右側的檔案(在網格模式下)",
+ "Toggle the grid view" : "切換網格檢視",
+ "Open the sidebar for a file" : "開啟檔案側邊欄"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json
index 4eadf4ded6a..c05a040a426 100644
--- a/apps/files/l10n/zh_HK.json
+++ b/apps/files/l10n/zh_HK.json
@@ -1,112 +1,9 @@
{ "translations": {
- "Storage is temporarily not available" : "儲存空間暫時無法使用",
- "Storage invalid" : "無效的儲存空間",
- "Unknown error" : "未知錯誤",
- "File could not be found" : "找不到檔案",
- "Move or copy" : "移動或複製",
- "Download" : "下載",
- "Delete" : "刪除",
- "Home" : "主目錄",
- "Close" : "關閉",
- "Favorites" : "最愛",
- "Could not create folder \"{dir}\"" : "無法建立資料夾 \"{dir}\"",
- "This will stop your current uploads." : "這會終止目前任何的上傳。",
- "Upload cancelled." : "上傳已取消",
- "Processing files …" : "正在處理檔案…",
- "…" : "...",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "資料夾 \"{dir}\" 不存在",
- "Not enough free space" : "空間不足",
- "An unknown error has occurred" : "發生了未知的錯誤",
- "Uploading …" : "上傳中...",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize}({bitrate})",
- "Uploading that item is not supported" : "不支援上傳該項目",
- "Target folder does not exist any more" : "目標資料夾已經不存在了",
- "Operation is blocked by access control" : "操作已被存取控制封鎖",
- "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
- "Actions" : "操作",
- "Rename" : "重新命名",
- "Copy" : "複製",
- "Choose target folder" : "選擇目標資料夾",
- "Open" : "開啟",
- "Delete file" : "刪除檔案",
- "Delete folder" : "刪除資料夾",
- "Disconnect storage" : "解除連結儲存空間",
- "Leave this share" : "保留該共用",
- "Could not load info for file \"{file}\"" : "無法讀取 \"{file}\" 的詳細資料",
- "Files" : "檔案",
- "Details" : "詳細資料",
- "Please select tag(s) to add to the selection" : "請選擇要添加到所選項目中的標籤",
- "Apply tag(s) to selection" : "將標籤應用於所選項目",
- "Select" : "選擇",
- "Pending" : "待定的",
- "Unable to determine date" : "無法確定日期",
- "This operation is forbidden" : "此操作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
- "Could not move \"{file}\"" : "無法移動 \"{file}\"",
- "copy" : "複製",
- "Could not copy \"{file}\", target exists" : "無法複製\"{file}\",目標已存在",
- "Could not copy \"{file}\"" : "無法複製\"{file}\"",
- "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
- "{newName} already exists" : "{newName} 已經存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "無法命名檔案 \"{fileName}\",因為此檔案已經不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱 \"{targetName}\" 在這資料夾 \"{dir}\" 已經被使用。請重新選擇不同的名稱",
- "Could not rename \"{fileName}\"" : "無法重新命名「{fileName}」",
- "Could not create file \"{file}\"" : "無法建立檔案 \"{file}\"",
- "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
- "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾 \"{dir}\",因為此資料夾已存在",
- "Could not fetch file details \"{file}\"" : "不能取得檔案細節\"{file}\"",
- "Error deleting file \"{fileName}\"." : "刪除 \"{fileName}\" 出錯",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其它資料夾中沒有找到 {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其它資料夾搜尋",
- "Name" : "名稱",
- "Size" : "大小",
- "Modified" : "修改時間",
- "_%n folder_::_%n folders_" : ["%n 個資料夾"],
- "_%n file_::_%n files_" : ["%n 個檔案"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"],
- "You don’t have permission to upload or create files here" : "您無權限上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
- "New" : "新增",
- "Select file range" : "選擇多個檔案",
- "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
- "{used} used" : "已使用 {used}",
- "\"{name}\" is an invalid file name." : "\"{name}\" 是無效的檔案名稱。",
- "File name cannot be empty." : "檔名不能為空",
- "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"",
- "\"{name}\" is not an allowed filetype" : "\"{name}\" 是不允許的檔案類型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿({usedSpacePercent}%)。",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
- "View in folder" : "在資料夾中檢視",
- "Copied!" : "已複製",
- "Copy direct link (only works for users who have access to this file/folder)" : "複製直接連結(只對能存取的用戶有用)",
- "Path" : "路徑",
- "_%n byte_::_%n bytes_" : ["%n 位元組"],
- "Favorited" : "已加入最愛",
- "Favorite" : "我的最愛",
- "You can only favorite a single file or folder at a time" : "您一次只能為一個檔案或資料夾加星號",
- "New folder" : "新資料夾",
- "Upload file" : "上傳檔案",
- "Recent" : "最新",
- "Not favorited" : "未加入至最愛",
- "Remove from favorites" : "從最愛中移除",
- "Add to favorites" : "加到我的最愛",
- "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
"Added to favorites" : "已加到我的最愛",
"Removed from favorites" : "已從最愛中移除",
"You added {file} to your favorites" : "你已添加 {file} 至最愛",
"You removed {file} from your favorites" : "你已移除 {file} 從最愛",
+ "Favorites" : "最愛",
"File changes" : "檔案更動",
"Created by {user}" : "由 {user} 建立",
"Changed by {user}" : "由 {user} 改動",
@@ -114,7 +11,7 @@
"Restored by {user}" : "由 {user} 還原",
"Renamed by {user}" : "由 {user} 重新命名",
"Moved by {user}" : "由 {user} 移動",
- "\"remote user\"" : "「遠端用戶」",
+ "\"remote account\"" : "「遠端帳戶」",
"You created {file}" : "您建立了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 建立了一個加密的檔案",
"{user} created {file}" : "{user} 建立了 {file}",
@@ -141,15 +38,26 @@
"You moved {oldfile} to {newfile}" : "您將 {oldfile} 移到 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 將 {oldfile} 移到 {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "已將檔案添加到<strong>我的最愛</strong>收藏夾中或從其中刪除",
+ "Files" : "檔案",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾有所<strong>更改</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "收藏的檔案或資料夾有所<strong>更改</strong>",
- "All files" : "所有檔案",
- "Unlimited" : "無限制",
- "Upload (max. %s)" : "上傳(上限 %s)",
+ "Failed to authorize" : "無法授權",
+ "Invalid folder path" : "無效的資料夾路徑",
+ "Folder not found" : "找不到資料夾",
+ "The file cannot be found" : "無法找到此檔案",
+ "The destination path does not exist: %1$s" : "目的途徑不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您無權在指定的位置創建檔案",
+ "The file could not be converted." : "無法轉換檔案。",
+ "Could not get relative path to converted file" : "無法取得轉換檔案的相對路徑",
+ "Favorite files" : "最愛的檔案",
+ "No favorites" : "沒有最愛",
+ "More favorites" : "更多最愛",
"Accept" : "接受",
"Reject" : "拒絕",
"Incoming ownership transfer from {user}" : "來自 {user} 的擁有權轉移",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您想要接收 \"{path}\" 嗎?\n\n註:所有權轉移的流程最多需要一小時",
+ "Ownership transfer denied" : "擁有權轉移被拒絕",
+ "Your ownership transfer of {path} was denied by {user}." : "您 \"{path}\" 的擁有權轉移被 {user} 拒絕",
"Ownership transfer failed" : "擁有權轉讓失敗",
"Your ownership transfer of {path} to {user} failed." : "您將 \"{path}\" 的擁有權轉移給 {user} 失敗",
"The ownership transfer of {path} from {user} failed." : "來自 {user} 的 \"{path}\" 擁有權轉移失敗",
@@ -157,62 +65,436 @@
"Your ownership transfer of {path} to {user} has completed." : "您將 \"{path}\" 的所有權轉移給 {user} 已經完成",
"The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 \"{path}\" 所有權轉移已經完成",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "於 %2$s 從 %1$s 轉移",
+ "Files compatibility" : "檔案兼容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允許限製檔案名稱以確保檔案可以與所有客戶端同步。默認情況下,允許 POSIX(例如 Linux 或 macOS)上有效的所有檔案名稱。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用 Windows 兼容檔案名後,現有的檔案無法再被修改,但其擁有者可以將其重新命名為有效的新名稱。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "啟用此設定後,還可以自動遷移檔案,請參考有關 occ 指令的說明書。",
+ "Enforce Windows compatibility" : "實施 Windows 兼容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "這將阻止在 Windows 系統上無效的檔案名,例如使用保留名稱或特殊字元。但這不會強制區分大小寫的兼容性。",
"File Management" : "檔案管理",
- "Transfer ownership of a file or folder" : "轉移檔案或資料夾的擁有權",
- "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
- "Change" : "更改",
- "New owner" : "新的擁有者",
- "Search users" : "搜尋用戶",
+ "Home" : "主目錄",
+ "Target folder does not exist any more" : "目標資料夾已經不存在了",
+ "Reload current directory" : "重新加載目前目錄",
+ "Go to the \"{dir}\" directory" : "前往「{dir}」目錄",
+ "Current directory path" : "目前目錄途徑",
+ "Your have used your space quota and cannot upload files anymore" : "您已用完您的空間配額,無法再上傳檔案",
+ "You do not have permission to upload or create files here." : "您無權在此上傳或建立檔案。",
+ "Drag and drop files here to upload" : "將檔案拖拽到此處即可上傳",
+ "Favorite" : "我的最愛",
+ "Back" : "上星期",
+ "Toggle selection for file \"{displayName}\"" : "切換對檔案 \"{displayName}\" 的選擇",
+ "Toggle selection for folder \"{displayName}\"" : "切換對資料夾 \"{displayName}\" 的選擇",
+ "File is loading" : "正在加載檔案",
+ "Folder is loading" : "正在加載資料夾",
+ "Filename" : "檔案名稱",
+ "Folder name" : "資料夾名稱",
+ "This node is unavailable" : "此節點不可用",
+ "Another entry with the same name already exists." : "另一個同名的條目已經存在。",
+ "Invalid filename." : "檔案名稱無效。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」",
+ "Rename file" : "重新命名檔案",
+ "Folder" : "資料夾",
+ "Unknown file type" : "檔案類型不詳",
+ "{ext} image" : "{ext} 圖像",
+ "{ext} video" : "{ext} 視像",
+ "{ext} audio" : "{ext} 音頻",
+ "{ext} text" : "{ext} 文字",
+ "Pending" : "待定的",
+ "Unknown date" : "日期不詳",
+ "Clear filter" : "清空過濾器",
+ "Modified" : "修改時間",
+ "Search everywhere" : "到處搜尋",
+ "Type" : "類型",
+ "Active filters" : "有效的過濾器",
+ "Remove filter" : "移除過濾",
+ "Total rows summary" : "總列摘要",
+ "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選擇",
+ "Name" : "名稱",
+ "File type" : "檔案類型",
+ "Size" : "大小",
+ "{displayName}: failed on some elements" : "{displayName}:在部份元素上失敗",
+ "{displayName}: done" : "{displayName}:完成",
+ "{displayName}: failed" : "{displayName}:失敗",
+ "Actions" : "操作",
+ "(selected)" : "(已選擇)",
+ "List of files and folders." : "檔案與資料夾清單。",
+ "You have used your space quota and cannot upload files anymore." : "您已用完您的空間配額,無法再上傳檔案。",
+ "Column headers with buttons are sortable." : "具有按鈕的縱列標題可排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
+ "File not found" : "找不到檔案",
+ "_{count} selected_::_{count} selected_" : ["已選擇 {count} 項"],
+ "Search everywhere …" : "搜尋各處 …",
+ "Search here …" : "搜尋此處 …",
+ "Search scope options" : "搜尋範圍選項",
+ "Search here" : "搜尋此處",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte} ",
+ "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "無法更新儲存統計數據",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage information" : "儲存資訊",
+ "Storage quota" : "儲存配額",
+ "New folder" : "新資料夾",
+ "Create new folder" : "新增資料夾",
+ "This name is already in use." : "這個用戶名稱已經有人使用了。",
+ "Create" : "創建",
+ "Files starting with a dot are hidden by default" : "以點開頭的檔案默認為隱藏檔案",
+ "Fill template fields" : "填寫模板欄位",
+ "Submitting fields …" : "正在遞交欄位 …",
+ "Submit" : "遞交",
"Choose a file or folder to transfer" : "選擇要轉移的檔案或資料夾",
"Transfer" : "轉移",
"Transfer {path} to {userid}" : "轉移 \"{path}\" 給 {userid}",
"Invalid path selected" : "所選的路徑無效",
+ "Unknown error" : "錯誤不詳",
"Ownership transfer request sent" : "已送出擁有權轉移的請求",
- "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權。",
- "Tags" : "標籤",
- "Unable to change the favourite state of the file" : "無法更改檔案的最愛狀態",
+ "Cannot transfer ownership of a file or folder you do not own" : "無法轉移您未擁有的檔案或是資料夾所有權",
+ "Transfer ownership of a file or folder" : "轉移檔案或資料夾的擁有權",
+ "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
+ "Change" : "更改",
+ "New owner" : "新的擁有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含副檔名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除副檔名",
+ "Change file extension" : "變更檔案副檔名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "將檔案副檔名從「{old}」改為「{new}」可能會導致檔案無法讀取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "移除檔案副檔名「{old}」可能會導致檔案無法讀取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "加入檔案副檔名「{new}」可能會導致檔案無法讀取。",
+ "Do not show this dialog again." : "不要再次顯示此對話框。",
+ "Select file or folder to link to" : "選擇要連結的檔案或資料夾",
+ "Choose {file}" : "選擇 {file}",
+ "Share" : "分享",
+ "Shared by link" : "由連結分享",
+ "Shared" : "已分享",
+ "Switch to list view" : "切換到列表檢視",
+ "Switch to grid view" : "切換到網格檢視",
+ "The file could not be found" : "找不到檔案",
+ "Upload was cancelled by user" : "用戶已取消上傳",
+ "Not enough free space" : "空間不足",
+ "Operation is blocked by access control" : "操作已被存取控制封鎖",
+ "Error during upload: {message}" : "上傳時發生錯誤:{message}",
+ "Error during upload, status code {status}" : "上傳期間發生錯誤,狀態代碼 {status}",
+ "Unknown error during upload" : "上傳時發生未知的錯誤",
+ "Loading current folder" : "目前資料夾加載中",
+ "Retry" : "重試",
+ "No files in here" : "沒有任何檔案",
+ "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Go back" : "返回",
+ "Views" : "視圖",
+ "Files settings" : "檔案設定",
+ "Your files" : "您的檔案",
+ "Open in files" : "在「檔案」應用程式中打開",
+ "File cannot be accessed" : "檔案無法存取",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到該檔案,或是您沒有檢視該檔案的權限。請要求寄件者分享。",
+ "No search results for “{query}”" : "沒有結果符合「{query}」",
+ "Search for files" : "搜尋檔案",
+ "Clipboard is not available" : "剪貼板不可用",
+ "WebDAV URL copied" : "已複製 WebDAV URL",
+ "General" : "一般",
+ "Default view" : "默認檢視",
+ "All files" : "所有檔案",
+ "Personal files" : "個人檔案",
+ "Sort favorites first" : "先排序最愛",
+ "Sort folders before files" : "將資料夾在檔案之前排序",
+ "Folder tree" : "資料夾樹",
+ "Appearance" : "外觀",
+ "Show hidden files" : "顯示隱藏檔案",
+ "Show file type column" : "顯示檔案類型縱列",
+ "Show file extensions" : "顯示副檔名",
+ "Crop image previews" : "圖片裁剪預覽",
+ "Additional settings" : "其他設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "複製",
+ "How to access files using WebDAV" : "如何使用 WebDAV 存取檔案",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
+ "Warnings" : "警告",
+ "Warn before changing a file extension" : "變更副檔名前警告",
+ "Warn before deleting files" : "刪除檔案前警告",
+ "Keyboard shortcuts" : "鍵盤快捷鍵",
+ "File actions" : "檔案操作",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Add or remove favorite" : "新增或移除最愛",
+ "Manage tags" : "管理標籤",
+ "Selection" : "選擇",
+ "Select all files" : "選擇所有檔案",
+ "Deselect all" : "取消全選",
+ "Select or deselect" : "選取或取消選取",
+ "Select a range" : "選取範圍",
+ "Navigation" : "導覽列",
+ "Go to parent folder" : "前往上層資料夾",
+ "Go to file above" : "前往以上檔案",
+ "Go to file below" : "前往以下檔案",
+ "Go left in grid" : "在網格中向左",
+ "Go right in grid" : "在網格中向右",
+ "View" : "檢視",
+ "Toggle grid view" : "切換網格檢視",
+ "Open file sidebar" : "開啟檔案側邊欄",
+ "Show those shortcuts" : "顯示這些快捷鍵",
+ "You" : "您",
+ "Shared multiple times with different people" : "與不同的人多次分享",
+ "Unable to change the favorite state of the file" : "無法更改檔案的最愛狀態",
"Error while loading the file data" : "載入檔案資料失敗",
+ "Owner" : "擁有者",
+ "Remove from favorites" : "從最愛中移除",
+ "Add to favorites" : "加到我的最愛",
+ "Tags" : "標籤",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "無法從模板創建新檔案",
"Pick a template for {name}" : "為 {name} 選擇一個模板",
- "Cancel" : "取消",
- "Create" : "創建",
"Create a new file with the selected template" : "使用所選模板創建一個新檔案",
"Creating file" : "創建檔案中",
- "Blank" : "空白",
- "Unable to create new file from template" : "無法從模板創建新檔案",
- "Set up templates folder" : "設定範本料夾",
- "Templates" : "模板",
+ "Save as {displayName}" : "保存為 {displayName}",
+ "Save as …" : "另存為 ...",
+ "Converting files …" : "正在轉換檔案 …",
+ "Failed to convert files: {message}" : "無法轉換檔案:{message}",
+ "All files failed to be converted" : "所有檔案轉換失敗",
+ "One file could not be converted: {message}" : "有一個檔案無法轉換:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["%n 個檔案無法轉換"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["%n 個檔案成功轉換"],
+ "Files successfully converted" : "成功轉換檔案",
+ "Failed to convert files" : "無法轉換檔案",
+ "Converting file …" : "正在轉換檔案 …",
+ "File successfully converted" : "成功轉換檔案",
+ "Failed to convert file: {message}" : "無法轉換檔案:{message}",
+ "Failed to convert file" : "無法轉換檔案",
+ "Leave this share" : "保留該共用",
+ "Leave these shares" : "保留這些分享",
+ "Disconnect storage" : "解除連結儲存空間",
+ "Disconnect storages" : "解除連結儲存空間",
+ "Delete permanently" : "永久刪除",
+ "Delete and unshare" : "刪除並取消分享",
+ "Delete file" : "刪除檔案",
+ "Delete files" : "刪除檔案",
+ "Delete folder" : "刪除資料夾",
+ "Delete folders" : "刪除資料夾",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您即將永久刪除 {count} 個項目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您即將刪除 {count} 個項目"],
+ "Confirm deletion" : "確認刪除",
+ "Cancel" : "取消",
+ "Download" : "下載",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」…",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」…",
+ "Destination is not a folder" : "目標地不是資料夾",
+ "This file/folder is already in that directory" : "此檔案/資料夾已在該目錄中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
+ "(copy)" : "(複本)",
+ "(copy %n)" : "(複本 %n)",
+ "A file or folder with that name already exists in this folder" : "此資料夾中已存在同名的檔案或資料夾",
+ "The files are locked" : "檔案已被上鎖",
+ "The file does not exist anymore" : "檔案已不存在",
+ "Choose destination" : "選擇目標地",
+ "Copy to {target}" : "複製到 {target}",
+ "Move to {target}" : "移動到 {target}",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動或複製操作失敗",
+ "Move or copy" : "移動或複製",
+ "Open folder {displayName}" : "打開資料夾 {displayName}",
+ "Open in Files" : "在「檔案」應用程式中打開",
+ "Open locally" : "在近端打開",
+ "Failed to redirect to client" : "無法重定向到客戶端",
+ "Open file locally" : "在近端打開檔案",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "檔案現在應該在您的裝置上打開。如果沒有,請檢查您是否已安裝桌面應用程式。",
+ "Retry and close" : "重試和關閉",
+ "Open online" : "線上開啟",
+ "Details" : "詳細資料",
+ "View in folder" : "在資料夾中檢視",
+ "Today" : "今日",
+ "Last 7 days" : "過去7日",
+ "Last 30 days" : "過去30日",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "文件",
+ "Spreadsheets" : "試算表",
+ "Presentations" : "簡報",
+ "PDFs" : "PDF",
+ "Folders" : "資料夾",
+ "Audio" : "音頻",
+ "Images" : "圖像",
+ "Videos" : "影片",
+ "Created new folder \"{name}\"" : "創建了新資料夾 \"{name}\"",
"Unable to initialize the templates directory" : "無法初始化模板目錄",
- "%s used" : "使用了 %s 的存儲空間",
- "%s%% of %s used" : "%s 在 %s 中使用了 %%",
- "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s",
- "Settings" : "設定",
- "Show hidden files" : "顯示隱藏檔",
- "Crop image previews" : "圖片裁剪預覽",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
- "Toggle %1$s sublist" : "切換 %1$s 子列表",
- "Toggle grid view" : "切換網格檢視",
- "No files in here" : "沒有任何檔案",
- "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Create templates folder" : "創建模板資料夾",
+ "Templates" : "模板",
+ "New template folder" : "新範本資料夾",
+ "In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
+ "Search in folder: {folder}" : "搜尋資料夾: {folder}",
+ "One of the dropped files could not be processed" : "無法處理其中一個投放的檔案",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
+ "No files to upload" : "沒有要上傳的檔案",
+ "Unable to create the directory {directory}" : "無法建立目錄 {directory}",
+ "Some files could not be uploaded" : "無法上傳某些檔案",
+ "Files uploaded successfully" : "成功上傳檔案",
+ "No files to process" : "沒有要處理的檔案",
+ "Some files could not be copied" : "無法複製部份檔案",
+ "Some files could not be moved" : "有些檔案無法被移動",
+ "Files copied successfully" : "檔案複製成功",
+ "Files moved successfully" : "檔案移動成功",
+ "Conflicts resolution skipped" : "已略過衝突解決",
+ "Upload cancelled" : "上傳已取消",
+ "Could not rename \"{oldName}\", it does not exist any more" : "無法命名檔案「{oldName}」,因為此檔案已經不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{newName}」在這資料夾「{dir}」已經被使用。請選擇其他名稱。",
+ "Could not rename \"{oldName}\"" : "無法重新命名「{oldName}」",
+ "This operation is forbidden" : "此操作被禁止",
+ "This folder is unavailable, please try again later or contact the administration" : "此資料夾無法使用,請稍後再試或聯絡管理員",
+ "Storage is temporarily not available" : "儲存空間暫時無法使用",
+ "Unexpected error: {error}" : "意外錯誤:{error}",
+ "_%n file_::_%n files_" : ["%n 個檔案"],
+ "_%n folder_::_%n folders_" : ["%n 個資料夾"],
+ "_%n hidden_::_%n hidden_" : ["%n 個隱藏"],
+ "Filename must not be empty." : "檔案名稱不能為空。",
+ "\"{char}\" is not allowed inside a filename." : "檔案名稱中不允許出現「{char}」",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "「{segment}」是保留名稱,不允許用在檔案名稱。",
+ "\"{extension}\" is not an allowed filetype." : "「{extension}」是不允許的檔案類型。",
+ "Filenames must not end with \"{extension}\"." : "檔案名稱不能以「{extension}」結尾。",
+ "List of favorite files and folders." : "最愛檔案與資料夾的清單。",
+ "No favorites yet" : "尚無最愛",
+ "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
+ "List of your files and folders." : "您的檔案與資料夾清單。",
+ "List of your files and folders that are not shared." : "未分享的檔案與資料夾清單。",
+ "No personal files found" : "找不到個人檔案",
+ "Files that are not shared will show up here." : "尚未分享的檔案將會顯示在此處。",
+ "Recent" : "最新",
+ "List of recently modified files and folders." : "最近修改的檔案和資料夾的清單。",
+ "No recently modified files" : "近期無修改檔案",
+ "Files and folders you recently modified will show up here." : "您最近修改的檔案和資料夾將顯示在此處。",
+ "Search" : "搜尋",
+ "Search results within your files." : "在您的檔案中搜尋結果",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"Upload too large" : "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
- "No favorites yet" : "尚無最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
- "Deleted files" : "回收桶",
- "Shares" : "分享",
- "Shared with others" : "與其他人分享",
- "Shared with you" : "與您分享",
- "Shared by link" : "由連結分享",
- "Deleted shares" : "已刪除的分享",
- "Pending shares" : "等待分享",
+ "File could not be found" : "找不到檔案",
+ "Show list view" : "顯示清單視圖",
+ "Show grid view" : "顯示網格視圖",
+ "Close" : "關閉",
+ "Could not create folder \"{dir}\"" : "無法建立資料夾 \"{dir}\"",
+ "This will stop your current uploads." : "這會終止目前任何的上傳。",
+ "Upload cancelled." : "上傳已取消",
+ "Processing files …" : "正在處理檔案…",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "資料夾 \"{dir}\" 不存在",
+ "An unknown error has occurred" : "發生了不詳的錯誤",
+ "File could not be uploaded" : "檔案無法上傳",
+ "Uploading …" : "上傳中...",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "上傳中 ... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize}({bitrate})",
+ "Uploading that item is not supported" : "不支援上傳該項目",
+ "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
+ "Choose target folder" : "選擇目標資料夾",
+ "Set reminder" : "設定提醒",
+ "Edit locally" : "在近端編輯",
+ "Open" : "開啟",
+ "Could not load info for file \"{file}\"" : "無法讀取 \"{file}\" 的詳細資料",
+ "Please select tag(s) to add to the selection" : "請選擇要添加到所選項目中的標籤",
+ "Apply tag(s) to selection" : "將標籤應用於所選項目",
+ "Select directory \"{dirName}\"" : "選擇目錄「{dirName}」",
+ "Select file \"{fileName}\"" : "選擇檔案「{fileName}」",
+ "Unable to determine date" : "無法確定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
+ "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
+ "Could not move \"{file}\"" : "無法移動 \"{file}\"",
+ "copy" : "複製",
+ "Could not copy \"{file}\", target exists" : "無法複製\"{file}\",目標已存在",
+ "Could not copy \"{file}\"" : "無法複製\"{file}\"",
+ "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
+ "{newName} already exists" : "{newName} 已經存在",
+ "Could not create file \"{file}\"" : "無法建立檔案 \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
+ "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾 \"{dir}\",因為此資料夾已存在",
+ "Could not fetch file details \"{file}\"" : "不能取得檔案細節\"{file}\"",
+ "Error deleting file \"{fileName}\"." : "刪除 \"{fileName}\" 出錯",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其它資料夾中沒有找到 {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其它資料夾搜尋",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包括 %n 個隱藏檔"],
+ "You do not have permission to upload or create files here" : "您無權限上傳或建立檔案",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
+ "New" : "新",
+ "New file/folder menu" : "新檔案/資料夾選項單",
+ "Select file range" : "選擇多個檔案",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used}",
+ "\"{name}\" is an invalid file name." : "\"{name}\" 是無效的檔案名稱。",
+ "File name cannot be empty." : "檔名不能為空",
+ "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" 是不允許的檔案類型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間 \"{mountPoint}\" 將近已滿({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿({usedSpacePercent}%)。",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已複製直接連結(僅適用於有權訪問此檔案/資料夾的人仕)",
+ "Path" : "路徑",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Favored" : "已加入最愛",
+ "Favor" : "加入最愛",
+ "Copy direct link (only works for people who have access to this file/folder)" : "複製直接連結(只對能存取的人仕有用)",
+ "Upload file" : "上傳檔案",
+ "Not favored" : "未加入最愛",
+ "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
+ "Upload (max. %s)" : "上傳(上限 %s)",
+ "\"{displayName}\" action executed successfully" : "成功執行 “{displayName}” 操作",
+ "\"{displayName}\" action failed" : "“{displayName}” 操作失敗",
+ "\"{displayName}\" failed on some elements" : "“{displayName}” 在某些元素上失敗",
+ "\"{displayName}\" batch action executed successfully" : "成功執行 “{displayName}” 批處理操作",
+ "Submitting fields…" : "正在遞交欄位 …",
+ "Filter filenames…" : "過濾檔案名 ...",
+ "WebDAV URL copied to clipboard" : "WebDAV 連結已複製到剪貼板",
+ "Enable the grid view" : "啟用網格檢視",
+ "Enable folder tree" : "啟用資料夾樹狀結構",
+ "Copy to clipboard" : "複製到剪貼板",
+ "Use this address to access your Files via WebDAV" : "用這位址使用 WebDAV 存取你的檔案。",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "如果您啟用了 2FA,則必須通過單擊此處創建和使用新的應用程式密碼。",
+ "Deletion cancelled" : "刪除已取消",
+ "Move cancelled" : "移動已取消",
+ "Cancelled move or copy of \"{filename}\"." : "已取消移動或複製 \"{filename}\"。",
+ "Cancelled move or copy operation" : "已取消移動或複製操作",
+ "Open details" : "開啟細節",
+ "Photos and images" : "照片與圖像",
+ "New folder creation cancelled" : "已取消建立新資料夾",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 個檔案與 1 個資料夾"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 個檔案與 {folderCount} 個資料夾",
+ "All folders" : "所有資料夾",
+ "Personal Files" : "個人檔案",
"Text file" : "文字檔",
"New text file.txt" : "新文字檔.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "群組資料夾 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部儲存空間 \"{mountPoint}\" 已滿,已無法再更新或同步檔案!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "_matches '{filter}'_::_match '{filter}'_" : ["符合「{filter}」"]
+ "%1$s (renamed)" : "%1$s(已重新命名)",
+ "renamed file" : "已重新命名的檔案",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用 Windows 兼容檔案名後,現有的檔案無法再被修改,但其擁有者可以將其重新命名為有效的新名稱。",
+ "Filter file names …" : "過濾檔案名稱 …",
+ "Prevent warning dialogs from open or reenable them." : "避免開啟警告對話框或重新啟用它們。",
+ "Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話框。",
+ "Speed up your Files experience with these quick shortcuts." : "這些快速捷徑可加快您的 Files 體驗。",
+ "Open the actions menu for a file" : "開啟檔案的操作選項單",
+ "Rename a file" : "重新命名檔案",
+ "Delete a file" : "刪除檔案",
+ "Favorite or remove a file from favorites" : "加入最愛或從最愛移除檔案",
+ "Manage tags for a file" : "管理檔案的標籤",
+ "Deselect all files" : "取消選擇所有檔案",
+ "Select or deselect a file" : "選擇或取消選擇檔案",
+ "Select a range of files" : "選擇一系列檔案",
+ "Navigate to the parent folder" : "前往上層資料夾",
+ "Navigate to the file above" : "前往以上檔案",
+ "Navigate to the file below" : "前往以下檔案",
+ "Navigate to the file on the left (in grid mode)" : "前往左側的檔案(在網格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "前往右側的檔案(在網格模式下)",
+ "Toggle the grid view" : "切換網格檢視",
+ "Open the sidebar for a file" : "開啟檔案側邊欄"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 71d01190a31..d895fbc5c68 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -1,126 +1,23 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "儲存空間暫時無法使用",
- "Storage invalid" : "無效的儲存空間",
- "Unknown error" : "未知的錯誤",
- "File could not be found" : "找不到檔案",
- "Move or copy" : "移動或複製",
- "Download" : "下載",
- "Delete" : "刪除",
- "Home" : "家目錄",
- "Close" : "關閉",
- "Favorites" : "最愛",
- "Could not create folder \"{dir}\"" : "無法建立資料夾「{dir}」",
- "This will stop your current uploads." : "這會終止目前任何的上傳。",
- "Upload cancelled." : "上傳已取消。",
- "Processing files …" : "正在處理檔案……",
- "…" : "……",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "目標資料夾「{dir}」不存在",
- "Not enough free space" : "空間不足",
- "An unknown error has occurred" : "發生未知的錯誤",
- "Uploading …" : "正在上傳……",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize} ({bitrate})",
- "Uploading that item is not supported" : "不支援上傳該項目",
- "Target folder does not exist any more" : "目標資料夾已經不存在了",
- "Operation is blocked by access control" : "操作已被存取控制封鎖",
- "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
- "Actions" : "動作",
- "Rename" : "重新命名",
- "Copy" : "複製",
- "Choose target folder" : "選擇目標資料夾",
- "Open" : "開啟",
- "Delete file" : "刪除檔案",
- "Delete folder" : "刪除資料夾",
- "Disconnect storage" : "解除連結儲存空間",
- "Leave this share" : "保留此分享",
- "Could not load info for file \"{file}\"" : "無法讀取「{file}」的詳細資料",
- "Files" : "檔案",
- "Details" : "詳細資料",
- "Please select tag(s) to add to the selection" : "請選取要新增到選定項目的標籤",
- "Apply tag(s) to selection" : "將標籤套用至選定項目",
- "Select" : "選取",
- "Pending" : "等候中",
- "Unable to determine date" : "無法確定日期",
- "This operation is forbidden" : "此動作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
- "Could not move \"{file}\"" : "無法移動「{file}」",
- "copy" : "複製",
- "Could not copy \"{file}\", target exists" : "無法複製「{file}」,目標已存在",
- "Could not copy \"{file}\"" : "無法複製「{file}」",
- "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
- "{newName} already exists" : "{newName} 已經存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "無法命名檔案「{fileName}」,因為此檔案已經不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{targetName}」在這資料夾「{dir}」已經被使用。請選擇其他名稱。",
- "Could not rename \"{fileName}\"" : "無法重新命名「{fileName}」",
- "Could not create file \"{file}\"" : "無法建立檔案「{file}」",
- "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
- "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾「{dir}」,因為此資料夾已存在",
- "Could not fetch file details \"{file}\"" : "無法擷取檔案詳細資訊「{file}」",
- "Error deleting file \"{fileName}\"." : "刪除「{fileName}」時發生錯誤。",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其他資料夾中沒有找到 {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其他資料夾搜尋",
- "Name" : "名稱",
- "Size" : "大小",
- "Modified" : "修改時間",
- "_%n folder_::_%n folders_" : ["%n 個資料夾"],
- "_%n file_::_%n files_" : ["%n 個檔案"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"],
- "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
- "New" : "新增",
- "Select file range" : "選取多個檔案",
- "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
- "{used} used" : "已使用 {used}",
- "\"{name}\" is an invalid file name." : "{name} 是無效的檔名。",
- "File name cannot be empty." : "檔名不能為空。",
- "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"。",
- "\"{name}\" is not an allowed filetype" : "「{name}」是不允許的檔案類型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿 ({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿 ({usedSpacePercent}%)。",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
- "View in folder" : "在資料夾中檢視",
- "Copied!" : "已複製",
- "Copy direct link (only works for users who have access to this file/folder)" : "複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
- "Path" : "路徑",
- "_%n byte_::_%n bytes_" : ["%n 位元組"],
- "Favorited" : "已加入最愛",
- "Favorite" : "我的最愛",
- "You can only favorite a single file or folder at a time" : "您一次只能將一個檔案或資料夾加入最愛",
- "New folder" : "新資料夾",
- "Upload file" : "上傳檔案",
- "Recent" : "近期",
- "Not favorited" : "未加入至最愛",
- "Remove from favorites" : "從最愛中移除",
- "Add to favorites" : "新增至最愛",
- "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
- "Added to favorites" : "已新增至最愛",
- "Removed from favorites" : "已從最愛中移除",
- "You added {file} to your favorites" : "您已新增 {file} 至您的最愛",
- "You removed {file} from your favorites" : "您已從您的最愛移除 {file}",
+ "Added to favorites" : "已新增至喜愛",
+ "Removed from favorites" : "已從喜愛中移除",
+ "You added {file} to your favorites" : "您已新增 {file} 至您的喜愛",
+ "You removed {file} from your favorites" : "您已從您的喜愛移除 {file}",
+ "Favorites" : "喜愛",
"File changes" : "檔案更動",
"Created by {user}" : "由 {user} 建立",
- "Changed by {user}" : "由 {user} 改動",
+ "Changed by {user}" : "由 {user} 變更",
"Deleted by {user}" : "由 {user} 刪除",
"Restored by {user}" : "由 {user} 還原",
- "Renamed by {user}" : "由 {user} 重新命名",
+ "Renamed by {user}" : "由 {user} 改名",
"Moved by {user}" : "由 {user} 移動",
- "\"remote user\"" : "「遠端使用者」",
+ "\"remote account\"" : "「遠端帳號」",
"You created {file}" : "您建立了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 裡建立了一個加密的檔案",
"{user} created {file}" : "{user} 建立了 {file}",
- "{user} created an encrypted file in {file}" : "{user} 在 {file} 裡建立了一個加密的檔案",
+ "{user} created an encrypted file in {file}" : "{user} 在 {file} 裡建立了一個加密檔案",
"{file} was created in a public folder" : "{file} 已建立於公開資料夾",
"You changed {file}" : "您變更了 {file}",
"You changed an encrypted file in {file}" : "您在 {file} 修改了一個加密的檔案",
@@ -142,79 +39,464 @@ OC.L10N.register(
"{user} renamed {oldfile} to {newfile}" : "{user} 將 {oldfile} 重新命名為 {newfile}",
"You moved {oldfile} to {newfile}" : "您將 {oldfile} 移動到了 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 將 {oldfile} 移動到了 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "檔案已從您的<strong>最愛</strong>新增或移除",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "檔案已從您的<strong>喜愛</strong>新增或移除",
+ "Files" : "檔案",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾已被<strong>變更</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "一個最愛的檔案或資料夾已<strong>變更</strong>",
- "All files" : "所有檔案",
- "Unlimited" : "無限制",
- "Upload (max. %s)" : "上傳(最多 %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "一個喜愛的檔案或資料夾已<strong>變更</strong>",
+ "Failed to authorize" : "授權失敗",
+ "Invalid folder path" : "無效的資料夾路徑",
+ "Folder not found" : "找不到資料夾",
+ "The file cannot be found" : "找不到檔案",
+ "The destination path does not exist: %1$s" : "目的路徑不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您無權在特定位置建立檔案",
+ "The file could not be converted." : "無法轉換檔案。",
+ "Could not get relative path to converted file" : "無法取得轉換檔案的相對路徑",
+ "Favorite files" : "收藏檔案",
+ "No favorites" : "沒有最愛",
+ "More favorites" : "更多收藏",
"Accept" : "接受",
"Reject" : "拒絕",
- "Incoming ownership transfer from {user}" : "來自 {user} 的所有權轉移",
+ "Incoming ownership transfer from {user}" : "{user} 傳來的所有權轉移",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您想要接受 {path} 嗎?\n\n註:所有權轉移的流程最多可能需要一小時。",
+ "Ownership transfer denied" : "所有權轉移被拒絕",
+ "Your ownership transfer of {path} was denied by {user}." : "您將 {path} 的所有權轉移給 {user} 時被拒絕。",
"Ownership transfer failed" : "所有權轉移失敗",
"Your ownership transfer of {path} to {user} failed." : "您將 {path} 的所有權轉移給 {user} 失敗。",
"The ownership transfer of {path} from {user} failed." : "來自 {user} 的 {path} 所有權轉移失敗。",
"Ownership transfer done" : "所有權轉移完成",
- "Your ownership transfer of {path} to {user} has completed." : "您將 {path} 的所有權轉移給 {user} 已經完成。",
- "The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 {path} 所有權轉移已經完成。",
+ "Your ownership transfer of {path} to {user} has completed." : "您將 {path} 的所有權轉移給 {user} 已完成。",
+ "The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 {path} 所有權轉移已完成。",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "於 %2$s 從 %1$s 轉移",
+ "Files compatibility" : "檔案相容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允許限制檔案名稱以確保檔案可以與所有客戶端同步。預設情況下,允許 POSIX(例如 Linux 或 macOS)上所有有效的檔案名稱。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用與 Windows 相容的檔案名稱後,無法再修改現有檔案,但可以由其擁有者重新命名為有效的新名稱。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "啟用此設定後,也可以自動遷移檔案,詳情請參閱關於 occ 命令的文件。",
+ "Enforce Windows compatibility" : "強制 Windows 相容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "這會封鎖在 Windows 系統上無效的檔案名稱,例如使用保留名稱或特殊字元。但這不會強制區分大小寫的相容性。",
"File Management" : "檔案管理",
- "Transfer ownership of a file or folder" : "轉移檔案或是資料夾的所有權",
- "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
- "Change" : "更改",
- "New owner" : "新的擁有者",
- "Search users" : "搜尋使用者",
+ "Home" : "家目錄",
+ "Target folder does not exist any more" : "目標資料夾已不存在了",
+ "Reload current directory" : "重新載入目前的目錄",
+ "Go to the \"{dir}\" directory" : "前往「{dir}」目錄",
+ "Current directory path" : "目前目錄路徑",
+ "Your have used your space quota and cannot upload files anymore" : "您已用完您的空間配額,無法再上傳檔案",
+ "You do not have permission to upload or create files here." : "您無權在此上傳或建立檔案。",
+ "Drag and drop files here to upload" : "將檔案拖放到此處以上傳",
+ "Favorite" : "喜愛",
+ "Back" : "返回",
+ "Toggle selection for file \"{displayName}\"" : "切換檔案「{displayName}」的選取",
+ "Toggle selection for folder \"{displayName}\"" : "切換資料夾「{displayName}」的選取",
+ "File is loading" : "正在載入檔案",
+ "Folder is loading" : "正在載入資料夾",
+ "Filename" : "檔案名稱",
+ "Folder name" : "資料夾名稱",
+ "This node is unavailable" : "此節點不可用",
+ "Another entry with the same name already exists." : "已存在另一個同名條目。",
+ "Invalid filename." : "無效的檔案名稱。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」",
+ "Rename file" : "重新命名檔案",
+ "Folder" : "資料夾",
+ "Unknown file type" : "未知檔案類型",
+ "{ext} image" : "{ext} 影像",
+ "{ext} video" : "{ext} 視訊",
+ "{ext} audio" : "{ext} 音訊",
+ "{ext} text" : "{ext} 文字",
+ "Pending" : "待處理",
+ "Unknown date" : "未知日期",
+ "Clear filter" : "清除過濾條件",
+ "Modified" : "修改時間",
+ "Search everywhere" : "到處搜尋",
+ "Type" : "類型",
+ "Active filters" : "作用中的過濾條件",
+ "Remove filter" : "移除過濾條件",
+ "Total rows summary" : "總列摘要",
+ "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選取",
+ "Name" : "名稱",
+ "File type" : "檔案類型",
+ "Size" : "大小",
+ "{displayName}: failed on some elements" : "{displayName}:在部份元素上失敗",
+ "{displayName}: done" : "{displayName}:完成",
+ "{displayName}: failed" : "{displayName}:失敗",
+ "Actions" : "動作",
+ "(selected)" : "(已選取)",
+ "List of files and folders." : "檔案與資料夾清單。",
+ "You have used your space quota and cannot upload files anymore." : "您已用完您的空間配額,無法再上傳檔案。",
+ "Column headers with buttons are sortable." : "帶有按鈕的欄位標頭為可排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
+ "File not found" : "找不到檔案",
+ "_{count} selected_::_{count} selected_" : ["已選取 {count} 個"],
+ "Search everywhere …" : "搜尋各處……",
+ "Search here …" : "搜尋此處……",
+ "Search scope options" : "搜尋範圍選項",
+ "Search here" : "搜尋此處",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
+ "{used} of {quota} used" : "已使用 {used},共 {quota}",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "無法重新整理儲存空間統計資料",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage information" : "儲存空間資訊",
+ "Storage quota" : "儲存空間配額",
+ "New folder" : "新資料夾",
+ "Create new folder" : "新增資料夾",
+ "This name is already in use." : "此名稱已使用。",
+ "Create" : "建立",
+ "Files starting with a dot are hidden by default" : "檔案名稱以點開頭的檔案預設隱藏",
+ "Fill template fields" : "檔案範本欄位",
+ "Submitting fields …" : "正在遞交欄位……",
+ "Submit" : "遞交",
"Choose a file or folder to transfer" : "選擇要轉移的檔案或資料夾",
"Transfer" : "轉移",
"Transfer {path} to {userid}" : "轉移 {path} 給 {userid}",
- "Invalid path selected" : "所選的路徑無效",
+ "Invalid path selected" : "選取的路徑無效",
+ "Unknown error" : "未知的錯誤",
"Ownership transfer request sent" : "已送出所有權轉移的請求",
- "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權",
- "Tags" : "標籤",
- "Unable to change the favourite state of the file" : "無法更改檔案的最愛狀態",
+ "Cannot transfer ownership of a file or folder you do not own" : "無法轉移您未擁有的檔案或資料夾的所有權",
+ "Transfer ownership of a file or folder" : "轉移檔案或是資料夾的所有權",
+ "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
+ "Change" : "更改",
+ "New owner" : "新的擁有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含副檔名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除副檔名",
+ "Change file extension" : "變更檔案副檔名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "將檔案副檔名從「{old}」改為「{new}」可能會導致檔案無法讀取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "移除檔案副檔名「{old}」可能會導致檔案無法讀取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "加入檔案副檔名「{new}」可能會導致檔案無法讀取。",
+ "Do not show this dialog again." : "不要再次顯示此對話方塊。",
+ "Select file or folder to link to" : "選取要連結的檔案或資料夾",
+ "Choose {file}" : "選擇 {file}",
+ "Share" : "分享",
+ "Shared by link" : "透過連結分享",
+ "Shared" : "已分享",
+ "Switch to list view" : "切換至列表檢視",
+ "Switch to grid view" : "切換到格狀檢視",
+ "The file could not be found" : "找不到檔案",
+ "Upload was cancelled by user" : "使用者已取消上傳",
+ "Not enough free space" : "空間不足",
+ "Operation is blocked by access control" : "操作已被存取控制封鎖",
+ "Error during upload: {message}" : "上傳時發生錯誤:{message}",
+ "Error during upload, status code {status}" : "上傳時發生錯誤,狀態碼 {status}",
+ "Unknown error during upload" : "上傳時發生未知的錯誤",
+ "Loading current folder" : "正在載入目前資料夾",
+ "Retry" : "重試",
+ "No files in here" : "沒有任何檔案",
+ "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Go back" : "返回",
+ "Views" : "顯示",
+ "Files settings" : "檔案設定",
+ "Your files" : "您的檔案",
+ "Open in files" : "在檔案中開啟",
+ "File cannot be accessed" : "無法存取檔案",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到該檔案,或是您沒有檢視該檔案的權限。請寄件者分享。",
+ "No search results for “{query}”" : "沒有結果符合「{query}」",
+ "Search for files" : "搜尋檔案",
+ "Clipboard is not available" : "剪貼簿無法使用",
+ "WebDAV URL copied" : "已複製 WebDAV URL",
+ "General" : "一般",
+ "Default view" : "預設檢視",
+ "All files" : "所有檔案",
+ "Personal files" : "個人檔案",
+ "Sort favorites first" : "先排序喜愛",
+ "Sort folders before files" : "將資料夾排序在檔案前",
+ "Folder tree" : "資料夾樹",
+ "Appearance" : "外觀",
+ "Show hidden files" : "顯示隱藏檔",
+ "Show file type column" : "顯示檔案類型欄位",
+ "Show file extensions" : "顯示副檔名",
+ "Crop image previews" : "圖片裁剪預覽",
+ "Additional settings" : "其他設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "複製",
+ "How to access files using WebDAV" : "如何使用 WebDAV 存取檔案",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
+ "Warnings" : "警告",
+ "Warn before changing a file extension" : "變更副檔名前警告",
+ "Warn before deleting files" : "刪除檔案前警告",
+ "Keyboard shortcuts" : "鍵盤快速鍵",
+ "File actions" : "檔案動作",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Add or remove favorite" : "新增或移除最愛",
+ "Manage tags" : "管理標籤",
+ "Selection" : "選取",
+ "Select all files" : "選取所有檔案",
+ "Deselect all" : "取消全選",
+ "Select or deselect" : "選取或取消選取",
+ "Select a range" : "選取範圍",
+ "Navigation" : "導覽列",
+ "Go to parent folder" : "前往上層資料夾",
+ "Go to file above" : "前往以上檔案",
+ "Go to file below" : "前往以下檔案",
+ "Go left in grid" : "在網格中向左",
+ "Go right in grid" : "在網格中向右",
+ "View" : "檢視",
+ "Toggle grid view" : "切換網格檢視",
+ "Open file sidebar" : "開啟檔案側邊欄",
+ "Show those shortcuts" : "顯示這些快捷鍵",
+ "You" : "您",
+ "Shared multiple times with different people" : "與不同的人多次分享",
+ "Unable to change the favorite state of the file" : "無法變更檔案的喜愛狀態",
"Error while loading the file data" : "載入檔案資料時發生錯誤",
+ "Owner" : "擁有者",
+ "Remove from favorites" : "從喜愛中移除",
+ "Add to favorites" : "新增至喜愛",
+ "Tags" : "標籤",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "無法從範本建立新檔案",
"Pick a template for {name}" : "為 {name} 挑選範本",
- "Cancel" : "取消",
- "Create" : "建立",
"Create a new file with the selected template" : "使用選定的範本建立新檔案",
"Creating file" : "正在建立檔案",
- "Blank" : "空白",
- "Unable to create new file from template" : "無法從範本建立新檔案",
- "Set up templates folder" : "設定範本資料夾",
- "Templates" : "範本",
+ "Save as {displayName}" : "另存為 {displayName}",
+ "Save as …" : "另存為……",
+ "Converting files …" : "正在轉換檔案……",
+ "Failed to convert files: {message}" : "無法轉換檔案:{message}",
+ "All files failed to be converted" : "所有檔案轉換失敗",
+ "One file could not be converted: {message}" : "一個檔案無法轉換:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["無法轉換 %n 個檔案"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["成功轉換 %n 個檔案"],
+ "Files successfully converted" : "檔案成功轉換",
+ "Failed to convert files" : "轉換檔案失敗",
+ "Converting file …" : "正在轉換檔案……",
+ "File successfully converted" : "成功轉換檔案",
+ "Failed to convert file: {message}" : "無法轉換檔案:{message}",
+ "Failed to convert file" : "無法轉換檔案",
+ "Leave this share" : "離開此分享",
+ "Leave these shares" : "離開這些分享",
+ "Disconnect storage" : "中斷連結儲存空間",
+ "Disconnect storages" : "解除連結儲存空間",
+ "Delete permanently" : "永久刪除",
+ "Delete and unshare" : "刪除並取消分享",
+ "Delete file" : "刪除檔案",
+ "Delete files" : "刪除檔案",
+ "Delete folder" : "刪除資料夾",
+ "Delete folders" : "刪除資料夾",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您將要永久刪除 {count} 個項目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您將要刪除 {count} 個項目"],
+ "Confirm deletion" : "確認刪除",
+ "Cancel" : "取消",
+ "Download" : "下載",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……",
+ "Destination is not a folder" : "目的地不是資料夾",
+ "This file/folder is already in that directory" : "此檔案/資料夾已在該目錄中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
+ "(copy)" : "(副本)",
+ "(copy %n)" : "(副本 %n)",
+ "A file or folder with that name already exists in this folder" : "此資料夾中已經存在同名的檔案或資料夾",
+ "The files are locked" : "檔案已鎖定",
+ "The file does not exist anymore" : "檔案已不存在",
+ "Choose destination" : "選擇目的地",
+ "Copy to {target}" : "複製到 {target}",
+ "Move to {target}" : "移動到 {target}",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動或複製操作失敗",
+ "Move or copy" : "移動或複製",
+ "Open folder {displayName}" : "開啟資料夾 {displayName}",
+ "Open in Files" : "以「檔案」開啟",
+ "Open locally" : "在本機開啟",
+ "Failed to redirect to client" : "重新導向到客戶端失敗",
+ "Open file locally" : "在本機開啟檔案",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "檔案現在應該可以在您的裝置上開啟。如果打不開,請檢查您是否有安裝桌面應用程式。",
+ "Retry and close" : "重試並關閉",
+ "Open online" : "線上開啟",
+ "Details" : "詳細資料",
+ "View in folder" : "在資料夾中檢視",
+ "Today" : "今日",
+ "Last 7 days" : "過去7天",
+ "Last 30 days" : "過去30天",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "文件",
+ "Spreadsheets" : "試算表",
+ "Presentations" : "簡報",
+ "PDFs" : "PDF",
+ "Folders" : "資料夾",
+ "Audio" : "音訊",
+ "Images" : "圖片",
+ "Videos" : "影片",
+ "Created new folder \"{name}\"" : "已建立新資料夾「{name}」",
"Unable to initialize the templates directory" : "無法初始化範本目錄",
- "%s used" : "%s 已使用",
- "%s%% of %s used" : "%s 在 %s 中使用了 %%",
- "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s ",
- "Settings" : "設定",
- "Show hidden files" : "顯示隱藏檔",
- "Crop image previews" : "圖片裁剪預覽",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
- "Toggle %1$s sublist" : "切換 %1$s 子列表",
- "Toggle grid view" : "切換網格檢視",
- "No files in here" : "沒有任何檔案",
- "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
- "No entries found in this folder" : "在此資料夾中沒有任何項目",
+ "Create templates folder" : "建立範本資料夾",
+ "Templates" : "範本",
+ "New template folder" : "新範本資料夾",
+ "In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
+ "Search in folder: {folder}" : "在資料夾中搜尋:{folder}",
+ "One of the dropped files could not be processed" : "無法處理其中一個投遞的檔案",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
+ "No files to upload" : "沒有要上傳的檔案",
+ "Unable to create the directory {directory}" : "無法建立目錄 {directory}",
+ "Some files could not be uploaded" : "無法上傳部份檔案",
+ "Files uploaded successfully" : "檔案上傳成功",
+ "No files to process" : "沒有要處理的檔案",
+ "Some files could not be copied" : "無法複製部份檔案",
+ "Some files could not be moved" : "有些檔案無法被移動",
+ "Files copied successfully" : "檔案複製成功",
+ "Files moved successfully" : "檔案移動成功",
+ "Conflicts resolution skipped" : "已略過衝突解決",
+ "Upload cancelled" : "已取消上傳",
+ "Could not rename \"{oldName}\", it does not exist any more" : "無法命名檔案「{oldName}」,此檔案已不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{newName}」在資料夾「{dir}」中已被使用。請改用其他名稱。",
+ "Could not rename \"{oldName}\"" : "無法重新命名「{oldName}」",
+ "This operation is forbidden" : "此操作被禁止",
+ "This folder is unavailable, please try again later or contact the administration" : "此資料夾無法使用,請稍後再試或聯絡管理員",
+ "Storage is temporarily not available" : "儲存空間暫時無法使用",
+ "Unexpected error: {error}" : "意外錯誤:{error}",
+ "_%n file_::_%n files_" : ["%n 個檔案"],
+ "_%n folder_::_%n folders_" : ["%n 個資料夾"],
+ "_%n hidden_::_%n hidden_" : ["%n 個隱藏"],
+ "Filename must not be empty." : "檔案名稱不能為空。",
+ "\"{char}\" is not allowed inside a filename." : "檔案名稱中不允許出現「{char}」",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "「{segment}」是保留名稱,不允許用在檔案名稱。",
+ "\"{extension}\" is not an allowed filetype." : "「{extension}」是不允許的檔案類型。",
+ "Filenames must not end with \"{extension}\"." : "檔案名稱不能以「{extension}」結尾。",
+ "List of favorite files and folders." : "最愛檔案與資料夾清單。",
+ "No favorites yet" : "尚無喜愛",
+ "Files and folders you mark as favorite will show up here" : "您標記為喜愛的檔案與資料夾將會顯示在這裡",
+ "List of your files and folders." : "您的檔案與資料夾清單。",
+ "List of your files and folders that are not shared." : "未分享的檔案與資料夾清單。",
+ "No personal files found" : "找不到個人檔案",
+ "Files that are not shared will show up here." : "尚未分享的檔案將會顯示在此處。",
+ "Recent" : "最近",
+ "List of recently modified files and folders." : "最近修改的檔案與資料夾的清單。",
+ "No recently modified files" : "最近無修改檔案",
+ "Files and folders you recently modified will show up here." : "您最近修改的檔案與資料夾將會顯示在此處。",
+ "Search" : "搜尋",
+ "Search results within your files." : "在您的檔案中搜尋結果",
+ "No entries found in this folder" : "此資料夾中沒有任何項目",
"Select all" : "全選",
- "Upload too large" : "上傳過大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
- "No favorites yet" : "尚無最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
- "Deleted files" : "已刪除的檔案",
- "Shares" : "分享",
- "Shared with others" : "與其他人分享",
- "Shared with you" : "與您分享",
- "Shared by link" : "由連結分享",
- "Deleted shares" : "已刪除的分享",
- "Pending shares" : "等待分享",
+ "Upload too large" : "上傳檔案過大",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。",
+ "File could not be found" : "找不到檔案",
+ "Show list view" : "顯示清單檢視",
+ "Show grid view" : "顯示格狀檢視",
+ "Close" : "關閉",
+ "Could not create folder \"{dir}\"" : "無法建立資料夾「{dir}」",
+ "This will stop your current uploads." : "這會停止您目前的上傳。",
+ "Upload cancelled." : "上傳已取消。",
+ "Processing files …" : "正在處理檔案…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,您正要上傳 {size1} 可是只剩下 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目標資料夾「{dir}」不存在",
+ "An unknown error has occurred" : "發生未知的錯誤",
+ "File could not be uploaded" : "檔案無法上傳",
+ "Uploading …" : "正在上傳…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "正在上傳… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize} ({bitrate})",
+ "Uploading that item is not supported" : "不支援上傳該項目",
+ "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
+ "Choose target folder" : "選擇目標資料夾",
+ "Set reminder" : "設定提醒",
+ "Edit locally" : "在本機編輯",
+ "Open" : "開啟",
+ "Could not load info for file \"{file}\"" : "無法讀取「{file}」的詳細資料",
+ "Please select tag(s) to add to the selection" : "請選取要新增到選定項目的標籤",
+ "Apply tag(s) to selection" : "將標籤套用至選定項目",
+ "Select directory \"{dirName}\"" : "選取目錄「{dirName}」",
+ "Select file \"{fileName}\"" : "選取檔案「{fileName}」",
+ "Unable to determine date" : "無法確定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法取用,請檢查伺服器紀錄檔或聯絡管理員",
+ "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
+ "Could not move \"{file}\"" : "無法移動「{file}」",
+ "copy" : "複製",
+ "Could not copy \"{file}\", target exists" : "無法複製「{file}」,目標已經存在",
+ "Could not copy \"{file}\"" : "無法複製「{file}」",
+ "Copied {origin} inside {destination}" : "已將 {origin} 複製到 {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "已將 {origin} 和其他 {nbfiles} 個檔案複製到 {destination}",
+ "{newName} already exists" : "{newName} 已經存在",
+ "Could not create file \"{file}\"" : "無法建立檔案「{file}」",
+ "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已經存在",
+ "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾「{dir}」,因為此資料夾已經存在",
+ "Could not fetch file details \"{file}\"" : "無法擷取檔案詳細資訊「{file}」",
+ "Error deleting file \"{fileName}\"." : "刪除「{fileName}」時發生錯誤。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其他資料夾中沒有找到 {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "請輸入兩個字元以上,以便在其他資料夾搜尋",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"],
+ "You do not have permission to upload or create files here" : "您無權在此上傳或建立檔案",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
+ "New" : "新增",
+ "New file/folder menu" : "新檔案/資料夾選單",
+ "Select file range" : "選取多個檔案",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used}",
+ "\"{name}\" is an invalid file name." : "「{name}」是無效的檔名。",
+ "File name cannot be empty." : "檔名不能為空。",
+ "\"/\" is not allowed inside a file name." : "不允許檔名中出現「/」。",
+ "\"{name}\" is not an allowed filetype" : "「{name}」是不允許的檔案類型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,已無法再更新或是同步檔案!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,已無法再更新或是同步檔案!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿 ({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿 ({usedSpacePercent}%)。",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
+ "Path" : "路徑",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Favored" : "已加入最愛",
+ "Favor" : "加入最愛",
+ "Copy direct link (only works for people who have access to this file/folder)" : "複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
+ "Upload file" : "上傳檔案",
+ "Not favored" : "未加入最愛",
+ "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
+ "Upload (max. %s)" : "上傳(最多 %s)",
+ "\"{displayName}\" action executed successfully" : "「{displayName}」動作執行成功",
+ "\"{displayName}\" action failed" : "「{displayName}」操作失敗",
+ "\"{displayName}\" failed on some elements" : "「{displayName}」在某些元素上失敗",
+ "\"{displayName}\" batch action executed successfully" : "「{displayName}」批次動作執行成功",
+ "Submitting fields…" : "正在遞交欄位……",
+ "Filter filenames…" : "篩選檔案名稱……",
+ "WebDAV URL copied to clipboard" : "WebDAV URL 已複製到剪貼簿",
+ "Enable the grid view" : "啟用格狀檢視",
+ "Enable folder tree" : "啟用資料夾樹",
+ "Copy to clipboard" : "複製到剪貼簿",
+ "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
+ "Deletion cancelled" : "刪除已取消",
+ "Move cancelled" : "移動已取消",
+ "Cancelled move or copy of \"{filename}\"." : "已取消移動或複製「{filename}」。",
+ "Cancelled move or copy operation" : "已取消移動或複製操作",
+ "Open details" : "開啟詳細資訊",
+ "Photos and images" : "照片與影像",
+ "New folder creation cancelled" : "已取消建立新資料夾",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 個檔案與 1 個資料夾"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 個檔案與 {folderCount} 個資料夾",
+ "All folders" : "所有資料夾",
+ "Personal Files" : "個人檔案",
"Text file" : "文字檔案",
"New text file.txt" : "新文字檔案.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "_matches '{filter}'_::_match '{filter}'_" : ["符合「{filter}」"]
+ "%1$s (renamed)" : "%1$s(已重新命名)",
+ "renamed file" : "已重新命名檔案",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用與 Windows 相容的檔案名稱後,無法再修改現有檔案,但可以由其擁有者重新命名為有效的新名稱。",
+ "Filter file names …" : "過濾檔案名稱……",
+ "Prevent warning dialogs from open or reenable them." : "避免開啟警告對話方塊或重新啟用它們。",
+ "Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話方塊。",
+ "Speed up your Files experience with these quick shortcuts." : "使用這些快捷鍵加速您的 Files 體驗。",
+ "Open the actions menu for a file" : "開啟檔案的動作選單",
+ "Rename a file" : "重新命名檔案",
+ "Delete a file" : "刪除檔案",
+ "Favorite or remove a file from favorites" : "加入最愛或從最愛移除檔案",
+ "Manage tags for a file" : "管理檔案的標籤",
+ "Deselect all files" : "取消選取所有檔案",
+ "Select or deselect a file" : "選取或取消選取檔案",
+ "Select a range of files" : "選取檔案範圍",
+ "Navigate to the parent folder" : "前往上層資料夾",
+ "Navigate to the file above" : "前往上述檔案",
+ "Navigate to the file below" : "前往以下檔案",
+ "Navigate to the file on the left (in grid mode)" : "前往左側的檔案(在網格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "前往右側的檔案(在網格模式下)",
+ "Toggle the grid view" : "切換網格檢視",
+ "Open the sidebar for a file" : "開啟檔案側邊欄"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index 44f6b48aa08..379c89a9ba0 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -1,124 +1,21 @@
{ "translations": {
- "Storage is temporarily not available" : "儲存空間暫時無法使用",
- "Storage invalid" : "無效的儲存空間",
- "Unknown error" : "未知的錯誤",
- "File could not be found" : "找不到檔案",
- "Move or copy" : "移動或複製",
- "Download" : "下載",
- "Delete" : "刪除",
- "Home" : "家目錄",
- "Close" : "關閉",
- "Favorites" : "最愛",
- "Could not create folder \"{dir}\"" : "無法建立資料夾「{dir}」",
- "This will stop your current uploads." : "這會終止目前任何的上傳。",
- "Upload cancelled." : "上傳已取消。",
- "Processing files …" : "正在處理檔案……",
- "…" : "……",
- "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
- "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}",
- "Target folder \"{dir}\" does not exist any more" : "目標資料夾「{dir}」不存在",
- "Not enough free space" : "空間不足",
- "An unknown error has occurred" : "發生未知的錯誤",
- "Uploading …" : "正在上傳……",
- "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize} ({bitrate})",
- "Uploading that item is not supported" : "不支援上傳該項目",
- "Target folder does not exist any more" : "目標資料夾已經不存在了",
- "Operation is blocked by access control" : "操作已被存取控制封鎖",
- "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
- "Actions" : "動作",
- "Rename" : "重新命名",
- "Copy" : "複製",
- "Choose target folder" : "選擇目標資料夾",
- "Open" : "開啟",
- "Delete file" : "刪除檔案",
- "Delete folder" : "刪除資料夾",
- "Disconnect storage" : "解除連結儲存空間",
- "Leave this share" : "保留此分享",
- "Could not load info for file \"{file}\"" : "無法讀取「{file}」的詳細資料",
- "Files" : "檔案",
- "Details" : "詳細資料",
- "Please select tag(s) to add to the selection" : "請選取要新增到選定項目的標籤",
- "Apply tag(s) to selection" : "將標籤套用至選定項目",
- "Select" : "選取",
- "Pending" : "等候中",
- "Unable to determine date" : "無法確定日期",
- "This operation is forbidden" : "此動作被禁止",
- "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員",
- "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
- "Could not move \"{file}\"" : "無法移動「{file}」",
- "copy" : "複製",
- "Could not copy \"{file}\", target exists" : "無法複製「{file}」,目標已存在",
- "Could not copy \"{file}\"" : "無法複製「{file}」",
- "Copied {origin} inside {destination}" : "已複製 {origin} 至 {destination}",
- "Copied {origin} and {nbfiles} other files inside {destination}" : "已複製 {origin} 和其他 {nbfiles} 個檔案至 {destination}",
- "{newName} already exists" : "{newName} 已經存在",
- "Could not rename \"{fileName}\", it does not exist any more" : "無法命名檔案「{fileName}」,因為此檔案已經不存在",
- "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{targetName}」在這資料夾「{dir}」已經被使用。請選擇其他名稱。",
- "Could not rename \"{fileName}\"" : "無法重新命名「{fileName}」",
- "Could not create file \"{file}\"" : "無法建立檔案「{file}」",
- "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已存在",
- "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾「{dir}」,因為此資料夾已存在",
- "Could not fetch file details \"{file}\"" : "無法擷取檔案詳細資訊「{file}」",
- "Error deleting file \"{fileName}\"." : "刪除「{fileName}」時發生錯誤。",
- "No search results in other folders for {tag}{filter}{endtag}" : "在其他資料夾中沒有找到 {tag}{filter}{endtag}",
- "Enter more than two characters to search in other folders" : "輸入兩個字元以上以便在其他資料夾搜尋",
- "Name" : "名稱",
- "Size" : "大小",
- "Modified" : "修改時間",
- "_%n folder_::_%n folders_" : ["%n 個資料夾"],
- "_%n file_::_%n files_" : ["%n 個檔案"],
- "{dirs} and {files}" : "{dirs} 和 {files}",
- "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"],
- "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案",
- "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
- "New" : "新增",
- "Select file range" : "選取多個檔案",
- "{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
- "{used} used" : "已使用 {used}",
- "\"{name}\" is an invalid file name." : "{name} 是無效的檔名。",
- "File name cannot be empty." : "檔名不能為空。",
- "\"/\" is not allowed inside a file name." : "不允許檔名中出現 \"/\"。",
- "\"{name}\" is not an allowed filetype" : "「{name}」是不允許的檔案類型",
- "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿 ({usedSpacePercent}%)。",
- "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
- "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
- "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿 ({usedSpacePercent}%)。",
- "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
- "View in folder" : "在資料夾中檢視",
- "Copied!" : "已複製",
- "Copy direct link (only works for users who have access to this file/folder)" : "複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
- "Path" : "路徑",
- "_%n byte_::_%n bytes_" : ["%n 位元組"],
- "Favorited" : "已加入最愛",
- "Favorite" : "我的最愛",
- "You can only favorite a single file or folder at a time" : "您一次只能將一個檔案或資料夾加入最愛",
- "New folder" : "新資料夾",
- "Upload file" : "上傳檔案",
- "Recent" : "近期",
- "Not favorited" : "未加入至最愛",
- "Remove from favorites" : "從最愛中移除",
- "Add to favorites" : "新增至最愛",
- "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
- "Added to favorites" : "已新增至最愛",
- "Removed from favorites" : "已從最愛中移除",
- "You added {file} to your favorites" : "您已新增 {file} 至您的最愛",
- "You removed {file} from your favorites" : "您已從您的最愛移除 {file}",
+ "Added to favorites" : "已新增至喜愛",
+ "Removed from favorites" : "已從喜愛中移除",
+ "You added {file} to your favorites" : "您已新增 {file} 至您的喜愛",
+ "You removed {file} from your favorites" : "您已從您的喜愛移除 {file}",
+ "Favorites" : "喜愛",
"File changes" : "檔案更動",
"Created by {user}" : "由 {user} 建立",
- "Changed by {user}" : "由 {user} 改動",
+ "Changed by {user}" : "由 {user} 變更",
"Deleted by {user}" : "由 {user} 刪除",
"Restored by {user}" : "由 {user} 還原",
- "Renamed by {user}" : "由 {user} 重新命名",
+ "Renamed by {user}" : "由 {user} 改名",
"Moved by {user}" : "由 {user} 移動",
- "\"remote user\"" : "「遠端使用者」",
+ "\"remote account\"" : "「遠端帳號」",
"You created {file}" : "您建立了 {file}",
"You created an encrypted file in {file}" : "您在 {file} 裡建立了一個加密的檔案",
"{user} created {file}" : "{user} 建立了 {file}",
- "{user} created an encrypted file in {file}" : "{user} 在 {file} 裡建立了一個加密的檔案",
+ "{user} created an encrypted file in {file}" : "{user} 在 {file} 裡建立了一個加密檔案",
"{file} was created in a public folder" : "{file} 已建立於公開資料夾",
"You changed {file}" : "您變更了 {file}",
"You changed an encrypted file in {file}" : "您在 {file} 修改了一個加密的檔案",
@@ -140,79 +37,464 @@
"{user} renamed {oldfile} to {newfile}" : "{user} 將 {oldfile} 重新命名為 {newfile}",
"You moved {oldfile} to {newfile}" : "您將 {oldfile} 移動到了 {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} 將 {oldfile} 移動到了 {newfile}",
- "A file has been added to or removed from your <strong>favorites</strong>" : "檔案已從您的<strong>最愛</strong>新增或移除",
+ "A file has been added to or removed from your <strong>favorites</strong>" : "檔案已從您的<strong>喜愛</strong>新增或移除",
+ "Files" : "檔案",
"A file or folder has been <strong>changed</strong>" : "檔案或資料夾已被<strong>變更</strong>",
- "A favorite file or folder has been <strong>changed</strong>" : "一個最愛的檔案或資料夾已<strong>變更</strong>",
- "All files" : "所有檔案",
- "Unlimited" : "無限制",
- "Upload (max. %s)" : "上傳(最多 %s)",
+ "A favorite file or folder has been <strong>changed</strong>" : "一個喜愛的檔案或資料夾已<strong>變更</strong>",
+ "Failed to authorize" : "授權失敗",
+ "Invalid folder path" : "無效的資料夾路徑",
+ "Folder not found" : "找不到資料夾",
+ "The file cannot be found" : "找不到檔案",
+ "The destination path does not exist: %1$s" : "目的路徑不存在:%1$s",
+ "You do not have permission to create a file at the specified location" : "您無權在特定位置建立檔案",
+ "The file could not be converted." : "無法轉換檔案。",
+ "Could not get relative path to converted file" : "無法取得轉換檔案的相對路徑",
+ "Favorite files" : "收藏檔案",
+ "No favorites" : "沒有最愛",
+ "More favorites" : "更多收藏",
"Accept" : "接受",
"Reject" : "拒絕",
- "Incoming ownership transfer from {user}" : "來自 {user} 的所有權轉移",
+ "Incoming ownership transfer from {user}" : "{user} 傳來的所有權轉移",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "您想要接受 {path} 嗎?\n\n註:所有權轉移的流程最多可能需要一小時。",
+ "Ownership transfer denied" : "所有權轉移被拒絕",
+ "Your ownership transfer of {path} was denied by {user}." : "您將 {path} 的所有權轉移給 {user} 時被拒絕。",
"Ownership transfer failed" : "所有權轉移失敗",
"Your ownership transfer of {path} to {user} failed." : "您將 {path} 的所有權轉移給 {user} 失敗。",
"The ownership transfer of {path} from {user} failed." : "來自 {user} 的 {path} 所有權轉移失敗。",
"Ownership transfer done" : "所有權轉移完成",
- "Your ownership transfer of {path} to {user} has completed." : "您將 {path} 的所有權轉移給 {user} 已經完成。",
- "The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 {path} 所有權轉移已經完成。",
+ "Your ownership transfer of {path} to {user} has completed." : "您將 {path} 的所有權轉移給 {user} 已完成。",
+ "The ownership transfer of {path} from {user} has completed." : "來自 {user} 的 {path} 所有權轉移已完成。",
"in %s" : "在 %s",
+ "Transferred from %1$s on %2$s" : "於 %2$s 從 %1$s 轉移",
+ "Files compatibility" : "檔案相容性",
+ "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "允許限制檔案名稱以確保檔案可以與所有客戶端同步。預設情況下,允許 POSIX(例如 Linux 或 macOS)上所有有效的檔案名稱。",
+ "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用與 Windows 相容的檔案名稱後,無法再修改現有檔案,但可以由其擁有者重新命名為有效的新名稱。",
+ "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "啟用此設定後,也可以自動遷移檔案,詳情請參閱關於 occ 命令的文件。",
+ "Enforce Windows compatibility" : "強制 Windows 相容性",
+ "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "這會封鎖在 Windows 系統上無效的檔案名稱,例如使用保留名稱或特殊字元。但這不會強制區分大小寫的相容性。",
"File Management" : "檔案管理",
- "Transfer ownership of a file or folder" : "轉移檔案或是資料夾的所有權",
- "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
- "Change" : "更改",
- "New owner" : "新的擁有者",
- "Search users" : "搜尋使用者",
+ "Home" : "家目錄",
+ "Target folder does not exist any more" : "目標資料夾已不存在了",
+ "Reload current directory" : "重新載入目前的目錄",
+ "Go to the \"{dir}\" directory" : "前往「{dir}」目錄",
+ "Current directory path" : "目前目錄路徑",
+ "Your have used your space quota and cannot upload files anymore" : "您已用完您的空間配額,無法再上傳檔案",
+ "You do not have permission to upload or create files here." : "您無權在此上傳或建立檔案。",
+ "Drag and drop files here to upload" : "將檔案拖放到此處以上傳",
+ "Favorite" : "喜愛",
+ "Back" : "返回",
+ "Toggle selection for file \"{displayName}\"" : "切換檔案「{displayName}」的選取",
+ "Toggle selection for folder \"{displayName}\"" : "切換資料夾「{displayName}」的選取",
+ "File is loading" : "正在載入檔案",
+ "Folder is loading" : "正在載入資料夾",
+ "Filename" : "檔案名稱",
+ "Folder name" : "資料夾名稱",
+ "This node is unavailable" : "此節點不可用",
+ "Another entry with the same name already exists." : "已存在另一個同名條目。",
+ "Invalid filename." : "無效的檔案名稱。",
+ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」",
+ "Rename file" : "重新命名檔案",
+ "Folder" : "資料夾",
+ "Unknown file type" : "未知檔案類型",
+ "{ext} image" : "{ext} 影像",
+ "{ext} video" : "{ext} 視訊",
+ "{ext} audio" : "{ext} 音訊",
+ "{ext} text" : "{ext} 文字",
+ "Pending" : "待處理",
+ "Unknown date" : "未知日期",
+ "Clear filter" : "清除過濾條件",
+ "Modified" : "修改時間",
+ "Search everywhere" : "到處搜尋",
+ "Type" : "類型",
+ "Active filters" : "作用中的過濾條件",
+ "Remove filter" : "移除過濾條件",
+ "Total rows summary" : "總列摘要",
+ "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選取",
+ "Name" : "名稱",
+ "File type" : "檔案類型",
+ "Size" : "大小",
+ "{displayName}: failed on some elements" : "{displayName}:在部份元素上失敗",
+ "{displayName}: done" : "{displayName}:完成",
+ "{displayName}: failed" : "{displayName}:失敗",
+ "Actions" : "動作",
+ "(selected)" : "(已選取)",
+ "List of files and folders." : "檔案與資料夾清單。",
+ "You have used your space quota and cannot upload files anymore." : "您已用完您的空間配額,無法再上傳檔案。",
+ "Column headers with buttons are sortable." : "帶有按鈕的欄位標頭為可排序。",
+ "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
+ "File not found" : "找不到檔案",
+ "_{count} selected_::_{count} selected_" : ["已選取 {count} 個"],
+ "Search everywhere …" : "搜尋各處……",
+ "Search here …" : "搜尋此處……",
+ "Search scope options" : "搜尋範圍選項",
+ "Search here" : "搜尋此處",
+ "{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
+ "{used} of {quota} used" : "已使用 {used},共 {quota}",
+ "{relative}% used" : "已使用 {relative}%",
+ "Could not refresh storage stats" : "無法重新整理儲存空間統計資料",
+ "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
+ "Storage information" : "儲存空間資訊",
+ "Storage quota" : "儲存空間配額",
+ "New folder" : "新資料夾",
+ "Create new folder" : "新增資料夾",
+ "This name is already in use." : "此名稱已使用。",
+ "Create" : "建立",
+ "Files starting with a dot are hidden by default" : "檔案名稱以點開頭的檔案預設隱藏",
+ "Fill template fields" : "檔案範本欄位",
+ "Submitting fields …" : "正在遞交欄位……",
+ "Submit" : "遞交",
"Choose a file or folder to transfer" : "選擇要轉移的檔案或資料夾",
"Transfer" : "轉移",
"Transfer {path} to {userid}" : "轉移 {path} 給 {userid}",
- "Invalid path selected" : "所選的路徑無效",
+ "Invalid path selected" : "選取的路徑無效",
+ "Unknown error" : "未知的錯誤",
"Ownership transfer request sent" : "已送出所有權轉移的請求",
- "Cannot transfer ownership of a file or folder you don't own" : "無法轉移您未擁有的檔案或是資料夾所有權",
- "Tags" : "標籤",
- "Unable to change the favourite state of the file" : "無法更改檔案的最愛狀態",
+ "Cannot transfer ownership of a file or folder you do not own" : "無法轉移您未擁有的檔案或資料夾的所有權",
+ "Transfer ownership of a file or folder" : "轉移檔案或是資料夾的所有權",
+ "Choose file or folder to transfer" : "選擇要轉移的檔案或資料夾",
+ "Change" : "更改",
+ "New owner" : "新的擁有者",
+ "Keep {old}" : "保留 {old}",
+ "Keep without extension" : "保留但不包含副檔名",
+ "Use {new}" : "使用 {new}",
+ "Remove extension" : "移除副檔名",
+ "Change file extension" : "變更檔案副檔名",
+ "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "將檔案副檔名從「{old}」改為「{new}」可能會導致檔案無法讀取。",
+ "Removing the file extension \"{old}\" may render the file unreadable." : "移除檔案副檔名「{old}」可能會導致檔案無法讀取。",
+ "Adding the file extension \"{new}\" may render the file unreadable." : "加入檔案副檔名「{new}」可能會導致檔案無法讀取。",
+ "Do not show this dialog again." : "不要再次顯示此對話方塊。",
+ "Select file or folder to link to" : "選取要連結的檔案或資料夾",
+ "Choose {file}" : "選擇 {file}",
+ "Share" : "分享",
+ "Shared by link" : "透過連結分享",
+ "Shared" : "已分享",
+ "Switch to list view" : "切換至列表檢視",
+ "Switch to grid view" : "切換到格狀檢視",
+ "The file could not be found" : "找不到檔案",
+ "Upload was cancelled by user" : "使用者已取消上傳",
+ "Not enough free space" : "空間不足",
+ "Operation is blocked by access control" : "操作已被存取控制封鎖",
+ "Error during upload: {message}" : "上傳時發生錯誤:{message}",
+ "Error during upload, status code {status}" : "上傳時發生錯誤,狀態碼 {status}",
+ "Unknown error during upload" : "上傳時發生未知的錯誤",
+ "Loading current folder" : "正在載入目前資料夾",
+ "Retry" : "重試",
+ "No files in here" : "沒有任何檔案",
+ "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
+ "Go back" : "返回",
+ "Views" : "顯示",
+ "Files settings" : "檔案設定",
+ "Your files" : "您的檔案",
+ "Open in files" : "在檔案中開啟",
+ "File cannot be accessed" : "無法存取檔案",
+ "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "找不到該檔案,或是您沒有檢視該檔案的權限。請寄件者分享。",
+ "No search results for “{query}”" : "沒有結果符合「{query}」",
+ "Search for files" : "搜尋檔案",
+ "Clipboard is not available" : "剪貼簿無法使用",
+ "WebDAV URL copied" : "已複製 WebDAV URL",
+ "General" : "一般",
+ "Default view" : "預設檢視",
+ "All files" : "所有檔案",
+ "Personal files" : "個人檔案",
+ "Sort favorites first" : "先排序喜愛",
+ "Sort folders before files" : "將資料夾排序在檔案前",
+ "Folder tree" : "資料夾樹",
+ "Appearance" : "外觀",
+ "Show hidden files" : "顯示隱藏檔",
+ "Show file type column" : "顯示檔案類型欄位",
+ "Show file extensions" : "顯示副檔名",
+ "Crop image previews" : "圖片裁剪預覽",
+ "Additional settings" : "其他設定",
+ "WebDAV" : "WebDAV",
+ "WebDAV URL" : "WebDAV URL",
+ "Copy" : "複製",
+ "How to access files using WebDAV" : "如何使用 WebDAV 存取檔案",
+ "Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "您的帳號已啟用兩階段驗證,因此您必須使用應用程式密碼才能連結外部 WebDAV 帳號。",
+ "Warnings" : "警告",
+ "Warn before changing a file extension" : "變更副檔名前警告",
+ "Warn before deleting files" : "刪除檔案前警告",
+ "Keyboard shortcuts" : "鍵盤快速鍵",
+ "File actions" : "檔案動作",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Add or remove favorite" : "新增或移除最愛",
+ "Manage tags" : "管理標籤",
+ "Selection" : "選取",
+ "Select all files" : "選取所有檔案",
+ "Deselect all" : "取消全選",
+ "Select or deselect" : "選取或取消選取",
+ "Select a range" : "選取範圍",
+ "Navigation" : "導覽列",
+ "Go to parent folder" : "前往上層資料夾",
+ "Go to file above" : "前往以上檔案",
+ "Go to file below" : "前往以下檔案",
+ "Go left in grid" : "在網格中向左",
+ "Go right in grid" : "在網格中向右",
+ "View" : "檢視",
+ "Toggle grid view" : "切換網格檢視",
+ "Open file sidebar" : "開啟檔案側邊欄",
+ "Show those shortcuts" : "顯示這些快捷鍵",
+ "You" : "您",
+ "Shared multiple times with different people" : "與不同的人多次分享",
+ "Unable to change the favorite state of the file" : "無法變更檔案的喜愛狀態",
"Error while loading the file data" : "載入檔案資料時發生錯誤",
+ "Owner" : "擁有者",
+ "Remove from favorites" : "從喜愛中移除",
+ "Add to favorites" : "新增至喜愛",
+ "Tags" : "標籤",
+ "Blank" : "空白",
+ "Unable to create new file from template" : "無法從範本建立新檔案",
"Pick a template for {name}" : "為 {name} 挑選範本",
- "Cancel" : "取消",
- "Create" : "建立",
"Create a new file with the selected template" : "使用選定的範本建立新檔案",
"Creating file" : "正在建立檔案",
- "Blank" : "空白",
- "Unable to create new file from template" : "無法從範本建立新檔案",
- "Set up templates folder" : "設定範本資料夾",
- "Templates" : "範本",
+ "Save as {displayName}" : "另存為 {displayName}",
+ "Save as …" : "另存為……",
+ "Converting files …" : "正在轉換檔案……",
+ "Failed to convert files: {message}" : "無法轉換檔案:{message}",
+ "All files failed to be converted" : "所有檔案轉換失敗",
+ "One file could not be converted: {message}" : "一個檔案無法轉換:{message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["無法轉換 %n 個檔案"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["成功轉換 %n 個檔案"],
+ "Files successfully converted" : "檔案成功轉換",
+ "Failed to convert files" : "轉換檔案失敗",
+ "Converting file …" : "正在轉換檔案……",
+ "File successfully converted" : "成功轉換檔案",
+ "Failed to convert file: {message}" : "無法轉換檔案:{message}",
+ "Failed to convert file" : "無法轉換檔案",
+ "Leave this share" : "離開此分享",
+ "Leave these shares" : "離開這些分享",
+ "Disconnect storage" : "中斷連結儲存空間",
+ "Disconnect storages" : "解除連結儲存空間",
+ "Delete permanently" : "永久刪除",
+ "Delete and unshare" : "刪除並取消分享",
+ "Delete file" : "刪除檔案",
+ "Delete files" : "刪除檔案",
+ "Delete folder" : "刪除資料夾",
+ "Delete folders" : "刪除資料夾",
+ "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["您將要永久刪除 {count} 個項目"],
+ "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["您將要刪除 {count} 個項目"],
+ "Confirm deletion" : "確認刪除",
+ "Cancel" : "取消",
+ "Download" : "下載",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……",
+ "Destination is not a folder" : "目的地不是資料夾",
+ "This file/folder is already in that directory" : "此檔案/資料夾已在該目錄中",
+ "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
+ "(copy)" : "(副本)",
+ "(copy %n)" : "(副本 %n)",
+ "A file or folder with that name already exists in this folder" : "此資料夾中已經存在同名的檔案或資料夾",
+ "The files are locked" : "檔案已鎖定",
+ "The file does not exist anymore" : "檔案已不存在",
+ "Choose destination" : "選擇目的地",
+ "Copy to {target}" : "複製到 {target}",
+ "Move to {target}" : "移動到 {target}",
+ "Move" : "移動",
+ "Move or copy operation failed" : "移動或複製操作失敗",
+ "Move or copy" : "移動或複製",
+ "Open folder {displayName}" : "開啟資料夾 {displayName}",
+ "Open in Files" : "以「檔案」開啟",
+ "Open locally" : "在本機開啟",
+ "Failed to redirect to client" : "重新導向到客戶端失敗",
+ "Open file locally" : "在本機開啟檔案",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "檔案現在應該可以在您的裝置上開啟。如果打不開,請檢查您是否有安裝桌面應用程式。",
+ "Retry and close" : "重試並關閉",
+ "Open online" : "線上開啟",
+ "Details" : "詳細資料",
+ "View in folder" : "在資料夾中檢視",
+ "Today" : "今日",
+ "Last 7 days" : "過去7天",
+ "Last 30 days" : "過去30天",
+ "This year ({year})" : "今年 ({year})",
+ "Last year ({year})" : "去年 ({year})",
+ "Documents" : "文件",
+ "Spreadsheets" : "試算表",
+ "Presentations" : "簡報",
+ "PDFs" : "PDF",
+ "Folders" : "資料夾",
+ "Audio" : "音訊",
+ "Images" : "圖片",
+ "Videos" : "影片",
+ "Created new folder \"{name}\"" : "已建立新資料夾「{name}」",
"Unable to initialize the templates directory" : "無法初始化範本目錄",
- "%s used" : "%s 已使用",
- "%s%% of %s used" : "%s 在 %s 中使用了 %%",
- "%1$s of %2$s used" : "在 %2$s 中使用了 %1$s ",
- "Settings" : "設定",
- "Show hidden files" : "顯示隱藏檔",
- "Crop image previews" : "圖片裁剪預覽",
- "WebDAV" : "WebDAV",
- "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
- "Toggle %1$s sublist" : "切換 %1$s 子列表",
- "Toggle grid view" : "切換網格檢視",
- "No files in here" : "沒有任何檔案",
- "Upload some content or sync with your devices!" : "在您的裝置同步或上傳一些內容!",
- "No entries found in this folder" : "在此資料夾中沒有任何項目",
+ "Create templates folder" : "建立範本資料夾",
+ "Templates" : "範本",
+ "New template folder" : "新範本資料夾",
+ "In folder" : "在資料夾中",
+ "Search in all files" : "在所有檔案中搜尋",
+ "Search in folder: {folder}" : "在資料夾中搜尋:{folder}",
+ "One of the dropped files could not be processed" : "無法處理其中一個投遞的檔案",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "您的瀏覽器不支援檔案系統 API。將不會上傳目錄",
+ "No files to upload" : "沒有要上傳的檔案",
+ "Unable to create the directory {directory}" : "無法建立目錄 {directory}",
+ "Some files could not be uploaded" : "無法上傳部份檔案",
+ "Files uploaded successfully" : "檔案上傳成功",
+ "No files to process" : "沒有要處理的檔案",
+ "Some files could not be copied" : "無法複製部份檔案",
+ "Some files could not be moved" : "有些檔案無法被移動",
+ "Files copied successfully" : "檔案複製成功",
+ "Files moved successfully" : "檔案移動成功",
+ "Conflicts resolution skipped" : "已略過衝突解決",
+ "Upload cancelled" : "已取消上傳",
+ "Could not rename \"{oldName}\", it does not exist any more" : "無法命名檔案「{oldName}」,此檔案已不存在",
+ "The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "此名稱「{newName}」在資料夾「{dir}」中已被使用。請改用其他名稱。",
+ "Could not rename \"{oldName}\"" : "無法重新命名「{oldName}」",
+ "This operation is forbidden" : "此操作被禁止",
+ "This folder is unavailable, please try again later or contact the administration" : "此資料夾無法使用,請稍後再試或聯絡管理員",
+ "Storage is temporarily not available" : "儲存空間暫時無法使用",
+ "Unexpected error: {error}" : "意外錯誤:{error}",
+ "_%n file_::_%n files_" : ["%n 個檔案"],
+ "_%n folder_::_%n folders_" : ["%n 個資料夾"],
+ "_%n hidden_::_%n hidden_" : ["%n 個隱藏"],
+ "Filename must not be empty." : "檔案名稱不能為空。",
+ "\"{char}\" is not allowed inside a filename." : "檔案名稱中不允許出現「{char}」",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "「{segment}」是保留名稱,不允許用在檔案名稱。",
+ "\"{extension}\" is not an allowed filetype." : "「{extension}」是不允許的檔案類型。",
+ "Filenames must not end with \"{extension}\"." : "檔案名稱不能以「{extension}」結尾。",
+ "List of favorite files and folders." : "最愛檔案與資料夾清單。",
+ "No favorites yet" : "尚無喜愛",
+ "Files and folders you mark as favorite will show up here" : "您標記為喜愛的檔案與資料夾將會顯示在這裡",
+ "List of your files and folders." : "您的檔案與資料夾清單。",
+ "List of your files and folders that are not shared." : "未分享的檔案與資料夾清單。",
+ "No personal files found" : "找不到個人檔案",
+ "Files that are not shared will show up here." : "尚未分享的檔案將會顯示在此處。",
+ "Recent" : "最近",
+ "List of recently modified files and folders." : "最近修改的檔案與資料夾的清單。",
+ "No recently modified files" : "最近無修改檔案",
+ "Files and folders you recently modified will show up here." : "您最近修改的檔案與資料夾將會顯示在此處。",
+ "Search" : "搜尋",
+ "Search results within your files." : "在您的檔案中搜尋結果",
+ "No entries found in this folder" : "此資料夾中沒有任何項目",
"Select all" : "全選",
- "Upload too large" : "上傳過大",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制",
- "No favorites yet" : "尚無最愛",
- "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡",
- "Deleted files" : "已刪除的檔案",
- "Shares" : "分享",
- "Shared with others" : "與其他人分享",
- "Shared with you" : "與您分享",
- "Shared by link" : "由連結分享",
- "Deleted shares" : "已刪除的分享",
- "Pending shares" : "等待分享",
+ "Upload too large" : "上傳檔案過大",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。",
+ "File could not be found" : "找不到檔案",
+ "Show list view" : "顯示清單檢視",
+ "Show grid view" : "顯示格狀檢視",
+ "Close" : "關閉",
+ "Could not create folder \"{dir}\"" : "無法建立資料夾「{dir}」",
+ "This will stop your current uploads." : "這會停止您目前的上傳。",
+ "Upload cancelled." : "上傳已取消。",
+ "Processing files …" : "正在處理檔案…",
+ "…" : "…",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,您正要上傳 {size1} 可是只剩下 {size2}",
+ "Target folder \"{dir}\" does not exist any more" : "目標資料夾「{dir}」不存在",
+ "An unknown error has occurred" : "發生未知的錯誤",
+ "File could not be uploaded" : "檔案無法上傳",
+ "Uploading …" : "正在上傳…",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "正在上傳… ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中的 {loadedSize} ({bitrate})",
+ "Uploading that item is not supported" : "不支援上傳該項目",
+ "Error when assembling chunks, status code {status}" : "重組檔案片段時出錯,狀態代碼 {status}",
+ "Choose target folder" : "選擇目標資料夾",
+ "Set reminder" : "設定提醒",
+ "Edit locally" : "在本機編輯",
+ "Open" : "開啟",
+ "Could not load info for file \"{file}\"" : "無法讀取「{file}」的詳細資料",
+ "Please select tag(s) to add to the selection" : "請選取要新增到選定項目的標籤",
+ "Apply tag(s) to selection" : "將標籤套用至選定項目",
+ "Select directory \"{dirName}\"" : "選取目錄「{dirName}」",
+ "Select file \"{fileName}\"" : "選取檔案「{fileName}」",
+ "Unable to determine date" : "無法確定日期",
+ "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法取用,請檢查伺服器紀錄檔或聯絡管理員",
+ "Could not move \"{file}\", target exists" : "無法移動「{file}」,目標已經存在",
+ "Could not move \"{file}\"" : "無法移動「{file}」",
+ "copy" : "複製",
+ "Could not copy \"{file}\", target exists" : "無法複製「{file}」,目標已經存在",
+ "Could not copy \"{file}\"" : "無法複製「{file}」",
+ "Copied {origin} inside {destination}" : "已將 {origin} 複製到 {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "已將 {origin} 和其他 {nbfiles} 個檔案複製到 {destination}",
+ "{newName} already exists" : "{newName} 已經存在",
+ "Could not create file \"{file}\"" : "無法建立檔案「{file}」",
+ "Could not create file \"{file}\" because it already exists" : "無法建立檔案「{file}」,因為此檔案已經存在",
+ "Could not create folder \"{dir}\" because it already exists" : "無法建立資料夾「{dir}」,因為此資料夾已經存在",
+ "Could not fetch file details \"{file}\"" : "無法擷取檔案詳細資訊「{file}」",
+ "Error deleting file \"{fileName}\"." : "刪除「{fileName}」時發生錯誤。",
+ "No search results in other folders for {tag}{filter}{endtag}" : "在其他資料夾中沒有找到 {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "請輸入兩個字元以上,以便在其他資料夾搜尋",
+ "{dirs} and {files}" : "{dirs} 和 {files}",
+ "_including %n hidden_::_including %n hidden_" : ["包含 %n 個隱藏檔"],
+ "You do not have permission to upload or create files here" : "您無權在此上傳或建立檔案",
+ "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"],
+ "New" : "新增",
+ "New file/folder menu" : "新檔案/資料夾選單",
+ "Select file range" : "選取多個檔案",
+ "{used}%" : "{used}%",
+ "{used} used" : "已使用 {used}",
+ "\"{name}\" is an invalid file name." : "「{name}」是無效的檔名。",
+ "File name cannot be empty." : "檔名不能為空。",
+ "\"/\" is not allowed inside a file name." : "不允許檔名中出現「/」。",
+ "\"{name}\" is not an allowed filetype" : "「{name}」是不允許的檔案類型",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "{owner} 的儲存空間已滿,已無法再更新或是同步檔案!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "您的儲存空間已滿,已無法再更新或是同步檔案!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "{owner} 的儲存空間將近已滿 ({usedSpacePercent}%)。",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "群組資料夾「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "外部儲存空間「{mountPoint}」將近已滿 ({usedSpacePercent}%)。",
+ "Your storage is almost full ({usedSpacePercent}%)." : "您的儲存空間將近已滿 ({usedSpacePercent}%)。",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["符合「{filter}」"],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "已複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
+ "Path" : "路徑",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Favored" : "已加入最愛",
+ "Favor" : "加入最愛",
+ "Copy direct link (only works for people who have access to this file/folder)" : "複製直接連結(僅對有權存取此檔案或資料夾的使用者有用)",
+ "Upload file" : "上傳檔案",
+ "Not favored" : "未加入最愛",
+ "An error occurred while trying to update the tags" : "更新標籤時發生錯誤",
+ "Upload (max. %s)" : "上傳(最多 %s)",
+ "\"{displayName}\" action executed successfully" : "「{displayName}」動作執行成功",
+ "\"{displayName}\" action failed" : "「{displayName}」操作失敗",
+ "\"{displayName}\" failed on some elements" : "「{displayName}」在某些元素上失敗",
+ "\"{displayName}\" batch action executed successfully" : "「{displayName}」批次動作執行成功",
+ "Submitting fields…" : "正在遞交欄位……",
+ "Filter filenames…" : "篩選檔案名稱……",
+ "WebDAV URL copied to clipboard" : "WebDAV URL 已複製到剪貼簿",
+ "Enable the grid view" : "啟用格狀檢視",
+ "Enable folder tree" : "啟用資料夾樹",
+ "Copy to clipboard" : "複製到剪貼簿",
+ "Use this address to access your Files via WebDAV" : "使用此位置透過 WebDAV 存取您的檔案",
+ "If you have enabled 2FA, you must create and use a new app password by clicking here." : "若您啟用了雙因子認證,您必須點擊此處建立並使用新的應用程式密碼。",
+ "Deletion cancelled" : "刪除已取消",
+ "Move cancelled" : "移動已取消",
+ "Cancelled move or copy of \"{filename}\"." : "已取消移動或複製「{filename}」。",
+ "Cancelled move or copy operation" : "已取消移動或複製操作",
+ "Open details" : "開啟詳細資訊",
+ "Photos and images" : "照片與影像",
+ "New folder creation cancelled" : "已取消建立新資料夾",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} 個資料夾"],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} 個檔案"],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 個檔案與 {folderCount} 個資料夾"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} 個檔案與 1 個資料夾"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} 個檔案與 {folderCount} 個資料夾",
+ "All folders" : "所有資料夾",
+ "Personal Files" : "個人檔案",
"Text file" : "文字檔案",
"New text file.txt" : "新文字檔案.txt",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} 的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "群組資料夾「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "外部儲存空間「{mountPoint}」已滿,已無法再更新或同步檔案!",
- "Your storage is full, files can not be updated or synced anymore!" : "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
- "_matches '{filter}'_::_match '{filter}'_" : ["符合「{filter}」"]
+ "%1$s (renamed)" : "%1$s(已重新命名)",
+ "renamed file" : "已重新命名檔案",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "啟用與 Windows 相容的檔案名稱後,無法再修改現有檔案,但可以由其擁有者重新命名為有效的新名稱。",
+ "Filter file names …" : "過濾檔案名稱……",
+ "Prevent warning dialogs from open or reenable them." : "避免開啟警告對話方塊或重新啟用它們。",
+ "Show a warning dialog when changing a file extension." : "在變更副檔名時顯示警告對話方塊。",
+ "Speed up your Files experience with these quick shortcuts." : "使用這些快捷鍵加速您的 Files 體驗。",
+ "Open the actions menu for a file" : "開啟檔案的動作選單",
+ "Rename a file" : "重新命名檔案",
+ "Delete a file" : "刪除檔案",
+ "Favorite or remove a file from favorites" : "加入最愛或從最愛移除檔案",
+ "Manage tags for a file" : "管理檔案的標籤",
+ "Deselect all files" : "取消選取所有檔案",
+ "Select or deselect a file" : "選取或取消選取檔案",
+ "Select a range of files" : "選取檔案範圍",
+ "Navigate to the parent folder" : "前往上層資料夾",
+ "Navigate to the file above" : "前往上述檔案",
+ "Navigate to the file below" : "前往以下檔案",
+ "Navigate to the file on the left (in grid mode)" : "前往左側的檔案(在網格模式下)",
+ "Navigate to the file on the right (in grid mode)" : "前往右側的檔案(在網格模式下)",
+ "Toggle the grid view" : "切換網格檢視",
+ "Open the sidebar for a file" : "開啟檔案側邊欄"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/lib/Activity/FavoriteProvider.php b/apps/files/lib/Activity/FavoriteProvider.php
index a1c08370e4e..e56b13b902a 100644
--- a/apps/files/lib/Activity/FavoriteProvider.php
+++ b/apps/files/lib/Activity/FavoriteProvider.php
@@ -1,28 +1,12 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -35,32 +19,21 @@ class FavoriteProvider implements IProvider {
public const SUBJECT_ADDED = 'added_favorite';
public const SUBJECT_REMOVED = 'removed_favorite';
- /** @var IFactory */
- protected $languageFactory;
-
/** @var IL10N */
protected $l;
- /** @var IURLGenerator */
- protected $url;
-
- /** @var IManager */
- protected $activityManager;
-
- /** @var IEventMerger */
- protected $eventMerger;
-
/**
* @param IFactory $languageFactory
* @param IURLGenerator $url
* @param IManager $activityManager
* @param IEventMerger $eventMerger
*/
- public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IEventMerger $eventMerger) {
- $this->languageFactory = $languageFactory;
- $this->url = $url;
- $this->activityManager = $activityManager;
- $this->eventMerger = $eventMerger;
+ public function __construct(
+ protected IFactory $languageFactory,
+ protected IURLGenerator $url,
+ protected IManager $activityManager,
+ protected IEventMerger $eventMerger,
+ ) {
}
/**
@@ -68,12 +41,12 @@ class FavoriteProvider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parse($language, IEvent $event, IEvent $previousEvent = null) {
+ public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'files' || $event->getType() !== 'favorite') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('files', $language);
@@ -81,7 +54,7 @@ class FavoriteProvider implements IProvider {
if ($this->activityManager->isFormattingFilteredObject()) {
try {
return $this->parseShortVersion($event);
- } catch (\InvalidArgumentException $e) {
+ } catch (UnknownActivityException) {
// Ignore and simply use the long version...
}
}
@@ -92,10 +65,10 @@ class FavoriteProvider implements IProvider {
/**
* @param IEvent $event
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parseShortVersion(IEvent $event) {
+ public function parseShortVersion(IEvent $event): IEvent {
if ($event->getSubject() === self::SUBJECT_ADDED) {
$event->setParsedSubject($this->l->t('Added to favorites'));
if ($this->activityManager->getRequirePNG()) {
@@ -112,7 +85,7 @@ class FavoriteProvider implements IProvider {
$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/star.svg')));
}
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
return $event;
@@ -122,10 +95,10 @@ class FavoriteProvider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
+ public function parseLongVersion(IEvent $event, ?IEvent $previousEvent = null): IEvent {
if ($event->getSubject() === self::SUBJECT_ADDED) {
$subject = $this->l->t('You added {file} to your favorites');
if ($this->activityManager->getRequirePNG()) {
@@ -142,7 +115,7 @@ class FavoriteProvider implements IProvider {
$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/star.svg')));
}
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->setSubjects($event, $subject);
@@ -166,13 +139,12 @@ class FavoriteProvider implements IProvider {
}
$parameter = [
'type' => 'file',
- 'id' => $subjectParams['id'],
+ 'id' => (string)$subjectParams['id'],
'name' => basename($subjectParams['path']),
'path' => trim($subjectParams['path'], '/'),
'link' => $this->url->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $subjectParams['id']]),
];
- $event->setParsedSubject(str_replace('{file}', $parameter['path'], $subject))
- ->setRichSubject($subject, ['file' => $parameter]);
+ $event->setRichSubject($subject, ['file' => $parameter]);
}
}
diff --git a/apps/files/lib/Activity/Filter/Favorites.php b/apps/files/lib/Activity/Filter/Favorites.php
index 04f906b2f97..0159dd20b82 100644
--- a/apps/files/lib/Activity/Filter/Favorites.php
+++ b/apps/files/lib/Activity/Filter/Favorites.php
@@ -1,24 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Filter;
@@ -32,21 +16,6 @@ use OCP\IURLGenerator;
class Favorites implements IFilter {
- /** @var IL10N */
- protected $l;
-
- /** @var IURLGenerator */
- protected $url;
-
- /** @var IManager */
- protected $activityManager;
-
- /** @var Helper */
- protected $helper;
-
- /** @var IDBConnection */
- protected $db;
-
/**
* @param IL10N $l
* @param IURLGenerator $url
@@ -54,12 +23,13 @@ class Favorites implements IFilter {
* @param Helper $helper
* @param IDBConnection $db
*/
- public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager, Helper $helper, IDBConnection $db) {
- $this->l = $l;
- $this->url = $url;
- $this->activityManager = $activityManager;
- $this->helper = $helper;
- $this->db = $db;
+ public function __construct(
+ protected IL10N $l,
+ protected IURLGenerator $url,
+ protected IManager $activityManager,
+ protected Helper $helper,
+ protected IDBConnection $db,
+ ) {
}
/**
diff --git a/apps/files/lib/Activity/Filter/FileChanges.php b/apps/files/lib/Activity/Filter/FileChanges.php
index 2950e7c46df..0ca8f6792e0 100644
--- a/apps/files/lib/Activity/Filter/FileChanges.php
+++ b/apps/files/lib/Activity/Filter/FileChanges.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Filter;
@@ -29,19 +12,14 @@ use OCP\IURLGenerator;
class FileChanges implements IFilter {
- /** @var IL10N */
- protected $l;
-
- /** @var IURLGenerator */
- protected $url;
-
/**
* @param IL10N $l
* @param IURLGenerator $url
*/
- public function __construct(IL10N $l, IURLGenerator $url) {
- $this->l = $l;
- $this->url = $url;
+ public function __construct(
+ protected IL10N $l,
+ protected IURLGenerator $url,
+ ) {
}
/**
diff --git a/apps/files/lib/Activity/Helper.php b/apps/files/lib/Activity/Helper.php
index b9a5ae887ec..9b8ad9cd442 100644
--- a/apps/files/lib/Activity/Helper.php
+++ b/apps/files/lib/Activity/Helper.php
@@ -1,52 +1,37 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Activity;
use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\Node;
use OCP\ITagManager;
class Helper {
/** If a user has a lot of favorites the query might get too slow and long */
public const FAVORITE_LIMIT = 50;
- /** @var ITagManager */
- protected $tagManager;
-
- /**
- * @param ITagManager $tagManager
- */
- public function __construct(ITagManager $tagManager) {
- $this->tagManager = $tagManager;
+ public function __construct(
+ protected ITagManager $tagManager,
+ protected IRootFolder $rootFolder,
+ ) {
}
/**
- * Returns an array with the favorites
+ * Return an array with nodes marked as favorites
*
- * @param string $user
- * @return array
+ * @param string $user User ID
+ * @param bool $foldersOnly Only return folders (default false)
+ * @return Node[]
+ * @psalm-return ($foldersOnly is true ? Folder[] : Node[])
* @throws \RuntimeException when too many or no favorites where found
*/
- public function getFavoriteFilePaths($user) {
+ public function getFavoriteNodes(string $user, bool $foldersOnly = false): array {
$tags = $this->tagManager->load('files', [], false, $user);
$favorites = $tags->getFavorites();
@@ -57,26 +42,44 @@ class Helper {
}
// Can not DI because the user is not known on instantiation
- $rootFolder = \OC::$server->getUserFolder($user);
- $folders = $items = [];
+ $userFolder = $this->rootFolder->getUserFolder($user);
+ $favoriteNodes = [];
foreach ($favorites as $favorite) {
- $nodes = $rootFolder->getById($favorite);
- if (!empty($nodes)) {
- /** @var \OCP\Files\Node $node */
- $node = array_shift($nodes);
- $path = substr($node->getPath(), strlen($user . '/files/'));
-
- $items[] = $path;
- if ($node instanceof Folder) {
- $folders[] = $path;
+ $node = $userFolder->getFirstNodeById($favorite);
+ if ($node) {
+ if (!$foldersOnly || $node instanceof Folder) {
+ $favoriteNodes[] = $node;
}
}
}
- if (empty($items)) {
+ if (empty($favoriteNodes)) {
throw new \RuntimeException('No favorites', 1);
}
+ return $favoriteNodes;
+ }
+
+ /**
+ * Returns an array with the favorites
+ *
+ * @param string $user
+ * @return array
+ * @throws \RuntimeException when too many or no favorites where found
+ */
+ public function getFavoriteFilePaths(string $user): array {
+ $userFolder = $this->rootFolder->getUserFolder($user);
+ $nodes = $this->getFavoriteNodes($user);
+ $folders = $items = [];
+ foreach ($nodes as $node) {
+ $path = $userFolder->getRelativePath($node->getPath());
+
+ $items[] = $path;
+ if ($node instanceof Folder) {
+ $folders[] = $path;
+ }
+ }
+
return [
'items' => $items,
'folders' => $folders,
diff --git a/apps/files/lib/Activity/Provider.php b/apps/files/lib/Activity/Provider.php
index a7db85a0de1..3ef79ac107f 100644
--- a/apps/files/lib/Activity/Provider.php
+++ b/apps/files/lib/Activity/Provider.php
@@ -1,30 +1,12 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -38,62 +20,28 @@ use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IL10N;
use OCP\IURLGenerator;
-use OCP\IUser;
use OCP\IUserManager;
use OCP\L10N\IFactory;
class Provider implements IProvider {
-
- /** @var IFactory */
- protected $languageFactory;
-
/** @var IL10N */
protected $l;
- /** @var IL10N */
- protected $activityLang;
-
- /** @var IURLGenerator */
- protected $url;
-
- /** @var IManager */
- protected $activityManager;
-
- /** @var IUserManager */
- protected $userManager;
-
- /** @var IRootFolder */
- protected $rootFolder;
-
- /** @var IEventMerger */
- protected $eventMerger;
-
- /** @var ICloudIdManager */
- protected $cloudIdManager;
-
- /** @var IContactsManager */
- protected $contactsManager;
/** @var string[] cached displayNames - key is the cloud id and value the displayname */
protected $displayNames = [];
protected $fileIsEncrypted = false;
- public function __construct(IFactory $languageFactory,
- IURLGenerator $url,
- IManager $activityManager,
- IUserManager $userManager,
- IRootFolder $rootFolder,
- ICloudIdManager $cloudIdManager,
- IContactsManager $contactsManager,
- IEventMerger $eventMerger) {
- $this->languageFactory = $languageFactory;
- $this->url = $url;
- $this->activityManager = $activityManager;
- $this->userManager = $userManager;
- $this->rootFolder = $rootFolder;
- $this->cloudIdManager = $cloudIdManager;
- $this->contactsManager = $contactsManager;
- $this->eventMerger = $eventMerger;
+ public function __construct(
+ protected IFactory $languageFactory,
+ protected IURLGenerator $url,
+ protected IManager $activityManager,
+ protected IUserManager $userManager,
+ protected IRootFolder $rootFolder,
+ protected ICloudIdManager $cloudIdManager,
+ protected IContactsManager $contactsManager,
+ protected IEventMerger $eventMerger,
+ ) {
}
/**
@@ -101,21 +49,20 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parse($language, IEvent $event, IEvent $previousEvent = null) {
+ public function parse($language, IEvent $event, ?IEvent $previousEvent = null) {
if ($event->getApp() !== 'files') {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
$this->l = $this->languageFactory->get('files', $language);
- $this->activityLang = $this->languageFactory->get('activity', $language);
if ($this->activityManager->isFormattingFilteredObject()) {
try {
return $this->parseShortVersion($event, $previousEvent);
- } catch (\InvalidArgumentException $e) {
+ } catch (UnknownActivityException) {
// Ignore and simply use the long version...
}
}
@@ -135,10 +82,10 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parseShortVersion(IEvent $event, IEvent $previousEvent = null) {
+ public function parseShortVersion(IEvent $event, ?IEvent $previousEvent = null): IEvent {
$parsedParameters = $this->getParameters($event);
if ($event->getSubject() === 'created_by') {
@@ -160,12 +107,12 @@ class Provider implements IProvider {
$subject = $this->l->t('Moved by {user}');
$this->setIcon($event, 'change');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
if (!isset($parsedParameters['user'])) {
// External user via public link share
- $subject = str_replace('{user}', $this->activityLang->t('"remote user"'), $subject);
+ $subject = str_replace('{user}', $this->l->t('"remote account"'), $subject);
}
$this->setSubjects($event, $subject, $parsedParameters);
@@ -177,10 +124,10 @@ class Provider implements IProvider {
* @param IEvent $event
* @param IEvent|null $previousEvent
* @return IEvent
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
+ public function parseLongVersion(IEvent $event, ?IEvent $previousEvent = null): IEvent {
$this->fileIsEncrypted = false;
$parsedParameters = $this->getParameters($event);
@@ -274,7 +221,7 @@ class Provider implements IProvider {
$subject = $this->l->t('{user} moved {oldfile} to {newfile}');
$this->setIcon($event, 'change');
} else {
- throw new \InvalidArgumentException();
+ throw new UnknownActivityException();
}
if ($this->fileIsEncrypted) {
@@ -283,7 +230,7 @@ class Provider implements IProvider {
if (!isset($parsedParameters['user'])) {
// External user via public link share
- $subject = str_replace('{user}', $this->activityLang->t('"remote user"'), $subject);
+ $subject = str_replace('{user}', $this->l->t('"remote account"'), $subject);
}
$this->setSubjects($event, $subject, $parsedParameters);
@@ -306,27 +253,16 @@ class Provider implements IProvider {
return strlen($filename) > 0 && $filename[0] === '.';
}
- protected function setSubjects(IEvent $event, $subject, array $parameters) {
- $placeholders = $replacements = [];
- foreach ($parameters as $placeholder => $parameter) {
- $placeholders[] = '{' . $placeholder . '}';
- if ($parameter['type'] === 'file') {
- $replacements[] = $parameter['path'];
- } else {
- $replacements[] = $parameter['name'];
- }
- }
-
- $event->setParsedSubject(str_replace($placeholders, $replacements, $subject))
- ->setRichSubject($subject, $parameters);
+ protected function setSubjects(IEvent $event, string $subject, array $parameters): void {
+ $event->setRichSubject($subject, $parameters);
}
/**
* @param IEvent $event
* @return array
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
*/
- protected function getParameters(IEvent $event) {
+ protected function getParameters(IEvent $event): array {
$parameters = $event->getSubjectParameters();
switch ($event->getSubject()) {
case 'created_self':
@@ -379,18 +315,18 @@ class Provider implements IProvider {
* @param array|string $parameter
* @param IEvent|null $event
* @return array
- * @throws \InvalidArgumentException
+ * @throws UnknownActivityException
*/
- protected function getFile($parameter, IEvent $event = null) {
+ protected function getFile($parameter, ?IEvent $event = null): array {
if (is_array($parameter)) {
$path = reset($parameter);
- $id = (string) key($parameter);
+ $id = (int)key($parameter);
} elseif ($event !== null) {
// Legacy from before ownCloud 8.2
$path = $parameter;
$id = $event->getObjectId();
} else {
- throw new \InvalidArgumentException('Could not generate file parameter');
+ throw new UnknownActivityException('Could not generate file parameter');
}
$encryptionContainer = $this->getEndToEndEncryptionContainer($id, $path);
@@ -406,7 +342,7 @@ class Provider implements IProvider {
return [
'type' => 'file',
- 'id' => $encryptionContainer->getId(),
+ 'id' => (string)$encryptionContainer->getId(),
'name' => $encryptionContainer->getName(),
'path' => $path,
'link' => $this->url->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $encryptionContainer->getId()]),
@@ -419,7 +355,7 @@ class Provider implements IProvider {
return [
'type' => 'file',
- 'id' => $id,
+ 'id' => (string)$id,
'name' => basename($path),
'path' => trim($path, '/'),
'link' => $this->url->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $id]),
@@ -446,8 +382,8 @@ class Provider implements IProvider {
}
$userFolder = $this->rootFolder->getUserFolder($this->activityManager->getCurrentUserId());
- $files = $userFolder->getById($fileId);
- if (empty($files)) {
+ $file = $userFolder->getFirstNodeById($fileId);
+ if (!$file) {
try {
// Deleted, try with parent
$file = $this->findExistingParent($userFolder, dirname($path));
@@ -463,8 +399,6 @@ class Provider implements IProvider {
return $file;
}
- $file = array_shift($files);
-
if ($file instanceof Folder && $file->isEncrypted()) {
// If the folder is encrypted, it is the Container,
// but can be the name is just fine.
@@ -527,12 +461,12 @@ class Provider implements IProvider {
*/
protected function getUser($uid) {
// First try local user
- $user = $this->userManager->get($uid);
- if ($user instanceof IUser) {
+ $displayName = $this->userManager->getDisplayName($uid);
+ if ($displayName !== null) {
return [
'type' => 'user',
- 'id' => $user->getUID(),
- 'name' => $user->getDisplayName(),
+ 'id' => $uid,
+ 'name' => $displayName,
];
}
diff --git a/apps/files/lib/Activity/Settings/FavoriteAction.php b/apps/files/lib/Activity/Settings/FavoriteAction.php
index 3c6ceb23959..73b200341ec 100644
--- a/apps/files/lib/Activity/Settings/FavoriteAction.php
+++ b/apps/files/lib/Activity/Settings/FavoriteAction.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Settings;
@@ -42,8 +25,8 @@ class FavoriteAction extends FileActivitySettings {
/**
* @return int whether the filter should be rather on the top or bottom of
- * the admin section. The filters are arranged in ascending order of the
- * priority values. It is required to return a value between 0 and 100.
+ * the admin section. The filters are arranged in ascending order of the
+ * priority values. It is required to return a value between 0 and 100.
* @since 11.0.0
*/
public function getPriority() {
diff --git a/apps/files/lib/Activity/Settings/FileActivitySettings.php b/apps/files/lib/Activity/Settings/FileActivitySettings.php
index 8bb97a81cc8..0ca7100832f 100644
--- a/apps/files/lib/Activity/Settings/FileActivitySettings.php
+++ b/apps/files/lib/Activity/Settings/FileActivitySettings.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
- *
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Settings;
@@ -29,14 +12,12 @@ use OCP\Activity\ActivitySettings;
use OCP\IL10N;
abstract class FileActivitySettings extends ActivitySettings {
- /** @var IL10N */
- protected $l;
-
/**
* @param IL10N $l
*/
- public function __construct(IL10N $l) {
- $this->l = $l;
+ public function __construct(
+ protected IL10N $l,
+ ) {
}
public function getGroupIdentifier() {
diff --git a/apps/files/lib/Activity/Settings/FileChanged.php b/apps/files/lib/Activity/Settings/FileChanged.php
index 2d826c30b5b..c33ed5e1eba 100644
--- a/apps/files/lib/Activity/Settings/FileChanged.php
+++ b/apps/files/lib/Activity/Settings/FileChanged.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Settings;
@@ -42,8 +25,8 @@ class FileChanged extends FileActivitySettings {
/**
* @return int whether the filter should be rather on the top or bottom of
- * the admin section. The filters are arranged in ascending order of the
- * priority values. It is required to return a value between 0 and 100.
+ * the admin section. The filters are arranged in ascending order of the
+ * priority values. It is required to return a value between 0 and 100.
* @since 11.0.0
*/
public function getPriority() {
diff --git a/apps/files/lib/Activity/Settings/FileFavoriteChanged.php b/apps/files/lib/Activity/Settings/FileFavoriteChanged.php
index 829f3e0d9d0..5000902ed3f 100644
--- a/apps/files/lib/Activity/Settings/FileFavoriteChanged.php
+++ b/apps/files/lib/Activity/Settings/FileFavoriteChanged.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Activity\Settings;
@@ -42,8 +25,8 @@ class FileFavoriteChanged extends FileActivitySettings {
/**
* @return int whether the filter should be rather on the top or bottom of
- * the admin section. The filters are arranged in ascending order of the
- * priority values. It is required to return a value between 0 and 100.
+ * the admin section. The filters are arranged in ascending order of the
+ * priority values. It is required to return a value between 0 and 100.
* @since 11.0.0
*/
public function getPriority() {
diff --git a/apps/files/lib/AdvancedCapabilities.php b/apps/files/lib/AdvancedCapabilities.php
new file mode 100644
index 00000000000..22f990f0cf8
--- /dev/null
+++ b/apps/files/lib/AdvancedCapabilities.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files;
+
+use OCA\Files\Service\SettingsService;
+use OCP\Capabilities\ICapability;
+use OCP\Capabilities\IInitialStateExcludedCapability;
+
+/**
+ * Capabilities not needed for every request.
+ * This capabilities might be hard to compute or no used by the webui.
+ */
+class AdvancedCapabilities implements ICapability, IInitialStateExcludedCapability {
+
+ public function __construct(
+ protected SettingsService $service,
+ ) {
+ }
+
+ /**
+ * Return this classes capabilities
+ *
+ * @return array{files: array{'windows_compatible_filenames': bool}}
+ */
+ public function getCapabilities(): array {
+ return [
+ 'files' => [
+ 'windows_compatible_filenames' => $this->service->hasFilesWindowsSupport(),
+ ],
+ ];
+ }
+}
diff --git a/apps/files/lib/App.php b/apps/files/lib/App.php
index 386e5a3243a..9e6d35a7538 100644
--- a/apps/files/lib/App.php
+++ b/apps/files/lib/App.php
@@ -1,62 +1,54 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files;
+use OC\NavigationManager;
+use OCA\Files\Service\ChunkedUploadConfig;
+use OCP\App\IAppManager;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IConfig;
+use OCP\IGroupManager;
+use OCP\INavigationManager;
+use OCP\IURLGenerator;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+use OCP\Server;
+use Psr\Log\LoggerInterface;
+
class App {
- /**
- * @var \OCP\INavigationManager
- */
- private static $navigationManager;
+ private static ?INavigationManager $navigationManager = null;
/**
* Returns the app's navigation manager
- *
- * @return \OCP\INavigationManager
*/
- public static function getNavigationManager() {
+ public static function getNavigationManager(): INavigationManager {
// TODO: move this into a service in the Application class
if (self::$navigationManager === null) {
- self::$navigationManager = new \OC\NavigationManager(
- \OC::$server->getAppManager(),
- \OC::$server->getURLGenerator(),
- \OC::$server->getL10NFactory(),
- \OC::$server->getUserSession(),
- \OC::$server->getGroupManager(),
- \OC::$server->getConfig()
+ self::$navigationManager = new NavigationManager(
+ Server::get(IAppManager::class),
+ Server::get(IUrlGenerator::class),
+ Server::get(IFactory::class),
+ Server::get(IUserSession::class),
+ Server::get(IGroupManager::class),
+ Server::get(IConfig::class),
+ Server::get(LoggerInterface::class),
+ Server::get(IEventDispatcher::class),
);
self::$navigationManager->clear(false);
}
return self::$navigationManager;
}
- public static function extendJsConfig($settings) {
+ public static function extendJsConfig($settings): void {
$appConfig = json_decode($settings['array']['oc_appconfig'], true);
- $maxChunkSize = (int)\OC::$server->getConfig()->getAppValue('files', 'max_chunk_size', 10 * 1024 * 1024);
$appConfig['files'] = [
- 'max_chunk_size' => $maxChunkSize
+ 'max_chunk_size' => ChunkedUploadConfig::getMaxChunkSize(),
];
$settings['array']['oc_appconfig'] = json_encode($appConfig);
diff --git a/apps/files/lib/AppInfo/Application.php b/apps/files/lib/AppInfo/Application.php
index 26d541f57e8..2761b44ecf9 100644
--- a/apps/files/lib/AppInfo/Application.php
+++ b/apps/files/lib/AppInfo/Application.php
@@ -1,61 +1,53 @@
<?php
declare(strict_types=1);
-
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\AppInfo;
use Closure;
-use OC\Search\Provider\File;
+use OCA\Files\AdvancedCapabilities;
use OCA\Files\Capabilities;
use OCA\Files\Collaboration\Resources\Listener;
use OCA\Files\Collaboration\Resources\ResourceProvider;
use OCA\Files\Controller\ApiController;
-use OCA\Files\Event\LoadAdditionalScriptsEvent;
+use OCA\Files\Dashboard\FavoriteWidget;
+use OCA\Files\DirectEditingCapabilities;
+use OCA\Files\Event\LoadSearchPlugins;
use OCA\Files\Event\LoadSidebar;
-use OCA\Files\Listener\LegacyLoadAdditionalScriptsAdapter;
+use OCA\Files\Listener\LoadSearchPluginsListener;
use OCA\Files\Listener\LoadSidebarListener;
+use OCA\Files\Listener\NodeAddedToFavoriteListener;
+use OCA\Files\Listener\NodeRemovedFromFavoriteListener;
+use OCA\Files\Listener\RenderReferenceEventListener;
+use OCA\Files\Listener\SyncLivePhotosListener;
use OCA\Files\Notification\Notifier;
use OCA\Files\Search\FilesSearchProvider;
use OCA\Files\Service\TagService;
+use OCA\Files\Service\UserConfig;
+use OCA\Files\Service\ViewConfig;
+use OCA\Files\Settings\DeclarativeAdminSettings;
use OCP\Activity\IManager as IActivityManager;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
+use OCP\Collaboration\Reference\RenderReferenceEvent;
use OCP\Collaboration\Resources\IProviderManager;
+use OCP\Files\Cache\CacheEntryRemovedEvent;
+use OCP\Files\Events\Node\BeforeNodeCopiedEvent;
+use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
+use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
+use OCP\Files\Events\Node\NodeCopiedEvent;
+use OCP\Files\Events\NodeAddedToFavorite;
+use OCP\Files\Events\NodeRemovedFromFavorite;
+use OCP\Files\IRootFolder;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IPreview;
-use OCP\ISearch;
use OCP\IRequest;
use OCP\IServerContainer;
use OCP\ITagManager;
@@ -63,6 +55,7 @@ use OCP\IUserSession;
use OCP\Share\IManager as IShareManager;
use OCP\Util;
use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
class Application extends App implements IBootstrap {
public const APP_ID = 'files';
@@ -87,7 +80,12 @@ class Application extends App implements IBootstrap {
$c->get(IPreview::class),
$c->get(IShareManager::class),
$c->get(IConfig::class),
- $server->getUserFolder()
+ $server->getUserFolder(),
+ $c->get(UserConfig::class),
+ $c->get(ViewConfig::class),
+ $c->get(IL10N::class),
+ $c->get(IRootFolder::class),
+ $c->get(LoggerInterface::class),
);
});
@@ -103,7 +101,6 @@ class Application extends App implements IBootstrap {
$c->get(IActivityManager::class),
$c->get(ITagManager::class)->load(self::APP_ID),
$server->getUserFolder(),
- $server->getEventDispatcher()
);
});
@@ -111,21 +108,30 @@ class Application extends App implements IBootstrap {
* Register capabilities
*/
$context->registerCapability(Capabilities::class);
+ $context->registerCapability(AdvancedCapabilities::class);
+ $context->registerCapability(DirectEditingCapabilities::class);
- $context->registerEventListener(LoadAdditionalScriptsEvent::class, LegacyLoadAdditionalScriptsAdapter::class);
- $context->registerEventListener(LoadSidebar::class, LoadSidebarListener::class);
+ $context->registerDeclarativeSettings(DeclarativeAdminSettings::class);
+ $context->registerEventListener(LoadSidebar::class, LoadSidebarListener::class);
+ $context->registerEventListener(RenderReferenceEvent::class, RenderReferenceEventListener::class);
+ $context->registerEventListener(BeforeNodeRenamedEvent::class, SyncLivePhotosListener::class);
+ $context->registerEventListener(BeforeNodeDeletedEvent::class, SyncLivePhotosListener::class);
+ $context->registerEventListener(CacheEntryRemovedEvent::class, SyncLivePhotosListener::class, 1); // Ensure this happen before the metadata are deleted.
+ $context->registerEventListener(BeforeNodeCopiedEvent::class, SyncLivePhotosListener::class);
+ $context->registerEventListener(NodeCopiedEvent::class, SyncLivePhotosListener::class);
+ $context->registerEventListener(LoadSearchPlugins::class, LoadSearchPluginsListener::class);
+ $context->registerEventListener(NodeAddedToFavorite::class, NodeAddedToFavoriteListener::class);
+ $context->registerEventListener(NodeRemovedFromFavorite::class, NodeRemovedFromFavoriteListener::class);
$context->registerSearchProvider(FilesSearchProvider::class);
$context->registerNotifierService(Notifier::class);
+ $context->registerDashboardWidget(FavoriteWidget::class);
}
public function boot(IBootContext $context): void {
$context->injectFn(Closure::fromCallable([$this, 'registerCollaboration']));
$context->injectFn([Listener::class, 'register']);
- $context->injectFn(Closure::fromCallable([$this, 'registerSearchProvider']));
- $this->registerTemplates();
- $context->injectFn(Closure::fromCallable([$this, 'registerNavigation']));
$this->registerHooks();
}
@@ -133,48 +139,6 @@ class Application extends App implements IBootstrap {
$providerManager->registerResourceProvider(ResourceProvider::class);
}
- private function registerSearchProvider(ISearch $search): void {
- $search->registerProvider(File::class, ['apps' => ['files']]);
- }
-
- private function registerTemplates(): void {
- $templateManager = \OC_Helper::getFileTemplateManager();
- $templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp');
- $templateManager->registerTemplate('application/vnd.oasis.opendocument.text', 'core/templates/filetemplates/template.odt');
- $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadsheet', 'core/templates/filetemplates/template.ods');
- }
-
- private function registerNavigation(IL10N $l10n): void {
- \OCA\Files\App::getNavigationManager()->add(function () use ($l10n) {
- return [
- 'id' => 'files',
- 'appname' => 'files',
- 'script' => 'list.php',
- 'order' => 0,
- 'name' => $l10n->t('All files')
- ];
- });
- \OCA\Files\App::getNavigationManager()->add(function () use ($l10n) {
- return [
- 'id' => 'recent',
- 'appname' => 'files',
- 'script' => 'recentlist.php',
- 'order' => 2,
- 'name' => $l10n->t('Recent')
- ];
- });
- \OCA\Files\App::getNavigationManager()->add(function () use ($l10n) {
- return [
- 'id' => 'favorites',
- 'appname' => 'files',
- 'script' => 'simplelist.php',
- 'order' => 5,
- 'name' => $l10n->t('Favorites'),
- 'expandedState' => 'show_Quick_Access'
- ];
- });
- }
-
private function registerHooks(): void {
Util::connectHook('\OCP\Config', 'js', '\OCA\Files\App', 'extendJsConfig');
}
diff --git a/apps/files/lib/BackgroundJob/CleanupDirectEditingTokens.php b/apps/files/lib/BackgroundJob/CleanupDirectEditingTokens.php
index 16f76a76dd8..a1032b2787d 100644
--- a/apps/files/lib/BackgroundJob/CleanupDirectEditingTokens.php
+++ b/apps/files/lib/BackgroundJob/CleanupDirectEditingTokens.php
@@ -1,42 +1,24 @@
<?php
+
+declare(strict_types=1);
+
/**
- * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\BackgroundJob;
-use OC\BackgroundJob\TimedJob;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
use OCP\DirectEditing\IManager;
class CleanupDirectEditingTokens extends TimedJob {
- private const INTERVAL_MINUTES = 15 * 60;
-
- /**
- * @var IManager
- */
- private $manager;
-
- public function __construct(IManager $manager) {
- $this->interval = self::INTERVAL_MINUTES;
- $this->manager = $manager;
+ public function __construct(
+ ITimeFactory $time,
+ private IManager $manager,
+ ) {
+ parent::__construct($time);
+ $this->setInterval(15 * 60);
}
/**
diff --git a/apps/files/lib/BackgroundJob/CleanupFileLocks.php b/apps/files/lib/BackgroundJob/CleanupFileLocks.php
index f22b8edcd9b..91bb145884b 100644
--- a/apps/files/lib/BackgroundJob/CleanupFileLocks.php
+++ b/apps/files/lib/BackgroundJob/CleanupFileLocks.php
@@ -1,48 +1,28 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Max Kovalenko <mxss1998@yandex.ru>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\BackgroundJob;
-use OC\BackgroundJob\TimedJob;
use OC\Lock\DBLockingProvider;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
+use OCP\Lock\ILockingProvider;
+use OCP\Server;
/**
* Clean up all file locks that are expired for the DB file locking provider
*/
class CleanupFileLocks extends TimedJob {
-
- /**
- * Default interval in minutes
- *
- * @var int $defaultIntervalMin
- **/
- protected $defaultIntervalMin = 5;
-
/**
* sets the correct interval for this timed job
*/
- public function __construct() {
- $this->interval = $this->defaultIntervalMin * 60;
+ public function __construct(ITimeFactory $time) {
+ parent::__construct($time);
+ $this->setInterval(5 * 60);
}
/**
@@ -52,7 +32,7 @@ class CleanupFileLocks extends TimedJob {
* @throws \Exception
*/
public function run($argument) {
- $lockingProvider = \OC::$server->getLockingProvider();
+ $lockingProvider = Server::get(ILockingProvider::class);
if ($lockingProvider instanceof DBLockingProvider) {
$lockingProvider->cleanExpiredLocks();
}
diff --git a/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php b/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php
new file mode 100644
index 00000000000..8a20b6dfb0c
--- /dev/null
+++ b/apps/files/lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\BackgroundJob;
+
+use OCA\Files\Db\OpenLocalEditorMapper;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
+
+/**
+ * Delete all expired "Open local editor" token
+ */
+class DeleteExpiredOpenLocalEditor extends TimedJob {
+ public function __construct(
+ ITimeFactory $time,
+ protected OpenLocalEditorMapper $mapper,
+ ) {
+ parent::__construct($time);
+
+ // Run every 12h
+ $this->interval = 12 * 3600;
+ $this->setTimeSensitivity(self::TIME_INSENSITIVE);
+ }
+
+ /**
+ * Makes the background job do its work
+ *
+ * @param array $argument unused argument
+ */
+ public function run($argument): void {
+ $this->mapper->deleteExpiredTokens($this->time->getTime());
+ }
+}
diff --git a/apps/files/lib/BackgroundJob/DeleteOrphanedItems.php b/apps/files/lib/BackgroundJob/DeleteOrphanedItems.php
index 720785f5727..b925974f24a 100644
--- a/apps/files/lib/BackgroundJob/DeleteOrphanedItems.php
+++ b/apps/files/lib/BackgroundJob/DeleteOrphanedItems.php
@@ -1,31 +1,17 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\BackgroundJob;
-use OC\BackgroundJob\TimedJob;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use Psr\Log\LoggerInterface;
/**
* Delete all share entries that have no matching entries in the file cache table.
@@ -33,26 +19,16 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
class DeleteOrphanedItems extends TimedJob {
public const CHUNK_SIZE = 200;
- /** @var \OCP\IDBConnection */
- protected $connection;
-
- /** @var \OCP\ILogger */
- protected $logger;
-
- /**
- * Default interval in minutes
- *
- * @var int $defaultIntervalMin
- **/
- protected $defaultIntervalMin = 60;
-
/**
* sets the correct interval for this timed job
*/
- public function __construct() {
- $this->interval = $this->defaultIntervalMin * 60;
- $this->connection = \OC::$server->getDatabaseConnection();
- $this->logger = \OC::$server->getLogger();
+ public function __construct(
+ ITimeFactory $time,
+ protected IDBConnection $connection,
+ protected LoggerInterface $logger,
+ ) {
+ parent::__construct($time);
+ $this->setInterval(60 * 60);
}
/**
@@ -75,38 +51,87 @@ class DeleteOrphanedItems extends TimedJob {
* @param string $typeCol
* @return int Number of deleted entries
*/
- protected function cleanUp($table, $idCol, $typeCol) {
+ protected function cleanUp(string $table, string $idCol, string $typeCol): int {
$deletedEntries = 0;
- $query = $this->connection->getQueryBuilder();
- $query->select('t1.' . $idCol)
- ->from($table, 't1')
- ->where($query->expr()->eq($typeCol, $query->expr()->literal('files')))
- ->andWhere($query->expr()->isNull('t2.fileid'))
- ->leftJoin('t1', 'filecache', 't2', $query->expr()->eq($query->expr()->castColumn('t1.' . $idCol, IQueryBuilder::PARAM_INT), 't2.fileid'))
- ->groupBy('t1.' . $idCol)
- ->setMaxResults(self::CHUNK_SIZE);
-
$deleteQuery = $this->connection->getQueryBuilder();
$deleteQuery->delete($table)
->where($deleteQuery->expr()->eq($idCol, $deleteQuery->createParameter('objectid')));
- $deletedInLastChunk = self::CHUNK_SIZE;
- while ($deletedInLastChunk === self::CHUNK_SIZE) {
- $result = $query->execute();
- $deletedInLastChunk = 0;
- while ($row = $result->fetch()) {
- $deletedInLastChunk++;
- $deletedEntries += $deleteQuery->setParameter('objectid', (int) $row[$idCol])
- ->execute();
+ if ($this->connection->getShardDefinition('filecache')) {
+ $sourceIdChunks = $this->getItemIds($table, $idCol, $typeCol, 1000);
+ foreach ($sourceIdChunks as $sourceIdChunk) {
+ $deletedSources = $this->findMissingSources($sourceIdChunk);
+ $deleteQuery->setParameter('objectid', $deletedSources, IQueryBuilder::PARAM_INT_ARRAY);
+ $deletedEntries += $deleteQuery->executeStatement();
+ }
+ } else {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('t1.' . $idCol)
+ ->from($table, 't1')
+ ->where($query->expr()->eq($typeCol, $query->expr()->literal('files')))
+ ->leftJoin('t1', 'filecache', 't2', $query->expr()->eq($query->expr()->castColumn('t1.' . $idCol, IQueryBuilder::PARAM_INT), 't2.fileid'))
+ ->andWhere($query->expr()->isNull('t2.fileid'))
+ ->groupBy('t1.' . $idCol)
+ ->setMaxResults(self::CHUNK_SIZE);
+
+ $deleteQuery = $this->connection->getQueryBuilder();
+ $deleteQuery->delete($table)
+ ->where($deleteQuery->expr()->in($idCol, $deleteQuery->createParameter('objectid')));
+
+ $deletedInLastChunk = self::CHUNK_SIZE;
+ while ($deletedInLastChunk === self::CHUNK_SIZE) {
+ $chunk = $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+ $deletedInLastChunk = count($chunk);
+
+ $deleteQuery->setParameter('objectid', $chunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $deletedEntries += $deleteQuery->executeStatement();
}
- $result->closeCursor();
}
return $deletedEntries;
}
/**
+ * @param string $table
+ * @param string $idCol
+ * @param string $typeCol
+ * @param int $chunkSize
+ * @return \Iterator<int[]>
+ * @throws \OCP\DB\Exception
+ */
+ private function getItemIds(string $table, string $idCol, string $typeCol, int $chunkSize): \Iterator {
+ $query = $this->connection->getQueryBuilder();
+ $query->select($idCol)
+ ->from($table)
+ ->where($query->expr()->eq($typeCol, $query->expr()->literal('files')))
+ ->groupBy($idCol)
+ ->andWhere($query->expr()->gt($idCol, $query->createParameter('min_id')))
+ ->setMaxResults($chunkSize);
+
+ $minId = 0;
+ while (true) {
+ $query->setParameter('min_id', $minId);
+ $rows = $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+ if (count($rows) > 0) {
+ $minId = $rows[count($rows) - 1];
+ yield $rows;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function findMissingSources(array $ids): array {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->select('fileid')
+ ->from('filecache')
+ ->where($qb->expr()->in('fileid', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)));
+ $found = $qb->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+ return array_diff($ids, $found);
+ }
+
+ /**
* Deleting orphaned system tag mappings
*
* @return int Number of deleted entries
diff --git a/apps/files/lib/BackgroundJob/ScanFiles.php b/apps/files/lib/BackgroundJob/ScanFiles.php
index 07794a28774..f3f9093d648 100644
--- a/apps/files/lib/BackgroundJob/ScanFiles.php
+++ b/apps/files/lib/BackgroundJob/ScanFiles.php
@@ -1,30 +1,16 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\BackgroundJob;
use OC\Files\Utils\Scanner;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\TimedJob;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
@@ -37,36 +23,23 @@ use Psr\Log\LoggerInterface;
*
* @package OCA\Files\BackgroundJob
*/
-class ScanFiles extends \OC\BackgroundJob\TimedJob {
- /** @var IConfig */
- private $config;
- /** @var IEventDispatcher */
- private $dispatcher;
- private LoggerInterface $logger;
- private $connection;
-
+class ScanFiles extends TimedJob {
/** Amount of users that should get scanned per execution */
public const USERS_PER_SESSION = 500;
public function __construct(
- IConfig $config,
- IEventDispatcher $dispatcher,
- LoggerInterface $logger,
- IDBConnection $connection
+ private IConfig $config,
+ private IEventDispatcher $dispatcher,
+ private LoggerInterface $logger,
+ private IDBConnection $connection,
+ ITimeFactory $time,
) {
+ parent::__construct($time);
// Run once per 10 minutes
$this->setInterval(60 * 10);
-
- $this->config = $config;
- $this->dispatcher = $dispatcher;
- $this->logger = $logger;
- $this->connection = $connection;
}
- /**
- * @param string $user
- */
- protected function runScanner(string $user) {
+ protected function runScanner(string $user): void {
try {
$scanner = new Scanner(
$user,
@@ -87,15 +60,61 @@ class ScanFiles extends \OC\BackgroundJob\TimedJob {
* @return string|false
*/
private function getUserToScan() {
+ if ($this->connection->getShardDefinition('filecache')) {
+ // for sharded filecache, the "LIMIT" from the normal query doesn't work
+
+ // first we try it with a "LEFT JOIN" on mounts, this is fast, but might return a storage that isn't mounted.
+ // we also ask for up to 10 results from different storages to increase the odds of finding a result that is mounted
+ $query = $this->connection->getQueryBuilder();
+ $query->select('m.user_id')
+ ->from('filecache', 'f')
+ ->leftJoin('f', 'mounts', 'm', $query->expr()->eq('m.storage_id', 'f.storage'))
+ ->where($query->expr()->eq('f.size', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->andWhere($query->expr()->gt('f.parent', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->setMaxResults(10)
+ ->groupBy('f.storage')
+ ->runAcrossAllShards();
+
+ $result = $query->executeQuery();
+ while ($res = $result->fetch()) {
+ if ($res['user_id']) {
+ return $res['user_id'];
+ }
+ }
+
+ // as a fallback, we try a slower approach where we find all mounted storages first
+ // this is essentially doing the inner join manually
+ $storages = $this->getAllMountedStorages();
+
+ $query = $this->connection->getQueryBuilder();
+ $query->select('m.user_id')
+ ->from('filecache', 'f')
+ ->leftJoin('f', 'mounts', 'm', $query->expr()->eq('m.storage_id', 'f.storage'))
+ ->where($query->expr()->eq('f.size', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->andWhere($query->expr()->gt('f.parent', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->andWhere($query->expr()->in('f.storage', $query->createNamedParameter($storages, IQueryBuilder::PARAM_INT_ARRAY)))
+ ->setMaxResults(1)
+ ->runAcrossAllShards();
+ return $query->executeQuery()->fetchOne();
+ } else {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('m.user_id')
+ ->from('filecache', 'f')
+ ->innerJoin('f', 'mounts', 'm', $query->expr()->eq('m.storage_id', 'f.storage'))
+ ->where($query->expr()->eq('f.size', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->andWhere($query->expr()->gt('f.parent', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
+ ->setMaxResults(1)
+ ->runAcrossAllShards();
+
+ return $query->executeQuery()->fetchOne();
+ }
+ }
+
+ private function getAllMountedStorages(): array {
$query = $this->connection->getQueryBuilder();
- $query->select('user_id')
- ->from('filecache', 'f')
- ->innerJoin('f', 'mounts', 'm', $query->expr()->eq('storage_id', 'storage'))
- ->where($query->expr()->lt('size', $query->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
- ->andWhere($query->expr()->gt('parent', $query->createNamedParameter(-1, IQueryBuilder::PARAM_INT)))
- ->setMaxResults(1);
-
- return $query->execute()->fetchOne();
+ $query->selectDistinct('storage_id')
+ ->from('mounts');
+ return $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
}
/**
diff --git a/apps/files/lib/BackgroundJob/TransferOwnership.php b/apps/files/lib/BackgroundJob/TransferOwnership.php
index 8c96fcf8385..de8d1989733 100644
--- a/apps/files/lib/BackgroundJob/TransferOwnership.php
+++ b/apps/files/lib/BackgroundJob/TransferOwnership.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\BackgroundJob;
@@ -33,46 +16,23 @@ use OCA\Files\Service\OwnershipTransferService;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\QueuedJob;
use OCP\Files\IRootFolder;
-use OCP\ILogger;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Notification\IManager as NotificationManager;
+use Psr\Log\LoggerInterface;
use function ltrim;
class TransferOwnership extends QueuedJob {
-
- /** @var IUserManager $userManager */
- private $userManager;
-
- /** @var OwnershipTransferService */
- private $transferService;
-
- /** @var ILogger */
- private $logger;
-
- /** @var NotificationManager */
- private $notificationManager;
-
- /** @var TransferOwnershipMapper */
- private $mapper;
- /** @var IRootFolder */
- private $rootFolder;
-
- public function __construct(ITimeFactory $timeFactory,
- IUserManager $userManager,
- OwnershipTransferService $transferService,
- ILogger $logger,
- NotificationManager $notificationManager,
- TransferOwnershipMapper $mapper,
- IRootFolder $rootFolder) {
+ public function __construct(
+ ITimeFactory $timeFactory,
+ private IUserManager $userManager,
+ private OwnershipTransferService $transferService,
+ private LoggerInterface $logger,
+ private NotificationManager $notificationManager,
+ private TransferOwnershipMapper $mapper,
+ private IRootFolder $rootFolder,
+ ) {
parent::__construct($timeFactory);
-
- $this->userManager = $userManager;
- $this->transferService = $transferService;
- $this->logger = $logger;
- $this->notificationManager = $notificationManager;
- $this->mapper = $mapper;
- $this->rootFolder = $rootFolder;
}
protected function run($argument) {
@@ -84,14 +44,14 @@ class TransferOwnership extends QueuedJob {
$fileId = $transfer->getFileId();
$userFolder = $this->rootFolder->getUserFolder($sourceUser);
- $nodes = $userFolder->getById($fileId);
+ $node = $userFolder->getFirstNodeById($fileId);
- if (empty($nodes)) {
+ if (!$node) {
$this->logger->alert('Could not transfer ownership: Node not found');
$this->failedNotication($transfer);
return;
}
- $path = $userFolder->getRelativePath($nodes[0]->getPath());
+ $path = $userFolder->getRelativePath($node->getPath());
$sourceUserObject = $this->userManager->get($sourceUser);
$destinationUserObject = $this->userManager->get($destinationUser);
@@ -116,7 +76,12 @@ class TransferOwnership extends QueuedJob {
);
$this->successNotification($transfer);
} catch (TransferOwnershipException $e) {
- $this->logger->logException($e);
+ $this->logger->error(
+ $e->getMessage(),
+ [
+ 'exception' => $e,
+ ],
+ );
$this->failedNotication($transfer);
}
@@ -136,7 +101,6 @@ class TransferOwnership extends QueuedJob {
])
->setObject('transfer', (string)$transfer->getId());
$this->notificationManager->notify($notification);
-
// Send notification to source user
$notification = $this->notificationManager->createNotification();
$notification->setUser($transfer->getTargetUser())
diff --git a/apps/files/lib/Capabilities.php b/apps/files/lib/Capabilities.php
index 29abfb5b253..6b50e5807a5 100644
--- a/apps/files/lib/Capabilities.php
+++ b/apps/files/lib/Capabilities.php
@@ -1,76 +1,50 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Tom Needham <tom@owncloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files;
-use OCA\Files\Service\DirectEditingService;
+use OC\Files\FilenameValidator;
+use OCA\Files\Service\ChunkedUploadConfig;
use OCP\Capabilities\ICapability;
-use OCP\IConfig;
-use OCP\IURLGenerator;
+use OCP\Files\Conversion\ConversionMimeProvider;
+use OCP\Files\Conversion\IConversionManager;
-/**
- * Class Capabilities
- *
- * @package OCA\Files
- */
class Capabilities implements ICapability {
- /** @var IConfig */
- protected $config;
-
- /** @var DirectEditingService */
- protected $directEditingService;
-
- /** @var IURLGenerator */
- private $urlGenerator;
-
- /**
- * Capabilities constructor.
- *
- * @param IConfig $config
- */
- public function __construct(IConfig $config, DirectEditingService $directEditingService, IURLGenerator $urlGenerator) {
- $this->config = $config;
- $this->directEditingService = $directEditingService;
- $this->urlGenerator = $urlGenerator;
+ public function __construct(
+ protected FilenameValidator $filenameValidator,
+ protected IConversionManager $fileConversionManager,
+ ) {
}
/**
* Return this classes capabilities
*
- * @return array
+ * @return array{files: array{'$comment': ?string, bigfilechunking: bool, blacklisted_files: list<mixed>, forbidden_filenames: list<string>, forbidden_filename_basenames: list<string>, forbidden_filename_characters: list<string>, forbidden_filename_extensions: list<string>, chunked_upload: array{max_size: int, max_parallel_count: int}, file_conversions: list<array{from: string, to: string, extension: string, displayName: string}>}}
*/
- public function getCapabilities() {
+ public function getCapabilities(): array {
return [
'files' => [
+ '$comment' => '"blacklisted_files" is deprecated as of Nextcloud 30, use "forbidden_filenames" instead',
+ 'blacklisted_files' => $this->filenameValidator->getForbiddenFilenames(),
+ 'forbidden_filenames' => $this->filenameValidator->getForbiddenFilenames(),
+ 'forbidden_filename_basenames' => $this->filenameValidator->getForbiddenBasenames(),
+ 'forbidden_filename_characters' => $this->filenameValidator->getForbiddenCharacters(),
+ 'forbidden_filename_extensions' => $this->filenameValidator->getForbiddenExtensions(),
+
'bigfilechunking' => true,
- 'blacklisted_files' => $this->config->getSystemValue('blacklisted_files', ['.htaccess']),
- 'directEditing' => [
- 'url' => $this->urlGenerator->linkToOCSRouteAbsolute('files.DirectEditing.info'),
- 'etag' => $this->directEditingService->getDirectEditingETag()
- ]
+ 'chunked_upload' => [
+ 'max_size' => ChunkedUploadConfig::getMaxChunkSize(),
+ 'max_parallel_count' => ChunkedUploadConfig::getMaxParallelCount(),
+ ],
+
+ 'file_conversions' => array_map(function (ConversionMimeProvider $mimeProvider) {
+ return $mimeProvider->jsonSerialize();
+ }, $this->fileConversionManager->getProviders()),
],
];
}
diff --git a/apps/files/lib/Collaboration/Resources/Listener.php b/apps/files/lib/Collaboration/Resources/Listener.php
index 5cf84316578..e4ff5d83b7a 100644
--- a/apps/files/lib/Collaboration/Resources/Listener.php
+++ b/apps/files/lib/Collaboration/Resources/Listener.php
@@ -3,43 +3,30 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Collaboration\Resources;
use OCP\Collaboration\Resources\IManager;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Server;
+use OCP\Share\Events\ShareCreatedEvent;
+use OCP\Share\Events\ShareDeletedEvent;
+use OCP\Share\Events\ShareDeletedFromSelfEvent;
class Listener {
- public static function register(EventDispatcherInterface $dispatcher): void {
- $dispatcher->addListener('OCP\Share::postShare', [self::class, 'shareModification']);
- $dispatcher->addListener('OCP\Share::postUnshare', [self::class, 'shareModification']);
- $dispatcher->addListener('OCP\Share::postUnshareFromSelf', [self::class, 'shareModification']);
+ public static function register(IEventDispatcher $dispatcher): void {
+ $dispatcher->addListener(ShareCreatedEvent::class, [self::class, 'shareModification']);
+ $dispatcher->addListener(ShareDeletedEvent::class, [self::class, 'shareModification']);
+ $dispatcher->addListener(ShareDeletedFromSelfEvent::class, [self::class, 'shareModification']);
}
public static function shareModification(): void {
/** @var IManager $resourceManager */
- $resourceManager = \OC::$server->query(IManager::class);
+ $resourceManager = Server::get(IManager::class);
/** @var ResourceProvider $resourceProvider */
- $resourceProvider = \OC::$server->query(ResourceProvider::class);
+ $resourceProvider = Server::get(ResourceProvider::class);
$resourceManager->invalidateAccessCacheForProvider($resourceProvider);
}
diff --git a/apps/files/lib/Collaboration/Resources/ResourceProvider.php b/apps/files/lib/Collaboration/Resources/ResourceProvider.php
index 841a2bdd4f7..73883bc4c6a 100644
--- a/apps/files/lib/Collaboration/Resources/ResourceProvider.php
+++ b/apps/files/lib/Collaboration/Resources/ResourceProvider.php
@@ -3,26 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2018 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Collaboration\Resources;
@@ -38,32 +20,24 @@ use OCP\IUser;
class ResourceProvider implements IProvider {
public const RESOURCE_TYPE = 'file';
- /** @var IRootFolder */
- protected $rootFolder;
- /** @var IPreview */
- private $preview;
- /** @var IURLGenerator */
- private $urlGenerator;
-
/** @var array */
protected $nodes = [];
- public function __construct(IRootFolder $rootFolder,
- IPreview $preview,
- IURLGenerator $urlGenerator) {
- $this->rootFolder = $rootFolder;
- $this->preview = $preview;
- $this->urlGenerator = $urlGenerator;
+ public function __construct(
+ protected IRootFolder $rootFolder,
+ private IPreview $preview,
+ private IURLGenerator $urlGenerator,
+ ) {
}
private function getNode(IResource $resource): ?Node {
- if (isset($this->nodes[(int) $resource->getId()])) {
- return $this->nodes[(int) $resource->getId()];
+ if (isset($this->nodes[(int)$resource->getId()])) {
+ return $this->nodes[(int)$resource->getId()];
}
- $nodes = $this->rootFolder->getById((int) $resource->getId());
- if (!empty($nodes)) {
- $this->nodes[(int) $resource->getId()] = array_shift($nodes);
- return $this->nodes[(int) $resource->getId()];
+ $node = $this->rootFolder->getFirstNodeById((int)$resource->getId());
+ if ($node) {
+ $this->nodes[(int)$resource->getId()] = $node;
+ return $this->nodes[(int)$resource->getId()];
}
return null;
}
@@ -74,8 +48,8 @@ class ResourceProvider implements IProvider {
* @since 16.0.0
*/
public function getResourceRichObject(IResource $resource): array {
- if (isset($this->nodes[(int) $resource->getId()])) {
- $node = $this->nodes[(int) $resource->getId()]->getPath();
+ if (isset($this->nodes[(int)$resource->getId()])) {
+ $node = $this->nodes[(int)$resource->getId()]->getPath();
} else {
$node = $this->getNode($resource);
}
@@ -107,16 +81,16 @@ class ResourceProvider implements IProvider {
* @return bool
* @since 16.0.0
*/
- public function canAccessResource(IResource $resource, IUser $user = null): bool {
+ public function canAccessResource(IResource $resource, ?IUser $user = null): bool {
if (!$user instanceof IUser) {
return false;
}
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
- $nodes = $userFolder->getById((int) $resource->getId());
+ $node = $userFolder->getById((int)$resource->getId());
- if (!empty($nodes)) {
- $this->nodes[(int) $resource->getId()] = array_shift($nodes);
+ if ($node) {
+ $this->nodes[(int)$resource->getId()] = $node;
return true;
}
diff --git a/apps/files/lib/Command/Copy.php b/apps/files/lib/Command/Copy.php
new file mode 100644
index 00000000000..ad0dfa90de1
--- /dev/null
+++ b/apps/files/lib/Command/Copy.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\Folder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Copy extends Command {
+ public function __construct(
+ private FileUtils $fileUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:copy')
+ ->setDescription('Copy a file or folder')
+ ->addArgument('source', InputArgument::REQUIRED, 'Source file id or path')
+ ->addArgument('target', InputArgument::REQUIRED, 'Target path')
+ ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for confirmation and don't output any warnings")
+ ->addOption('no-target-directory', 'T', InputOption::VALUE_NONE, 'When target path is folder, overwrite the folder instead of copying into the folder');
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $sourceInput = $input->getArgument('source');
+ $targetInput = $input->getArgument('target');
+ $force = $input->getOption('force');
+ $noTargetDir = $input->getOption('no-target-directory');
+
+ $node = $this->fileUtils->getNode($sourceInput);
+ $targetNode = $this->fileUtils->getNode($targetInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $sourceInput not found</error>");
+ return 1;
+ }
+
+ $targetParentPath = dirname(rtrim($targetInput, '/'));
+ $targetParent = $this->fileUtils->getNode($targetParentPath);
+ if (!$targetParent) {
+ $output->writeln("<error>Target parent path $targetParentPath doesn't exist</error>");
+ return 1;
+ }
+
+ $wouldRequireDelete = false;
+
+ if ($targetNode) {
+ if (!$targetNode->isUpdateable()) {
+ $output->writeln("<error>$targetInput isn't writable</error>");
+ return 1;
+ }
+
+ if ($targetNode instanceof Folder) {
+ if ($noTargetDir) {
+ if (!$force) {
+ $output->writeln("Warning: <info>$sourceInput</info> is a file, but <info>$targetInput</info> is a folder");
+ }
+ $wouldRequireDelete = true;
+ } else {
+ $targetInput = $targetNode->getFullPath($node->getName());
+ $targetNode = $this->fileUtils->getNode($targetInput);
+ }
+ } else {
+ if ($node instanceof Folder) {
+ if (!$force) {
+ $output->writeln("Warning: <info>$sourceInput</info> is a folder, but <info>$targetInput</info> is a file");
+ }
+ $wouldRequireDelete = true;
+ }
+ }
+
+ if ($wouldRequireDelete && $targetNode->getInternalPath() === '') {
+ $output->writeln("<error>Mount root can't be overwritten with a different type</error>");
+ return 1;
+ }
+
+ if ($wouldRequireDelete && !$targetNode->isDeletable()) {
+ $output->writeln("<error>$targetInput can't be deleted to be replaced with $sourceInput</error>");
+ return 1;
+ }
+
+ if (!$force && $targetNode) {
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+
+ $question = new ConfirmationQuestion('<info>' . $targetInput . '</info> already exists, overwrite? [y/N] ', false);
+ if (!$helper->ask($input, $output, $question)) {
+ return 1;
+ }
+ }
+ }
+
+ if ($wouldRequireDelete && $targetNode) {
+ $targetNode->delete();
+ }
+
+ $node->copy($targetInput);
+
+ return 0;
+ }
+
+}
diff --git a/apps/files/lib/Command/Delete.php b/apps/files/lib/Command/Delete.php
new file mode 100644
index 00000000000..d984f839c91
--- /dev/null
+++ b/apps/files/lib/Command/Delete.php
@@ -0,0 +1,99 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCA\Files_Sharing\SharedStorage;
+use OCP\Files\Folder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Delete extends Command {
+ public function __construct(
+ private FileUtils $fileUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:delete')
+ ->setDescription('Delete a file or folder')
+ ->addArgument('file', InputArgument::REQUIRED, 'File id or path')
+ ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $fileInput = $input->getArgument('file');
+ $inputIsId = is_numeric($fileInput);
+ $force = $input->getOption('force');
+ $node = $this->fileUtils->getNode($fileInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $fileInput not found</error>");
+ return self::FAILURE;
+ }
+
+ $deleteConfirmed = $force;
+ if (!$deleteConfirmed) {
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $storage = $node->getStorage();
+ if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') {
+ /** @var SharedStorage $storage */
+ [,$user] = explode('/', $fileInput, 3);
+ $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file from <info>$user</info> instead of deleting the source file? [Y/n] ", true);
+ if ($helper->ask($input, $output, $question)) {
+ $storage->unshareStorage();
+ return self::SUCCESS;
+ } else {
+ $node = $storage->getShare()->getNode();
+ $output->writeln('');
+ }
+ }
+
+ $filesByUsers = $this->fileUtils->getFilesByUser($node);
+ if (count($filesByUsers) > 1) {
+ $output->writeln('Warning: the provided file is accessible by more than one user');
+ $output->writeln(' all of the following users will lose access to the file when deleted:');
+ $output->writeln('');
+ foreach ($filesByUsers as $user => $filesByUser) {
+ $output->writeln($user . ':');
+ foreach ($filesByUser as $file) {
+ $output->writeln(' - ' . $file->getPath());
+ }
+ }
+ $output->writeln('');
+ }
+
+ if ($node instanceof Folder) {
+ $maybeContents = " and all it's contents";
+ } else {
+ $maybeContents = '';
+ }
+ $question = new ConfirmationQuestion('Delete ' . $node->getPath() . $maybeContents . '? [y/N] ', false);
+ $deleteConfirmed = $helper->ask($input, $output, $question);
+ }
+
+ if ($deleteConfirmed) {
+ if ($node->isDeletable()) {
+ $node->delete();
+ } else {
+ $output->writeln('<error>File cannot be deleted, insufficient permissions.</error>');
+ }
+ }
+
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Command/DeleteOrphanedFiles.php b/apps/files/lib/Command/DeleteOrphanedFiles.php
index e3305fe3b9b..37cb3159f4a 100644
--- a/apps/files/lib/Command/DeleteOrphanedFiles.php
+++ b/apps/files/lib/Command/DeleteOrphanedFiles.php
@@ -1,32 +1,17 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Command;
+use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
@@ -35,56 +20,123 @@ use Symfony\Component\Console\Output\OutputInterface;
class DeleteOrphanedFiles extends Command {
public const CHUNK_SIZE = 200;
- /**
- * @var IDBConnection
- */
- protected $connection;
-
- public function __construct(IDBConnection $connection) {
- $this->connection = $connection;
+ public function __construct(
+ protected IDBConnection $connection,
+ ) {
parent::__construct();
}
- protected function configure() {
+ protected function configure(): void {
$this
->setName('files:cleanup')
- ->setDescription('cleanup filecache');
+ ->setDescription('Clean up orphaned filecache and mount entries')
+ ->setHelp('Deletes orphaned filecache and mount entries (those without an existing storage).')
+ ->addOption('skip-filecache-extended', null, InputOption::VALUE_NONE, 'don\'t remove orphaned entries from filecache_extended');
}
public function execute(InputInterface $input, OutputInterface $output): int {
- $deletedEntries = 0;
+ $fileIdsByStorage = [];
+
+ $deletedStorages = array_diff($this->getReferencedStorages(), $this->getExistingStorages());
+
+ $deleteExtended = !$input->getOption('skip-filecache-extended');
+ if ($deleteExtended) {
+ $fileIdsByStorage = $this->getFileIdsForStorages($deletedStorages);
+ }
+
+ $deletedEntries = $this->cleanupOrphanedFileCache($deletedStorages);
+ $output->writeln("$deletedEntries orphaned file cache entries deleted");
+ if ($deleteExtended) {
+ $deletedFileCacheExtended = $this->cleanupOrphanedFileCacheExtended($fileIdsByStorage);
+ $output->writeln("$deletedFileCacheExtended orphaned file cache extended entries deleted");
+ }
+
+ $deletedMounts = $this->cleanupOrphanedMounts();
+ $output->writeln("$deletedMounts orphaned mount entries deleted");
+
+ return self::SUCCESS;
+ }
+
+ private function getReferencedStorages(): array {
$query = $this->connection->getQueryBuilder();
- $query->select('fc.fileid')
- ->from('filecache', 'fc')
- ->where($query->expr()->isNull('s.numeric_id'))
- ->leftJoin('fc', 'storages', 's', $query->expr()->eq('fc.storage', 's.numeric_id'))
- ->setMaxResults(self::CHUNK_SIZE);
+ $query->select('storage')
+ ->from('filecache')
+ ->groupBy('storage')
+ ->runAcrossAllShards();
+ return $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+ }
+
+ private function getExistingStorages(): array {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('numeric_id')
+ ->from('storages')
+ ->groupBy('numeric_id');
+ return $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+ }
+
+ /**
+ * @param int[] $storageIds
+ * @return array<int, int[]>
+ */
+ private function getFileIdsForStorages(array $storageIds): array {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('storage', 'fileid')
+ ->from('filecache')
+ ->where($query->expr()->in('storage', $query->createParameter('storage_ids')));
+
+ $result = [];
+ $storageIdChunks = array_chunk($storageIds, self::CHUNK_SIZE);
+ foreach ($storageIdChunks as $storageIdChunk) {
+ $query->setParameter('storage_ids', $storageIdChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $chunk = $query->executeQuery()->fetchAll();
+ foreach ($chunk as $row) {
+ $result[$row['storage']][] = $row['fileid'];
+ }
+ }
+ return $result;
+ }
+
+ private function cleanupOrphanedFileCache(array $deletedStorages): int {
+ $deletedEntries = 0;
$deleteQuery = $this->connection->getQueryBuilder();
$deleteQuery->delete('filecache')
- ->where($deleteQuery->expr()->eq('fileid', $deleteQuery->createParameter('objectid')));
+ ->where($deleteQuery->expr()->in('storage', $deleteQuery->createParameter('storage_ids')));
- $deletedInLastChunk = self::CHUNK_SIZE;
- while ($deletedInLastChunk === self::CHUNK_SIZE) {
- $deletedInLastChunk = 0;
- $result = $query->execute();
- while ($row = $result->fetch()) {
- $deletedInLastChunk++;
- $deletedEntries += $deleteQuery->setParameter('objectid', (int) $row['fileid'])
- ->execute();
- }
- $result->closeCursor();
+ $deletedStorageChunks = array_chunk($deletedStorages, self::CHUNK_SIZE);
+ foreach ($deletedStorageChunks as $deletedStorageChunk) {
+ $deleteQuery->setParameter('storage_ids', $deletedStorageChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $deletedEntries += $deleteQuery->executeStatement();
}
- $output->writeln("$deletedEntries orphaned file cache entries deleted");
+ return $deletedEntries;
+ }
- $deletedMounts = $this->cleanupOrphanedMounts();
- $output->writeln("$deletedMounts orphaned mount entries deleted");
- return 0;
+ /**
+ * @param array<int, int[]> $fileIdsByStorage
+ * @return int
+ */
+ private function cleanupOrphanedFileCacheExtended(array $fileIdsByStorage): int {
+ $deletedEntries = 0;
+
+ $deleteQuery = $this->connection->getQueryBuilder();
+ $deleteQuery->delete('filecache_extended')
+ ->where($deleteQuery->expr()->in('fileid', $deleteQuery->createParameter('file_ids')));
+
+ foreach ($fileIdsByStorage as $storageId => $fileIds) {
+ $deleteQuery->hintShardKey('storage', $storageId, true);
+ $fileChunks = array_chunk($fileIds, self::CHUNK_SIZE);
+ foreach ($fileChunks as $fileChunk) {
+ $deleteQuery->setParameter('file_ids', $fileChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $deletedEntries += $deleteQuery->executeStatement();
+ }
+ }
+
+ return $deletedEntries;
}
- private function cleanupOrphanedMounts() {
+ private function cleanupOrphanedMounts(): int {
$deletedEntries = 0;
$query = $this->connection->getQueryBuilder();
@@ -102,11 +154,11 @@ class DeleteOrphanedFiles extends Command {
$deletedInLastChunk = self::CHUNK_SIZE;
while ($deletedInLastChunk === self::CHUNK_SIZE) {
$deletedInLastChunk = 0;
- $result = $query->execute();
+ $result = $query->executeQuery();
while ($row = $result->fetch()) {
$deletedInLastChunk++;
- $deletedEntries += $deleteQuery->setParameter('storageid', (int) $row['storage_id'])
- ->execute();
+ $deletedEntries += $deleteQuery->setParameter('storageid', (int)$row['storage_id'])
+ ->executeStatement();
}
$result->closeCursor();
}
diff --git a/apps/files/lib/Command/Get.php b/apps/files/lib/Command/Get.php
new file mode 100644
index 00000000000..60e028f615e
--- /dev/null
+++ b/apps/files/lib/Command/Get.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\File;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Get extends Command {
+ public function __construct(
+ private FileUtils $fileUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:get')
+ ->setDescription('Get the contents of a file')
+ ->addArgument('file', InputArgument::REQUIRED, 'Source file id or Nextcloud path')
+ ->addArgument('output', InputArgument::OPTIONAL, 'Target local file to output to, defaults to STDOUT');
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $fileInput = $input->getArgument('file');
+ $outputName = $input->getArgument('output');
+ $node = $this->fileUtils->getNode($fileInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $fileInput not found</error>");
+ return self::FAILURE;
+ }
+
+ if (!($node instanceof File)) {
+ $output->writeln("<error>$fileInput is a directory</error>");
+ return self::FAILURE;
+ }
+
+ $isTTY = stream_isatty(STDOUT);
+ if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
+ $output->writeln([
+ '<error>Warning: Binary output can mess up your terminal</error>',
+ " Use <info>occ files:get $fileInput -</info> to output it to the terminal anyway",
+ " Or <info>occ files:get $fileInput <FILE></info> to save to a file instead"
+ ]);
+ return self::FAILURE;
+ }
+ $source = $node->fopen('r');
+ if (!$source) {
+ $output->writeln("<error>Failed to open $fileInput for reading</error>");
+ return self::FAILURE;
+ }
+ $target = ($outputName === null || $outputName === '-') ? STDOUT : fopen($outputName, 'w');
+ if (!$target) {
+ $output->writeln("<error>Failed to open $outputName for reading</error>");
+ return self::FAILURE;
+ }
+
+ stream_copy_to_stream($source, $target);
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Command/Move.php b/apps/files/lib/Command/Move.php
new file mode 100644
index 00000000000..29dd8860b2a
--- /dev/null
+++ b/apps/files/lib/Command/Move.php
@@ -0,0 +1,106 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\File;
+use OCP\Files\Folder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Move extends Command {
+ public function __construct(
+ private FileUtils $fileUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:move')
+ ->setDescription('Move a file or folder')
+ ->addArgument('source', InputArgument::REQUIRED, 'Source file id or path')
+ ->addArgument('target', InputArgument::REQUIRED, 'Target path')
+ ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $sourceInput = $input->getArgument('source');
+ $targetInput = $input->getArgument('target');
+ $force = $input->getOption('force');
+
+ $node = $this->fileUtils->getNode($sourceInput);
+ $targetNode = $this->fileUtils->getNode($targetInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $sourceInput not found</error>");
+ return 1;
+ }
+
+ $targetParentPath = dirname(rtrim($targetInput, '/'));
+ $targetParent = $this->fileUtils->getNode($targetParentPath);
+ if (!$targetParent) {
+ $output->writeln("<error>Target parent path $targetParentPath doesn't exist</error>");
+ return 1;
+ }
+
+ $wouldRequireDelete = false;
+
+ if ($targetNode) {
+ if (!$targetNode->isUpdateable()) {
+ $output->writeln("<error>$targetInput already exists and isn't writable</error>");
+ return 1;
+ }
+
+ if ($node instanceof Folder && $targetNode instanceof File) {
+ $output->writeln("Warning: <info>$sourceInput</info> is a folder, but <info>$targetInput</info> is a file");
+ $wouldRequireDelete = true;
+ }
+
+ if ($node instanceof File && $targetNode instanceof Folder) {
+ $output->writeln("Warning: <info>$sourceInput</info> is a file, but <info>$targetInput</info> is a folder");
+ $wouldRequireDelete = true;
+ }
+
+ if ($wouldRequireDelete && $targetNode->getInternalPath() === '') {
+ $output->writeln("<error>Mount root can't be overwritten with a different type</error>");
+ return 1;
+ }
+
+ if ($wouldRequireDelete && !$targetNode->isDeletable()) {
+ $output->writeln("<error>$targetInput can't be deleted to be replaced with $sourceInput</error>");
+ return 1;
+ }
+
+ if (!$force) {
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+
+ $question = new ConfirmationQuestion('<info>' . $targetInput . '</info> already exists, overwrite? [y/N] ', false);
+ if (!$helper->ask($input, $output, $question)) {
+ return 1;
+ }
+ }
+ }
+
+ if ($wouldRequireDelete && $targetNode) {
+ $targetNode->delete();
+ }
+
+ $node->move($targetInput);
+
+ return 0;
+ }
+
+}
diff --git a/apps/files/lib/Command/Object/Delete.php b/apps/files/lib/Command/Object/Delete.php
new file mode 100644
index 00000000000..07613ecc616
--- /dev/null
+++ b/apps/files/lib/Command/Object/Delete.php
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Delete extends Command {
+ public function __construct(
+ private ObjectUtil $objectUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:object:delete')
+ ->setDescription('Delete an object from the object store')
+ ->addArgument('object', InputArgument::REQUIRED, 'Object to delete')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket to delete the object from, only required in cases where it can't be determined from the config");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $object = $input->getArgument('object');
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return -1;
+ }
+
+ if ($fileId = $this->objectUtils->objectExistsInDb($object)) {
+ $output->writeln("<error>Warning, object $object belongs to an existing file, deleting the object will lead to unexpected behavior if not replaced</error>");
+ $output->writeln(" Note: use <info>occ files:delete $fileId</info> to delete the file cleanly or <info>occ info:file $fileId</info> for more information about the file");
+ $output->writeln('');
+ }
+
+ if (!$objectStore->objectExists($object)) {
+ $output->writeln("<error>Object $object does not exist</error>");
+ return -1;
+ }
+
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $question = new ConfirmationQuestion("Delete $object? [y/N] ", false);
+ if ($helper->ask($input, $output, $question)) {
+ $objectStore->deleteObject($object);
+ }
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Command/Object/Get.php b/apps/files/lib/Command/Object/Get.php
new file mode 100644
index 00000000000..c32de020c5a
--- /dev/null
+++ b/apps/files/lib/Command/Object/Get.php
@@ -0,0 +1,63 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Get extends Command {
+ public function __construct(
+ private ObjectUtil $objectUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:object:get')
+ ->setDescription('Get the contents of an object')
+ ->addArgument('object', InputArgument::REQUIRED, 'Object to get')
+ ->addArgument('output', InputArgument::REQUIRED, 'Target local file to output to, use - for STDOUT')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket to get the object from, only required in cases where it can't be determined from the config");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $object = $input->getArgument('object');
+ $outputName = $input->getArgument('output');
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return self::FAILURE;
+ }
+
+ if (!$objectStore->objectExists($object)) {
+ $output->writeln("<error>Object $object does not exist</error>");
+ return self::FAILURE;
+ }
+
+ try {
+ $source = $objectStore->readObject($object);
+ } catch (\Exception $e) {
+ $msg = $e->getMessage();
+ $output->writeln("<error>Failed to read $object from object store: $msg</error>");
+ return self::FAILURE;
+ }
+ $target = $outputName === '-' ? STDOUT : fopen($outputName, 'w');
+ if (!$target) {
+ $output->writeln("<error>Failed to open $outputName for writing</error>");
+ return self::FAILURE;
+ }
+
+ stream_copy_to_stream($source, $target);
+ return self::SUCCESS;
+ }
+
+}
diff --git a/apps/files/lib/Command/Object/Info.php b/apps/files/lib/Command/Object/Info.php
new file mode 100644
index 00000000000..6748de37cfe
--- /dev/null
+++ b/apps/files/lib/Command/Object/Info.php
@@ -0,0 +1,80 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use OC\Core\Command\Base;
+use OCP\Files\IMimeTypeDetector;
+use OCP\Files\ObjectStore\IObjectStoreMetaData;
+use OCP\Util;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Info extends Base {
+ public function __construct(
+ private ObjectUtil $objectUtils,
+ private IMimeTypeDetector $mimeTypeDetector,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+ $this
+ ->setName('files:object:info')
+ ->setDescription('Get the metadata of an object')
+ ->addArgument('object', InputArgument::REQUIRED, 'Object to get')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket to get the object from, only required in cases where it can't be determined from the config");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $object = $input->getArgument('object');
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return self::FAILURE;
+ }
+
+ if (!$objectStore instanceof IObjectStoreMetaData) {
+ $output->writeln('<error>Configured object store does currently not support retrieve metadata</error>');
+ return self::FAILURE;
+ }
+
+ if (!$objectStore->objectExists($object)) {
+ $output->writeln("<error>Object $object does not exist</error>");
+ return self::FAILURE;
+ }
+
+ try {
+ $meta = $objectStore->getObjectMetaData($object);
+ } catch (\Exception $e) {
+ $msg = $e->getMessage();
+ $output->writeln("<error>Failed to read $object from object store: $msg</error>");
+ return self::FAILURE;
+ }
+
+ if ($input->getOption('output') === 'plain' && isset($meta['size'])) {
+ $meta['size'] = Util::humanFileSize($meta['size']);
+ }
+ if (isset($meta['mtime'])) {
+ $meta['mtime'] = $meta['mtime']->format(\DateTimeImmutable::ATOM);
+ }
+ if (!isset($meta['mimetype'])) {
+ $handle = $objectStore->readObject($object);
+ $head = fread($handle, 8192);
+ fclose($handle);
+ $meta['mimetype'] = $this->mimeTypeDetector->detectString($head);
+ }
+
+ $this->writeArrayInOutputFormat($input, $output, $meta);
+
+ return self::SUCCESS;
+ }
+
+}
diff --git a/apps/files/lib/Command/Object/ListObject.php b/apps/files/lib/Command/Object/ListObject.php
new file mode 100644
index 00000000000..5d30232e09f
--- /dev/null
+++ b/apps/files/lib/Command/Object/ListObject.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use OC\Core\Command\Base;
+use OCP\Files\ObjectStore\IObjectStoreMetaData;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ListObject extends Base {
+ private const CHUNK_SIZE = 100;
+
+ public function __construct(
+ private readonly ObjectUtil $objectUtils,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+ $this
+ ->setName('files:object:list')
+ ->setDescription('List all objects in the object store')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket to list the objects from, only required in cases where it can't be determined from the config");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return self::FAILURE;
+ }
+
+ if (!$objectStore instanceof IObjectStoreMetaData) {
+ $output->writeln('<error>Configured object store does currently not support listing objects</error>');
+ return self::FAILURE;
+ }
+ $objects = $objectStore->listObjects();
+ $objects = $this->objectUtils->formatObjects($objects, $input->getOption('output') === self::OUTPUT_FORMAT_PLAIN);
+ $this->writeStreamingTableInOutputFormat($input, $output, $objects, self::CHUNK_SIZE);
+
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Command/Object/Multi/Rename.php b/apps/files/lib/Command/Object/Multi/Rename.php
new file mode 100644
index 00000000000..562c68eb07f
--- /dev/null
+++ b/apps/files/lib/Command/Object/Multi/Rename.php
@@ -0,0 +1,108 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2025 Robin Appelman <robin@icewind.nl>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object\Multi;
+
+use OC\Core\Command\Base;
+use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
+use OCP\IConfig;
+use OCP\IDBConnection;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Rename extends Base {
+ public function __construct(
+ private readonly IDBConnection $connection,
+ private readonly PrimaryObjectStoreConfig $objectStoreConfig,
+ private readonly IConfig $config,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+ $this
+ ->setName('files:object:multi:rename-config')
+ ->setDescription('Rename an object store configuration and move all users over to the new configuration,')
+ ->addArgument('source', InputArgument::REQUIRED, 'Object store configuration to rename')
+ ->addArgument('target', InputArgument::REQUIRED, 'New name for the object store configuration');
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $source = $input->getArgument('source');
+ $target = $input->getArgument('target');
+
+ $configs = $this->objectStoreConfig->getObjectStoreConfigs();
+ if (!isset($configs[$source])) {
+ $output->writeln('<error>Unknown object store configuration: ' . $source . '</error>');
+ return 1;
+ }
+
+ if ($source === 'root') {
+ $output->writeln('<error>Renaming the root configuration is not supported.</error>');
+ return 1;
+ }
+
+ if ($source === 'default') {
+ $output->writeln('<error>Renaming the default configuration is not supported.</error>');
+ return 1;
+ }
+
+ if (!isset($configs[$target])) {
+ $output->writeln('<comment>Target object store configuration ' . $target . ' doesn\'t exist yet.</comment>');
+ $output->writeln('The target configuration can be created automatically.');
+ $output->writeln('However, as this depends on modifying the config.php, this only works as long as the instance runs on a single node or all nodes in a clustered setup have a shared config file (such as from a shared network mount).');
+ $output->writeln('If the different nodes have a separate copy of the config.php file, the automatic object store configuration creation will lead to the configuration going out of sync.');
+ $output->writeln('If these requirements are not met, you can manually create the target object store configuration in each node\'s configuration before running the command.');
+ $output->writeln('');
+ $output->writeln('<error>Failure to check these requirements will lead to data loss for users.</error>');
+
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $question = new ConfirmationQuestion('Automatically create target object store configuration? [y/N] ', false);
+ if ($helper->ask($input, $output, $question)) {
+ $configs[$target] = $configs[$source];
+
+ // update all aliases
+ foreach ($configs as &$config) {
+ if ($config === $source) {
+ $config = $target;
+ }
+ }
+ $this->config->setSystemValue('objectstore', $configs);
+ } else {
+ return 0;
+ }
+ } elseif (($configs[$source] !== $configs[$target]) || $configs[$source] !== $target) {
+ $output->writeln('<error>Source and target configuration differ.</error>');
+ $output->writeln('');
+ $output->writeln('To ensure proper migration of users, the source and target configuration must be the same to ensure that the objects for the moved users exist on the target configuration.');
+ $output->writeln('The usual migration process consists of creating a clone of the old configuration, moving the users from the old configuration to the new one, and then adjust the old configuration that is longer used.');
+ return 1;
+ }
+
+ $query = $this->connection->getQueryBuilder();
+ $query->update('preferences')
+ ->set('configvalue', $query->createNamedParameter($target))
+ ->where($query->expr()->eq('appid', $query->createNamedParameter('homeobjectstore')))
+ ->andWhere($query->expr()->eq('configkey', $query->createNamedParameter('objectstore')))
+ ->andWhere($query->expr()->eq('configvalue', $query->createNamedParameter($source)));
+ $count = $query->executeStatement();
+
+ if ($count > 0) {
+ $output->writeln('Moved <info>' . $count . '</info> users');
+ } else {
+ $output->writeln('No users moved');
+ }
+
+ return 0;
+ }
+}
diff --git a/apps/files/lib/Command/Object/Multi/Users.php b/apps/files/lib/Command/Object/Multi/Users.php
new file mode 100644
index 00000000000..e8f7d012641
--- /dev/null
+++ b/apps/files/lib/Command/Object/Multi/Users.php
@@ -0,0 +1,98 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2025 Robin Appelman <robin@icewind.nl>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object\Multi;
+
+use OC\Core\Command\Base;
+use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserManager;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Users extends Base {
+ public function __construct(
+ private readonly IUserManager $userManager,
+ private readonly PrimaryObjectStoreConfig $objectStoreConfig,
+ private readonly IConfig $config,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+ $this
+ ->setName('files:object:multi:users')
+ ->setDescription('Get the mapping between users and object store buckets')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, 'Only list users using the specified bucket')
+ ->addOption('object-store', 'o', InputOption::VALUE_REQUIRED, 'Only list users using the specified object store configuration')
+ ->addOption('user', 'u', InputOption::VALUE_REQUIRED, 'Only show the mapping for the specified user, ignores all other options');
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ if ($userId = $input->getOption('user')) {
+ $user = $this->userManager->get($userId);
+ if (!$user) {
+ $output->writeln("<error>User $userId not found</error>");
+ return 1;
+ }
+ $users = new \ArrayIterator([$user]);
+ } else {
+ $bucket = (string)$input->getOption('bucket');
+ $objectStore = (string)$input->getOption('object-store');
+ if ($bucket !== '' && $objectStore === '') {
+ $users = $this->getUsers($this->config->getUsersForUserValue('homeobjectstore', 'bucket', $bucket));
+ } elseif ($bucket === '' && $objectStore !== '') {
+ $users = $this->getUsers($this->config->getUsersForUserValue('homeobjectstore', 'objectstore', $objectStore));
+ } elseif ($bucket) {
+ $users = $this->getUsers(array_intersect(
+ $this->config->getUsersForUserValue('homeobjectstore', 'bucket', $bucket),
+ $this->config->getUsersForUserValue('homeobjectstore', 'objectstore', $objectStore)
+ ));
+ } else {
+ $users = $this->userManager->getSeenUsers();
+ }
+ }
+
+ $this->writeStreamingTableInOutputFormat($input, $output, $this->infoForUsers($users), 100);
+ return 0;
+ }
+
+ /**
+ * @param string[] $userIds
+ * @return \Iterator<IUser>
+ */
+ private function getUsers(array $userIds): \Iterator {
+ foreach ($userIds as $userId) {
+ $user = $this->userManager->get($userId);
+ if ($user) {
+ yield $user;
+ }
+ }
+ }
+
+ /**
+ * @param \Iterator<IUser> $users
+ * @return \Iterator<array>
+ */
+ private function infoForUsers(\Iterator $users): \Iterator {
+ foreach ($users as $user) {
+ yield $this->infoForUser($user);
+ }
+ }
+
+ private function infoForUser(IUser $user): array {
+ return [
+ 'user' => $user->getUID(),
+ 'object-store' => $this->objectStoreConfig->getObjectStoreForUser($user),
+ 'bucket' => $this->objectStoreConfig->getSetBucketForUser($user) ?? 'unset',
+ ];
+ }
+}
diff --git a/apps/files/lib/Command/Object/ObjectUtil.php b/apps/files/lib/Command/Object/ObjectUtil.php
new file mode 100644
index 00000000000..5f053c2c42f
--- /dev/null
+++ b/apps/files/lib/Command/Object/ObjectUtil.php
@@ -0,0 +1,115 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\Files\ObjectStore\IObjectStore;
+use OCP\IConfig;
+use OCP\IDBConnection;
+use OCP\Util;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ObjectUtil {
+ public function __construct(
+ private IConfig $config,
+ private IDBConnection $connection,
+ ) {
+ }
+
+ private function getObjectStoreConfig(): ?array {
+ $config = $this->config->getSystemValue('objectstore_multibucket');
+ if (is_array($config)) {
+ $config['multibucket'] = true;
+ return $config;
+ }
+ $config = $this->config->getSystemValue('objectstore');
+ if (is_array($config)) {
+ if (!isset($config['multibucket'])) {
+ $config['multibucket'] = false;
+ }
+ return $config;
+ }
+
+ return null;
+ }
+
+ public function getObjectStore(?string $bucket, OutputInterface $output): ?IObjectStore {
+ $config = $this->getObjectStoreConfig();
+ if (!$config) {
+ $output->writeln('<error>Instance is not using primary object store</error>');
+ return null;
+ }
+ if ($config['multibucket'] && !$bucket) {
+ $output->writeln('<error>--bucket option required</error> because <info>multi bucket</info> is enabled.');
+ return null;
+ }
+
+ if (!isset($config['arguments'])) {
+ throw new \Exception('no arguments configured for object store configuration');
+ }
+ if (!isset($config['class'])) {
+ throw new \Exception('no class configured for object store configuration');
+ }
+
+ if ($bucket) {
+ // s3, swift
+ $config['arguments']['bucket'] = $bucket;
+ // azure
+ $config['arguments']['container'] = $bucket;
+ }
+
+ $store = new $config['class']($config['arguments']);
+ if (!$store instanceof IObjectStore) {
+ throw new \Exception('configured object store class is not an object store implementation');
+ }
+ return $store;
+ }
+
+ /**
+ * Check if an object is referenced in the database
+ */
+ public function objectExistsInDb(string $object): int|false {
+ if (!str_starts_with($object, 'urn:oid:')) {
+ return false;
+ }
+
+ $fileId = (int)substr($object, strlen('urn:oid:'));
+ $query = $this->connection->getQueryBuilder();
+ $query->select('fileid')
+ ->from('filecache')
+ ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
+ $result = $query->executeQuery();
+
+ if ($result->fetchOne() === false) {
+ return false;
+ }
+
+ return $fileId;
+ }
+
+ public function formatObjects(\Iterator $objects, bool $humanOutput): \Iterator {
+ foreach ($objects as $object) {
+ yield $this->formatObject($object, $humanOutput);
+ }
+ }
+
+ public function formatObject(array $object, bool $humanOutput): array {
+ $row = array_merge([
+ 'urn' => $object['urn'],
+ ], ($object['metadata'] ?? []));
+
+ if ($humanOutput && isset($row['size'])) {
+ $row['size'] = Util::humanFileSize($row['size']);
+ }
+ if (isset($row['mtime'])) {
+ $row['mtime'] = $row['mtime']->format(\DateTimeImmutable::ATOM);
+ }
+ return $row;
+ }
+}
diff --git a/apps/files/lib/Command/Object/Orphans.php b/apps/files/lib/Command/Object/Orphans.php
new file mode 100644
index 00000000000..f7132540fc8
--- /dev/null
+++ b/apps/files/lib/Command/Object/Orphans.php
@@ -0,0 +1,79 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use OC\Core\Command\Base;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\Files\ObjectStore\IObjectStoreMetaData;
+use OCP\IDBConnection;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Orphans extends Base {
+ private const CHUNK_SIZE = 100;
+
+ private ?IQueryBuilder $query = null;
+
+ public function __construct(
+ private readonly ObjectUtil $objectUtils,
+ private readonly IDBConnection $connection,
+ ) {
+ parent::__construct();
+ }
+
+ private function getQuery(): IQueryBuilder {
+ if (!$this->query) {
+ $this->query = $this->connection->getQueryBuilder();
+ $this->query->select('fileid')
+ ->from('filecache')
+ ->where($this->query->expr()->eq('fileid', $this->query->createParameter('file_id')));
+ }
+ return $this->query;
+ }
+
+ protected function configure(): void {
+ parent::configure();
+ $this
+ ->setName('files:object:orphans')
+ ->setDescription('List all objects in the object store that don\'t have a matching entry in the database')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket to list the objects from, only required in cases where it can't be determined from the config");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return self::FAILURE;
+ }
+
+ if (!$objectStore instanceof IObjectStoreMetaData) {
+ $output->writeln('<error>Configured object store does currently not support listing objects</error>');
+ return self::FAILURE;
+ }
+ $prefixLength = strlen('urn:oid:');
+
+ $objects = $objectStore->listObjects('urn:oid:');
+ $orphans = new \CallbackFilterIterator($objects, function (array $object) use ($prefixLength) {
+ $fileId = (int)substr($object['urn'], $prefixLength);
+ return !$this->fileIdInDb($fileId);
+ });
+
+ $orphans = $this->objectUtils->formatObjects($orphans, $input->getOption('output') === self::OUTPUT_FORMAT_PLAIN);
+ $this->writeStreamingTableInOutputFormat($input, $output, $orphans, self::CHUNK_SIZE);
+
+ return self::SUCCESS;
+ }
+
+ private function fileIdInDb(int $fileId): bool {
+ $query = $this->getQuery();
+ $query->setParameter('file_id', $fileId, IQueryBuilder::PARAM_INT);
+ $result = $query->executeQuery();
+ return $result->fetchOne() !== false;
+ }
+}
diff --git a/apps/files/lib/Command/Object/Put.php b/apps/files/lib/Command/Object/Put.php
new file mode 100644
index 00000000000..8516eb51183
--- /dev/null
+++ b/apps/files/lib/Command/Object/Put.php
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command\Object;
+
+use OCP\Files\IMimeTypeDetector;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Put extends Command {
+ public function __construct(
+ private ObjectUtil $objectUtils,
+ private IMimeTypeDetector $mimeTypeDetector,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:object:put')
+ ->setDescription('Write a file to the object store')
+ ->addArgument('input', InputArgument::REQUIRED, 'Source local path, use - to read from STDIN')
+ ->addArgument('object', InputArgument::REQUIRED, 'Object to write')
+ ->addOption('bucket', 'b', InputOption::VALUE_REQUIRED, "Bucket where to store the object, only required in cases where it can't be determined from the config");
+ ;
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $object = $input->getArgument('object');
+ $inputName = (string)$input->getArgument('input');
+ $objectStore = $this->objectUtils->getObjectStore($input->getOption('bucket'), $output);
+ if (!$objectStore) {
+ return -1;
+ }
+
+ if ($fileId = $this->objectUtils->objectExistsInDb($object)) {
+ $output->writeln("<error>Warning, object $object belongs to an existing file, overwriting the object contents can lead to unexpected behavior.</error>");
+ $output->writeln("You can use <info>occ files:put $inputName $fileId</info> to write to the file safely.");
+ $output->writeln('');
+
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $question = new ConfirmationQuestion('Write to the object anyway? [y/N] ', false);
+ if (!$helper->ask($input, $output, $question)) {
+ return -1;
+ }
+ }
+
+ $source = $inputName === '-' ? STDIN : fopen($inputName, 'r');
+ if (!$source) {
+ $output->writeln("<error>Failed to open $inputName</error>");
+ return self::FAILURE;
+ }
+ $objectStore->writeObject($object, $source, $this->mimeTypeDetector->detectPath($inputName));
+ return self::SUCCESS;
+ }
+
+}
diff --git a/apps/files/lib/Command/Put.php b/apps/files/lib/Command/Put.php
new file mode 100644
index 00000000000..fd9d75db78c
--- /dev/null
+++ b/apps/files/lib/Command/Put.php
@@ -0,0 +1,67 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\File;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Put extends Command {
+ public function __construct(
+ private FileUtils $fileUtils,
+ private IRootFolder $rootFolder,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:put')
+ ->setDescription('Write contents of a file')
+ ->addArgument('input', InputArgument::REQUIRED, 'Source local path, use - to read from STDIN')
+ ->addArgument('file', InputArgument::REQUIRED, 'Target Nextcloud file path to write to or fileid of existing file');
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $fileOutput = $input->getArgument('file');
+ $inputName = $input->getArgument('input');
+ $node = $this->fileUtils->getNode($fileOutput);
+
+ if ($node instanceof Folder) {
+ $output->writeln("<error>$fileOutput is a folder</error>");
+ return self::FAILURE;
+ }
+ if (!$node and is_numeric($fileOutput)) {
+ $output->writeln("<error>$fileOutput not found</error>");
+ return self::FAILURE;
+ }
+
+ $source = ($inputName === null || $inputName === '-') ? STDIN : fopen($inputName, 'r');
+ if (!$source) {
+ $output->writeln("<error>Failed to open $inputName</error>");
+ return self::FAILURE;
+ }
+ if ($node instanceof File) {
+ $target = $node->fopen('w');
+ if (!$target) {
+ $output->writeln("<error>Failed to open $fileOutput</error>");
+ return self::FAILURE;
+ }
+ stream_copy_to_stream($source, $target);
+ } else {
+ $this->rootFolder->newFile($fileOutput, $source);
+ }
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Command/RepairTree.php b/apps/files/lib/Command/RepairTree.php
index 96f114735d6..622ccba48a3 100644
--- a/apps/files/lib/Command/RepairTree.php
+++ b/apps/files/lib/Command/RepairTree.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2021 Robin Appelman <robin@icewind.nl>
- *
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Command;
@@ -33,17 +16,13 @@ use Symfony\Component\Console\Output\OutputInterface;
class RepairTree extends Command {
public const CHUNK_SIZE = 200;
- /**
- * @var IDBConnection
- */
- protected $connection;
-
- public function __construct(IDBConnection $connection) {
- $this->connection = $connection;
+ public function __construct(
+ protected IDBConnection $connection,
+ ) {
parent::__construct();
}
- protected function configure() {
+ protected function configure(): void {
$this
->setName('files:repair-tree')
->setDescription('Try and repair malformed filesystem tree structures')
@@ -54,7 +33,7 @@ class RepairTree extends Command {
$rows = $this->findBrokenTreeBits();
$fix = !$input->getOption('dry-run');
- $output->writeln("Found " . count($rows) . " file entries with an invalid path");
+ $output->writeln('Found ' . count($rows) . ' file entries with an invalid path');
if ($fix) {
$this->connection->beginTransaction();
@@ -68,7 +47,7 @@ class RepairTree extends Command {
->where($query->expr()->eq('fileid', $query->createParameter('fileid')));
foreach ($rows as $row) {
- $output->writeln("Path of file ${row['fileid']} is ${row['path']} but should be ${row['parent_path']}/${row['name']} based on it's parent", OutputInterface::VERBOSITY_VERBOSE);
+ $output->writeln("Path of file {$row['fileid']} is {$row['path']} but should be {$row['parent_path']}/{$row['name']} based on its parent", OutputInterface::VERBOSITY_VERBOSE);
if ($fix) {
$fileId = $this->getFileId((int)$row['parent_storage'], $row['parent_path'] . '/' . $row['name']);
@@ -90,7 +69,7 @@ class RepairTree extends Command {
$this->connection->commit();
}
- return 0;
+ return self::SUCCESS;
}
private function getFileId(int $storage, string $path) {
@@ -102,7 +81,7 @@ class RepairTree extends Command {
return $query->execute()->fetch(\PDO::FETCH_COLUMN);
}
- private function deleteById(int $fileId) {
+ private function deleteById(int $fileId): void {
$query = $this->connection->getQueryBuilder();
$query->delete('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId)));
diff --git a/apps/files/lib/Command/SanitizeFilenames.php b/apps/files/lib/Command/SanitizeFilenames.php
new file mode 100644
index 00000000000..88d41d1cb5e
--- /dev/null
+++ b/apps/files/lib/Command/SanitizeFilenames.php
@@ -0,0 +1,151 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Command;
+
+use Exception;
+use OC\Core\Command\Base;
+use OC\Files\FilenameValidator;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\NotPermittedException;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+use OCP\Lock\LockedException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SanitizeFilenames extends Base {
+
+ private OutputInterface $output;
+ private ?string $charReplacement;
+ private bool $dryRun;
+
+ public function __construct(
+ private IUserManager $userManager,
+ private IRootFolder $rootFolder,
+ private IUserSession $session,
+ private IFactory $l10nFactory,
+ private FilenameValidator $filenameValidator,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+
+ $this
+ ->setName('files:sanitize-filenames')
+ ->setDescription('Renames files to match naming constraints')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ 'will only rename files the given user(s) have access to'
+ )
+ ->addOption(
+ 'dry-run',
+ mode: InputOption::VALUE_NONE,
+ description: 'Do not actually rename any files but just check filenames.',
+ )
+ ->addOption(
+ 'char-replacement',
+ 'c',
+ mode: InputOption::VALUE_REQUIRED,
+ description: 'Replacement for invalid character (by default space, underscore or dash is used)',
+ );
+
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+ $this->charReplacement = $input->getOption('char-replacement');
+ // check if replacement is needed
+ $c = $this->filenameValidator->getForbiddenCharacters();
+ if (count($c) > 0) {
+ try {
+ $this->filenameValidator->sanitizeFilename($c[0], $this->charReplacement);
+ } catch (\InvalidArgumentException) {
+ if ($this->charReplacement === null) {
+ $output->writeln('<error>Character replacement required</error>');
+ } else {
+ $output->writeln('<error>Invalid character replacement given</error>');
+ }
+ return 1;
+ }
+ }
+
+ $this->dryRun = $input->getOption('dry-run');
+ if ($this->dryRun) {
+ $output->writeln('<info>Dry run is enabled, no actual renaming will be applied.</>');
+ }
+
+ $this->output = $output;
+ $users = $input->getArgument('user_id');
+ if (!empty($users)) {
+ foreach ($users as $userId) {
+ $user = $this->userManager->get($userId);
+ if ($user === null) {
+ $output->writeln("<error>User '$userId' does not exist - skipping</>");
+ continue;
+ }
+ $this->sanitizeUserFiles($user);
+ }
+ } else {
+ $this->userManager->callForSeenUsers($this->sanitizeUserFiles(...));
+ }
+ return self::SUCCESS;
+ }
+
+ private function sanitizeUserFiles(IUser $user): void {
+ // Set an active user so that event listeners can correctly work (e.g. files versions)
+ $this->session->setVolatileActiveUser($user);
+
+ $this->output->writeln('<info>Analyzing files of ' . $user->getUID() . '</>');
+
+ $folder = $this->rootFolder->getUserFolder($user->getUID());
+ $this->sanitizeFiles($folder);
+ }
+
+ private function sanitizeFiles(Folder $folder): void {
+ foreach ($folder->getDirectoryListing() as $node) {
+ $this->output->writeln('scanning: ' . $node->getPath(), OutputInterface::VERBOSITY_VERBOSE);
+
+ try {
+ $oldName = $node->getName();
+ $newName = $this->filenameValidator->sanitizeFilename($oldName, $this->charReplacement);
+ if ($oldName !== $newName) {
+ $newName = $folder->getNonExistingName($newName);
+ $path = rtrim(dirname($node->getPath()), '/');
+
+ if (!$this->dryRun) {
+ $node->move("$path/$newName");
+ } elseif (!$folder->isCreatable()) {
+ // simulate error for dry run
+ throw new NotPermittedException();
+ }
+ $this->output->writeln('renamed: "' . $oldName . '" to "' . $newName . '"');
+ }
+ } catch (LockedException) {
+ $this->output->writeln('<comment>skipping: ' . $node->getPath() . ' (file is locked)</>');
+ } catch (NotPermittedException) {
+ $this->output->writeln('<comment>skipping: ' . $node->getPath() . ' (no permissions)</>');
+ } catch (Exception $error) {
+ $this->output->writeln('<error>failed: ' . $node->getPath() . '</>');
+ $this->output->writeln('<error>' . $error->getMessage() . '</>', OutputInterface::OUTPUT_NORMAL | OutputInterface::VERBOSITY_VERBOSE);
+ }
+
+ if ($node instanceof Folder) {
+ $this->sanitizeFiles($node);
+ }
+ }
+ }
+
+}
diff --git a/apps/files/lib/Command/Scan.php b/apps/files/lib/Command/Scan.php
index 47f1caabc78..b9057139b0e 100644
--- a/apps/files/lib/Command/Scan.php
+++ b/apps/files/lib/Command/Scan.php
@@ -1,35 +1,9 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Blaok <i@blaok.me>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author J0WI <J0WI@users.noreply.github.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Joel S <joel.devbox@protonmail.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author martin.mattel@diemattels.at <martin.mattel@diemattels.at>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Command;
@@ -37,12 +11,22 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
+use OC\Files\Storage\Wrapper\Jail;
+use OC\Files\Utils\Scanner;
+use OC\FilesMetadata\FilesMetadataManager;
use OC\ForbiddenException;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Files\Events\FileCacheUpdated;
+use OCP\Files\Events\NodeAddedToCache;
+use OCP\Files\Events\NodeRemovedFromCache;
+use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
use OCP\Files\StorageNotAvailableException;
+use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\IUserManager;
+use OCP\Lock\LockedException;
+use OCP\Server;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
@@ -51,22 +35,25 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class Scan extends Base {
+ protected float $execTime = 0;
+ protected int $foldersCounter = 0;
+ protected int $filesCounter = 0;
+ protected int $errorsCounter = 0;
+ protected int $newCounter = 0;
+ protected int $updatedCounter = 0;
+ protected int $removedCounter = 0;
- /** @var IUserManager $userManager */
- private $userManager;
- /** @var float */
- protected $execTime = 0;
- /** @var int */
- protected $foldersCounter = 0;
- /** @var int */
- protected $filesCounter = 0;
-
- public function __construct(IUserManager $userManager) {
- $this->userManager = $userManager;
+ public function __construct(
+ private IUserManager $userManager,
+ private IRootFolder $rootFolder,
+ private FilesMetadataManager $filesMetadataManager,
+ private IEventDispatcher $eventDispatcher,
+ private LoggerInterface $logger,
+ ) {
parent::__construct();
}
- protected function configure() {
+ protected function configure(): void {
parent::configure();
$this
@@ -80,10 +67,17 @@ class Scan extends Base {
->addOption(
'path',
'p',
- InputArgument::OPTIONAL,
+ InputOption::VALUE_REQUIRED,
'limit rescan to this path, eg. --path="/alice/files/Music", the user_id is determined by the path and the user_id parameter and --all are ignored'
)
->addOption(
+ 'generate-metadata',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'Generate metadata for all scanned files; if specified only generate for named value',
+ ''
+ )
+ ->addOption(
'all',
null,
InputOption::VALUE_NONE,
@@ -106,58 +100,95 @@ class Scan extends Base {
);
}
- protected function scanFiles($user, $path, OutputInterface $output, $backgroundScan = false, $recursive = true, $homeOnly = false) {
+ protected function scanFiles(
+ string $user,
+ string $path,
+ ?string $scanMetadata,
+ OutputInterface $output,
+ callable $mountFilter,
+ bool $backgroundScan = false,
+ bool $recursive = true,
+ ): void {
$connection = $this->reconnectToDatabase($output);
- $scanner = new \OC\Files\Utils\Scanner(
+ $scanner = new Scanner(
$user,
new ConnectionAdapter($connection),
- \OC::$server->query(IEventDispatcher::class),
- \OC::$server->get(LoggerInterface::class)
+ Server::get(IEventDispatcher::class),
+ Server::get(LoggerInterface::class)
);
# check on each file/folder if there was a user interrupt (ctrl-c) and throw an exception
-
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function (string $path) use ($output, $scanMetadata): void {
$output->writeln("\tFile\t<info>$path</info>", OutputInterface::VERBOSITY_VERBOSE);
++$this->filesCounter;
$this->abortIfInterrupted();
+ if ($scanMetadata !== null) {
+ $node = $this->rootFolder->get($path);
+ $this->filesMetadataManager->refreshMetadata(
+ $node,
+ ($scanMetadata !== '') ? IFilesMetadataManager::PROCESS_NAMED : IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND,
+ $scanMetadata
+ );
+ }
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output): void {
$output->writeln("\tFolder\t<info>$path</info>", OutputInterface::VERBOSITY_VERBOSE);
++$this->foldersCounter;
$this->abortIfInterrupted();
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output): void {
$output->writeln('Error while scanning, storage not available (' . $e->getMessage() . ')', OutputInterface::VERBOSITY_VERBOSE);
+ ++$this->errorsCounter;
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output): void {
$output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
+ ++$this->errorsCounter;
+ });
+
+ $this->eventDispatcher->addListener(NodeAddedToCache::class, function (): void {
+ ++$this->newCounter;
+ });
+ $this->eventDispatcher->addListener(FileCacheUpdated::class, function (): void {
+ ++$this->updatedCounter;
+ });
+ $this->eventDispatcher->addListener(NodeRemovedFromCache::class, function (): void {
+ ++$this->removedCounter;
});
try {
if ($backgroundScan) {
$scanner->backgroundScan($path);
} else {
- $scanner->scan($path, $recursive, $homeOnly ? [$this, 'filterHomeMount'] : null);
+ $scanner->scan($path, $recursive, $mountFilter);
}
} catch (ForbiddenException $e) {
- $output->writeln("<error>Home storage for user $user not writable</error>");
+ $output->writeln("<error>Home storage for user $user not writable or 'files' subdirectory missing</error>");
+ $output->writeln(' ' . $e->getMessage());
$output->writeln('Make sure you\'re running the scan command only as the user the web server runs as');
+ ++$this->errorsCounter;
} catch (InterruptedException $e) {
# exit the function if ctrl-c has been pressed
$output->writeln('Interrupted by user');
} catch (NotFoundException $e) {
$output->writeln('<error>Path not found: ' . $e->getMessage() . '</error>');
+ ++$this->errorsCounter;
+ } catch (LockedException $e) {
+ if (str_starts_with($e->getPath(), 'scanner::')) {
+ $output->writeln('<error>Another process is already scanning \'' . substr($e->getPath(), strlen('scanner::')) . '\'</error>');
+ } else {
+ throw $e;
+ }
} catch (\Exception $e) {
$output->writeln('<error>Exception during scan: ' . $e->getMessage() . '</error>');
$output->writeln('<error>' . $e->getTraceAsString() . '</error>');
+ ++$this->errorsCounter;
}
}
- public function filterHomeMount(IMountPoint $mountPoint) {
+ public function isHomeMount(IMountPoint $mountPoint): bool {
// any mountpoint inside '/$user/files/'
return substr_count($mountPoint->getMountPoint(), '/') <= 3;
}
@@ -174,30 +205,62 @@ class Scan extends Base {
$users = $input->getArgument('user_id');
}
- # restrict the verbosity level to VERBOSITY_VERBOSE
- if ($output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) {
- $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
- }
-
# check quantity of users to be process and show it on the command line
$users_total = count($users);
if ($users_total === 0) {
$output->writeln('<error>Please specify the user id to scan, --all to scan for all users or --path=...</error>');
- return 1;
+ return self::FAILURE;
}
- $this->initTools();
+ $this->initTools($output);
+
+ // getOption() logic on VALUE_OPTIONAL
+ $metadata = null; // null if --generate-metadata is not set, empty if option have no value, value if set
+ if ($input->getOption('generate-metadata') !== '') {
+ $metadata = $input->getOption('generate-metadata') ?? '';
+ }
+
+ $homeOnly = $input->getOption('home-only');
+ $scannedStorages = [];
+ $mountFilter = function (IMountPoint $mount) use ($homeOnly, &$scannedStorages) {
+ if ($homeOnly && !$this->isHomeMount($mount)) {
+ return false;
+ }
+
+ // when scanning multiple users, the scanner might encounter the same storage multiple times (e.g. external storages, or group folders)
+ // we can filter out any storage we've already scanned to avoid double work
+ $storage = $mount->getStorage();
+ $storageKey = $storage->getId();
+ while ($storage->instanceOfStorage(Jail::class)) {
+ $storageKey .= '/' . $storage->getUnjailedPath('');
+ $storage = $storage->getUnjailedStorage();
+ }
+ if (array_key_exists($storageKey, $scannedStorages)) {
+ return false;
+ }
+
+ $scannedStorages[$storageKey] = true;
+ return true;
+ };
$user_count = 0;
foreach ($users as $user) {
if (is_object($user)) {
$user = $user->getUID();
}
- $path = $inputPath ? $inputPath : '/' . $user;
+ $path = $inputPath ?: '/' . $user;
++$user_count;
if ($this->userManager->userExists($user)) {
$output->writeln("Starting scan for user $user_count out of $users_total ($user)");
- $this->scanFiles($user, $path, $output, $input->getOption('unscanned'), !$input->getOption('shallow'), $input->getOption('home-only'));
+ $this->scanFiles(
+ $user,
+ $path,
+ $metadata,
+ $output,
+ $mountFilter,
+ $input->getOption('unscanned'),
+ !$input->getOption('shallow'),
+ );
$output->writeln('', OutputInterface::VERBOSITY_VERBOSE);
} else {
$output->writeln("<error>Unknown user $user_count $user</error>");
@@ -212,21 +275,25 @@ class Scan extends Base {
}
$this->presentStats($output);
- return 0;
+ return self::SUCCESS;
}
/**
* Initialises some useful tools for the Command
*/
- protected function initTools() {
+ protected function initTools(OutputInterface $output): void {
// Start the timer
$this->execTime = -microtime(true);
// Convert PHP errors to exceptions
- set_error_handler([$this, 'exceptionErrorHandler'], E_ALL);
+ set_error_handler(
+ fn (int $severity, string $message, string $file, int $line): bool
+ => $this->exceptionErrorHandler($output, $severity, $message, $file, $line),
+ E_ALL
+ );
}
/**
- * Processes PHP errors as exceptions in order to be able to keep track of problems
+ * Processes PHP errors in order to be able to show them in the output
*
* @see https://www.php.net/manual/en/function.set-error-handler.php
*
@@ -234,47 +301,44 @@ class Scan extends Base {
* @param string $message
* @param string $file the filename that the error was raised in
* @param int $line the line number the error was raised
- *
- * @throws \ErrorException
*/
- public function exceptionErrorHandler($severity, $message, $file, $line) {
- if (!(error_reporting() & $severity)) {
- // This error code is not included in error_reporting
- return;
+ public function exceptionErrorHandler(OutputInterface $output, int $severity, string $message, string $file, int $line): bool {
+ if (($severity === E_DEPRECATED) || ($severity === E_USER_DEPRECATED)) {
+ // Do not show deprecation warnings
+ return false;
}
- throw new \ErrorException($message, 0, $severity, $file, $line);
+ $e = new \ErrorException($message, 0, $severity, $file, $line);
+ $output->writeln('<error>Error during scan: ' . $e->getMessage() . '</error>');
+ $output->writeln('<error>' . $e->getTraceAsString() . '</error>', OutputInterface::VERBOSITY_VERY_VERBOSE);
+ ++$this->errorsCounter;
+ return true;
}
- /**
- * @param OutputInterface $output
- */
- protected function presentStats(OutputInterface $output) {
+ protected function presentStats(OutputInterface $output): void {
// Stop the timer
$this->execTime += microtime(true);
+ $this->logger->info("Completed scan of {$this->filesCounter} files in {$this->foldersCounter} folder. Found {$this->newCounter} new, {$this->updatedCounter} updated and {$this->removedCounter} removed items");
+
$headers = [
- 'Folders', 'Files', 'Elapsed time'
+ 'Folders',
+ 'Files',
+ 'New',
+ 'Updated',
+ 'Removed',
+ 'Errors',
+ 'Elapsed time',
];
-
- $this->showSummary($headers, null, $output);
- }
-
- /**
- * Shows a summary of operations
- *
- * @param string[] $headers
- * @param string[] $rows
- * @param OutputInterface $output
- */
- protected function showSummary($headers, $rows, OutputInterface $output) {
$niceDate = $this->formatExecTime();
- if (!$rows) {
- $rows = [
- $this->foldersCounter,
- $this->filesCounter,
- $niceDate,
- ];
- }
+ $rows = [
+ $this->foldersCounter,
+ $this->filesCounter,
+ $this->newCounter,
+ $this->updatedCounter,
+ $this->removedCounter,
+ $this->errorsCounter,
+ $niceDate,
+ ];
$table = new Table($output);
$table
->setHeaders($headers)
@@ -284,19 +348,17 @@ class Scan extends Base {
/**
- * Formats microtime into a human readable format
- *
- * @return string
+ * Formats microtime into a human-readable format
*/
- protected function formatExecTime() {
- $secs = round($this->execTime);
+ protected function formatExecTime(): string {
+ $secs = (int)round($this->execTime);
# convert seconds into HH:MM:SS form
- return sprintf('%02d:%02d:%02d', ($secs / 3600), ($secs / 60 % 60), $secs % 60);
+ return sprintf('%02d:%02d:%02d', (int)($secs / 3600), ((int)($secs / 60) % 60), $secs % 60);
}
protected function reconnectToDatabase(OutputInterface $output): Connection {
/** @var Connection $connection */
- $connection = \OC::$server->get(Connection::class);
+ $connection = Server::get(Connection::class);
try {
$connection->close();
} catch (\Exception $ex) {
diff --git a/apps/files/lib/Command/ScanAppData.php b/apps/files/lib/Command/ScanAppData.php
index a5e9d99f804..0e08c6a8cfe 100644
--- a/apps/files/lib/Command/ScanAppData.php
+++ b/apps/files/lib/Command/ScanAppData.php
@@ -1,30 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author J0WI <J0WI@users.noreply.github.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Joel S <joel.devbox@protonmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Command;
@@ -32,12 +10,16 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
+use OC\Files\Utils\Scanner;
use OC\ForbiddenException;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Files\Folder;
use OCP\Files\IRootFolder;
+use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
+use OCP\Server;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
@@ -45,26 +27,20 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class ScanAppData extends Base {
+ protected float $execTime = 0;
- /** @var IRootFolder */
- protected $root;
- /** @var IConfig */
- protected $config;
- /** @var float */
- protected $execTime = 0;
- /** @var int */
- protected $foldersCounter = 0;
- /** @var int */
- protected $filesCounter = 0;
-
- public function __construct(IRootFolder $rootFolder, IConfig $config) {
- parent::__construct();
+ protected int $foldersCounter = 0;
- $this->root = $rootFolder;
- $this->config = $config;
+ protected int $filesCounter = 0;
+
+ public function __construct(
+ protected IRootFolder $rootFolder,
+ protected IConfig $config,
+ ) {
+ parent::__construct();
}
- protected function configure() {
+ protected function configure(): void {
parent::configure();
$this
@@ -76,10 +52,11 @@ class ScanAppData extends Base {
protected function scanFiles(OutputInterface $output, string $folder): int {
try {
+ /** @var Folder $appData */
$appData = $this->getAppDataFolder();
} catch (NotFoundException $e) {
$output->writeln('<error>NoAppData folder found</error>');
- return 1;
+ return self::FAILURE;
}
if ($folder !== '') {
@@ -87,36 +64,36 @@ class ScanAppData extends Base {
$appData = $appData->get($folder);
} catch (NotFoundException $e) {
$output->writeln('<error>Could not find folder: ' . $folder . '</error>');
- return 1;
+ return self::FAILURE;
}
}
$connection = $this->reconnectToDatabase($output);
- $scanner = new \OC\Files\Utils\Scanner(
+ $scanner = new Scanner(
null,
new ConnectionAdapter($connection),
- \OC::$server->query(IEventDispatcher::class),
- \OC::$server->get(LoggerInterface::class)
+ Server::get(IEventDispatcher::class),
+ Server::get(LoggerInterface::class)
);
# check on each file/folder if there was a user interrupt (ctrl-c) and throw an exception
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output): void {
$output->writeln("\tFile <info>$path</info>", OutputInterface::VERBOSITY_VERBOSE);
++$this->filesCounter;
$this->abortIfInterrupted();
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output): void {
$output->writeln("\tFolder <info>$path</info>", OutputInterface::VERBOSITY_VERBOSE);
++$this->foldersCounter;
$this->abortIfInterrupted();
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output): void {
$output->writeln('Error while scanning, storage not available (' . $e->getMessage() . ')', OutputInterface::VERBOSITY_VERBOSE);
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output) {
+ $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output): void {
$output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
});
@@ -125,21 +102,21 @@ class ScanAppData extends Base {
} catch (ForbiddenException $e) {
$output->writeln('<error>Storage not writable</error>');
$output->writeln('<info>Make sure you\'re running the scan command only as the user the web server runs as</info>');
- return 1;
+ return self::FAILURE;
} catch (InterruptedException $e) {
# exit the function if ctrl-c has been pressed
$output->writeln('<info>Interrupted by user</info>');
- return 1;
+ return self::FAILURE;
} catch (NotFoundException $e) {
$output->writeln('<error>Path not found: ' . $e->getMessage() . '</error>');
- return 1;
+ return self::FAILURE;
} catch (\Exception $e) {
$output->writeln('<error>Exception during scan: ' . $e->getMessage() . '</error>');
$output->writeln('<error>' . $e->getTraceAsString() . '</error>');
- return 1;
+ return self::FAILURE;
}
- return 0;
+ return self::SUCCESS;
}
@@ -166,7 +143,7 @@ class ScanAppData extends Base {
/**
* Initialises some useful tools for the Command
*/
- protected function initTools() {
+ protected function initTools(): void {
// Start the timer
$this->execTime = -microtime(true);
// Convert PHP errors to exceptions
@@ -193,10 +170,7 @@ class ScanAppData extends Base {
throw new \ErrorException($message, 0, $severity, $file, $line);
}
- /**
- * @param OutputInterface $output
- */
- protected function presentStats(OutputInterface $output) {
+ protected function presentStats(OutputInterface $output): void {
// Stop the timer
$this->execTime += microtime(true);
@@ -212,9 +186,8 @@ class ScanAppData extends Base {
*
* @param string[] $headers
* @param string[] $rows
- * @param OutputInterface $output
*/
- protected function showSummary($headers, $rows, OutputInterface $output) {
+ protected function showSummary($headers, $rows, OutputInterface $output): void {
$niceDate = $this->formatExecTime();
if (!$rows) {
$rows = [
@@ -232,19 +205,17 @@ class ScanAppData extends Base {
/**
- * Formats microtime into a human readable format
- *
- * @return string
+ * Formats microtime into a human-readable format
*/
- protected function formatExecTime() {
+ protected function formatExecTime(): string {
$secs = round($this->execTime);
# convert seconds into HH:MM:SS form
- return sprintf('%02d:%02d:%02d', ($secs / 3600), ($secs / 60 % 60), $secs % 60);
+ return sprintf('%02d:%02d:%02d', (int)($secs / 3600), ((int)($secs / 60) % 60), (int)$secs % 60);
}
protected function reconnectToDatabase(OutputInterface $output): Connection {
- /** @var Connection $connection*/
- $connection = \OC::$server->get(Connection::class);
+ /** @var Connection $connection */
+ $connection = Server::get(Connection::class);
try {
$connection->close();
} catch (\Exception $ex) {
@@ -262,16 +233,15 @@ class ScanAppData extends Base {
}
/**
- * @return \OCP\Files\Folder
* @throws NotFoundException
*/
- private function getAppDataFolder() {
+ private function getAppDataFolder(): Node {
$instanceId = $this->config->getSystemValue('instanceid', null);
if ($instanceId === null) {
throw new NotFoundException();
}
- return $this->root->get('appdata_'.$instanceId);
+ return $this->rootFolder->get('appdata_' . $instanceId);
}
}
diff --git a/apps/files/lib/Command/TransferOwnership.php b/apps/files/lib/Command/TransferOwnership.php
index 50aa0b21a5f..f7663e26f28 100644
--- a/apps/files/lib/Command/TransferOwnership.php
+++ b/apps/files/lib/Command/TransferOwnership.php
@@ -1,71 +1,41 @@
<?php
declare(strict_types=1);
-
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Carla Schroder <carla@owncloud.com>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Sujith Haridasan <sujith.h@gmail.com>
- * @author Sujith H <sharidasan@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Tobia De Koninck <LEDfan@users.noreply.github.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Command;
use OCA\Files\Exception\TransferOwnershipException;
use OCA\Files\Service\OwnershipTransferService;
+use OCA\Files_External\Config\ConfigAdapter;
+use OCP\Files\Mount\IMountManager;
+use OCP\Files\Mount\IMountPoint;
+use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
-use OCP\IConfig;
use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
class TransferOwnership extends Command {
-
- /** @var IUserManager */
- private $userManager;
-
- /** @var OwnershipTransferService */
- private $transferService;
-
- /** @var IConfig */
- private $config;
-
- public function __construct(IUserManager $userManager,
- OwnershipTransferService $transferService,
- IConfig $config) {
+ public function __construct(
+ private IUserManager $userManager,
+ private OwnershipTransferService $transferService,
+ private IConfig $config,
+ private IMountManager $mountManager,
+ ) {
parent::__construct();
- $this->userManager = $userManager;
- $this->transferService = $transferService;
- $this->config = $config;
}
- protected function configure() {
+ protected function configure(): void {
$this
->setName('files:transfer-ownership')
->setDescription('All files and folders are moved to another user - outgoing shares and incoming user file shares (optionally) are moved as well.')
@@ -94,9 +64,19 @@ class TransferOwnership extends Command {
'transfer-incoming-shares',
null,
InputOption::VALUE_OPTIONAL,
- 'transfer incoming user file shares to destination user. Usage: --transfer-incoming-shares=1 (value required)',
+ 'Incoming shares are always transferred now, so this option does not affect the ownership transfer anymore',
'2'
- );
+ )->addOption(
+ 'include-external-storage',
+ null,
+ InputOption::VALUE_NONE,
+ 'include files on external storages, this will _not_ setup an external storage for the target user, but instead moves all the files from the external storages into the target users home directory',
+ )->addOption(
+ 'force-include-external-storage',
+ null,
+ InputOption::VALUE_NONE,
+ 'don\'t ask for confirmation for transferring external storages',
+ );
}
protected function execute(InputInterface $input, OutputInterface $output): int {
@@ -107,59 +87,62 @@ class TransferOwnership extends Command {
if ($input->getArgument(('source-user')) === $input->getArgument('destination-user')) {
$output->writeln("<error>Ownership can't be transferred when Source and Destination users are the same user. Please check your input.</error>");
- return 1;
+ return self::FAILURE;
}
$sourceUserObject = $this->userManager->get($input->getArgument('source-user'));
$destinationUserObject = $this->userManager->get($input->getArgument('destination-user'));
if (!$sourceUserObject instanceof IUser) {
- $output->writeln("<error>Unknown source user " . $input->getArgument('source-user') . "</error>");
- return 1;
+ $output->writeln('<error>Unknown source user ' . $input->getArgument('source-user') . '</error>');
+ return self::FAILURE;
}
if (!$destinationUserObject instanceof IUser) {
- $output->writeln("<error>Unknown destination user " . $input->getArgument('destination-user') . "</error>");
- return 1;
+ $output->writeln('<error>Unknown destination user ' . $input->getArgument('destination-user') . '</error>');
+ return self::FAILURE;
}
- try {
- $includeIncomingArgument = $input->getOption('transfer-incoming-shares');
-
- switch ($includeIncomingArgument) {
- case '0':
- $includeIncoming = false;
- break;
- case '1':
- $includeIncoming = true;
- break;
- case '2':
- $includeIncoming = $this->config->getSystemValue('transferIncomingShares', false);
- if (gettype($includeIncoming) !== 'boolean') {
- $output->writeln("<error> config.php: 'transfer-incoming-shares': wrong usage. Transfer aborted.</error>");
- return 1;
+ $path = ltrim($input->getOption('path'), '/');
+ $includeExternalStorage = $input->getOption('include-external-storage');
+ if ($includeExternalStorage) {
+ $mounts = $this->mountManager->findIn('/' . rtrim($sourceUserObject->getUID() . '/files/' . $path, '/'));
+ /** @var IMountPoint[] $mounts */
+ $mounts = array_filter($mounts, fn ($mount) => $mount->getMountProvider() === ConfigAdapter::class);
+ if (count($mounts) > 0) {
+ $output->writeln(count($mounts) . ' external storages will be transferred:');
+ foreach ($mounts as $mount) {
+ $output->writeln(' - <info>' . $mount->getMountPoint() . '</info>');
+ }
+ $output->writeln('');
+ $output->writeln('<comment>Any other users with access to these external storages will lose access to the files.</comment>');
+ $output->writeln('');
+ if (!$input->getOption('force-include-external-storage')) {
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $question = new ConfirmationQuestion('Are you sure you want to transfer external storages? (y/N) ', false);
+ if (!$helper->ask($input, $output, $question)) {
+ return self::FAILURE;
}
- break;
- default:
- $output->writeln("<error>Option --transfer-incoming-shares: wrong usage. Transfer aborted.</error>");
- return 1;
- break;
+ }
}
+ }
+ try {
$this->transferService->transfer(
$sourceUserObject,
$destinationUserObject,
- ltrim($input->getOption('path'), '/'),
+ $path,
$output,
$input->getOption('move') === true,
false,
- $includeIncoming
+ $includeExternalStorage,
);
} catch (TransferOwnershipException $e) {
- $output->writeln("<error>" . $e->getMessage() . "</error>");
- return $e->getCode() !== 0 ? $e->getCode() : 1;
+ $output->writeln('<error>' . $e->getMessage() . '</error>');
+ return $e->getCode() !== 0 ? $e->getCode() : self::FAILURE;
}
- return 0;
+ return self::SUCCESS;
}
}
diff --git a/apps/files/lib/Command/WindowsCompatibleFilenames.php b/apps/files/lib/Command/WindowsCompatibleFilenames.php
new file mode 100644
index 00000000000..84a1b277824
--- /dev/null
+++ b/apps/files/lib/Command/WindowsCompatibleFilenames.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files\Service\SettingsService;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class WindowsCompatibleFilenames extends Base {
+
+ public function __construct(
+ private SettingsService $service,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ parent::configure();
+
+ $this
+ ->setName('files:windows-compatible-filenames')
+ ->setDescription('Enforce naming constraints for windows compatible filenames')
+ ->addOption('enable', description: 'Enable windows naming constraints')
+ ->addOption('disable', description: 'Disable windows naming constraints');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+ if ($input->getOption('enable')) {
+ if ($this->service->hasFilesWindowsSupport()) {
+ $output->writeln('<error>Windows compatible filenames already enforced.</error>', OutputInterface::VERBOSITY_VERBOSE);
+ }
+ $this->service->setFilesWindowsSupport(true);
+ $output->writeln('Windows compatible filenames enforced.');
+ } elseif ($input->getOption('disable')) {
+ if (!$this->service->hasFilesWindowsSupport()) {
+ $output->writeln('<error>Windows compatible filenames already disabled.</error>', OutputInterface::VERBOSITY_VERBOSE);
+ }
+ $this->service->setFilesWindowsSupport(false);
+ $output->writeln('Windows compatible filename constraints removed.');
+ } else {
+ $output->writeln('Windows compatible filenames are ' . ($this->service->hasFilesWindowsSupport() ? 'enforced' : 'disabled'));
+ }
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files/lib/Controller/AjaxController.php b/apps/files/lib/Controller/AjaxController.php
deleted file mode 100644
index cd26ab7a6f8..00000000000
--- a/apps/files/lib/Controller/AjaxController.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * @copyright Copyright (c) 2018, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-namespace OCA\Files\Controller;
-
-use OCA\Files\Helper;
-use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http\JSONResponse;
-use OCP\Files\NotFoundException;
-use OCP\IRequest;
-
-class AjaxController extends Controller {
- public function __construct(string $appName, IRequest $request) {
- parent::__construct($appName, $request);
- }
-
- /**
- * @NoAdminRequired
- */
- public function getStorageStats(string $dir = '/'): JSONResponse {
- try {
- return new JSONResponse([
- 'status' => 'success',
- 'data' => Helper::buildFileStorageStatistics($dir),
- ]);
- } catch (NotFoundException $e) {
- return new JSONResponse([
- 'status' => 'error',
- 'data' => [
- 'message' => 'Folder not found'
- ],
- ]);
- }
- }
-}
diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php
index 45c7466e0c2..8bb024fb698 100644
--- a/apps/files/lib/Controller/ApiController.php
+++ b/apps/files/lib/Controller/ApiController.php
@@ -1,136 +1,124 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Felix Nüsse <Felix.nuesse@t-online.de>
- * @author fnuesse <felix.nuesse@t-online.de>
- * @author fnuesse <fnuesse@techfak.uni-bielefeld.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Max Kovalenko <mxss1998@yandex.ru>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
- * @author Richard Steinmetz <richard@steinmetz.cloud>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Controller;
use OC\Files\Node\Node;
+use OCA\Files\Helper;
+use OCA\Files\ResponseDefinitions;
use OCA\Files\Service\TagService;
+use OCA\Files\Service\UserConfig;
+use OCA\Files\Service\ViewConfig;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\ApiRoute;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
+use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
+use OCP\AppFramework\Http\Attribute\OpenAPI;
+use OCP\AppFramework\Http\Attribute\PublicPage;
+use OCP\AppFramework\Http\Attribute\StrictCookiesRequired;
+use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\StreamResponse;
use OCP\Files\File;
use OCP\Files\Folder;
+use OCP\Files\InvalidPathException;
+use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
+use OCP\Files\NotPermittedException;
+use OCP\Files\Storage\ISharedStorage;
+use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
+use OCP\IL10N;
use OCP\IPreview;
use OCP\IRequest;
+use OCP\IUser;
use OCP\IUserSession;
+use OCP\PreConditionNotMetException;
use OCP\Share\IManager;
use OCP\Share\IShare;
+use Psr\Log\LoggerInterface;
+use Throwable;
/**
- * Class ApiController
+ * @psalm-import-type FilesFolderTree from ResponseDefinitions
*
* @package OCA\Files\Controller
*/
class ApiController extends Controller {
- /** @var TagService */
- private $tagService;
- /** @var IManager * */
- private $shareManager;
- /** @var IPreview */
- private $previewManager;
- /** @var IUserSession */
- private $userSession;
- /** @var IConfig */
- private $config;
- /** @var Folder */
- private $userFolder;
-
- /**
- * @param string $appName
- * @param IRequest $request
- * @param IUserSession $userSession
- * @param TagService $tagService
- * @param IPreview $previewManager
- * @param IManager $shareManager
- * @param IConfig $config
- * @param Folder $userFolder
- */
- public function __construct($appName,
- IRequest $request,
- IUserSession $userSession,
- TagService $tagService,
- IPreview $previewManager,
- IManager $shareManager,
- IConfig $config,
- Folder $userFolder) {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private IUserSession $userSession,
+ private TagService $tagService,
+ private IPreview $previewManager,
+ private IManager $shareManager,
+ private IConfig $config,
+ private ?Folder $userFolder,
+ private UserConfig $userConfig,
+ private ViewConfig $viewConfig,
+ private IL10N $l10n,
+ private IRootFolder $rootFolder,
+ private LoggerInterface $logger,
+ ) {
parent::__construct($appName, $request);
- $this->userSession = $userSession;
- $this->tagService = $tagService;
- $this->previewManager = $previewManager;
- $this->shareManager = $shareManager;
- $this->config = $config;
- $this->userFolder = $userFolder;
}
/**
* Gets a thumbnail of the specified file
*
* @since API version 1.0
+ * @deprecated 32.0.0 Use the preview endpoint provided by core instead
*
- * @NoAdminRequired
- * @NoCSRFRequired
- * @StrictCookieRequired
- *
- * @param int $x
- * @param int $y
+ * @param int $x Width of the thumbnail
+ * @param int $y Height of the thumbnail
* @param string $file URL-encoded filename
- * @return DataResponse|FileDisplayResponse
+ * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, array{message?: string}, array{}>
+ *
+ * 200: Thumbnail returned
+ * 400: Getting thumbnail is not possible
+ * 404: File not found
*/
+ #[NoAdminRequired]
+ #[NoCSRFRequired]
+ #[StrictCookiesRequired]
+ #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)]
public function getThumbnail($x, $y, $file) {
if ($x < 1 || $y < 1) {
return new DataResponse(['message' => 'Requested size must be numeric and a positive value.'], Http::STATUS_BAD_REQUEST);
}
try {
- $file = $this->userFolder->get($file);
- if ($file instanceof Folder) {
+ $file = $this->userFolder?->get($file);
+ if ($file === null
+ || !($file instanceof File)
+ || ($file->getId() <= 0)
+ ) {
throw new NotFoundException();
}
- /** @var File $file */
+ // Validate the user is allowed to download the file (preview is some kind of download)
+ /** @var ISharedStorage $storage */
+ $storage = $file->getStorage();
+ if ($storage->instanceOfStorage(ISharedStorage::class)) {
+ /** @var IShare $share */
+ $share = $storage->getShare();
+ if (!$share->canSeeContent()) {
+ throw new NotFoundException();
+ }
+ }
+
$preview = $this->previewManager->getPreview($file, $x, $y, true);
return new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => $preview->getMimeType()]);
- } catch (NotFoundException $e) {
+ } catch (NotFoundException|NotPermittedException|InvalidPathException) {
return new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
} catch (\Exception $e) {
return new DataResponse([], Http::STATUS_BAD_REQUEST);
@@ -142,23 +130,22 @@ class ApiController extends Controller {
* The passed tags are absolute, which means they will
* replace the actual tag selection.
*
- * @NoAdminRequired
- *
* @param string $path path
* @param array|string $tags array of tags
* @return DataResponse
*/
+ #[NoAdminRequired]
public function updateFileTags($path, $tags = null) {
$result = [];
// if tags specified or empty array, update tags
if (!is_null($tags)) {
try {
$this->tagService->updateFileTags($path, $tags);
- } catch (\OCP\Files\NotFoundException $e) {
+ } catch (NotFoundException $e) {
return new DataResponse([
'message' => $e->getMessage()
], Http::STATUS_NOT_FOUND);
- } catch (\OCP\Files\StorageNotAvailableException $e) {
+ } catch (StorageNotAvailableException $e) {
return new DataResponse([
'message' => $e->getMessage()
], Http::STATUS_SERVICE_UNAVAILABLE);
@@ -180,7 +167,7 @@ class ApiController extends Controller {
$shareTypesForNodes = $this->getShareTypesForNodes($nodes);
return array_values(array_map(function (Node $node) use ($shareTypesForNodes) {
$shareTypes = $shareTypesForNodes[$node->getId()] ?? [];
- $file = \OCA\Files\Helper::formatFileInfo($node->getFileInfo());
+ $file = Helper::formatFileInfo($node->getFileInfo());
$file['hasPreview'] = $this->previewManager->isAvailable($node);
$parts = explode('/', dirname($node->getPath()), 4);
if (isset($parts[3])) {
@@ -211,6 +198,7 @@ class ApiController extends Controller {
IShare::TYPE_EMAIL,
IShare::TYPE_ROOM,
IShare::TYPE_DECK,
+ IShare::TYPE_SCIENCEMESH,
];
$shareTypes = [];
@@ -247,12 +235,11 @@ class ApiController extends Controller {
}
/**
- * Returns a list of recently modifed files.
- *
- * @NoAdminRequired
+ * Returns a list of recently modified files.
*
* @return DataResponse
*/
+ #[NoAdminRequired]
public function getRecentFiles() {
$nodes = $this->userFolder->getRecent(100);
$files = $this->formatNodes($nodes);
@@ -260,65 +247,188 @@ class ApiController extends Controller {
}
/**
- * Change the default sort mode
+ * @param \OCP\Files\Node[] $nodes
+ * @param int $depth The depth to traverse into the contents of each node
+ */
+ private function getChildren(array $nodes, int $depth = 1, int $currentDepth = 0): array {
+ if ($currentDepth >= $depth) {
+ return [];
+ }
+
+ $children = [];
+ foreach ($nodes as $node) {
+ if (!($node instanceof Folder)) {
+ continue;
+ }
+
+ $basename = basename($node->getPath());
+ $entry = [
+ 'id' => $node->getId(),
+ 'basename' => $basename,
+ 'children' => $this->getChildren($node->getDirectoryListing(), $depth, $currentDepth + 1),
+ ];
+ $displayName = $node->getName();
+ if ($basename !== $displayName) {
+ $entry['displayName'] = $displayName;
+ }
+ $children[] = $entry;
+ }
+ return $children;
+ }
+
+ /**
+ * Returns the folder tree of the user
*
- * @NoAdminRequired
+ * @param string $path The path relative to the user folder
+ * @param int $depth The depth of the tree
*
- * @param string $mode
- * @param string $direction
- * @return Response
- * @throws \OCP\PreConditionNotMetException
+ * @return JSONResponse<Http::STATUS_OK, FilesFolderTree, array{}>|JSONResponse<Http::STATUS_UNAUTHORIZED|Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, array{message: string}, array{}>
+ *
+ * 200: Folder tree returned successfully
+ * 400: Invalid folder path
+ * 401: Unauthorized
+ * 404: Folder not found
*/
- public function updateFileSorting($mode, $direction) {
- $allowedMode = ['name', 'size', 'mtime'];
- $allowedDirection = ['asc', 'desc'];
- if (!in_array($mode, $allowedMode) || !in_array($direction, $allowedDirection)) {
- $response = new Response();
- $response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
- return $response;
+ #[NoAdminRequired]
+ #[ApiRoute(verb: 'GET', url: '/api/v1/folder-tree')]
+ #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)]
+ public function getFolderTree(string $path = '/', int $depth = 1): JSONResponse {
+ $user = $this->userSession->getUser();
+ if (!($user instanceof IUser)) {
+ return new JSONResponse([
+ 'message' => $this->l10n->t('Failed to authorize'),
+ ], Http::STATUS_UNAUTHORIZED);
}
- $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting', $mode);
- $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting_direction', $direction);
- return new Response();
+ try {
+ $userFolder = $this->rootFolder->getUserFolder($user->getUID());
+ $userFolderPath = $userFolder->getPath();
+ $fullPath = implode('/', [$userFolderPath, trim($path, '/')]);
+ $node = $this->rootFolder->get($fullPath);
+ if (!($node instanceof Folder)) {
+ return new JSONResponse([
+ 'message' => $this->l10n->t('Invalid folder path'),
+ ], Http::STATUS_BAD_REQUEST);
+ }
+ $nodes = $node->getDirectoryListing();
+ $tree = $this->getChildren($nodes, $depth);
+ } catch (NotFoundException $e) {
+ return new JSONResponse([
+ 'message' => $this->l10n->t('Folder not found'),
+ ], Http::STATUS_NOT_FOUND);
+ } catch (Throwable $th) {
+ $this->logger->error($th->getMessage(), ['exception' => $th]);
+ $tree = [];
+ }
+ return new JSONResponse($tree);
}
/**
- * Toggle default for showing/hiding hidden files
+ * Returns the current logged-in user's storage stats.
*
- * @NoAdminRequired
+ * @param ?string $dir the directory to get the storage stats from
+ * @return JSONResponse
+ */
+ #[NoAdminRequired]
+ public function getStorageStats($dir = '/'): JSONResponse {
+ $storageInfo = \OC_Helper::getStorageInfo($dir ?: '/');
+ $response = new JSONResponse(['message' => 'ok', 'data' => $storageInfo]);
+ $response->cacheFor(5 * 60);
+ return $response;
+ }
+
+ /**
+ * Set a user view config
*
- * @param bool $show
+ * @param string $view
+ * @param string $key
+ * @param string|bool $value
+ * @return JSONResponse
+ */
+ #[NoAdminRequired]
+ public function setViewConfig(string $view, string $key, $value): JSONResponse {
+ try {
+ $this->viewConfig->setConfig($view, $key, (string)$value);
+ } catch (\InvalidArgumentException $e) {
+ return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_BAD_REQUEST);
+ }
+
+ return new JSONResponse(['message' => 'ok', 'data' => $this->viewConfig->getConfig($view)]);
+ }
+
+
+ /**
+ * Get the user view config
+ *
+ * @return JSONResponse
+ */
+ #[NoAdminRequired]
+ public function getViewConfigs(): JSONResponse {
+ return new JSONResponse(['message' => 'ok', 'data' => $this->viewConfig->getConfigs()]);
+ }
+
+ /**
+ * Set a user config
+ *
+ * @param string $key
+ * @param string|bool $value
+ * @return JSONResponse
+ */
+ #[NoAdminRequired]
+ public function setConfig(string $key, $value): JSONResponse {
+ try {
+ $this->userConfig->setConfig($key, (string)$value);
+ } catch (\InvalidArgumentException $e) {
+ return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_BAD_REQUEST);
+ }
+
+ return new JSONResponse(['message' => 'ok', 'data' => ['key' => $key, 'value' => $value]]);
+ }
+
+
+ /**
+ * Get the user config
+ *
+ * @return JSONResponse
+ */
+ #[NoAdminRequired]
+ public function getConfigs(): JSONResponse {
+ return new JSONResponse(['message' => 'ok', 'data' => $this->userConfig->getConfigs()]);
+ }
+
+ /**
+ * Toggle default for showing/hiding hidden files
+ *
+ * @param bool $value
* @return Response
- * @throws \OCP\PreConditionNotMetException
+ * @throws PreConditionNotMetException
*/
- public function showHiddenFiles(bool $show): Response {
- $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', $show ? '1' : '0');
+ #[NoAdminRequired]
+ public function showHiddenFiles(bool $value): Response {
+ $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', $value ? '1' : '0');
return new Response();
}
/**
* Toggle default for cropping preview images
*
- * @NoAdminRequired
- *
- * @param bool $crop
+ * @param bool $value
* @return Response
- * @throws \OCP\PreConditionNotMetException
+ * @throws PreConditionNotMetException
*/
- public function cropImagePreviews(bool $crop): Response {
- $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'crop_image_previews', $crop ? '1' : '0');
+ #[NoAdminRequired]
+ public function cropImagePreviews(bool $value): Response {
+ $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'crop_image_previews', $value ? '1' : '0');
return new Response();
}
/**
* Toggle default for files grid view
*
- * @NoAdminRequired
- *
* @param bool $show
* @return Response
- * @throws \OCP\PreConditionNotMetException
+ * @throws PreConditionNotMetException
*/
+ #[NoAdminRequired]
public function showGridView(bool $show): Response {
$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_grid', $show ? '1' : '0');
return new Response();
@@ -326,51 +436,27 @@ class ApiController extends Controller {
/**
* Get default settings for the grid view
- *
- * @NoAdminRequired
*/
+ #[NoAdminRequired]
public function getGridView() {
$status = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_grid', '0') === '1';
return new JSONResponse(['gridview' => $status]);
}
- /**
- * Toggle default for showing/hiding xxx folder
- *
- * @NoAdminRequired
- *
- * @param int $show
- * @param string $key the key of the folder
- *
- * @return Response
- * @throws \OCP\PreConditionNotMetException
- */
- public function toggleShowFolder(int $show, string $key): Response {
- // ensure the edited key exists
- $navItems = \OCA\Files\App::getNavigationManager()->getAll();
- foreach ($navItems as $item) {
- // check if data is valid
- if (($show === 0 || $show === 1) && isset($item['expandedState']) && $key === $item['expandedState']) {
- $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', $key, (string)$show);
- return new Response();
- }
- }
- $response = new Response();
- $response->setStatus(Http::STATUS_FORBIDDEN);
+ #[PublicPage]
+ #[NoCSRFRequired]
+ #[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
+ public function serviceWorker(): StreamResponse {
+ $response = new StreamResponse(__DIR__ . '/../../../../dist/preview-service-worker.js');
+ $response->setHeaders([
+ 'Content-Type' => 'application/javascript',
+ 'Service-Worker-Allowed' => '/'
+ ]);
+ $policy = new ContentSecurityPolicy();
+ $policy->addAllowedWorkerSrcDomain("'self'");
+ $policy->addAllowedScriptDomain("'self'");
+ $policy->addAllowedConnectDomain("'self'");
+ $response->setContentSecurityPolicy($policy);
return $response;
}
-
- /**
- * Get sorting-order for custom sorting
- *
- * @NoAdminRequired
- *
- * @param string $folderpath
- * @return string
- * @throws \OCP\Files\NotFoundException
- */
- public function getNodeType($folderpath) {
- $node = $this->userFolder->get($folderpath);
- return $node->getType();
- }
}
diff --git a/apps/files/lib/Controller/ConversionApiController.php b/apps/files/lib/Controller/ConversionApiController.php
new file mode 100644
index 00000000000..40a42d6ca4c
--- /dev/null
+++ b/apps/files/lib/Controller/ConversionApiController.php
@@ -0,0 +1,109 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Controller;
+
+use OC\Files\Utils\PathHelper;
+use OC\ForbiddenException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\ApiRoute;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
+use OCP\AppFramework\Http\Attribute\UserRateLimit;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCS\OCSBadRequestException;
+use OCP\AppFramework\OCS\OCSException;
+use OCP\AppFramework\OCS\OCSForbiddenException;
+use OCP\AppFramework\OCS\OCSNotFoundException;
+use OCP\AppFramework\OCSController;
+use OCP\Files\Conversion\IConversionManager;
+use OCP\Files\File;
+use OCP\Files\GenericFileException;
+use OCP\Files\IRootFolder;
+use OCP\IL10N;
+use OCP\IRequest;
+use function OCP\Log\logger;
+
+class ConversionApiController extends OCSController {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private IConversionManager $fileConversionManager,
+ private IRootFolder $rootFolder,
+ private IL10N $l10n,
+ private ?string $userId,
+ ) {
+ parent::__construct($appName, $request);
+ }
+
+ /**
+ * Converts a file from one MIME type to another
+ *
+ * @param int $fileId ID of the file to be converted
+ * @param string $targetMimeType The MIME type to which you want to convert the file
+ * @param string|null $destination The target path of the converted file. Written to a temporary file if left empty
+ *
+ * @return DataResponse<Http::STATUS_CREATED, array{path: string, fileId: int}, array{}>
+ *
+ * 201: File was converted and written to the destination or temporary file
+ *
+ * @throws OCSException The file was unable to be converted
+ * @throws OCSNotFoundException The file to be converted was not found
+ */
+ #[NoAdminRequired]
+ #[UserRateLimit(limit: 25, period: 120)]
+ #[ApiRoute(verb: 'POST', url: '/api/v1/convert')]
+ public function convert(int $fileId, string $targetMimeType, ?string $destination = null): DataResponse {
+ $userFolder = $this->rootFolder->getUserFolder($this->userId);
+ $file = $userFolder->getFirstNodeById($fileId);
+
+ // Also throw a 404 if the file is not readable to not leak information
+ if (!($file instanceof File) || $file->isReadable() === false) {
+ throw new OCSNotFoundException($this->l10n->t('The file cannot be found'));
+ }
+
+ if ($destination !== null) {
+ $destination = PathHelper::normalizePath($destination);
+ $parentDir = dirname($destination);
+
+ if (!$userFolder->nodeExists($parentDir)) {
+ throw new OCSNotFoundException($this->l10n->t('The destination path does not exist: %1$s', [$parentDir]));
+ }
+
+ if (!$userFolder->get($parentDir)->isCreatable()) {
+ throw new OCSForbiddenException($this->l10n->t('You do not have permission to create a file at the specified location'));
+ }
+
+ $destination = $userFolder->getFullPath($destination);
+ }
+
+ try {
+ $convertedFile = $this->fileConversionManager->convert($file, $targetMimeType, $destination);
+ } catch (ForbiddenException $e) {
+ throw new OCSForbiddenException($e->getMessage());
+ } catch (GenericFileException $e) {
+ throw new OCSBadRequestException($e->getMessage());
+ } catch (\Exception $e) {
+ logger('files')->error($e->getMessage(), ['exception' => $e]);
+ throw new OCSException($this->l10n->t('The file could not be converted.'));
+ }
+
+ $convertedFileRelativePath = $userFolder->getRelativePath($convertedFile);
+ if ($convertedFileRelativePath === null) {
+ throw new OCSNotFoundException($this->l10n->t('Could not get relative path to converted file'));
+ }
+
+ $file = $userFolder->get($convertedFileRelativePath);
+ $fileId = $file->getId();
+
+ return new DataResponse([
+ 'path' => $convertedFileRelativePath,
+ 'fileId' => $fileId,
+ ], Http::STATUS_CREATED);
+ }
+}
diff --git a/apps/files/lib/Controller/DirectEditingController.php b/apps/files/lib/Controller/DirectEditingController.php
index c67150be8d4..c8addc33e98 100644
--- a/apps/files/lib/Controller/DirectEditingController.php
+++ b/apps/files/lib/Controller/DirectEditingController.php
@@ -1,70 +1,47 @@
<?php
+
/**
- * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
- *
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Controller;
use Exception;
use OCA\Files\Service\DirectEditingService;
use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\DirectEditing\IManager;
use OCP\DirectEditing\RegisterDirectEditorEvent;
use OCP\EventDispatcher\IEventDispatcher;
-use OCP\ILogger;
use OCP\IRequest;
use OCP\IURLGenerator;
+use Psr\Log\LoggerInterface;
class DirectEditingController extends OCSController {
-
- /** @var IEventDispatcher */
- private $eventDispatcher;
-
- /** @var IManager */
- private $directEditingManager;
-
- /** @var IURLGenerator */
- private $urlGenerator;
-
- /** @var ILogger */
- private $logger;
-
- /** @var DirectEditingService */
- private $directEditingService;
-
- public function __construct($appName, IRequest $request, $corsMethods, $corsAllowedHeaders, $corsMaxAge,
- IEventDispatcher $eventDispatcher, IURLGenerator $urlGenerator, IManager $manager, DirectEditingService $directEditingService, ILogger $logger) {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ string $corsMethods,
+ string $corsAllowedHeaders,
+ int $corsMaxAge,
+ private IEventDispatcher $eventDispatcher,
+ private IURLGenerator $urlGenerator,
+ private IManager $directEditingManager,
+ private DirectEditingService $directEditingService,
+ private LoggerInterface $logger,
+ ) {
parent::__construct($appName, $request, $corsMethods, $corsAllowedHeaders, $corsMaxAge);
-
- $this->eventDispatcher = $eventDispatcher;
- $this->directEditingManager = $manager;
- $this->directEditingService = $directEditingService;
- $this->logger = $logger;
- $this->urlGenerator = $urlGenerator;
}
/**
- * @NoAdminRequired
+ * Get the direct editing capabilities
+ * @return DataResponse<Http::STATUS_OK, array{editors: array<string, array{id: string, name: string, mimetypes: list<string>, optionalMimetypes: list<string>, secure: bool}>, creators: array<string, array{id: string, editor: string, name: string, extension: string, templates: bool, mimetypes: list<string>}>}, array{}>
+ *
+ * 200: Direct editing capabilities returned
*/
+ #[NoAdminRequired]
public function info(): DataResponse {
$response = new DataResponse($this->directEditingService->getDirectEditingCapabilitites());
$response->setETag($this->directEditingService->getDirectEditingETag());
@@ -72,9 +49,20 @@ class DirectEditingController extends OCSController {
}
/**
- * @NoAdminRequired
+ * Create a file for direct editing
+ *
+ * @param string $path Path of the file
+ * @param string $editorId ID of the editor
+ * @param string $creatorId ID of the creator
+ * @param ?string $templateId ID of the template
+ *
+ * @return DataResponse<Http::STATUS_OK, array{url: string}, array{}>|DataResponse<Http::STATUS_FORBIDDEN|Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
+ *
+ * 200: URL for direct editing returned
+ * 403: Opening file is not allowed
*/
- public function create(string $path, string $editorId, string $creatorId, string $templateId = null): DataResponse {
+ #[NoAdminRequired]
+ public function create(string $path, string $editorId, string $creatorId, ?string $templateId = null): DataResponse {
if (!$this->directEditingManager->isEnabled()) {
return new DataResponse(['message' => 'Direct editing is not enabled'], Http::STATUS_INTERNAL_SERVER_ERROR);
}
@@ -86,27 +74,47 @@ class DirectEditingController extends OCSController {
'url' => $this->urlGenerator->linkToRouteAbsolute('files.DirectEditingView.edit', ['token' => $token])
]);
} catch (Exception $e) {
- $this->logger->logException($e, ['message' => 'Exception when creating a new file through direct editing']);
+ $this->logger->error(
+ 'Exception when creating a new file through direct editing',
+ [
+ 'exception' => $e
+ ],
+ );
return new DataResponse(['message' => 'Failed to create file: ' . $e->getMessage()], Http::STATUS_FORBIDDEN);
}
}
/**
- * @NoAdminRequired
+ * Open a file for direct editing
+ *
+ * @param string $path Path of the file
+ * @param ?string $editorId ID of the editor
+ * @param ?int $fileId ID of the file
+ *
+ * @return DataResponse<Http::STATUS_OK, array{url: string}, array{}>|DataResponse<Http::STATUS_FORBIDDEN|Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
+ *
+ * 200: URL for direct editing returned
+ * 403: Opening file is not allowed
*/
- public function open(string $path, string $editorId = null): DataResponse {
+ #[NoAdminRequired]
+ public function open(string $path, ?string $editorId = null, ?int $fileId = null): DataResponse {
if (!$this->directEditingManager->isEnabled()) {
return new DataResponse(['message' => 'Direct editing is not enabled'], Http::STATUS_INTERNAL_SERVER_ERROR);
}
$this->eventDispatcher->dispatchTyped(new RegisterDirectEditorEvent($this->directEditingManager));
try {
- $token = $this->directEditingManager->open($path, $editorId);
+ $token = $this->directEditingManager->open($path, $editorId, $fileId);
return new DataResponse([
'url' => $this->urlGenerator->linkToRouteAbsolute('files.DirectEditingView.edit', ['token' => $token])
]);
} catch (Exception $e) {
- $this->logger->logException($e, ['message' => 'Exception when opening a file through direct editing']);
+ $this->logger->error(
+ 'Exception when opening a file through direct editing',
+ [
+ 'exception' => $e
+ ],
+ );
return new DataResponse(['message' => 'Failed to open file: ' . $e->getMessage()], Http::STATUS_FORBIDDEN);
}
}
@@ -114,8 +122,16 @@ class DirectEditingController extends OCSController {
/**
- * @NoAdminRequired
+ * Get the templates for direct editing
+ *
+ * @param string $editorId ID of the editor
+ * @param string $creatorId ID of the creator
+ *
+ * @return DataResponse<Http::STATUS_OK, array{templates: array<string, array{id: string, title: string, preview: ?string, extension: string, mimetype: string}>}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
+ *
+ * 200: Templates returned
*/
+ #[NoAdminRequired]
public function templates(string $editorId, string $creatorId): DataResponse {
if (!$this->directEditingManager->isEnabled()) {
return new DataResponse(['message' => 'Direct editing is not enabled'], Http::STATUS_INTERNAL_SERVER_ERROR);
@@ -125,7 +141,12 @@ class DirectEditingController extends OCSController {
try {
return new DataResponse($this->directEditingManager->getTemplates($editorId, $creatorId));
} catch (Exception $e) {
- $this->logger->logException($e);
+ $this->logger->error(
+ $e->getMessage(),
+ [
+ 'exception' => $e
+ ],
+ );
return new DataResponse(['message' => 'Failed to obtain template list: ' . $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR);
}
}
diff --git a/apps/files/lib/Controller/DirectEditingViewController.php b/apps/files/lib/Controller/DirectEditingViewController.php
index 06bde8d63d7..b13e68f7766 100644
--- a/apps/files/lib/Controller/DirectEditingViewController.php
+++ b/apps/files/lib/Controller/DirectEditingViewController.php
@@ -1,69 +1,50 @@
<?php
+
/**
- * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
- *
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Controller;
use Exception;
use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
+use OCP\AppFramework\Http\Attribute\OpenAPI;
+use OCP\AppFramework\Http\Attribute\PublicPage;
+use OCP\AppFramework\Http\Attribute\UseSession;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\Response;
use OCP\DirectEditing\IManager;
use OCP\DirectEditing\RegisterDirectEditorEvent;
use OCP\EventDispatcher\IEventDispatcher;
-use OCP\ILogger;
use OCP\IRequest;
+use Psr\Log\LoggerInterface;
+#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class DirectEditingViewController extends Controller {
-
- /** @var IEventDispatcher */
- private $eventDispatcher;
-
- /** @var IManager */
- private $directEditingManager;
-
- /** @var ILogger */
- private $logger;
-
- public function __construct($appName, IRequest $request, IEventDispatcher $eventDispatcher, IManager $manager, ILogger $logger) {
+ public function __construct(
+ $appName,
+ IRequest $request,
+ private IEventDispatcher $eventDispatcher,
+ private IManager $directEditingManager,
+ private LoggerInterface $logger,
+ ) {
parent::__construct($appName, $request);
-
- $this->eventDispatcher = $eventDispatcher;
- $this->directEditingManager = $manager;
- $this->logger = $logger;
}
/**
- * @PublicPage
- * @NoCSRFRequired
- *
* @param string $token
* @return Response
*/
+ #[PublicPage]
+ #[NoCSRFRequired]
+ #[UseSession]
public function edit(string $token): Response {
$this->eventDispatcher->dispatchTyped(new RegisterDirectEditorEvent($this->directEditingManager));
try {
return $this->directEditingManager->edit($token);
} catch (Exception $e) {
- $this->logger->logException($e);
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
return new NotFoundResponse();
}
}
diff --git a/apps/files/lib/Controller/OpenLocalEditorController.php b/apps/files/lib/Controller/OpenLocalEditorController.php
new file mode 100644
index 00000000000..b000304eef6
--- /dev/null
+++ b/apps/files/lib/Controller/OpenLocalEditorController.php
@@ -0,0 +1,128 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Controller;
+
+use OCA\Files\Db\OpenLocalEditor;
+use OCA\Files\Db\OpenLocalEditorMapper;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\BruteForceProtection;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
+use OCP\AppFramework\Http\Attribute\UserRateLimit;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCSController;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\DB\Exception;
+use OCP\IRequest;
+use OCP\Security\ISecureRandom;
+use Psr\Log\LoggerInterface;
+
+class OpenLocalEditorController extends OCSController {
+ public const TOKEN_LENGTH = 128;
+ public const TOKEN_DURATION = 600; // 10 Minutes
+ public const TOKEN_RETRIES = 50;
+
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ protected ITimeFactory $timeFactory,
+ protected OpenLocalEditorMapper $mapper,
+ protected ISecureRandom $secureRandom,
+ protected LoggerInterface $logger,
+ protected ?string $userId,
+ ) {
+ parent::__construct($appName, $request);
+ }
+
+ /**
+ * Create a local editor
+ *
+ * @param string $path Path of the file
+ *
+ * @return DataResponse<Http::STATUS_OK, array{userId: ?string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}>
+ *
+ * 200: Local editor returned
+ */
+ #[NoAdminRequired]
+ #[UserRateLimit(limit: 10, period: 120)]
+ public function create(string $path): DataResponse {
+ $pathHash = sha1($path);
+
+ $entity = new OpenLocalEditor();
+ $entity->setUserId($this->userId);
+ $entity->setPathHash($pathHash);
+ $entity->setExpirationTime($this->timeFactory->getTime() + self::TOKEN_DURATION); // Expire in 10 minutes
+
+ for ($i = 1; $i <= self::TOKEN_RETRIES; $i++) {
+ $token = $this->secureRandom->generate(self::TOKEN_LENGTH, ISecureRandom::CHAR_ALPHANUMERIC);
+ $entity->setToken($token);
+
+ try {
+ $this->mapper->insert($entity);
+
+ return new DataResponse([
+ 'userId' => $this->userId,
+ 'pathHash' => $pathHash,
+ 'expirationTime' => $entity->getExpirationTime(),
+ 'token' => $entity->getToken(),
+ ]);
+ } catch (Exception $e) {
+ if ($e->getCode() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
+ // Only retry on unique constraint violation
+ throw $e;
+ }
+ }
+ }
+
+ $this->logger->error('Giving up after ' . self::TOKEN_RETRIES . ' retries to generate a unique local editor token for path hash: ' . $pathHash);
+ return new DataResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
+ }
+
+ /**
+ * Validate a local editor
+ *
+ * @param string $path Path of the file
+ * @param string $token Token of the local editor
+ *
+ * @return DataResponse<Http::STATUS_OK, array{userId: string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}>
+ *
+ * 200: Local editor validated successfully
+ * 404: Local editor not found
+ */
+ #[NoAdminRequired]
+ #[BruteForceProtection(action: 'openLocalEditor')]
+ public function validate(string $path, string $token): DataResponse {
+ $pathHash = sha1($path);
+
+ try {
+ $entity = $this->mapper->verifyToken($this->userId, $pathHash, $token);
+ } catch (DoesNotExistException $e) {
+ $response = new DataResponse([], Http::STATUS_NOT_FOUND);
+ $response->throttle(['userId' => $this->userId, 'pathHash' => $pathHash]);
+ return $response;
+ }
+
+ $this->mapper->delete($entity);
+
+ if ($entity->getExpirationTime() <= $this->timeFactory->getTime()) {
+ $response = new DataResponse([], Http::STATUS_NOT_FOUND);
+ $response->throttle(['userId' => $this->userId, 'pathHash' => $pathHash]);
+ return $response;
+ }
+
+ return new DataResponse([
+ 'userId' => $this->userId,
+ 'pathHash' => $pathHash,
+ 'expirationTime' => $entity->getExpirationTime(),
+ 'token' => $entity->getToken(),
+ ]);
+ }
+
+}
diff --git a/apps/files/lib/Controller/TemplateController.php b/apps/files/lib/Controller/TemplateController.php
index d04d86760e6..ee4c86941c7 100644
--- a/apps/files/lib/Controller/TemplateController.php
+++ b/apps/files/lib/Controller/TemplateController.php
@@ -3,72 +3,123 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2021 Julius Härtl <jus@bitgrid.net>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Controller;
+use OCA\Files\ResponseDefinitions;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSForbiddenException;
use OCP\AppFramework\OCSController;
use OCP\Files\GenericFileException;
use OCP\Files\Template\ITemplateManager;
+use OCP\Files\Template\Template;
+use OCP\Files\Template\TemplateFileCreator;
use OCP\IRequest;
+/**
+ * @psalm-import-type FilesTemplateFile from ResponseDefinitions
+ * @psalm-import-type FilesTemplateFileCreator from ResponseDefinitions
+ * @psalm-import-type FilesTemplateFileCreatorWithTemplates from ResponseDefinitions
+ * @psalm-import-type FilesTemplateField from ResponseDefinitions
+ * @psalm-import-type FilesTemplate from ResponseDefinitions
+ */
class TemplateController extends OCSController {
- protected $templateManager;
-
- public function __construct($appName, IRequest $request, ITemplateManager $templateManager) {
+ public function __construct(
+ $appName,
+ IRequest $request,
+ protected ITemplateManager $templateManager,
+ ) {
parent::__construct($appName, $request);
- $this->templateManager = $templateManager;
}
/**
- * @NoAdminRequired
+ * List the available templates
+ *
+ * @return DataResponse<Http::STATUS_OK, list<FilesTemplateFileCreatorWithTemplates>, array{}>
+ *
+ * 200: Available templates returned
*/
+ #[NoAdminRequired]
public function list(): DataResponse {
- return new DataResponse($this->templateManager->listTemplates());
+ /* Convert embedded Template instances to arrays to match return type */
+ return new DataResponse(array_map(static function (array $templateFileCreator) {
+ $templateFileCreator['templates'] = array_map(static fn (Template $template) => $template->jsonSerialize(), $templateFileCreator['templates']);
+ return $templateFileCreator;
+ }, $this->templateManager->listTemplates()));
+ }
+
+ /**
+ * List the fields for the template specified by the given file ID
+ *
+ * @param int $fileId File ID of the template
+ * @return DataResponse<Http::STATUS_OK, array<string, FilesTemplateField>, array{}>
+ *
+ * 200: Fields returned
+ */
+ #[NoAdminRequired]
+ public function listTemplateFields(int $fileId): DataResponse {
+ $fields = $this->templateManager->listTemplateFields($fileId);
+
+ return new DataResponse(
+ array_merge([], ...$fields),
+ Http::STATUS_OK
+ );
}
/**
- * @NoAdminRequired
- * @throws OCSForbiddenException
+ * Create a template
+ *
+ * @param string $filePath Path of the file
+ * @param string $templatePath Name of the template
+ * @param string $templateType Type of the template
+ * @param list<FilesTemplateField> $templateFields Fields of the template
+ *
+ * @return DataResponse<Http::STATUS_OK, FilesTemplateFile, array{}>
+ * @throws OCSForbiddenException Creating template is not allowed
+ *
+ * 200: Template created successfully
*/
- public function create(string $filePath, string $templatePath = '', string $templateType = 'user'): DataResponse {
+ #[NoAdminRequired]
+ public function create(
+ string $filePath,
+ string $templatePath = '',
+ string $templateType = 'user',
+ array $templateFields = [],
+ ): DataResponse {
try {
- return new DataResponse($this->templateManager->createFromTemplate($filePath, $templatePath, $templateType));
+ return new DataResponse($this->templateManager->createFromTemplate(
+ $filePath,
+ $templatePath,
+ $templateType,
+ $templateFields));
} catch (GenericFileException $e) {
throw new OCSForbiddenException($e->getMessage());
}
}
/**
- * @NoAdminRequired
+ * Initialize the template directory
+ *
+ * @param string $templatePath Path of the template directory
+ * @param bool $copySystemTemplates Whether to copy the system templates to the template directory
+ *
+ * @return DataResponse<Http::STATUS_OK, array{template_path: string, templates: list<FilesTemplateFileCreator>}, array{}>
+ * @throws OCSForbiddenException Initializing the template directory is not allowed
+ *
+ * 200: Template directory initialized successfully
*/
+ #[NoAdminRequired]
public function path(string $templatePath = '', bool $copySystemTemplates = false) {
try {
+ /** @var string $templatePath */
$templatePath = $this->templateManager->initializeTemplateDirectory($templatePath, null, $copySystemTemplates);
return new DataResponse([
'template_path' => $templatePath,
- 'templates' => $this->templateManager->listCreators()
+ 'templates' => array_values(array_map(fn (TemplateFileCreator $creator) => $creator->jsonSerialize(), $this->templateManager->listCreators())),
]);
} catch (\Exception $e) {
throw new OCSForbiddenException($e->getMessage());
diff --git a/apps/files/lib/Controller/TransferOwnershipController.php b/apps/files/lib/Controller/TransferOwnershipController.php
index fb1a8b33dc1..51a25400efb 100644
--- a/apps/files/lib/Controller/TransferOwnershipController.php
+++ b/apps/files/lib/Controller/TransferOwnershipController.php
@@ -3,27 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Controller;
@@ -32,10 +13,12 @@ use OCA\Files\Db\TransferOwnership as TransferOwnershipEntity;
use OCA\Files\Db\TransferOwnershipMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
+use OCP\Files\IHomeStorage;
use OCP\Files\IRootFolder;
use OCP\IRequest;
use OCP\IUserManager;
@@ -43,45 +26,34 @@ use OCP\Notification\IManager as NotificationManager;
class TransferOwnershipController extends OCSController {
- /** @var string */
- private $userId;
- /** @var NotificationManager */
- private $notificationManager;
- /** @var ITimeFactory */
- private $timeFactory;
- /** @var IJobList */
- private $jobList;
- /** @var TransferOwnershipMapper */
- private $mapper;
- /** @var IUserManager */
- private $userManager;
- /** @var IRootFolder */
- private $rootFolder;
-
- public function __construct(string $appName,
- IRequest $request,
- string $userId,
- NotificationManager $notificationManager,
- ITimeFactory $timeFactory,
- IJobList $jobList,
- TransferOwnershipMapper $mapper,
- IUserManager $userManager,
- IRootFolder $rootFolder) {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private string $userId,
+ private NotificationManager $notificationManager,
+ private ITimeFactory $timeFactory,
+ private IJobList $jobList,
+ private TransferOwnershipMapper $mapper,
+ private IUserManager $userManager,
+ private IRootFolder $rootFolder,
+ ) {
parent::__construct($appName, $request);
-
- $this->userId = $userId;
- $this->notificationManager = $notificationManager;
- $this->timeFactory = $timeFactory;
- $this->jobList = $jobList;
- $this->mapper = $mapper;
- $this->userManager = $userManager;
- $this->rootFolder = $rootFolder;
}
/**
- * @NoAdminRequired
+ * Transfer the ownership to another user
+ *
+ * @param string $recipient Username of the recipient
+ * @param string $path Path of the file
+ *
+ * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN, list<empty>, array{}>
+ *
+ * 200: Ownership transferred successfully
+ * 400: Transferring ownership is not possible
+ * 403: Transferring ownership is not allowed
*/
+ #[NoAdminRequired]
public function transfer(string $recipient, string $path): DataResponse {
$recipientUser = $this->userManager->get($recipient);
@@ -97,7 +69,7 @@ class TransferOwnershipController extends OCSController {
return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
- if ($node->getOwner()->getUID() !== $this->userId) {
+ if ($node->getOwner()->getUID() !== $this->userId || !$node->getStorage()->instanceOfStorage(IHomeStorage::class)) {
return new DataResponse([], Http::STATUS_FORBIDDEN);
}
@@ -125,8 +97,17 @@ class TransferOwnershipController extends OCSController {
}
/**
- * @NoAdminRequired
+ * Accept an ownership transfer
+ *
+ * @param int $id ID of the ownership transfer
+ *
+ * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}>
+ *
+ * 200: Ownership transfer accepted successfully
+ * 403: Accepting ownership transfer is not allowed
+ * 404: Ownership transfer not found
*/
+ #[NoAdminRequired]
public function accept(int $id): DataResponse {
try {
$transferOwnership = $this->mapper->getById($id);
@@ -138,28 +119,30 @@ class TransferOwnershipController extends OCSController {
return new DataResponse([], Http::STATUS_FORBIDDEN);
}
+ $this->jobList->add(TransferOwnership::class, [
+ 'id' => $transferOwnership->getId(),
+ ]);
+
$notification = $this->notificationManager->createNotification();
$notification->setApp('files')
->setObject('transfer', (string)$id);
$this->notificationManager->markProcessed($notification);
- $newTransferOwnership = new TransferOwnershipEntity();
- $newTransferOwnership->setNodeName($transferOwnership->getNodeName());
- $newTransferOwnership->setFileId($transferOwnership->getFileId());
- $newTransferOwnership->setSourceUser($transferOwnership->getSourceUser());
- $newTransferOwnership->setTargetUser($transferOwnership->getTargetUser());
- $this->mapper->insert($newTransferOwnership);
-
- $this->jobList->add(TransferOwnership::class, [
- 'id' => $newTransferOwnership->getId(),
- ]);
-
return new DataResponse([], Http::STATUS_OK);
}
/**
- * @NoAdminRequired
+ * Reject an ownership transfer
+ *
+ * @param int $id ID of the ownership transfer
+ *
+ * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}>
+ *
+ * 200: Ownership transfer rejected successfully
+ * 403: Rejecting ownership transfer is not allowed
+ * 404: Ownership transfer not found
*/
+ #[NoAdminRequired]
public function reject(int $id): DataResponse {
try {
$transferOwnership = $this->mapper->getById($id);
@@ -176,20 +159,10 @@ class TransferOwnershipController extends OCSController {
->setObject('transfer', (string)$id);
$this->notificationManager->markProcessed($notification);
- $notification = $this->notificationManager->createNotification();
- $notification->setUser($transferOwnership->getSourceUser())
- ->setApp($this->appName)
- ->setDateTime($this->timeFactory->getDateTime())
- ->setSubject('transferownershipRequestDenied', [
- 'sourceUser' => $transferOwnership->getSourceUser(),
- 'targetUser' => $transferOwnership->getTargetUser(),
- 'nodeName' => $transferOwnership->getNodeName()
- ])
- ->setObject('transfer', (string)$transferOwnership->getId());
- $this->notificationManager->notify($notification);
-
$this->mapper->delete($transferOwnership);
+ // A "request denied" notification will be created by Notifier::dismissNotification
+
return new DataResponse([], Http::STATUS_OK);
}
}
diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php
index 587f75f3f02..ecf21cef313 100644
--- a/apps/files/lib/Controller/ViewController.php
+++ b/apps/files/lib/Controller/ViewController.php
@@ -1,51 +1,33 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author fnuesse <felix.nuesse@t-online.de>
- * @author fnuesse <fnuesse@techfak.uni-bielefeld.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Max Kovalenko <mxss1998@yandex.ru>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Controller;
-use OCA\Files\Activity\Helper;
+use OC\Files\FilenameValidator;
+use OC\Files\Filesystem;
+use OCA\Files\AppInfo\Application;
use OCA\Files\Event\LoadAdditionalScriptsEvent;
+use OCA\Files\Event\LoadSearchPlugins;
use OCA\Files\Event\LoadSidebar;
+use OCA\Files\Service\UserConfig;
+use OCA\Files\Service\ViewConfig;
use OCA\Viewer\Event\LoadViewer;
use OCP\App\IAppManager;
use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
+use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
+use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
+use OCP\Authentication\TwoFactorAuth\IRegistry;
+use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
@@ -56,375 +38,269 @@ use OCP\IL10N;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
-use OCP\Share\IManager;
+use OCP\Util;
/**
- * Class ViewController
- *
* @package OCA\Files\Controller
*/
+#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class ViewController extends Controller {
- /** @var string */
- protected $appName;
- /** @var IRequest */
- protected $request;
- /** @var IURLGenerator */
- protected $urlGenerator;
- /** @var IL10N */
- protected $l10n;
- /** @var IConfig */
- protected $config;
- /** @var IEventDispatcher */
- protected $eventDispatcher;
- /** @var IUserSession */
- protected $userSession;
- /** @var IAppManager */
- protected $appManager;
- /** @var IRootFolder */
- protected $rootFolder;
- /** @var Helper */
- protected $activityHelper;
- /** @var IInitialState */
- private $initialState;
- /** @var ITemplateManager */
- private $templateManager;
- /** @var IManager */
- private $shareManager;
-
- public function __construct(string $appName,
+
+ public function __construct(
+ string $appName,
IRequest $request,
- IURLGenerator $urlGenerator,
- IL10N $l10n,
- IConfig $config,
- IEventDispatcher $eventDispatcher,
- IUserSession $userSession,
- IAppManager $appManager,
- IRootFolder $rootFolder,
- Helper $activityHelper,
- IInitialState $initialState,
- ITemplateManager $templateManager,
- IManager $shareManager
+ private IURLGenerator $urlGenerator,
+ private IL10N $l10n,
+ private IConfig $config,
+ private IEventDispatcher $eventDispatcher,
+ private IUserSession $userSession,
+ private IAppManager $appManager,
+ private IRootFolder $rootFolder,
+ private IInitialState $initialState,
+ private ITemplateManager $templateManager,
+ private UserConfig $userConfig,
+ private ViewConfig $viewConfig,
+ private FilenameValidator $filenameValidator,
+ private IRegistry $twoFactorRegistry,
) {
parent::__construct($appName, $request);
- $this->appName = $appName;
- $this->request = $request;
- $this->urlGenerator = $urlGenerator;
- $this->l10n = $l10n;
- $this->config = $config;
- $this->eventDispatcher = $eventDispatcher;
- $this->userSession = $userSession;
- $this->appManager = $appManager;
- $this->rootFolder = $rootFolder;
- $this->activityHelper = $activityHelper;
- $this->initialState = $initialState;
- $this->templateManager = $templateManager;
- $this->shareManager = $shareManager;
- }
-
- /**
- * @param string $appName
- * @param string $scriptName
- * @return string
- */
- protected function renderScript($appName, $scriptName) {
- $content = '';
- $appPath = \OC_App::getAppPath($appName);
- $scriptPath = $appPath . '/' . $scriptName;
- if (file_exists($scriptPath)) {
- // TODO: sanitize path / script name ?
- ob_start();
- include $scriptPath;
- $content = ob_get_contents();
- @ob_end_clean();
- }
-
- return $content;
}
/**
* FIXME: Replace with non static code
*
* @return array
- * @throws \OCP\Files\NotFoundException
+ * @throws NotFoundException
*/
- protected function getStorageInfo() {
- \OC_Util::setupFS();
- $dirInfo = \OC\Files\Filesystem::getFileInfo('/', false);
+ protected function getStorageInfo(string $dir = '/') {
+ $rootInfo = Filesystem::getFileInfo('/', false);
- return \OC_Helper::getStorageInfo('/', $dirInfo);
+ return \OC_Helper::getStorageInfo($dir, $rootInfo ?: null);
}
/**
- * @NoCSRFRequired
- * @NoAdminRequired
- *
* @param string $fileid
* @return TemplateResponse|RedirectResponse
- * @throws NotFoundException
*/
- public function showFile(string $fileid = null, int $openfile = 1): Response {
+ #[NoAdminRequired]
+ #[NoCSRFRequired]
+ public function showFile(?string $fileid = null, ?string $opendetails = null, ?string $openfile = null): Response {
+ if (!$fileid) {
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index'));
+ }
+
// This is the entry point from the `/f/{fileid}` URL which is hardcoded in the server.
try {
- return $this->redirectToFile($fileid, $openfile !== 0);
+ return $this->redirectToFile((int)$fileid, $opendetails, $openfile);
} catch (NotFoundException $e) {
- return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', ['fileNotFound' => true]));
+ // Keep the fileid even if not found, it will be used
+ // to detect the file could not be found and warn the user
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.indexViewFileid', ['fileid' => $fileid, 'view' => 'files']));
}
}
+
/**
- * @NoCSRFRequired
- * @NoAdminRequired
- *
* @param string $dir
* @param string $view
* @param string $fileid
- * @param bool $fileNotFound
- * @param string $openfile - the openfile URL parameter if it was present in the initial request
* @return TemplateResponse|RedirectResponse
- * @throws NotFoundException
*/
- public function index($dir = '', $view = '', $fileid = null, $fileNotFound = false, $openfile = null) {
- if ($fileid !== null && $dir === '') {
+ #[NoAdminRequired]
+ #[NoCSRFRequired]
+ public function indexView($dir = '', $view = '', $fileid = null) {
+ return $this->index($dir, $view, $fileid);
+ }
+
+ /**
+ * @param string $dir
+ * @param string $view
+ * @param string $fileid
+ * @return TemplateResponse|RedirectResponse
+ */
+ #[NoAdminRequired]
+ #[NoCSRFRequired]
+ public function indexViewFileid($dir = '', $view = '', $fileid = null) {
+ return $this->index($dir, $view, $fileid);
+ }
+
+ /**
+ * @param string $dir
+ * @param string $view
+ * @param string $fileid
+ * @return TemplateResponse|RedirectResponse
+ */
+ #[NoAdminRequired]
+ #[NoCSRFRequired]
+ public function index($dir = '', $view = '', $fileid = null) {
+ if ($fileid !== null && $view !== 'trashbin') {
try {
- return $this->redirectToFile($fileid);
+ return $this->redirectToFileIfInTrashbin((int)$fileid);
} catch (NotFoundException $e) {
- return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', ['fileNotFound' => true]));
}
}
- $nav = new \OCP\Template('files', 'appnavigation', '');
-
// Load the files we need
- \OCP\Util::addStyle('files', 'merged');
- \OCP\Util::addScript('files', 'merged-index', 'files');
- \OCP\Util::addScript('files', 'main');
-
- // mostly for the home storage's free space
- // FIXME: Make non static
- $storageInfo = $this->getStorageInfo();
+ Util::addInitScript('files', 'init');
+ Util::addScript('files', 'main');
- $user = $this->userSession->getUser()->getUID();
-
- // Get all the user favorites to create a submenu
- try {
- $favElements = $this->activityHelper->getFavoriteFilePaths($this->userSession->getUser()->getUID());
- } catch (\RuntimeException $e) {
- $favElements['folders'] = [];
- }
-
- $collapseClasses = '';
- if (count($favElements['folders']) > 0) {
- $collapseClasses = 'collapsible';
- }
-
- $favoritesSublistArray = [];
-
- $navBarPositionPosition = 6;
- $currentCount = 0;
- foreach ($favElements['folders'] as $favElement) {
- $link = $this->urlGenerator->linkToRoute('files.view.index', ['dir' => $favElement, 'view' => 'files']);
- $sortingValue = ++$currentCount;
- $element = [
- 'id' => str_replace('/', '-', $favElement),
- 'view' => 'files',
- 'href' => $link,
- 'dir' => $favElement,
- 'order' => $navBarPositionPosition,
- 'folderPosition' => $sortingValue,
- 'name' => basename($favElement),
- 'icon' => 'files',
- 'quickaccesselement' => 'true'
- ];
-
- array_push($favoritesSublistArray, $element);
- $navBarPositionPosition++;
- }
-
- $navItems = \OCA\Files\App::getNavigationManager()->getAll();
-
- // add the favorites entry in menu
- $navItems['favorites']['sublist'] = $favoritesSublistArray;
- $navItems['favorites']['classes'] = $collapseClasses;
-
- // parse every menu and add the expandedState user value
- foreach ($navItems as $key => $item) {
- if (isset($item['expandedState'])) {
- $navItems[$key]['defaultExpandedState'] = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', $item['expandedState'], '0') === '1';
+ $user = $this->userSession->getUser();
+ $userId = $user->getUID();
+
+ // If the file doesn't exists in the folder and
+ // exists in only one occurrence, redirect to that file
+ // in the correct folder
+ if ($fileid && $dir !== '') {
+ $baseFolder = $this->rootFolder->getUserFolder($userId);
+ $nodes = $baseFolder->getById((int)$fileid);
+ if (!empty($nodes)) {
+ $nodePath = $baseFolder->getRelativePath($nodes[0]->getPath());
+ $relativePath = $nodePath ? dirname($nodePath) : '';
+ // If the requested path does not contain the file id
+ // or if the requested path is not the file id itself
+ if (count($nodes) === 1 && $relativePath !== $dir && $nodePath !== $dir) {
+ return $this->redirectToFile((int)$fileid);
+ }
}
}
- $nav->assign('navigationItems', $navItems);
-
- $nav->assign('usage', \OC_Helper::humanFileSize($storageInfo['used']));
- if ($storageInfo['quota'] === \OCP\Files\FileInfo::SPACE_UNLIMITED) {
- $totalSpace = $this->l10n->t('Unlimited');
- } else {
- $totalSpace = \OC_Helper::humanFileSize($storageInfo['total']);
+ try {
+ // If view is files, we use the directory, otherwise we use the root storage
+ $storageInfo = $this->getStorageInfo(($view === 'files' && $dir) ? $dir : '/');
+ } catch (\Exception $e) {
+ $storageInfo = $this->getStorageInfo();
}
- $nav->assign('total_space', $totalSpace);
- $nav->assign('quota', $storageInfo['quota']);
- $nav->assign('usage_relative', $storageInfo['relative']);
- $nav->assign('webdav_url', \OCP\Util::linkToRemote('dav/files/' . $user));
+ $this->initialState->provideInitialState('storageStats', $storageInfo);
+ $this->initialState->provideInitialState('config', $this->userConfig->getConfigs());
+ $this->initialState->provideInitialState('viewConfigs', $this->viewConfig->getConfigs());
- $contentItems = [];
+ // File sorting user config
+ $filesSortingConfig = json_decode($this->config->getUserValue($userId, 'files', 'files_sorting_configs', '{}'), true);
+ $this->initialState->provideInitialState('filesSortingConfig', $filesSortingConfig);
- // render the container content for every navigation item
- foreach ($navItems as $item) {
- $content = '';
- if (isset($item['script'])) {
- $content = $this->renderScript($item['appname'], $item['script']);
- }
- // parse submenus
- if (isset($item['sublist'])) {
- foreach ($item['sublist'] as $subitem) {
- $subcontent = '';
- if (isset($subitem['script'])) {
- $subcontent = $this->renderScript($subitem['appname'], $subitem['script']);
- }
- $contentItems[$subitem['id']] = [
- 'id' => $subitem['id'],
- 'content' => $subcontent
- ];
- }
- }
- $contentItems[$item['id']] = [
- 'id' => $item['id'],
- 'content' => $content
- ];
- }
+ // Forbidden file characters (deprecated use capabilities)
+ // TODO: Remove with next release of `@nextcloud/files`
+ $forbiddenCharacters = $this->filenameValidator->getForbiddenCharacters();
+ $this->initialState->provideInitialState('forbiddenCharacters', $forbiddenCharacters);
$event = new LoadAdditionalScriptsEvent();
$this->eventDispatcher->dispatchTyped($event);
+ $this->eventDispatcher->dispatchTyped(new ResourcesLoadAdditionalScriptsEvent());
$this->eventDispatcher->dispatchTyped(new LoadSidebar());
+ $this->eventDispatcher->dispatchTyped(new LoadSearchPlugins());
// Load Viewer scripts
if (class_exists(LoadViewer::class)) {
$this->eventDispatcher->dispatchTyped(new LoadViewer());
}
+
+ $this->initialState->provideInitialState('templates_enabled', ($this->config->getSystemValueString('skeletondirectory', \OC::$SERVERROOT . '/core/skeleton') !== '') || ($this->config->getSystemValueString('templatedirectory', \OC::$SERVERROOT . '/core/skeleton/Templates') !== ''));
$this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false);
$this->initialState->provideInitialState('templates', $this->templateManager->listCreators());
- $params = [];
- $params['usedSpacePercent'] = (int) $storageInfo['relative'];
- $params['owner'] = $storageInfo['owner'] ?? '';
- $params['ownerDisplayName'] = $storageInfo['ownerDisplayName'] ?? '';
- $params['isPublic'] = false;
- $params['allowShareWithLink'] = $this->shareManager->shareApiAllowLinks() ? 'yes' : 'no';
- $params['defaultFileSorting'] = $this->config->getUserValue($user, 'files', 'file_sorting', 'name');
- $params['defaultFileSortingDirection'] = $this->config->getUserValue($user, 'files', 'file_sorting_direction', 'asc');
- $params['showgridview'] = $this->config->getUserValue($user, 'files', 'show_grid', false);
- $showHidden = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', false);
- $params['showHiddenFiles'] = $showHidden ? 1 : 0;
- $cropImagePreviews = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'crop_image_previews', true);
- $params['cropImagePreviews'] = $cropImagePreviews ? 1 : 0;
- $params['fileNotFound'] = $fileNotFound ? 1 : 0;
- $params['appNavigation'] = $nav;
- $params['appContents'] = $contentItems;
- $params['hiddenFields'] = $event->getHiddenFields();
+ $isTwoFactorEnabled = false;
+ foreach ($this->twoFactorRegistry->getProviderStates($user) as $providerId => $providerState) {
+ if ($providerId !== 'backup_codes' && $providerState === true) {
+ $isTwoFactorEnabled = true;
+ }
+ }
+
+ $this->initialState->provideInitialState('isTwoFactorEnabled', $isTwoFactorEnabled);
$response = new TemplateResponse(
- $this->appName,
+ Application::APP_ID,
'index',
- $params
);
$policy = new ContentSecurityPolicy();
$policy->addAllowedFrameDomain('\'self\'');
+ // Allow preview service worker
+ $policy->addAllowedWorkerSrcDomain('\'self\'');
$response->setContentSecurityPolicy($policy);
- $this->provideInitialState($dir, $openfile);
-
return $response;
}
/**
- * Add openFileInfo in initialState if $openfile is set.
- * @param string $dir - the ?dir= URL param
- * @param string $openfile - the ?openfile= URL param
- * @return void
+ * Redirects to the trashbin file list and highlight the given file id
+ *
+ * @param int $fileId file id to show
+ * @return RedirectResponse redirect response or not found response
+ * @throws NotFoundException
*/
- private function provideInitialState(string $dir, ?string $openfile): void {
- if ($openfile === null) {
- return;
- }
-
- $user = $this->userSession->getUser();
-
- if ($user === null) {
- return;
- }
-
- $uid = $user->getUID();
- $userFolder = $this->rootFolder->getUserFolder($uid);
- $nodes = $userFolder->getById((int) $openfile);
- $node = array_shift($nodes);
-
- if ($node === null) {
- return;
- }
+ private function redirectToFileIfInTrashbin($fileId): RedirectResponse {
+ $uid = $this->userSession->getUser()->getUID();
+ $baseFolder = $this->rootFolder->getUserFolder($uid);
+ $node = $baseFolder->getFirstNodeById($fileId);
+ $params = [];
- // properly format full path and make sure
- // we're relative to the user home folder
- $isRoot = $node === $userFolder;
- $path = $userFolder->getRelativePath($node->getPath());
- $directory = $userFolder->getRelativePath($node->getParent()->getPath());
+ if (!$node && $this->appManager->isEnabledForUser('files_trashbin')) {
+ /** @var Folder */
+ $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/');
+ $node = $baseFolder->getFirstNodeById($fileId);
+ $params['view'] = 'trashbin';
- // Prevent opening a file from another folder.
- if ($dir !== $directory) {
- return;
+ if ($node) {
+ $params['fileid'] = $fileId;
+ if ($node instanceof Folder) {
+ // set the full path to enter the folder
+ $params['dir'] = $baseFolder->getRelativePath($node->getPath());
+ } else {
+ // set parent path as dir
+ $params['dir'] = $baseFolder->getRelativePath($node->getParent()->getPath());
+ }
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.indexViewFileid', $params));
+ }
}
-
- $this->initialState->provideInitialState(
- 'openFileInfo', [
- 'id' => $node->getId(),
- 'name' => $isRoot ? '' : $node->getName(),
- 'path' => $path,
- 'directory' => $directory,
- 'mime' => $node->getMimetype(),
- 'type' => $node->getType(),
- 'permissions' => $node->getPermissions(),
- ]
- );
+ throw new NotFoundException();
}
/**
* Redirects to the file list and highlight the given file id
*
- * @param string $fileId file id to show
- * @param bool $setOpenfile - whether or not to set the openfile URL parameter
+ * @param int $fileId file id to show
+ * @param string|null $openDetails open details parameter
+ * @param string|null $openFile open file parameter
* @return RedirectResponse redirect response or not found response
- * @throws \OCP\Files\NotFoundException
+ * @throws NotFoundException
*/
- private function redirectToFile($fileId, bool $setOpenfile = false) {
+ private function redirectToFile(int $fileId, ?string $openDetails = null, ?string $openFile = null): RedirectResponse {
$uid = $this->userSession->getUser()->getUID();
$baseFolder = $this->rootFolder->getUserFolder($uid);
- $files = $baseFolder->getById($fileId);
- $params = [];
+ $node = $baseFolder->getFirstNodeById($fileId);
+ $params = ['view' => 'files'];
- if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) {
- $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/');
- $files = $baseFolder->getById($fileId);
- $params['view'] = 'trashbin';
+ try {
+ $this->redirectToFileIfInTrashbin($fileId);
+ } catch (NotFoundException $e) {
}
- if (!empty($files)) {
- $file = current($files);
- if ($file instanceof Folder) {
+ if ($node) {
+ $params['fileid'] = $fileId;
+ if ($node instanceof Folder) {
// set the full path to enter the folder
- $params['dir'] = $baseFolder->getRelativePath($file->getPath());
+ $params['dir'] = $baseFolder->getRelativePath($node->getPath());
} else {
// set parent path as dir
- $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath());
- // and scroll to the entry
- $params['scrollto'] = $file->getName();
+ $params['dir'] = $baseFolder->getRelativePath($node->getParent()->getPath());
+ // open the file by default (opening the viewer)
+ $params['openfile'] = 'true';
+ }
- if ($setOpenfile) {
- // forward the openfile URL parameter.
- $params['openfile'] = $fileId;
- }
+ // Forward open parameters if any.
+ // - openfile is true by default
+ // - opendetails is undefined by default
+ // - both will be evaluated as truthy
+ if ($openDetails !== null) {
+ $params['opendetails'] = $openDetails !== 'false' ? 'true' : 'false';
}
- return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params));
+ if ($openFile !== null) {
+ $params['openfile'] = $openFile !== 'false' ? 'true' : 'false';
+ }
+
+ return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.indexViewFileid', $params));
}
- throw new \OCP\Files\NotFoundException();
+
+ throw new NotFoundException();
}
}
diff --git a/apps/files/lib/Dashboard/FavoriteWidget.php b/apps/files/lib/Dashboard/FavoriteWidget.php
new file mode 100644
index 00000000000..b68b8a56b2e
--- /dev/null
+++ b/apps/files/lib/Dashboard/FavoriteWidget.php
@@ -0,0 +1,141 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Dashboard;
+
+use OCA\Files\AppInfo\Application;
+use OCP\Dashboard\IAPIWidgetV2;
+use OCP\Dashboard\IButtonWidget;
+use OCP\Dashboard\IIconWidget;
+use OCP\Dashboard\IOptionWidget;
+use OCP\Dashboard\Model\WidgetButton;
+use OCP\Dashboard\Model\WidgetItem;
+use OCP\Dashboard\Model\WidgetItems;
+use OCP\Dashboard\Model\WidgetOptions;
+use OCP\Files\File;
+use OCP\Files\IMimeTypeDetector;
+use OCP\Files\IRootFolder;
+use OCP\IL10N;
+use OCP\IPreview;
+use OCP\ITagManager;
+use OCP\IURLGenerator;
+use OCP\IUserManager;
+
+class FavoriteWidget implements IIconWidget, IAPIWidgetV2, IButtonWidget, IOptionWidget {
+
+ public function __construct(
+ private readonly IL10N $l10n,
+ private readonly IURLGenerator $urlGenerator,
+ private readonly IMimeTypeDetector $mimeTypeDetector,
+ private readonly IUserManager $userManager,
+ private readonly ITagManager $tagManager,
+ private readonly IRootFolder $rootFolder,
+ private readonly IPreview $previewManager,
+ ) {
+ }
+
+ public function getId(): string {
+ return Application::APP_ID . '-favorites';
+ }
+
+ public function getTitle(): string {
+ return $this->l10n->t('Favorite files');
+ }
+
+ public function getOrder(): int {
+ return 0;
+ }
+
+ public function getIconClass(): string {
+ return 'icon-star-dark';
+ }
+
+ public function getIconUrl(): string {
+ return $this->urlGenerator->getAbsoluteURL(
+ $this->urlGenerator->imagePath('core', 'actions/star.svg')
+ );
+ }
+
+ public function getUrl(): ?string {
+ return $this->urlGenerator->linkToRouteAbsolute('files.View.indexView', ['view' => 'favorites']);
+ }
+
+ public function load(): void {
+ }
+
+ public function getItems(string $userId, int $limit = 7): array {
+ $user = $this->userManager->get($userId);
+
+ if (!$user) {
+ return [];
+ }
+ $tags = $this->tagManager->load('files', [], false, $userId);
+ $favorites = $tags->getFavorites();
+ if (empty($favorites)) {
+ return [];
+ }
+ $favoriteNodes = [];
+ $userFolder = $this->rootFolder->getUserFolder($userId);
+ $count = 0;
+ foreach ($favorites as $favorite) {
+ $node = $userFolder->getFirstNodeById($favorite);
+ if ($node) {
+ $url = $this->urlGenerator->linkToRouteAbsolute(
+ 'files.view.showFile', ['fileid' => $node->getId()]
+ );
+ if ($node instanceof File) {
+ $icon = $this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreviewByFileId', [
+ 'x' => 256,
+ 'y' => 256,
+ 'fileId' => $node->getId(),
+ 'c' => $node->getEtag(),
+ 'mimeFallback' => true,
+ ]);
+ } else {
+ $icon = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'filetypes/folder.svg'));
+ }
+ $favoriteNodes[] = new WidgetItem(
+ $node->getName(),
+ '',
+ $url,
+ $icon,
+ (string)$node->getCreationTime()
+ );
+ $count++;
+ if ($count >= $limit) {
+ break;
+ }
+ }
+ }
+
+ return $favoriteNodes;
+ }
+
+ public function getItemsV2(string $userId, ?string $since = null, int $limit = 7): WidgetItems {
+ $items = $this->getItems($userId, $limit);
+ return new WidgetItems(
+ $items,
+ count($items) === 0 ? $this->l10n->t('No favorites') : '',
+ );
+ }
+
+ public function getWidgetButtons(string $userId): array {
+ return [
+ new WidgetButton(
+ WidgetButton::TYPE_MORE,
+ $this->urlGenerator->linkToRouteAbsolute('files.View.indexView', ['view' => 'favorites']),
+ $this->l10n->t('More favorites')
+ ),
+ ];
+ }
+
+ public function getWidgetOptions(): WidgetOptions {
+ return new WidgetOptions(roundItemIcons: false);
+ }
+}
diff --git a/apps/files/lib/Db/OpenLocalEditor.php b/apps/files/lib/Db/OpenLocalEditor.php
new file mode 100644
index 00000000000..da7f5d13206
--- /dev/null
+++ b/apps/files/lib/Db/OpenLocalEditor.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Db;
+
+use OCP\AppFramework\Db\Entity;
+
+/**
+ * @method void setUserId(string $userId)
+ * @method string getUserId()
+ * @method void setPathHash(string $pathHash)
+ * @method string getPathHash()
+ * @method void setExpirationTime(int $expirationTime)
+ * @method int getExpirationTime()
+ * @method void setToken(string $token)
+ * @method string getToken()
+ */
+class OpenLocalEditor extends Entity {
+ /** @var string */
+ protected $userId;
+
+ /** @var string */
+ protected $pathHash;
+
+ /** @var int */
+ protected $expirationTime;
+
+ /** @var string */
+ protected $token;
+
+ public function __construct() {
+ $this->addType('userId', 'string');
+ $this->addType('pathHash', 'string');
+ $this->addType('expirationTime', 'integer');
+ $this->addType('token', 'string');
+ }
+}
diff --git a/apps/files/lib/Db/OpenLocalEditorMapper.php b/apps/files/lib/Db/OpenLocalEditorMapper.php
new file mode 100644
index 00000000000..6ae8b79c258
--- /dev/null
+++ b/apps/files/lib/Db/OpenLocalEditorMapper.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Db;
+
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\AppFramework\Db\MultipleObjectsReturnedException;
+use OCP\AppFramework\Db\QBMapper;
+use OCP\DB\Exception;
+use OCP\IDBConnection;
+
+/**
+ * @template-extends QBMapper<OpenLocalEditor>
+ */
+class OpenLocalEditorMapper extends QBMapper {
+ public function __construct(IDBConnection $db) {
+ parent::__construct($db, 'open_local_editor', OpenLocalEditor::class);
+ }
+
+ /**
+ * @throws DoesNotExistException
+ * @throws MultipleObjectsReturnedException
+ * @throws Exception
+ */
+ public function verifyToken(string $userId, string $pathHash, string $token): OpenLocalEditor {
+ $qb = $this->db->getQueryBuilder();
+
+ $qb->select('*')
+ ->from($this->getTableName())
+ ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId)))
+ ->andWhere($qb->expr()->eq('path_hash', $qb->createNamedParameter($pathHash)))
+ ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)));
+
+ return $this->findEntity($qb);
+ }
+
+ public function deleteExpiredTokens(int $time): void {
+ $qb = $this->db->getQueryBuilder();
+
+ $qb->delete($this->getTableName())
+ ->where($qb->expr()->lt('expiration_time', $qb->createNamedParameter($time)));
+
+ $qb->executeStatement();
+ }
+}
diff --git a/apps/files/lib/Db/TransferOwnership.php b/apps/files/lib/Db/TransferOwnership.php
index 1ab94361ac9..ae78c19b76d 100644
--- a/apps/files/lib/Db/TransferOwnership.php
+++ b/apps/files/lib/Db/TransferOwnership.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Db;
diff --git a/apps/files/lib/Db/TransferOwnershipMapper.php b/apps/files/lib/Db/TransferOwnershipMapper.php
index f55f9e733f9..8b29399f768 100644
--- a/apps/files/lib/Db/TransferOwnershipMapper.php
+++ b/apps/files/lib/Db/TransferOwnershipMapper.php
@@ -3,32 +3,17 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Db;
use OCP\AppFramework\Db\QBMapper;
use OCP\IDBConnection;
+/**
+ * @template-extends QBMapper<TransferOwnership>
+ */
class TransferOwnershipMapper extends QBMapper {
public function __construct(IDBConnection $db) {
parent::__construct($db, 'user_transfer_owner', TransferOwnership::class);
diff --git a/apps/files/lib/DirectEditingCapabilities.php b/apps/files/lib/DirectEditingCapabilities.php
new file mode 100644
index 00000000000..5bceef9305f
--- /dev/null
+++ b/apps/files/lib/DirectEditingCapabilities.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files;
+
+use OCA\Files\Service\DirectEditingService;
+use OCP\Capabilities\ICapability;
+use OCP\Capabilities\IInitialStateExcludedCapability;
+use OCP\IURLGenerator;
+
+class DirectEditingCapabilities implements ICapability, IInitialStateExcludedCapability {
+ public function __construct(
+ protected DirectEditingService $directEditingService,
+ protected IURLGenerator $urlGenerator,
+ ) {
+ }
+
+ /**
+ * @return array{files: array{directEditing: array{url: string, etag: string, supportsFileId: bool}}}
+ */
+ public function getCapabilities() {
+ return [
+ 'files' => [
+ 'directEditing' => [
+ 'url' => $this->urlGenerator->linkToOCSRouteAbsolute('files.DirectEditing.info'),
+ 'etag' => $this->directEditingService->getDirectEditingETag(),
+ 'supportsFileId' => true,
+ ]
+ ],
+ ];
+ }
+}
diff --git a/apps/files/lib/Event/LoadAdditionalScriptsEvent.php b/apps/files/lib/Event/LoadAdditionalScriptsEvent.php
index 5291a776e81..d1cf7f4016e 100644
--- a/apps/files/lib/Event/LoadAdditionalScriptsEvent.php
+++ b/apps/files/lib/Event/LoadAdditionalScriptsEvent.php
@@ -3,27 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Event;
@@ -31,18 +12,8 @@ use OCP\EventDispatcher\Event;
/**
* This event is triggered when the files app is rendered.
- * It can be used to add additional scripts to the files app.
*
* @since 17.0.0
*/
class LoadAdditionalScriptsEvent extends Event {
- private $hiddenFields = [];
-
- public function addHiddenField(string $name, string $value): void {
- $this->hiddenFields[$name] = $value;
- }
-
- public function getHiddenFields(): array {
- return $this->hiddenFields;
- }
}
diff --git a/apps/files/lib/Event/LoadSearchPlugins.php b/apps/files/lib/Event/LoadSearchPlugins.php
new file mode 100644
index 00000000000..9c6c81fcca5
--- /dev/null
+++ b/apps/files/lib/Event/LoadSearchPlugins.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Event;
+
+use OCP\EventDispatcher\Event;
+
+class LoadSearchPlugins extends Event {
+}
diff --git a/apps/files/lib/Event/LoadSidebar.php b/apps/files/lib/Event/LoadSidebar.php
index 8dc30e33632..01db57bb562 100644
--- a/apps/files/lib/Event/LoadSidebar.php
+++ b/apps/files/lib/Event/LoadSidebar.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Event;
diff --git a/apps/files/lib/Exception/TransferOwnershipException.php b/apps/files/lib/Exception/TransferOwnershipException.php
index 1849976b6db..531c5d513da 100644
--- a/apps/files/lib/Exception/TransferOwnershipException.php
+++ b/apps/files/lib/Exception/TransferOwnershipException.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Exception;
diff --git a/apps/files/lib/Helper.php b/apps/files/lib/Helper.php
index 18fea3aa2a1..b1439ac7fa5 100644
--- a/apps/files/lib/Helper.php
+++ b/apps/files/lib/Helper.php
@@ -1,100 +1,26 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author brumsel <brumsel@losecatcher.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Michael Jobst <mjobst+github@tecratech.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files;
+use OC\Files\Filesystem;
use OCP\Files\FileInfo;
-use OCP\ITagManager;
+use OCP\Util;
/**
* Helper class for manipulating file information
*/
class Helper {
/**
- * @param string $dir
- * @return array
- * @throws \OCP\Files\NotFoundException
- */
- public static function buildFileStorageStatistics($dir) {
- // information about storage capacities
- $storageInfo = \OC_Helper::getStorageInfo($dir);
- $l = \OC::$server->getL10N('files');
- $maxUploadFileSize = \OCP\Util::maxUploadFilesize($dir, $storageInfo['free']);
- $maxHumanFileSize = \OCP\Util::humanFileSize($maxUploadFileSize);
- $maxHumanFileSize = $l->t('Upload (max. %s)', [$maxHumanFileSize]);
-
- return [
- 'uploadMaxFilesize' => $maxUploadFileSize,
- 'maxHumanFilesize' => $maxHumanFileSize,
- 'freeSpace' => $storageInfo['free'],
- 'quota' => $storageInfo['quota'],
- 'used' => $storageInfo['used'],
- 'usedSpacePercent' => (int)$storageInfo['relative'],
- 'owner' => $storageInfo['owner'],
- 'ownerDisplayName' => $storageInfo['ownerDisplayName'],
- 'mountType' => $storageInfo['mountType'],
- 'mountPoint' => $storageInfo['mountPoint'],
- ];
- }
-
- /**
- * Determine icon for a given file
- *
- * @param \OCP\Files\FileInfo $file file info
- * @return string icon URL
- */
- public static function determineIcon($file) {
- if ($file['type'] === 'dir') {
- $icon = \OC::$server->getMimeTypeDetector()->mimeTypeIcon('dir');
- // TODO: move this part to the client side, using mountType
- if ($file->isShared()) {
- $icon = \OC::$server->getMimeTypeDetector()->mimeTypeIcon('dir-shared');
- } elseif ($file->isMounted()) {
- $icon = \OC::$server->getMimeTypeDetector()->mimeTypeIcon('dir-external');
- }
- } else {
- $icon = \OC::$server->getMimeTypeDetector()->mimeTypeIcon($file->getMimetype());
- }
-
- return substr($icon, 0, -3) . 'svg';
- }
-
- /**
* Comparator function to sort files alphabetically and have
* the directories appear first
*
- * @param \OCP\Files\FileInfo $a file
- * @param \OCP\Files\FileInfo $b file
+ * @param FileInfo $a file
+ * @param FileInfo $b file
* @return int -1 if $a must come before $b, 1 otherwise
*/
public static function compareFileNames(FileInfo $a, FileInfo $b) {
@@ -105,15 +31,15 @@ class Helper {
} elseif ($aType !== 'dir' and $bType === 'dir') {
return 1;
} else {
- return \OCP\Util::naturalSortCompare($a->getName(), $b->getName());
+ return Util::naturalSortCompare($a->getName(), $b->getName());
}
}
/**
* Comparator function to sort files by date
*
- * @param \OCP\Files\FileInfo $a file
- * @param \OCP\Files\FileInfo $b file
+ * @param FileInfo $a file
+ * @param FileInfo $b file
* @return int -1 if $a must come before $b, 1 otherwise
*/
public static function compareTimestamp(FileInfo $a, FileInfo $b) {
@@ -125,8 +51,8 @@ class Helper {
/**
* Comparator function to sort files by size
*
- * @param \OCP\Files\FileInfo $a file
- * @param \OCP\Files\FileInfo $b file
+ * @param FileInfo $a file
+ * @param FileInfo $b file
* @return int -1 if $a must come before $b, 1 otherwise
*/
public static function compareSize(FileInfo $a, FileInfo $b) {
@@ -138,22 +64,24 @@ class Helper {
/**
* Formats the file info to be returned as JSON to the client.
*
- * @param \OCP\Files\FileInfo $i
+ * @param FileInfo $i
* @return array formatted file info
*/
public static function formatFileInfo(FileInfo $i) {
$entry = [];
- $entry['id'] = $i['fileid'];
- $entry['parentId'] = $i['parent'];
- $entry['mtime'] = $i['mtime'] * 1000;
+ $entry['id'] = $i->getId();
+ $entry['parentId'] = $i->getParentId();
+ $entry['mtime'] = $i->getMtime() * 1000;
// only pick out the needed attributes
$entry['name'] = $i->getName();
- $entry['permissions'] = $i['permissions'];
- $entry['mimetype'] = $i['mimetype'];
- $entry['size'] = $i['size'];
- $entry['type'] = $i['type'];
- $entry['etag'] = $i['etag'];
+ $entry['permissions'] = $i->getPermissions();
+ $entry['mimetype'] = $i->getMimetype();
+ $entry['size'] = $i->getSize();
+ $entry['type'] = $i->getType();
+ $entry['etag'] = $i->getEtag();
+ // TODO: this is using the private implementation of FileInfo
+ // the array access is not part of the public interface
if (isset($i['tags'])) {
$entry['tags'] = $i['tags'];
}
@@ -163,6 +91,10 @@ class Helper {
if (isset($i['is_share_mount_point'])) {
$entry['isShareMountPoint'] = $i['is_share_mount_point'];
}
+ if (isset($i['extraData'])) {
+ $entry['extraData'] = $i['extraData'];
+ }
+
$mountType = null;
$mount = $i->getMountPoint();
$mountType = $mount->getMountType();
@@ -172,27 +104,10 @@ class Helper {
}
$entry['mountType'] = $mountType;
}
- if (isset($i['extraData'])) {
- $entry['extraData'] = $i['extraData'];
- }
return $entry;
}
/**
- * Format file info for JSON
- * @param \OCP\Files\FileInfo[] $fileInfos file infos
- * @return array
- */
- public static function formatFileInfos($fileInfos) {
- $files = [];
- foreach ($fileInfos as $i) {
- $files[] = self::formatFileInfo($i);
- }
-
- return $files;
- }
-
- /**
* Retrieves the contents of the given directory and
* returns it as a sorted array of FileInfo.
*
@@ -200,61 +115,21 @@ class Helper {
* @param string $sortAttribute attribute to sort on
* @param bool $sortDescending true for descending sort, false otherwise
* @param string $mimetypeFilter limit returned content to this mimetype or mimepart
- * @return \OCP\Files\FileInfo[] files
+ * @return FileInfo[] files
*/
public static function getFiles($dir, $sortAttribute = 'name', $sortDescending = false, $mimetypeFilter = '') {
- $content = \OC\Files\Filesystem::getDirectoryContent($dir, $mimetypeFilter);
+ $content = Filesystem::getDirectoryContent($dir, $mimetypeFilter);
return self::sortFiles($content, $sortAttribute, $sortDescending);
}
/**
- * Populate the result set with file tags
- *
- * @param array $fileList
- * @param string $fileIdentifier identifier attribute name for values in $fileList
- * @param ITagManager $tagManager
- * @return array file list populated with tags
- */
- public static function populateTags(array $fileList, $fileIdentifier, ITagManager $tagManager) {
- $ids = [];
- foreach ($fileList as $fileData) {
- $ids[] = $fileData[$fileIdentifier];
- }
- $tagger = $tagManager->load('files');
- $tags = $tagger->getTagsForObjects($ids);
-
- if (!is_array($tags)) {
- throw new \UnexpectedValueException('$tags must be an array');
- }
-
- // Set empty tag array
- foreach ($fileList as $key => $fileData) {
- $fileList[$key]['tags'] = [];
- }
-
- if (!empty($tags)) {
- foreach ($tags as $fileId => $fileTags) {
- foreach ($fileList as $key => $fileData) {
- if ($fileId !== $fileData[$fileIdentifier]) {
- continue;
- }
-
- $fileList[$key]['tags'] = $fileTags;
- }
- }
- }
-
- return $fileList;
- }
-
- /**
* Sort the given file info array
*
- * @param \OCP\Files\FileInfo[] $files files to sort
+ * @param FileInfo[] $files files to sort
* @param string $sortAttribute attribute to sort on
* @param bool $sortDescending true for descending sort, false otherwise
- * @return \OCP\Files\FileInfo[] sorted files
+ * @return FileInfo[] sorted files
*/
public static function sortFiles($files, $sortAttribute = 'name', $sortDescending = false) {
$sortFunc = 'compareFileNames';
diff --git a/apps/files/lib/Listener/LegacyLoadAdditionalScriptsAdapter.php b/apps/files/lib/Listener/LegacyLoadAdditionalScriptsAdapter.php
deleted file mode 100644
index f60f9d73d78..00000000000
--- a/apps/files/lib/Listener/LegacyLoadAdditionalScriptsAdapter.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-namespace OCA\Files\Listener;
-
-use OC\EventDispatcher\SymfonyAdapter;
-use OCA\Files\Event\LoadAdditionalScriptsEvent;
-use OCP\EventDispatcher\Event;
-use OCP\EventDispatcher\IEventListener;
-use Symfony\Component\EventDispatcher\GenericEvent;
-
-class LegacyLoadAdditionalScriptsAdapter implements IEventListener {
-
- /** @var SymfonyAdapter */
- private $dispatcher;
-
- public function __construct(SymfonyAdapter $dispatcher) {
- $this->dispatcher = $dispatcher;
- }
-
- public function handle(Event $event): void {
- if (!($event instanceof LoadAdditionalScriptsEvent)) {
- return;
- }
-
- $legacyEvent = new GenericEvent(null, ['hiddenFields' => []]);
- $this->dispatcher->dispatch('OCA\Files::loadAdditionalScripts', $legacyEvent);
-
- $hiddenFields = $legacyEvent->getArgument('hiddenFields');
- foreach ($hiddenFields as $name => $value) {
- $event->addHiddenField($name, $value);
- }
- }
-}
diff --git a/apps/files/lib/Listener/LoadSearchPluginsListener.php b/apps/files/lib/Listener/LoadSearchPluginsListener.php
new file mode 100644
index 00000000000..4cc4ca22f83
--- /dev/null
+++ b/apps/files/lib/Listener/LoadSearchPluginsListener.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Listener;
+
+use OCA\Files\Event\LoadSearchPlugins;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Util;
+
+/** @template-implements IEventListener<LoadSearchPlugins> */
+class LoadSearchPluginsListener implements IEventListener {
+ public function handle(Event $event): void {
+ if (!$event instanceof LoadSearchPlugins) {
+ return;
+ }
+
+ Util::addScript('files', 'search');
+ }
+}
diff --git a/apps/files/lib/Listener/LoadSidebarListener.php b/apps/files/lib/Listener/LoadSidebarListener.php
index 15f24279e0a..78b48ab1ce0 100644
--- a/apps/files/lib/Listener/LoadSidebarListener.php
+++ b/apps/files/lib/Listener/LoadSidebarListener.php
@@ -3,25 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Listener;
@@ -31,6 +14,7 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Util;
+/** @template-implements IEventListener<LoadSidebar> */
class LoadSidebarListener implements IEventListener {
public function handle(Event $event): void {
if (!($event instanceof LoadSidebar)) {
@@ -38,8 +22,5 @@ class LoadSidebarListener implements IEventListener {
}
Util::addScript(Application::APP_ID, 'sidebar');
- // needed by the Sidebar legacy tabs
- // TODO: remove when all tabs migrated to the new api
- Util::addScript('files', 'fileinfomodel');
}
}
diff --git a/apps/files/lib/Listener/NodeAddedToFavoriteListener.php b/apps/files/lib/Listener/NodeAddedToFavoriteListener.php
new file mode 100644
index 00000000000..827c1851d3d
--- /dev/null
+++ b/apps/files/lib/Listener/NodeAddedToFavoriteListener.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Listener;
+
+use OCA\Files\Activity\FavoriteProvider;
+use OCP\Activity\IManager as IActivityManager;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Files\Events\NodeAddedToFavorite;
+
+/** @template-implements IEventListener<NodeAddedToFavorite> */
+class NodeAddedToFavoriteListener implements IEventListener {
+ public function __construct(
+ private IActivityManager $activityManager,
+ ) {
+ }
+ public function handle(Event $event):void {
+ if (!($event instanceof NodeAddedToFavorite)) {
+ return;
+ }
+ $activityEvent = $this->activityManager->generateEvent();
+ try {
+ $activityEvent->setApp('files')
+ ->setObject('files', $event->getFileId(), $event->getPath())
+ ->setType('favorite')
+ ->setAuthor($event->getUser()->getUID())
+ ->setAffectedUser($event->getUser()->getUID())
+ ->setTimestamp(time())
+ ->setSubject(
+ FavoriteProvider::SUBJECT_ADDED,
+ ['id' => $event->getFileId(), 'path' => $event->getPath()]
+ );
+ $this->activityManager->publish($activityEvent);
+ } catch (\InvalidArgumentException $e) {
+ } catch (\BadMethodCallException $e) {
+ }
+ }
+}
diff --git a/apps/files/lib/Listener/NodeRemovedFromFavoriteListener.php b/apps/files/lib/Listener/NodeRemovedFromFavoriteListener.php
new file mode 100644
index 00000000000..fe39d4af540
--- /dev/null
+++ b/apps/files/lib/Listener/NodeRemovedFromFavoriteListener.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Listener;
+
+use OCA\Files\Activity\FavoriteProvider;
+use OCP\Activity\IManager as IActivityManager;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Files\Events\NodeRemovedFromFavorite;
+
+/** @template-implements IEventListener<NodeRemovedFromFavorite> */
+class NodeRemovedFromFavoriteListener implements IEventListener {
+ public function __construct(
+ private IActivityManager $activityManager,
+ ) {
+ }
+ public function handle(Event $event):void {
+ if (!($event instanceof NodeRemovedFromFavorite)) {
+ return;
+ }
+ $activityEvent = $this->activityManager->generateEvent();
+ try {
+ $activityEvent->setApp('files')
+ ->setObject('files', $event->getFileId(), $event->getPath())
+ ->setType('favorite')
+ ->setAuthor($event->getUser()->getUID())
+ ->setAffectedUser($event->getUser()->getUID())
+ ->setTimestamp(time())
+ ->setSubject(
+ FavoriteProvider::SUBJECT_REMOVED,
+ ['id' => $event->getFileId(), 'path' => $event->getPath()]
+ );
+ $this->activityManager->publish($activityEvent);
+ } catch (\InvalidArgumentException $e) {
+ } catch (\BadMethodCallException $e) {
+ }
+ }
+}
diff --git a/apps/files/lib/Listener/RenderReferenceEventListener.php b/apps/files/lib/Listener/RenderReferenceEventListener.php
new file mode 100644
index 00000000000..b7470e5acf5
--- /dev/null
+++ b/apps/files/lib/Listener/RenderReferenceEventListener.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Listener;
+
+use OCP\Collaboration\Reference\RenderReferenceEvent;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Util;
+
+/** @template-implements IEventListener<RenderReferenceEvent> */
+class RenderReferenceEventListener implements IEventListener {
+ public function handle(Event $event): void {
+ if (!$event instanceof RenderReferenceEvent) {
+ return;
+ }
+
+ Util::addScript('files', 'reference-files');
+ }
+}
diff --git a/apps/files/lib/Listener/SyncLivePhotosListener.php b/apps/files/lib/Listener/SyncLivePhotosListener.php
new file mode 100644
index 00000000000..b6773e8c452
--- /dev/null
+++ b/apps/files/lib/Listener/SyncLivePhotosListener.php
@@ -0,0 +1,254 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Listener;
+
+use Exception;
+use OC\Files\Node\NonExistingFile;
+use OC\Files\Node\NonExistingFolder;
+use OC\Files\View;
+use OC\FilesMetadata\Model\FilesMetadata;
+use OCA\Files\Service\LivePhotosService;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Exceptions\AbortedEventException;
+use OCP\Files\Cache\CacheEntryRemovedEvent;
+use OCP\Files\Events\Node\BeforeNodeCopiedEvent;
+use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
+use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
+use OCP\Files\Events\Node\NodeCopiedEvent;
+use OCP\Files\File;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\Node;
+use OCP\Files\NotFoundException;
+use OCP\FilesMetadata\IFilesMetadataManager;
+
+/**
+ * @template-implements IEventListener<Event>
+ */
+class SyncLivePhotosListener implements IEventListener {
+ /** @var Array<int> */
+ private array $pendingRenames = [];
+ /** @var Array<int, bool> */
+ private array $pendingDeletion = [];
+ /** @var Array<int> */
+ private array $pendingCopies = [];
+
+ public function __construct(
+ private ?Folder $userFolder,
+ private IFilesMetadataManager $filesMetadataManager,
+ private LivePhotosService $livePhotosService,
+ private IRootFolder $rootFolder,
+ private View $view,
+ ) {
+ }
+
+ public function handle(Event $event): void {
+ if ($this->userFolder === null) {
+ return;
+ }
+
+ if ($event instanceof BeforeNodeCopiedEvent || $event instanceof NodeCopiedEvent) {
+ $this->handleCopyRecursive($event, $event->getSource(), $event->getTarget());
+ } else {
+ $peerFileId = null;
+
+ if ($event instanceof BeforeNodeRenamedEvent) {
+ $peerFileId = $this->livePhotosService->getLivePhotoPeerId($event->getSource()->getId());
+ } elseif ($event instanceof BeforeNodeDeletedEvent) {
+ $peerFileId = $this->livePhotosService->getLivePhotoPeerId($event->getNode()->getId());
+ } elseif ($event instanceof CacheEntryRemovedEvent) {
+ $peerFileId = $this->livePhotosService->getLivePhotoPeerId($event->getFileId());
+ }
+
+ if ($peerFileId === null) {
+ return; // Not a live photo.
+ }
+
+ // Check the user's folder.
+ $peerFile = $this->userFolder->getFirstNodeById($peerFileId);
+
+ if ($peerFile === null) {
+ return; // Peer file not found.
+ }
+
+ if ($event instanceof BeforeNodeRenamedEvent) {
+ $this->runMoveOrCopyChecks($event->getSource(), $event->getTarget(), $peerFile);
+ $this->handleMove($event->getSource(), $event->getTarget(), $peerFile);
+ } elseif ($event instanceof BeforeNodeDeletedEvent) {
+ $this->handleDeletion($event, $peerFile);
+ } elseif ($event instanceof CacheEntryRemovedEvent) {
+ $peerFile->delete();
+ }
+ }
+ }
+
+ private function runMoveOrCopyChecks(Node $sourceFile, Node $targetFile, Node $peerFile): void {
+ $targetParent = $targetFile->getParent();
+ $sourceExtension = $sourceFile->getExtension();
+ $peerFileExtension = $peerFile->getExtension();
+ $targetName = $targetFile->getName();
+ $peerTargetName = substr($targetName, 0, -strlen($sourceExtension)) . $peerFileExtension;
+
+ if (!str_ends_with($targetName, '.' . $sourceExtension)) {
+ throw new AbortedEventException('Cannot change the extension of a Live Photo');
+ }
+
+ try {
+ $targetParent->get($targetName);
+ throw new AbortedEventException('A file already exist at destination path of the Live Photo');
+ } catch (NotFoundException) {
+ }
+
+ if (!($targetParent instanceof NonExistingFolder)) {
+ try {
+ $targetParent->get($peerTargetName);
+ throw new AbortedEventException('A file already exist at destination path of the Live Photo');
+ } catch (NotFoundException) {
+ }
+ }
+ }
+
+ /**
+ * During rename events, which also include move operations,
+ * we rename the peer file using the same name.
+ * The event listener being singleton, we can store the current state
+ * of pending renames inside the 'pendingRenames' property,
+ * to prevent infinite recursive.
+ */
+ private function handleMove(Node $sourceFile, Node $targetFile, Node $peerFile): void {
+ $targetParent = $targetFile->getParent();
+ $sourceExtension = $sourceFile->getExtension();
+ $peerFileExtension = $peerFile->getExtension();
+ $targetName = $targetFile->getName();
+ $peerTargetName = substr($targetName, 0, -strlen($sourceExtension)) . $peerFileExtension;
+
+ // in case the rename was initiated from this listener, we stop right now
+ if (in_array($peerFile->getId(), $this->pendingRenames)) {
+ return;
+ }
+
+ $this->pendingRenames[] = $sourceFile->getId();
+ try {
+ $peerFile->move($targetParent->getPath() . '/' . $peerTargetName);
+ } catch (\Throwable $ex) {
+ throw new AbortedEventException($ex->getMessage());
+ }
+
+ $this->pendingRenames = array_diff($this->pendingRenames, [$sourceFile->getId()]);
+ }
+
+
+ /**
+ * handle copy, we already know if it is doable from BeforeNodeCopiedEvent, so we just copy the linked file
+ */
+ private function handleCopy(File $sourceFile, File $targetFile, File $peerFile): void {
+ $sourceExtension = $sourceFile->getExtension();
+ $peerFileExtension = $peerFile->getExtension();
+ $targetParent = $targetFile->getParent();
+ $targetName = $targetFile->getName();
+ $peerTargetName = substr($targetName, 0, -strlen($sourceExtension)) . $peerFileExtension;
+
+ if ($targetParent->nodeExists($peerTargetName)) {
+ // If the copy was a folder copy, then the peer file already exists.
+ $targetPeerFile = $targetParent->get($peerTargetName);
+ } else {
+ // If the copy was a file copy, then we need to create the peer file.
+ $targetPeerFile = $peerFile->copy($targetParent->getPath() . '/' . $peerTargetName);
+ }
+
+ /** @var FilesMetadata $targetMetadata */
+ $targetMetadata = $this->filesMetadataManager->getMetadata($targetFile->getId(), true);
+ $targetMetadata->setStorageId($targetFile->getStorage()->getCache()->getNumericStorageId());
+ $targetMetadata->setString('files-live-photo', (string)$targetPeerFile->getId());
+ $this->filesMetadataManager->saveMetadata($targetMetadata);
+ /** @var FilesMetadata $peerMetadata */
+ $peerMetadata = $this->filesMetadataManager->getMetadata($targetPeerFile->getId(), true);
+ $peerMetadata->setStorageId($targetPeerFile->getStorage()->getCache()->getNumericStorageId());
+ $peerMetadata->setString('files-live-photo', (string)$targetFile->getId());
+ $this->filesMetadataManager->saveMetadata($peerMetadata);
+ }
+
+ /**
+ * During deletion event, we trigger another recursive delete on the peer file.
+ * Delete operations on the .mov file directly are currently blocked.
+ * The event listener being singleton, we can store the current state
+ * of pending deletions inside the 'pendingDeletions' property,
+ * to prevent infinite recursivity.
+ */
+ private function handleDeletion(BeforeNodeDeletedEvent $event, Node $peerFile): void {
+ $deletedFile = $event->getNode();
+ if ($deletedFile->getMimetype() === 'video/quicktime') {
+ if (isset($this->pendingDeletion[$peerFile->getId()])) {
+ unset($this->pendingDeletion[$peerFile->getId()]);
+ return;
+ } else {
+ throw new AbortedEventException('Cannot delete the video part of a live photo');
+ }
+ } else {
+ $this->pendingDeletion[$deletedFile->getId()] = true;
+ try {
+ $peerFile->delete();
+ } catch (\Throwable $ex) {
+ throw new AbortedEventException($ex->getMessage());
+ }
+ }
+ return;
+ }
+
+ /*
+ * Recursively get all the peer ids of a live photo.
+ * Needed when coping a folder.
+ *
+ * @param BeforeNodeCopiedEvent|NodeCopiedEvent $event
+ */
+ private function handleCopyRecursive(Event $event, Node $sourceNode, Node $targetNode): void {
+ if ($sourceNode instanceof Folder && $targetNode instanceof Folder) {
+ foreach ($sourceNode->getDirectoryListing() as $sourceChild) {
+ if ($event instanceof BeforeNodeCopiedEvent) {
+ if ($sourceChild instanceof Folder) {
+ $targetChild = new NonExistingFolder($this->rootFolder, $this->view, $targetNode->getPath() . '/' . $sourceChild->getName(), null, $targetNode);
+ } else {
+ $targetChild = new NonExistingFile($this->rootFolder, $this->view, $targetNode->getPath() . '/' . $sourceChild->getName(), null, $targetNode);
+ }
+ } elseif ($event instanceof NodeCopiedEvent) {
+ $targetChild = $targetNode->get($sourceChild->getName());
+ } else {
+ throw new Exception('Event is type is not supported');
+ }
+
+ $this->handleCopyRecursive($event, $sourceChild, $targetChild);
+ }
+ } elseif ($sourceNode instanceof File && $targetNode instanceof File) {
+ // in case the copy was initiated from this listener, we stop right now
+ if (in_array($sourceNode->getId(), $this->pendingCopies)) {
+ return;
+ }
+
+ $peerFileId = $this->livePhotosService->getLivePhotoPeerId($sourceNode->getId());
+ if ($peerFileId === null) {
+ return;
+ }
+ $peerFile = $this->userFolder->getFirstNodeById($peerFileId);
+ if ($peerFile === null) {
+ return;
+ }
+
+ $this->pendingCopies[] = $peerFileId;
+ if ($event instanceof BeforeNodeCopiedEvent) {
+ $this->runMoveOrCopyChecks($sourceNode, $targetNode, $peerFile);
+ } elseif ($event instanceof NodeCopiedEvent) {
+ $this->handleCopy($sourceNode, $targetNode, $peerFile);
+ }
+ $this->pendingCopies = array_diff($this->pendingCopies, [$peerFileId]);
+ } else {
+ throw new Exception('Source and target type are not matching');
+ }
+ }
+}
diff --git a/apps/files/lib/Migration/Version11301Date20191205150729.php b/apps/files/lib/Migration/Version11301Date20191205150729.php
index e7bda7ef38a..2e3d72c7ece 100644
--- a/apps/files/lib/Migration/Version11301Date20191205150729.php
+++ b/apps/files/lib/Migration/Version11301Date20191205150729.php
@@ -3,26 +3,8 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Migration;
diff --git a/apps/files/lib/Migration/Version12101Date20221011153334.php b/apps/files/lib/Migration/Version12101Date20221011153334.php
new file mode 100644
index 00000000000..ed4d8bef90b
--- /dev/null
+++ b/apps/files/lib/Migration/Version12101Date20221011153334.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Migration;
+
+use Closure;
+use OCP\DB\ISchemaWrapper;
+use OCP\DB\Types;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+
+class Version12101Date20221011153334 extends SimpleMigrationStep {
+ public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
+ /** @var ISchemaWrapper $schema */
+ $schema = $schemaClosure();
+
+ $table = $schema->createTable('open_local_editor');
+ $table->addColumn('id', Types::BIGINT, [
+ 'autoincrement' => true,
+ 'notnull' => true,
+ 'length' => 20,
+ 'unsigned' => true,
+ ]);
+ $table->addColumn('user_id', Types::STRING, [
+ 'notnull' => true,
+ 'length' => 64,
+ ]);
+ $table->addColumn('path_hash', Types::STRING, [
+ 'notnull' => true,
+ 'length' => 64,
+ ]);
+ $table->addColumn('expiration_time', Types::BIGINT, [
+ 'notnull' => true,
+ 'unsigned' => true,
+ ]);
+ $table->addColumn('token', Types::STRING, [
+ 'notnull' => true,
+ 'length' => 128,
+ ]);
+
+ $table->setPrimaryKey(['id']);
+ $table->addUniqueIndex(['user_id', 'path_hash', 'token'], 'openlocal_user_path_token');
+
+ return $schema;
+ }
+}
diff --git a/apps/files/lib/Migration/Version2003Date20241021095629.php b/apps/files/lib/Migration/Version2003Date20241021095629.php
new file mode 100644
index 00000000000..30d05fa12ad
--- /dev/null
+++ b/apps/files/lib/Migration/Version2003Date20241021095629.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Migration;
+
+use Closure;
+use OCA\Files\Service\ChunkedUploadConfig;
+use OCP\DB\ISchemaWrapper;
+use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\SimpleMigrationStep;
+use OCP\Server;
+
+class Version2003Date20241021095629 extends SimpleMigrationStep {
+ /**
+ * @param IOutput $output
+ * @param Closure(): ISchemaWrapper $schemaClosure
+ * @param array $options
+ */
+ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
+ $maxChunkSize = Server::get(IConfig::class)->getAppValue('files', 'max_chunk_size');
+ if ($maxChunkSize === '') {
+ // Skip if no value was configured before
+ return;
+ }
+
+ ChunkedUploadConfig::setMaxChunkSize((int)$maxChunkSize);
+ Server::get(IConfig::class)->deleteAppValue('files', 'max_chunk_size');
+ }
+}
diff --git a/apps/files/lib/Notification/Notifier.php b/apps/files/lib/Notification/Notifier.php
index 8f885a995f9..6acc312c126 100644
--- a/apps/files/lib/Notification/Notifier.php
+++ b/apps/files/lib/Notification/Notifier.php
@@ -3,33 +3,16 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Sascha Wiswedel <sascha.wiswedel@nextcloud.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Notification;
+use OCA\Files\BackgroundJob\TransferOwnership;
use OCA\Files\Db\TransferOwnershipMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\IJobList;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
@@ -39,35 +22,18 @@ use OCP\Notification\IDismissableNotifier;
use OCP\Notification\IManager;
use OCP\Notification\INotification;
use OCP\Notification\INotifier;
+use OCP\Notification\UnknownNotificationException;
class Notifier implements INotifier, IDismissableNotifier {
-
- /** @var IFactory */
- protected $l10nFactory;
-
- /** @var IURLGenerator */
- protected $urlGenerator;
- /** @var TransferOwnershipMapper */
- private $mapper;
- /** @var IManager */
- private $notificationManager;
- /** @var IUserManager */
- private $userManager;
- /** @var ITimeFactory */
- private $timeFactory;
-
- public function __construct(IFactory $l10nFactory,
- IURLGenerator $urlGenerator,
- TransferOwnershipMapper $mapper,
- IManager $notificationManager,
- IUserManager $userManager,
- ITimeFactory $timeFactory) {
- $this->l10nFactory = $l10nFactory;
- $this->urlGenerator = $urlGenerator;
- $this->mapper = $mapper;
- $this->notificationManager = $notificationManager;
- $this->userManager = $userManager;
- $this->timeFactory = $timeFactory;
+ public function __construct(
+ protected IFactory $l10nFactory,
+ protected IURLGenerator $urlGenerator,
+ private TransferOwnershipMapper $mapper,
+ private IManager $notificationManager,
+ private IUserManager $userManager,
+ private IJobList $jobList,
+ private ITimeFactory $timeFactory,
+ ) {
}
public function getID(): string {
@@ -82,30 +48,26 @@ class Notifier implements INotifier, IDismissableNotifier {
* @param INotification $notification
* @param string $languageCode The code of the language that should be used to prepare the notification
* @return INotification
- * @throws \InvalidArgumentException When the notification was not prepared by a notifier
+ * @throws UnknownNotificationException When the notification was not prepared by a notifier
*/
public function prepare(INotification $notification, string $languageCode): INotification {
if ($notification->getApp() !== 'files') {
- throw new \InvalidArgumentException('Unhandled app');
- }
-
- if ($notification->getSubject() === 'transferownershipRequest') {
- return $this->handleTransferownershipRequest($notification, $languageCode);
- }
- if ($notification->getSubject() === 'transferOwnershipFailedSource') {
- return $this->handleTransferOwnershipFailedSource($notification, $languageCode);
- }
- if ($notification->getSubject() === 'transferOwnershipFailedTarget') {
- return $this->handleTransferOwnershipFailedTarget($notification, $languageCode);
- }
- if ($notification->getSubject() === 'transferOwnershipDoneSource') {
- return $this->handleTransferOwnershipDoneSource($notification, $languageCode);
- }
- if ($notification->getSubject() === 'transferOwnershipDoneTarget') {
- return $this->handleTransferOwnershipDoneTarget($notification, $languageCode);
+ throw new UnknownNotificationException('Unhandled app');
}
- throw new \InvalidArgumentException('Unhandled subject');
+ $imagePath = $this->urlGenerator->imagePath('files', 'folder-move.svg');
+ $iconUrl = $this->urlGenerator->getAbsoluteURL($imagePath);
+ $notification->setIcon($iconUrl);
+
+ return match($notification->getSubject()) {
+ 'transferownershipRequest' => $this->handleTransferownershipRequest($notification, $languageCode),
+ 'transferownershipRequestDenied' => $this->handleTransferOwnershipRequestDenied($notification, $languageCode),
+ 'transferOwnershipFailedSource' => $this->handleTransferOwnershipFailedSource($notification, $languageCode),
+ 'transferOwnershipFailedTarget' => $this->handleTransferOwnershipFailedTarget($notification, $languageCode),
+ 'transferOwnershipDoneSource' => $this->handleTransferOwnershipDoneSource($notification, $languageCode),
+ 'transferOwnershipDoneTarget' => $this->handleTransferOwnershipDoneTarget($notification, $languageCode),
+ default => throw new UnknownNotificationException('Unhandled subject')
+ };
}
public function handleTransferownershipRequest(INotification $notification, string $languageCode): INotification {
@@ -151,7 +113,6 @@ class Notifier implements INotifier, IDismissableNotifier {
'name' => $sourceUser->getDisplayName(),
],
])
- ->setParsedSubject(str_replace('{user}', $sourceUser->getDisplayName(), $l->t('Incoming ownership transfer from {user}')))
->setRichMessage(
$l->t("Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour."),
[
@@ -160,20 +121,40 @@ class Notifier implements INotifier, IDismissableNotifier {
'id' => $param['targetUser'] . '::' . $param['nodeName'],
'name' => $param['nodeName'],
]
- ])
- ->setParsedMessage(str_replace('{path}', $param['nodeName'], $l->t("Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour.")));
+ ]);
return $notification;
}
- public function handleTransferOwnershipFailedSource(INotification $notification, string $languageCode): INotification {
+ public function handleTransferOwnershipRequestDenied(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('files', $languageCode);
$param = $notification->getSubjectParameters();
$targetUser = $this->getUser($param['targetUser']);
- $notification->setRichSubject($l->t('Ownership transfer failed'))
- ->setParsedSubject($l->t('Ownership transfer failed'))
+ $notification->setRichSubject($l->t('Ownership transfer denied'))
+ ->setRichMessage(
+ $l->t('Your ownership transfer of {path} was denied by {user}.'),
+ [
+ 'path' => [
+ 'type' => 'highlight',
+ 'id' => $param['targetUser'] . '::' . $param['nodeName'],
+ 'name' => $param['nodeName'],
+ ],
+ 'user' => [
+ 'type' => 'user',
+ 'id' => $targetUser->getUID(),
+ 'name' => $targetUser->getDisplayName(),
+ ],
+ ]);
+ return $notification;
+ }
+
+ public function handleTransferOwnershipFailedSource(INotification $notification, string $languageCode): INotification {
+ $l = $this->l10nFactory->get('files', $languageCode);
+ $param = $notification->getSubjectParameters();
+ $targetUser = $this->getUser($param['targetUser']);
+ $notification->setRichSubject($l->t('Ownership transfer failed'))
->setRichMessage(
$l->t('Your ownership transfer of {path} to {user} failed.'),
[
@@ -187,19 +168,16 @@ class Notifier implements INotifier, IDismissableNotifier {
'id' => $targetUser->getUID(),
'name' => $targetUser->getDisplayName(),
],
- ])
- ->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $targetUser->getDisplayName()], $l->t('Your ownership transfer of {path} to {user} failed.')));
+ ]);
return $notification;
}
- public function handleTransferOwnershipFailedTarget(INotification $notification, string $languageCode): INotification {
+ public function handleTransferOwnershipFailedTarget(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('files', $languageCode);
$param = $notification->getSubjectParameters();
$sourceUser = $this->getUser($param['sourceUser']);
$notification->setRichSubject($l->t('Ownership transfer failed'))
- ->setParsedSubject($l->t('Ownership transfer failed'))
-
->setRichMessage(
$l->t('The ownership transfer of {path} from {user} failed.'),
[
@@ -213,20 +191,17 @@ class Notifier implements INotifier, IDismissableNotifier {
'id' => $sourceUser->getUID(),
'name' => $sourceUser->getDisplayName(),
],
- ])
- ->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $sourceUser->getDisplayName()], $l->t('The ownership transfer of {path} from {user} failed.')));
+ ]);
return $notification;
}
- public function handleTransferOwnershipDoneSource(INotification $notification, string $languageCode): INotification {
+ public function handleTransferOwnershipDoneSource(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('files', $languageCode);
$param = $notification->getSubjectParameters();
$targetUser = $this->getUser($param['targetUser']);
$notification->setRichSubject($l->t('Ownership transfer done'))
- ->setParsedSubject($l->t('Ownership transfer done'))
-
->setRichMessage(
$l->t('Your ownership transfer of {path} to {user} has completed.'),
[
@@ -240,20 +215,17 @@ class Notifier implements INotifier, IDismissableNotifier {
'id' => $targetUser->getUID(),
'name' => $targetUser->getDisplayName(),
],
- ])
- ->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $targetUser->getDisplayName()], $l->t('Your ownership transfer of {path} to {user} has completed.')));
+ ]);
return $notification;
}
- public function handleTransferOwnershipDoneTarget(INotification $notification, string $languageCode): INotification {
+ public function handleTransferOwnershipDoneTarget(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('files', $languageCode);
$param = $notification->getSubjectParameters();
$sourceUser = $this->getUser($param['sourceUser']);
$notification->setRichSubject($l->t('Ownership transfer done'))
- ->setParsedSubject($l->t('Ownership transfer done'))
-
->setRichMessage(
$l->t('The ownership transfer of {path} from {user} has completed.'),
[
@@ -267,24 +239,32 @@ class Notifier implements INotifier, IDismissableNotifier {
'id' => $sourceUser->getUID(),
'name' => $sourceUser->getDisplayName(),
],
- ])
- ->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $sourceUser->getDisplayName()], $l->t('The ownership transfer of {path} from {user} has completed.')));
+ ]);
return $notification;
}
public function dismissNotification(INotification $notification): void {
if ($notification->getApp() !== 'files') {
- throw new \InvalidArgumentException('Unhandled app');
+ throw new UnknownNotificationException('Unhandled app');
+ }
+ if ($notification->getSubject() !== 'transferownershipRequest') {
+ throw new UnknownNotificationException('Unhandled notification type');
}
- // TODO: This should all be moved to a service that also the transferownershipContoller uses.
+ // TODO: This should all be moved to a service that also the transferownershipController uses.
try {
$transferOwnership = $this->mapper->getById((int)$notification->getObjectId());
} catch (DoesNotExistException $e) {
return;
}
+ if ($this->jobList->has(TransferOwnership::class, [
+ 'id' => $transferOwnership->getId(),
+ ])) {
+ return;
+ }
+
$notification = $this->notificationManager->createNotification();
$notification->setUser($transferOwnership->getSourceUser())
->setApp('files')
diff --git a/apps/files/lib/ResponseDefinitions.php b/apps/files/lib/ResponseDefinitions.php
new file mode 100644
index 00000000000..c5d094e7bd8
--- /dev/null
+++ b/apps/files/lib/ResponseDefinitions.php
@@ -0,0 +1,75 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files;
+
+/**
+ * @psalm-type FilesTemplateFile = array{
+ * basename: string,
+ * etag: string,
+ * fileid: int,
+ * filename: ?string,
+ * lastmod: int,
+ * mime: string,
+ * size: int,
+ * type: string,
+ * hasPreview: bool,
+ * }
+ *
+ * @psalm-type FilesTemplateField = array{
+ * index: string,
+ * type: string,
+ * alias: ?string,
+ * tag: ?string,
+ * id: ?int,
+ * content?: string,
+ * checked?: bool,
+ * }
+ *
+ * @psalm-type FilesTemplate = array{
+ * templateType: string,
+ * templateId: string,
+ * basename: string,
+ * etag: string,
+ * fileid: int,
+ * filename: string,
+ * lastmod: int,
+ * mime: string,
+ * size: int|float,
+ * type: string,
+ * hasPreview: bool,
+ * previewUrl: ?string,
+ * fields: list<FilesTemplateField>,
+ * }
+ *
+ * @psalm-type FilesTemplateFileCreator = array{
+ * app: string,
+ * label: string,
+ * extension: string,
+ * iconClass: ?string,
+ * iconSvgInline: ?string,
+ * mimetypes: list<string>,
+ * ratio: ?float,
+ * actionLabel: string,
+ * }
+ *
+ * @psalm-type FilesTemplateFileCreatorWithTemplates = FilesTemplateFileCreator&array{
+ * templates: list<FilesTemplate>,
+ * }
+ *
+ * @psalm-type FilesFolderTree = list<array{
+ * id: int,
+ * basename: string,
+ * displayName?: string,
+ * children: list<array{}>,
+ * }>
+ *
+ */
+class ResponseDefinitions {
+}
diff --git a/apps/files/lib/Search/FilesSearchProvider.php b/apps/files/lib/Search/FilesSearchProvider.php
index ba2d4bafa30..f71d58c6fae 100644
--- a/apps/files/lib/Search/FilesSearchProvider.php
+++ b/apps/files/lib/Search/FilesSearchProvider.php
@@ -3,73 +3,45 @@
declare(strict_types=1);
/**
- * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Search;
+use InvalidArgumentException;
+use OC\Files\Search\SearchBinaryOperator;
use OC\Files\Search\SearchComparison;
use OC\Files\Search\SearchOrder;
use OC\Files\Search\SearchQuery;
+use OC\Search\Filter\GroupFilter;
+use OC\Search\Filter\UserFilter;
use OCP\Files\FileInfo;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\IRootFolder;
-use OCP\Files\Search\ISearchComparison;
use OCP\Files\Node;
+use OCP\Files\Search\ISearchComparison;
+use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchOrder;
use OCP\IL10N;
+use OCP\IPreview;
use OCP\IURLGenerator;
use OCP\IUser;
-use OCP\Search\IProvider;
+use OCP\Search\FilterDefinition;
+use OCP\Search\IFilter;
+use OCP\Search\IFilteringProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;
use OCP\Search\SearchResultEntry;
+use OCP\Share\IShare;
-class FilesSearchProvider implements IProvider {
-
- /** @var IL10N */
- private $l10n;
-
- /** @var IURLGenerator */
- private $urlGenerator;
-
- /** @var IMimeTypeDetector */
- private $mimeTypeDetector;
-
- /** @var IRootFolder */
- private $rootFolder;
-
+class FilesSearchProvider implements IFilteringProvider {
public function __construct(
- IL10N $l10n,
- IURLGenerator $urlGenerator,
- IMimeTypeDetector $mimeTypeDetector,
- IRootFolder $rootFolder
+ private IL10N $l10n,
+ private IURLGenerator $urlGenerator,
+ private IMimeTypeDetector $mimeTypeDetector,
+ private IRootFolder $rootFolder,
+ private IPreview $previewManager,
) {
- $this->l10n = $l10n;
- $this->urlGenerator = $urlGenerator;
- $this->mimeTypeDetector = $mimeTypeDetector;
- $this->rootFolder = $rootFolder;
}
/**
@@ -97,26 +69,49 @@ class FilesSearchProvider implements IProvider {
return 5;
}
- /**
- * @inheritDoc
- */
+ public function getSupportedFilters(): array {
+ return [
+ 'term',
+ 'since',
+ 'until',
+ 'person',
+ 'min-size',
+ 'max-size',
+ 'mime',
+ 'type',
+ 'path',
+ 'is-favorite',
+ 'title-only',
+ ];
+ }
+
+ public function getAlternateIds(): array {
+ return [];
+ }
+
+ public function getCustomFilters(): array {
+ return [
+ new FilterDefinition('min-size', FilterDefinition::TYPE_INT),
+ new FilterDefinition('max-size', FilterDefinition::TYPE_INT),
+ new FilterDefinition('mime', FilterDefinition::TYPE_STRING),
+ new FilterDefinition('type', FilterDefinition::TYPE_STRING),
+ new FilterDefinition('path', FilterDefinition::TYPE_STRING),
+ new FilterDefinition('is-favorite', FilterDefinition::TYPE_BOOL),
+ ];
+ }
+
public function search(IUser $user, ISearchQuery $query): SearchResult {
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
- $fileQuery = new SearchQuery(
- new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $query->getTerm() . '%'),
- $query->getLimit(),
- (int)$query->getCursor(),
- $query->getSortOrder() === ISearchQuery::SORT_DATE_DESC ? [
- new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime'),
- ] : [],
- $user
- );
-
+ $fileQuery = $this->buildSearchQuery($query, $user);
return SearchResult::paginated(
$this->l10n->t('Files'),
array_map(function (Node $result) use ($userFolder) {
- // Generate thumbnail url
- $thumbnailUrl = $this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreviewByFileId', ['x' => 32, 'y' => 32, 'fileId' => $result->getId()]);
+ $thumbnailUrl = $this->previewManager->isMimeSupported($result->getMimetype())
+ ? $this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreviewByFileId', ['x' => 32, 'y' => 32, 'fileId' => $result->getId()])
+ : '';
+ $icon = $result->getMimetype() === FileInfo::MIMETYPE_FOLDER
+ ? 'icon-folder'
+ : $this->mimeTypeDetector->mimeTypeIcon($result->getMimetype());
$path = $userFolder->getRelativePath($result->getPath());
// Use shortened link to centralize the various
@@ -131,7 +126,7 @@ class FilesSearchProvider implements IProvider {
$result->getName(),
$this->formatSubline($path),
$this->urlGenerator->getAbsoluteURL($link),
- $result->getMimetype() === FileInfo::MIMETYPE_FOLDER ? 'icon-folder' : $this->mimeTypeDetector->mimeTypeIcon($result->getMimetype())
+ $icon,
);
$searchResultEntry->addAttribute('fileId', (string)$result->getId());
$searchResultEntry->addAttribute('path', $path);
@@ -141,6 +136,54 @@ class FilesSearchProvider implements IProvider {
);
}
+ private function buildSearchQuery(ISearchQuery $query, IUser $user): SearchQuery {
+ $comparisons = [];
+ foreach ($query->getFilters() as $name => $filter) {
+ $comparisons[] = match ($name) {
+ 'term' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $filter->get() . '%'),
+ 'since' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'mtime', $filter->get()->getTimestamp()),
+ 'until' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'mtime', $filter->get()->getTimestamp()),
+ 'min-size' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'size', $filter->get()),
+ 'max-size' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'size', $filter->get()),
+ 'mime' => new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', $filter->get()),
+ 'type' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $filter->get() . '/%'),
+ 'path' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'path', 'files/' . ltrim($filter->get(), '/') . '%'),
+ 'person' => $this->buildPersonSearchQuery($filter),
+ default => throw new InvalidArgumentException('Unsupported comparison'),
+ };
+ }
+
+ return new SearchQuery(
+ new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_AND, $comparisons),
+ $query->getLimit(),
+ (int)$query->getCursor(),
+ $query->getSortOrder() === ISearchQuery::SORT_DATE_DESC
+ ? [new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime')]
+ : [],
+ $user
+ );
+ }
+
+ private function buildPersonSearchQuery(IFilter $person): ISearchOperator {
+ if ($person instanceof UserFilter) {
+ return new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_OR, [
+ new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_AND, [
+ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'share_with', $person->get()->getUID()),
+ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'share_type', IShare::TYPE_USER),
+ ]),
+ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'owner', $person->get()->getUID()),
+ ]);
+ }
+ if ($person instanceof GroupFilter) {
+ return new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_AND, [
+ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'share_with', $person->get()->getGID()),
+ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'share_type', IShare::TYPE_GROUP),
+ ]);
+ }
+
+ throw new InvalidArgumentException('Unsupported filter type');
+ }
+
/**
* Format subline for files
*
diff --git a/apps/files/lib/Service/ChunkedUploadConfig.php b/apps/files/lib/Service/ChunkedUploadConfig.php
new file mode 100644
index 00000000000..29661750f8b
--- /dev/null
+++ b/apps/files/lib/Service/ChunkedUploadConfig.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Service;
+
+use OCP\IConfig;
+use OCP\Server;
+
+class ChunkedUploadConfig {
+ private const KEY_MAX_SIZE = 'files.chunked_upload.max_size';
+ private const KEY_MAX_PARALLEL_COUNT = 'files.chunked_upload.max_parallel_count';
+
+ public static function getMaxChunkSize(): int {
+ return Server::get(IConfig::class)->getSystemValueInt(self::KEY_MAX_SIZE, 100 * 1024 * 1024);
+ }
+
+ public static function setMaxChunkSize(int $maxChunkSize): void {
+ Server::get(IConfig::class)->setSystemValue(self::KEY_MAX_SIZE, $maxChunkSize);
+ }
+
+ public static function getMaxParallelCount(): int {
+ return Server::get(IConfig::class)->getSystemValueInt(self::KEY_MAX_PARALLEL_COUNT, 5);
+ }
+}
diff --git a/apps/files/lib/Service/DirectEditingService.php b/apps/files/lib/Service/DirectEditingService.php
index 1ee3a53d85a..3d756ee56fa 100644
--- a/apps/files/lib/Service/DirectEditingService.php
+++ b/apps/files/lib/Service/DirectEditingService.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
- *
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Service;
@@ -32,14 +15,10 @@ use OCP\EventDispatcher\IEventDispatcher;
class DirectEditingService {
- /** @var IManager */
- private $directEditingManager;
- /** @var IEventDispatcher */
- private $eventDispatcher;
-
- public function __construct(IEventDispatcher $eventDispatcher, IManager $directEditingManager) {
- $this->directEditingManager = $directEditingManager;
- $this->eventDispatcher = $eventDispatcher;
+ public function __construct(
+ private IEventDispatcher $eventDispatcher,
+ private IManager $directEditingManager,
+ ) {
}
public function getDirectEditingETag(): string {
diff --git a/apps/files/lib/Service/LivePhotosService.php b/apps/files/lib/Service/LivePhotosService.php
new file mode 100644
index 00000000000..3ac6601d5dc
--- /dev/null
+++ b/apps/files/lib/Service/LivePhotosService.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Service;
+
+use OCP\FilesMetadata\Exceptions\FilesMetadataNotFoundException;
+use OCP\FilesMetadata\IFilesMetadataManager;
+
+class LivePhotosService {
+ public function __construct(
+ private IFilesMetadataManager $filesMetadataManager,
+ ) {
+ }
+
+ /**
+ * Get the associated live photo for a given file id
+ */
+ public function getLivePhotoPeerId(int $fileId): ?int {
+ try {
+ $metadata = $this->filesMetadataManager->getMetadata($fileId);
+ } catch (FilesMetadataNotFoundException $ex) {
+ return null;
+ }
+
+ if (!$metadata->hasKey('files-live-photo')) {
+ return null;
+ }
+
+ return (int)$metadata->getString('files-live-photo');
+ }
+}
diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php
index 661a7e66e10..afef5d2093d 100644
--- a/apps/files/lib/Service/OwnershipTransferService.php
+++ b/apps/files/lib/Service/OwnershipTransferService.php
@@ -3,47 +3,33 @@
declare(strict_types=1);
/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Sascha Wiswedel <sascha.wiswedel@nextcloud.com>
- * @author Tobia De Koninck <LEDfan@users.noreply.github.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Service;
use Closure;
+use Exception;
use OC\Files\Filesystem;
use OC\Files\View;
+use OC\User\NoUserException;
+use OCA\Encryption\Util;
use OCA\Files\Exception\TransferOwnershipException;
+use OCA\Files_External\Config\ConfigAdapter;
use OCP\Encryption\IManager as IEncryptionManager;
+use OCP\Files\Config\IHomeMountProvider;
use OCP\Files\Config\IUserMountCache;
+use OCP\Files\File;
use OCP\Files\FileInfo;
-use OCP\Files\IHomeStorage;
use OCP\Files\InvalidPathException;
+use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
+use OCP\Files\NotFoundException;
use OCP\IUser;
use OCP\IUserManager;
+use OCP\L10N\IFactory;
+use OCP\Server;
use OCP\Share\IManager as IShareManager;
use OCP\Share\IShare;
use Symfony\Component\Console\Helper\ProgressBar;
@@ -58,31 +44,15 @@ use function rtrim;
class OwnershipTransferService {
- /** @var IEncryptionManager */
- private $encryptionManager;
-
- /** @var IShareManager */
- private $shareManager;
-
- /** @var IMountManager */
- private $mountManager;
-
- /** @var IUserMountCache */
- private $userMountCache;
-
- /** @var IUserManager */
- private $userManager;
-
- public function __construct(IEncryptionManager $manager,
- IShareManager $shareManager,
- IMountManager $mountManager,
- IUserMountCache $userMountCache,
- IUserManager $userManager) {
- $this->encryptionManager = $manager;
- $this->shareManager = $shareManager;
- $this->mountManager = $mountManager;
- $this->userMountCache = $userMountCache;
- $this->userManager = $userManager;
+ public function __construct(
+ private IEncryptionManager $encryptionManager,
+ private IShareManager $shareManager,
+ private IMountManager $mountManager,
+ private IUserMountCache $userMountCache,
+ private IUserManager $userManager,
+ private IFactory $l10nFactory,
+ private IRootFolder $rootFolder,
+ ) {
}
/**
@@ -93,15 +63,17 @@ class OwnershipTransferService {
* @param OutputInterface|null $output
* @param bool $move
* @throws TransferOwnershipException
- * @throws \OC\User\NoUserException
+ * @throws NoUserException
*/
- public function transfer(IUser $sourceUser,
- IUser $destinationUser,
- string $path,
- ?OutputInterface $output = null,
- bool $move = false,
- bool $firstLogin = false,
- bool $transferIncomingShares = false): void {
+ public function transfer(
+ IUser $sourceUser,
+ IUser $destinationUser,
+ string $path,
+ ?OutputInterface $output = null,
+ bool $move = false,
+ bool $firstLogin = false,
+ bool $includeExternalStorage = false,
+ ): void {
$output = $output ?? new NullOutput();
$sourceUid = $sourceUser->getUID();
$destinationUid = $destinationUser->getUID();
@@ -110,12 +82,17 @@ class OwnershipTransferService {
// If encryption is on we have to ensure the user has logged in before and that all encryption modules are ready
if (($this->encryptionManager->isEnabled() && $destinationUser->getLastLogin() === 0)
|| !$this->encryptionManager->isReadyForUser($destinationUid)) {
- throw new TransferOwnershipException("The target user is not ready to accept files. The user has at least to have logged in once.", 2);
+ throw new TransferOwnershipException('The target user is not ready to accept files. The user has at least to have logged in once.', 2);
}
// setup filesystem
// Requesting the user folder will set it up if the user hasn't logged in before
- \OC::$server->getUserFolder($destinationUser->getUID());
+ // We need a setupFS for the full filesystem setup before as otherwise we will just return
+ // a lazy root folder which does not create the destination users folder
+ \OC_Util::setupFS($sourceUser->getUID());
+ \OC_Util::setupFS($destinationUser->getUID());
+ $this->rootFolder->getUserFolder($sourceUser->getUID());
+ $this->rootFolder->getUserFolder($destinationUser->getUID());
Filesystem::initMountPoints($sourceUid);
Filesystem::initMountPoints($destinationUid);
@@ -124,19 +101,15 @@ class OwnershipTransferService {
if ($move) {
$finalTarget = "$destinationUid/files/";
} else {
+ $l = $this->l10nFactory->get('files', $this->l10nFactory->getUserLanguage($destinationUser));
$date = date('Y-m-d H-i-s');
- // Remove some characters which are prone to cause errors
- $cleanUserName = str_replace(['\\', '/', ':', '.', '?', '#', '\'', '"'], '-', $sourceUser->getDisplayName());
- // Replace multiple dashes with one dash
- $cleanUserName = preg_replace('/-{2,}/s', '-', $cleanUserName);
- $cleanUserName = $cleanUserName ?: $sourceUid;
-
- $finalTarget = "$destinationUid/files/transferred from $cleanUserName on $date";
+ $cleanUserName = $this->sanitizeFolderName($sourceUser->getDisplayName()) ?: $sourceUid;
+ $finalTarget = "$destinationUid/files/" . $this->sanitizeFolderName($l->t('Transferred from %1$s on %2$s', [$cleanUserName, $date]));
try {
$view->verifyPath(dirname($finalTarget), basename($finalTarget));
} catch (InvalidPathException $e) {
- $finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
+ $finalTarget = "$destinationUid/files/" . $this->sanitizeFolderName($l->t('Transferred from %1$s on %2$s', [$sourceUid, $date]));
}
}
@@ -150,7 +123,7 @@ class OwnershipTransferService {
}
if ($move && !$firstLogin && count($view->getDirectoryContent($finalTarget)) > 0) {
- throw new TransferOwnershipException("Destination path does not exists or is not empty", 1);
+ throw new TransferOwnershipException('Destination path does not exists or is not empty', 1);
}
@@ -171,49 +144,62 @@ class OwnershipTransferService {
$sourcePath
);
+ $sourceSize = $view->getFileInfo($sourcePath)->getSize();
+
// transfer the files
$this->transferFiles(
$sourceUid,
$sourcePath,
$finalTarget,
$view,
- $output
+ $output,
+ $includeExternalStorage,
);
+ $sizeDifference = $sourceSize - $view->getFileInfo($finalTarget)->getSize();
+ // transfer the incoming shares
+ $sourceShares = $this->collectIncomingShares(
+ $sourceUid,
+ $output,
+ $sourcePath,
+ );
+ $destinationShares = $this->collectIncomingShares(
+ $destinationUid,
+ $output,
+ null,
+ );
+ $this->transferIncomingShares(
+ $sourceUid,
+ $destinationUid,
+ $sourceShares,
+ $destinationShares,
+ $output,
+ $path,
+ $finalTarget,
+ $move
+ );
+
+ $destinationPath = $finalTarget . '/' . $path;
// restore the shares
$this->restoreShares(
$sourceUid,
$destinationUid,
+ $destinationPath,
$shares,
$output
);
-
- // transfer the incoming shares
- if ($transferIncomingShares === true) {
- $sourceShares = $this->collectIncomingShares(
- $sourceUid,
- $output,
- $view
- );
- $destinationShares = $this->collectIncomingShares(
- $destinationUid,
- $output,
- $view,
- true
- );
- $this->transferIncomingShares(
- $sourceUid,
- $destinationUid,
- $sourceShares,
- $destinationShares,
- $output,
- $path,
- $finalTarget,
- $move
- );
+ if ($sizeDifference !== 0) {
+ $output->writeln("Transferred folder have a size difference of: $sizeDifference Bytes which means the transfer may be incomplete. Please check the logs if there was any issue during the transfer operation.");
}
}
+ private function sanitizeFolderName(string $name): string {
+ // Remove some characters which are prone to cause errors
+ $name = str_replace(['\\', '/', ':', '.', '?', '#', '\'', '"'], '-', $name);
+ // Replace multiple dashes with one dash
+ return preg_replace('/-{2,}/s', '-', $name);
+ }
+
private function walkFiles(View $view, $path, Closure $callBack) {
foreach ($view->getDirectoryContent($path) as $fileInfo) {
if (!$callBack($fileInfo)) {
@@ -228,85 +214,130 @@ class OwnershipTransferService {
/**
* @param OutputInterface $output
*
- * @throws \Exception
+ * @throws TransferOwnershipException
*/
- protected function analyse(string $sourceUid,
- string $destinationUid,
- string $sourcePath,
- View $view,
- OutputInterface $output): void {
+ protected function analyse(
+ string $sourceUid,
+ string $destinationUid,
+ string $sourcePath,
+ View $view,
+ OutputInterface $output,
+ bool $includeExternalStorage = false,
+ ): void {
$output->writeln('Validating quota');
- $size = $view->getFileInfo($sourcePath, false)->getSize(false);
+ $sourceFileInfo = $view->getFileInfo($sourcePath, false);
+ if ($sourceFileInfo === false) {
+ throw new TransferOwnershipException("Unknown path provided: $sourcePath", 1);
+ }
+ $size = $sourceFileInfo->getSize(false);
$freeSpace = $view->free_space($destinationUid . '/files/');
if ($size > $freeSpace && $freeSpace !== FileInfo::SPACE_UNKNOWN) {
- $output->writeln('<error>Target user does not have enough free space available.</error>');
- throw new \Exception('Execution terminated.');
+ throw new TransferOwnershipException('Target user does not have enough free space available.', 1);
}
$output->writeln("Analysing files of $sourceUid ...");
$progress = new ProgressBar($output);
$progress->start();
+ if ($this->encryptionManager->isEnabled()) {
+ $masterKeyEnabled = Server::get(Util::class)->isMasterKeyEnabled();
+ } else {
+ $masterKeyEnabled = false;
+ }
$encryptedFiles = [];
- $this->walkFiles($view, $sourcePath,
- function (FileInfo $fileInfo) use ($progress) {
- if ($fileInfo->getType() === FileInfo::TYPE_FOLDER) {
- // only analyze into folders from main storage,
- if (!$fileInfo->getStorage()->instanceOfStorage(IHomeStorage::class)) {
- return false;
- }
- return true;
- }
- $progress->advance();
- if ($fileInfo->isEncrypted()) {
- $encryptedFiles[] = $fileInfo;
- }
- return true;
- });
+ if ($sourceFileInfo->getType() === FileInfo::TYPE_FOLDER) {
+ if ($sourceFileInfo->isEncrypted()) {
+ /* Encrypted folder means e2ee encrypted */
+ $encryptedFiles[] = $sourceFileInfo;
+ } else {
+ $this->walkFiles($view, $sourcePath,
+ function (FileInfo $fileInfo) use ($progress, $masterKeyEnabled, &$encryptedFiles, $includeExternalStorage) {
+ if ($fileInfo->getType() === FileInfo::TYPE_FOLDER) {
+ $mount = $fileInfo->getMountPoint();
+ // only analyze into folders from main storage,
+ if (
+ $mount->getMountProvider() instanceof IHomeMountProvider
+ || ($includeExternalStorage && $mount->getMountProvider() instanceof ConfigAdapter)
+ ) {
+ if ($fileInfo->isEncrypted()) {
+ /* Encrypted folder means e2ee encrypted, we cannot transfer it */
+ $encryptedFiles[] = $fileInfo;
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ $progress->advance();
+ if ($fileInfo->isEncrypted() && !$masterKeyEnabled) {
+ /* Encrypted file means SSE, we can only transfer it if master key is enabled */
+ $encryptedFiles[] = $fileInfo;
+ }
+ return true;
+ });
+ }
+ } elseif ($sourceFileInfo->isEncrypted() && !$masterKeyEnabled) {
+ /* Encrypted file means SSE, we can only transfer it if master key is enabled */
+ $encryptedFiles[] = $sourceFileInfo;
+ }
$progress->finish();
$output->writeln('');
// no file is allowed to be encrypted
if (!empty($encryptedFiles)) {
- $output->writeln("<error>Some files are encrypted - please decrypt them first.</error>");
+ $output->writeln('<error>Some files are encrypted - please decrypt them first.</error>');
foreach ($encryptedFiles as $encryptedFile) {
/** @var FileInfo $encryptedFile */
- $output->writeln(" " . $encryptedFile->getPath());
+ $output->writeln(' ' . $encryptedFile->getPath());
}
- throw new \Exception('Execution terminated.');
+ throw new TransferOwnershipException('Some files are encrypted - please decrypt them first.', 1);
}
}
- private function collectUsersShares(string $sourceUid,
- OutputInterface $output,
- View $view,
- string $path): array {
+ /**
+ * @return array<array{share: IShare, suffix: string}>
+ */
+ private function collectUsersShares(
+ string $sourceUid,
+ OutputInterface $output,
+ View $view,
+ string $path,
+ ): array {
$output->writeln("Collecting all share information for files and folders of $sourceUid ...");
$shares = [];
$progress = new ProgressBar($output);
- foreach ([IShare::TYPE_GROUP, IShare::TYPE_USER, IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_ROOM, IShare::TYPE_EMAIL, IShare::TYPE_CIRCLE, IShare::TYPE_DECK] as $shareType) {
+ $normalizedPath = Filesystem::normalizePath($path);
+
+ $supportedShareTypes = [
+ IShare::TYPE_GROUP,
+ IShare::TYPE_USER,
+ IShare::TYPE_LINK,
+ IShare::TYPE_REMOTE,
+ IShare::TYPE_ROOM,
+ IShare::TYPE_EMAIL,
+ IShare::TYPE_CIRCLE,
+ IShare::TYPE_DECK,
+ IShare::TYPE_SCIENCEMESH,
+ ];
+
+ foreach ($supportedShareTypes as $shareType) {
$offset = 0;
while (true) {
- $sharePage = $this->shareManager->getSharesBy($sourceUid, $shareType, null, true, 50, $offset);
+ $sharePage = $this->shareManager->getSharesBy($sourceUid, $shareType, null, true, 50, $offset, onlyValid: false);
$progress->advance(count($sharePage));
if (empty($sharePage)) {
break;
}
if ($path !== "$sourceUid/files") {
- $sharePage = array_filter($sharePage, function (IShare $share) use ($view, $path) {
+ $sharePage = array_filter($sharePage, function (IShare $share) use ($view, $normalizedPath) {
try {
- $relativePath = $view->getPath($share->getNodeId());
- $singleFileTranfer = $view->is_file($path);
- if ($singleFileTranfer) {
- return Filesystem::normalizePath($relativePath) === Filesystem::normalizePath($path);
- }
+ $sourceNode = $share->getNode();
+ $relativePath = $view->getRelativePath($sourceNode->getPath());
- return mb_strpos(
- Filesystem::normalizePath($relativePath . '/', false),
- Filesystem::normalizePath($path . '/', false)) === 0;
- } catch (\Exception $e) {
+ return str_starts_with($relativePath . '/', $normalizedPath . '/');
+ } catch (Exception $e) {
return false;
}
});
@@ -318,17 +349,32 @@ class OwnershipTransferService {
$progress->finish();
$output->writeln('');
- return $shares;
+
+ return array_values(array_filter(array_map(function (IShare $share) use ($view, $normalizedPath, $output, $sourceUid) {
+ try {
+ $nodePath = $view->getRelativePath($share->getNode()->getPath());
+ } catch (NotFoundException $e) {
+ $output->writeln("<error>Failed to find path for shared file {$share->getNodeId()} for user $sourceUid, skipping</error>");
+ return null;
+ }
+
+ return [
+ 'share' => $share,
+ 'suffix' => substr(Filesystem::normalizePath($nodePath), strlen($normalizedPath)),
+ ];
+ }, $shares)));
}
- private function collectIncomingShares(string $sourceUid,
- OutputInterface $output,
- View $view,
- bool $addKeys = false): array {
+ private function collectIncomingShares(
+ string $sourceUid,
+ OutputInterface $output,
+ ?string $path,
+ ): array {
$output->writeln("Collecting all incoming share information for files and folders of $sourceUid ...");
$shares = [];
$progress = new ProgressBar($output);
+ $normalizedPath = Filesystem::normalizePath($path);
$offset = 0;
while (true) {
@@ -337,14 +383,19 @@ class OwnershipTransferService {
if (empty($sharePage)) {
break;
}
- if ($addKeys) {
- foreach ($sharePage as $singleShare) {
- $shares[$singleShare->getNodeId()] = $singleShare;
- }
- } else {
- foreach ($sharePage as $singleShare) {
- $shares[] = $singleShare;
- }
+
+ if ($path !== null && $path !== "$sourceUid/files") {
+ $sharePage = array_filter($sharePage, static function (IShare $share) use ($sourceUid, $normalizedPath) {
+ try {
+ return str_starts_with(Filesystem::normalizePath($sourceUid . '/files' . $share->getTarget() . '/', false), $normalizedPath . '/');
+ } catch (Exception) {
+ return false;
+ }
+ });
+ }
+
+ foreach ($sharePage as $share) {
+ $shares[$share->getNodeId()] = $share;
}
$offset += 50;
@@ -359,11 +410,14 @@ class OwnershipTransferService {
/**
* @throws TransferOwnershipException
*/
- protected function transferFiles(string $sourceUid,
- string $sourcePath,
- string $finalTarget,
- View $view,
- OutputInterface $output): void {
+ protected function transferFiles(
+ string $sourceUid,
+ string $sourcePath,
+ string $finalTarget,
+ View $view,
+ OutputInterface $output,
+ bool $includeExternalStorage,
+ ): void {
$output->writeln("Transferring files to $finalTarget ...");
// This change will help user to transfer the folder specified using --path option.
@@ -372,26 +426,69 @@ class OwnershipTransferService {
$view->mkdir($finalTarget);
$finalTarget = $finalTarget . '/' . basename($sourcePath);
}
- if ($view->rename($sourcePath, $finalTarget) === false) {
- throw new TransferOwnershipException("Could not transfer files.", 1);
+ $sourceInfo = $view->getFileInfo($sourcePath);
+
+ /// handle the external storages mounted at the root, or the admin specifying an external storage with --path
+ if ($sourceInfo->getInternalPath() === '' && $includeExternalStorage) {
+ $this->moveMountContents($view, $sourcePath, $finalTarget);
+ } else {
+ if ($view->rename($sourcePath, $finalTarget, ['checkSubMounts' => false]) === false) {
+ throw new TransferOwnershipException('Could not transfer files.', 1);
+ }
+ }
+
+ if ($includeExternalStorage) {
+ $nestedMounts = $this->mountManager->findIn($sourcePath);
+ foreach ($nestedMounts as $mount) {
+ if ($mount->getMountProvider() === ConfigAdapter::class) {
+ $relativePath = substr(trim($mount->getMountPoint(), '/'), strlen($sourcePath));
+ $this->moveMountContents($view, $mount->getMountPoint(), $finalTarget . $relativePath);
+ }
+ }
}
+
if (!is_dir("$sourceUid/files")) {
// because the files folder is moved away we need to recreate it
$view->mkdir("$sourceUid/files");
}
}
- private function restoreShares(string $sourceUid,
- string $destinationUid,
- array $shares,
- OutputInterface $output) {
- $output->writeln("Restoring shares ...");
+ private function moveMountContents(View $rootView, string $source, string $target) {
+ if ($rootView->copy($source, $target)) {
+ // just doing `rmdir` on the mountpoint would cause it to try and unmount the storage
+ // we need to empty the contents instead
+ $content = $rootView->getDirectoryContent($source);
+ foreach ($content as $item) {
+ if ($item->getType() === FileInfo::TYPE_FOLDER) {
+ $rootView->rmdir($item->getPath());
+ } else {
+ $rootView->unlink($item->getPath());
+ }
+ }
+ } else {
+ throw new TransferOwnershipException("Could not transfer $source to $target");
+ }
+ }
+
+ /**
+ * @param string $targetLocation New location of the transfered node
+ * @param array<array{share: IShare, suffix: string}> $shares previously collected share information
+ */
+ private function restoreShares(
+ string $sourceUid,
+ string $destinationUid,
+ string $targetLocation,
+ array $shares,
+ OutputInterface $output,
+ ):void {
+ $output->writeln('Restoring shares ...');
$progress = new ProgressBar($output, count($shares));
- foreach ($shares as $share) {
+ foreach ($shares as ['share' => $share, 'suffix' => $suffix]) {
try {
- if ($share->getShareType() === IShare::TYPE_USER &&
- $share->getSharedWith() === $destinationUid) {
+ $output->writeln('Transfering share ' . $share->getId() . ' of type ' . $share->getShareType(), OutputInterface::VERBOSITY_VERBOSE);
+ if ($share->getShareType() === IShare::TYPE_USER
+ && $share->getSharedWith() === $destinationUid) {
// Unmount the shares before deleting, so we don't try to get the storage later on.
$shareMountPoint = $this->mountManager->find('/' . $destinationUid . '/files' . $share->getTarget());
if ($shareMountPoint) {
@@ -406,8 +503,8 @@ class OwnershipTransferService {
$share->setSharedBy($destinationUid);
}
- if ($share->getShareType() === IShare::TYPE_USER &&
- !$this->userManager->userExists($share->getSharedWith())) {
+ if ($share->getShareType() === IShare::TYPE_USER
+ && !$this->userManager->userExists($share->getSharedWith())) {
// stray share with deleted user
$output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted user "' . $share->getSharedWith() . '", deleting</error>');
$this->shareManager->deleteShare($share);
@@ -416,12 +513,25 @@ class OwnershipTransferService {
// trigger refetching of the node so that the new owner and mountpoint are taken into account
// otherwise the checks on the share update will fail due to the original node not being available in the new user scope
$this->userMountCache->clear();
- $share->setNodeId($share->getNode()->getId());
- $this->shareManager->updateShare($share);
+ try {
+ // Try to get the "old" id.
+ // Normally the ID is preserved,
+ // but for transferes between different storages the ID might change
+ $newNodeId = $share->getNode()->getId();
+ } catch (NotFoundException) {
+ // ID has changed due to transfer between different storages
+ // Try to get the new ID from the target path and suffix of the share
+ $node = $this->rootFolder->get(Filesystem::normalizePath($targetLocation . '/' . $suffix));
+ $newNodeId = $node->getId();
+ $output->writeln('Had to change node id to ' . $newNodeId, OutputInterface::VERBOSITY_VERY_VERBOSE);
+ }
+ $share->setNodeId($newNodeId);
+
+ $this->shareManager->updateShare($share, onlyValid: false);
}
}
- } catch (\OCP\Files\NotFoundException $e) {
+ } catch (NotFoundException $e) {
$output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>');
} catch (\Throwable $e) {
$output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getMessage() . ' : ' . $e->getTraceAsString() . '</error>');
@@ -433,18 +543,18 @@ class OwnershipTransferService {
}
private function transferIncomingShares(string $sourceUid,
- string $destinationUid,
- array $sourceShares,
- array $destinationShares,
- OutputInterface $output,
- string $path,
- string $finalTarget,
- bool $move): void {
- $output->writeln("Restoring incoming shares ...");
+ string $destinationUid,
+ array $sourceShares,
+ array $destinationShares,
+ OutputInterface $output,
+ string $path,
+ string $finalTarget,
+ bool $move): void {
+ $output->writeln('Restoring incoming shares ...');
$progress = new ProgressBar($output, count($sourceShares));
$prefix = "$destinationUid/files";
$finalShareTarget = '';
- if (substr($finalTarget, 0, strlen($prefix)) === $prefix) {
+ if (str_starts_with($finalTarget, $prefix)) {
$finalShareTarget = substr($finalTarget, strlen($prefix));
}
foreach ($sourceShares as $share) {
@@ -454,13 +564,13 @@ class OwnershipTransferService {
if (trim($path, '/') !== '') {
$pathToCheck = '/' . trim($path) . '/';
}
- if (substr($share->getTarget(), 0, strlen($pathToCheck)) !== $pathToCheck) {
+ if (!str_starts_with($share->getTarget(), $pathToCheck)) {
continue;
}
$shareTarget = $share->getTarget();
$shareTarget = $finalShareTarget . $shareTarget;
- if ($share->getShareType() === IShare::TYPE_USER &&
- $share->getSharedBy() === $destinationUid) {
+ if ($share->getShareType() === IShare::TYPE_USER
+ && $share->getSharedBy() === $destinationUid) {
$this->shareManager->deleteShare($share);
} elseif (isset($destinationShares[$share->getNodeId()])) {
$destinationShare = $destinationShares[$share->getNodeId()];
@@ -501,7 +611,7 @@ class OwnershipTransferService {
$this->shareManager->moveShare($share, $destinationUid);
continue;
}
- } catch (\OCP\Files\NotFoundException $e) {
+ } catch (NotFoundException $e) {
$output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>');
} catch (\Throwable $e) {
$output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getTraceAsString() . '</error>');
diff --git a/apps/files/lib/Service/SettingsService.php b/apps/files/lib/Service/SettingsService.php
new file mode 100644
index 00000000000..d07e907a5f6
--- /dev/null
+++ b/apps/files/lib/Service/SettingsService.php
@@ -0,0 +1,63 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Service;
+
+use OC\Files\FilenameValidator;
+use OCP\IConfig;
+use Psr\Log\LoggerInterface;
+
+class SettingsService {
+
+ protected const WINDOWS_EXTENSION = [
+ ' ',
+ '.',
+ ];
+
+ protected const WINDOWS_BASENAMES = [
+ 'con', 'prn', 'aux', 'nul', 'com0', 'com1', 'com2', 'com3', 'com4', 'com5',
+ 'com6', 'com7', 'com8', 'com9', 'com¹', 'com²', 'com³', 'lpt0', 'lpt1', 'lpt2',
+ 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9', 'lpt¹', 'lpt²', 'lpt³',
+ ];
+
+ protected const WINDOWS_CHARACTERS = [
+ '<', '>', ':',
+ '"', '|', '?',
+ '*',
+ ];
+
+ public function __construct(
+ private IConfig $config,
+ private FilenameValidator $filenameValidator,
+ private LoggerInterface $logger,
+ ) {
+ }
+
+ public function hasFilesWindowsSupport(): bool {
+ return empty(array_diff(self::WINDOWS_BASENAMES, $this->filenameValidator->getForbiddenBasenames()))
+ && empty(array_diff(self::WINDOWS_CHARACTERS, $this->filenameValidator->getForbiddenCharacters()))
+ && empty(array_diff(self::WINDOWS_EXTENSION, $this->filenameValidator->getForbiddenExtensions()));
+ }
+
+ public function setFilesWindowsSupport(bool $enabled = true): void {
+ if ($enabled) {
+ $basenames = array_unique(array_merge(self::WINDOWS_BASENAMES, $this->filenameValidator->getForbiddenBasenames()));
+ $characters = array_unique(array_merge(self::WINDOWS_CHARACTERS, $this->filenameValidator->getForbiddenCharacters()));
+ $extensions = array_unique(array_merge(self::WINDOWS_EXTENSION, $this->filenameValidator->getForbiddenExtensions()));
+ } else {
+ $basenames = array_unique(array_values(array_diff($this->filenameValidator->getForbiddenBasenames(), self::WINDOWS_BASENAMES)));
+ $characters = array_unique(array_values(array_diff($this->filenameValidator->getForbiddenCharacters(), self::WINDOWS_CHARACTERS)));
+ $extensions = array_unique(array_values(array_diff($this->filenameValidator->getForbiddenExtensions(), self::WINDOWS_EXTENSION)));
+ }
+ $values = [
+ 'forbidden_filename_basenames' => empty($basenames) ? null : $basenames,
+ 'forbidden_filename_characters' => empty($characters) ? null : $characters,
+ 'forbidden_filename_extensions' => empty($extensions) ? null : $extensions,
+ ];
+ $this->config->setSystemValues($values);
+ }
+}
diff --git a/apps/files/lib/Service/TagService.php b/apps/files/lib/Service/TagService.php
index 29b6fbc2840..63c54d01fd0 100644
--- a/apps/files/lib/Service/TagService.php
+++ b/apps/files/lib/Service/TagService.php
@@ -1,73 +1,29 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Service;
-use OCA\Files\Activity\FavoriteProvider;
use OCP\Activity\IManager;
use OCP\Files\Folder;
+use OCP\Files\NotFoundException;
use OCP\ITags;
-use OCP\IUser;
use OCP\IUserSession;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
-use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Service class to manage tags on files.
*/
class TagService {
- /** @var IUserSession */
- private $userSession;
- /** @var IManager */
- private $activityManager;
- /** @var ITags */
- private $tagger;
- /** @var Folder */
- private $homeFolder;
- /** @var EventDispatcherInterface */
- private $dispatcher;
-
- /**
- * @param IUserSession $userSession
- * @param IManager $activityManager
- * @param ITags $tagger
- * @param Folder $homeFolder
- * @param EventDispatcherInterface $dispatcher
- */
public function __construct(
- IUserSession $userSession,
- IManager $activityManager,
- ITags $tagger,
- Folder $homeFolder,
- EventDispatcherInterface $dispatcher
+ private IUserSession $userSession,
+ private IManager $activityManager,
+ private ?ITags $tagger,
+ private ?Folder $homeFolder,
) {
- $this->userSession = $userSession;
- $this->activityManager = $activityManager;
- $this->tagger = $tagger;
- $this->homeFolder = $homeFolder;
- $this->dispatcher = $dispatcher;
}
/**
@@ -76,11 +32,18 @@ class TagService {
* replace the actual tag selection.
*
* @param string $path path
- * @param array $tags array of tags
+ * @param array $tags array of tags
* @return array list of tags
- * @throws \OCP\Files\NotFoundException if the file does not exist
+ * @throws NotFoundException if the file does not exist
*/
public function updateFileTags($path, $tags) {
+ if ($this->tagger === null) {
+ throw new \RuntimeException('No tagger set');
+ }
+ if ($this->homeFolder === null) {
+ throw new \RuntimeException('No homeFolder set');
+ }
+
$fileId = $this->homeFolder->get($path)->getId();
$currentTags = $this->tagger->getTagsForObjects([$fileId]);
@@ -91,16 +54,10 @@ class TagService {
$newTags = array_diff($tags, $currentTags);
foreach ($newTags as $tag) {
- if ($tag === ITags::TAG_FAVORITE) {
- $this->addActivity(true, $fileId, $path);
- }
$this->tagger->tagAs($fileId, $tag);
}
$deletedTags = array_diff($currentTags, $tags);
foreach ($deletedTags as $tag) {
- if ($tag === ITags::TAG_FAVORITE) {
- $this->addActivity(false, $fileId, $path);
- }
$this->tagger->unTag($fileId, $tag);
}
@@ -108,40 +65,4 @@ class TagService {
// list is up to date, in case of concurrent changes ?
return $tags;
}
-
- /**
- * @param bool $addToFavorite
- * @param int $fileId
- * @param string $path
- */
- protected function addActivity($addToFavorite, $fileId, $path) {
- $user = $this->userSession->getUser();
- if (!$user instanceof IUser) {
- return;
- }
-
- $eventName = $addToFavorite ? 'addFavorite' : 'removeFavorite';
- $this->dispatcher->dispatch(self::class . '::' . $eventName, new GenericEvent(null, [
- 'userId' => $user->getUID(),
- 'fileId' => $fileId,
- 'path' => $path,
- ]));
-
- $event = $this->activityManager->generateEvent();
- try {
- $event->setApp('files')
- ->setObject('files', $fileId, $path)
- ->setType('favorite')
- ->setAuthor($user->getUID())
- ->setAffectedUser($user->getUID())
- ->setTimestamp(time())
- ->setSubject(
- $addToFavorite ? FavoriteProvider::SUBJECT_ADDED : FavoriteProvider::SUBJECT_REMOVED,
- ['id' => $fileId, 'path' => $path]
- );
- $this->activityManager->publish($event);
- } catch (\InvalidArgumentException $e) {
- } catch (\BadMethodCallException $e) {
- }
- }
}
diff --git a/apps/files/lib/Service/UserConfig.php b/apps/files/lib/Service/UserConfig.php
new file mode 100644
index 00000000000..dcf30b7796d
--- /dev/null
+++ b/apps/files/lib/Service/UserConfig.php
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Service;
+
+use OCA\Files\AppInfo\Application;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserSession;
+
+class UserConfig {
+ public const ALLOWED_CONFIGS = [
+ [
+ // Whether to crop the files previews or not in the files list
+ 'key' => 'crop_image_previews',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
+ // The view to start the files app in
+ 'key' => 'default_view',
+ 'default' => 'files',
+ 'allowed' => ['files', 'personal'],
+ ],
+ [
+ // Whether to show the folder tree
+ 'key' => 'folder_tree',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the files list in grid view or not
+ 'key' => 'grid_view',
+ 'default' => false,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the "confirm file deletion" warning
+ 'key' => 'show_dialog_deletion',
+ 'default' => false,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the "confirm file extension change" warning
+ 'key' => 'show_dialog_file_extension',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the files extensions in the files list or not
+ 'key' => 'show_files_extensions',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the hidden files or not in the files list
+ 'key' => 'show_hidden',
+ 'default' => false,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to show the mime column or not
+ 'key' => 'show_mime_column',
+ 'default' => false,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to sort favorites first in the list or not
+ 'key' => 'sort_favorites_first',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ [
+ // Whether to sort folders before files in the list or not
+ 'key' => 'sort_folders_first',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ ];
+ protected ?IUser $user = null;
+
+ public function __construct(
+ protected IConfig $config,
+ IUserSession $userSession,
+ ) {
+ $this->user = $userSession->getUser();
+ }
+
+ /**
+ * Get the list of all allowed user config keys
+ * @return string[]
+ */
+ public function getAllowedConfigKeys(): array {
+ return array_map(function ($config) {
+ return $config['key'];
+ }, self::ALLOWED_CONFIGS);
+ }
+
+ /**
+ * Get the list of allowed config values for a given key
+ *
+ * @param string $key a valid config key
+ * @return array
+ */
+ private function getAllowedConfigValues(string $key): array {
+ foreach (self::ALLOWED_CONFIGS as $config) {
+ if ($config['key'] === $key) {
+ return $config['allowed'];
+ }
+ }
+ return [];
+ }
+
+ /**
+ * Get the default config value for a given key
+ *
+ * @param string $key a valid config key
+ * @return string|bool
+ */
+ private function getDefaultConfigValue(string $key) {
+ foreach (self::ALLOWED_CONFIGS as $config) {
+ if ($config['key'] === $key) {
+ return $config['default'];
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Set a user config
+ *
+ * @param string $key
+ * @param string|bool $value
+ * @throws \Exception
+ * @throws \InvalidArgumentException
+ */
+ public function setConfig(string $key, $value): void {
+ if ($this->user === null) {
+ throw new \Exception('No user logged in');
+ }
+
+ if (!in_array($key, $this->getAllowedConfigKeys())) {
+ throw new \InvalidArgumentException('Unknown config key');
+ }
+
+ if (!in_array($value, $this->getAllowedConfigValues($key))) {
+ throw new \InvalidArgumentException('Invalid config value');
+ }
+
+ if (is_bool($value)) {
+ $value = $value ? '1' : '0';
+ }
+
+ $this->config->setUserValue($this->user->getUID(), Application::APP_ID, $key, $value);
+ }
+
+ /**
+ * Get the current user configs array
+ *
+ * @return array
+ */
+ public function getConfigs(): array {
+ if ($this->user === null) {
+ throw new \Exception('No user logged in');
+ }
+
+ $userId = $this->user->getUID();
+ $userConfigs = array_map(function (string $key) use ($userId) {
+ $value = $this->config->getUserValue($userId, Application::APP_ID, $key, $this->getDefaultConfigValue($key));
+ // If the default is expected to be a boolean, we need to cast the value
+ if (is_bool($this->getDefaultConfigValue($key)) && is_string($value)) {
+ return $value === '1';
+ }
+ return $value;
+ }, $this->getAllowedConfigKeys());
+
+ return array_combine($this->getAllowedConfigKeys(), $userConfigs);
+ }
+}
diff --git a/apps/files/lib/Service/ViewConfig.php b/apps/files/lib/Service/ViewConfig.php
new file mode 100644
index 00000000000..cf8bebd5372
--- /dev/null
+++ b/apps/files/lib/Service/ViewConfig.php
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Service;
+
+use OCA\Files\AppInfo\Application;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserSession;
+
+class ViewConfig {
+ public const CONFIG_KEY = 'files_views_configs';
+ public const ALLOWED_CONFIGS = [
+ [
+ // The default sorting key for the files list view
+ 'key' => 'sorting_mode',
+ // null by default as views can provide default sorting key
+ // and will fallback to it if user hasn't change it
+ 'default' => null,
+ ],
+ [
+ // The default sorting direction for the files list view
+ 'key' => 'sorting_direction',
+ 'default' => 'asc',
+ 'allowed' => ['asc', 'desc'],
+ ],
+ [
+ // If the navigation entry for this view is expanded or not
+ 'key' => 'expanded',
+ 'default' => true,
+ 'allowed' => [true, false],
+ ],
+ ];
+ protected ?IUser $user = null;
+
+ public function __construct(
+ protected IConfig $config,
+ IUserSession $userSession,
+ ) {
+ $this->user = $userSession->getUser();
+ }
+
+ /**
+ * Get the list of all allowed user config keys
+ * @return string[]
+ */
+ public function getAllowedConfigKeys(): array {
+ return array_map(function ($config) {
+ return $config['key'];
+ }, self::ALLOWED_CONFIGS);
+ }
+
+ /**
+ * Get the list of allowed config values for a given key
+ *
+ * @param string $key a valid config key
+ * @return array
+ */
+ private function getAllowedConfigValues(string $key): array {
+ foreach (self::ALLOWED_CONFIGS as $config) {
+ if ($config['key'] === $key) {
+ return $config['allowed'] ?? [];
+ }
+ }
+ return [];
+ }
+
+ /**
+ * Get the default config value for a given key
+ *
+ * @param string $key a valid config key
+ * @return string|bool|null
+ */
+ private function getDefaultConfigValue(string $key) {
+ foreach (self::ALLOWED_CONFIGS as $config) {
+ if ($config['key'] === $key) {
+ return $config['default'];
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Set a user config
+ *
+ * @param string $view
+ * @param string $key
+ * @param string|bool $value
+ * @throws \Exception
+ * @throws \InvalidArgumentException
+ */
+ public function setConfig(string $view, string $key, $value): void {
+ if ($this->user === null) {
+ throw new \Exception('No user logged in');
+ }
+
+ if (!$view) {
+ throw new \Exception('Unknown view');
+ }
+
+ if (!in_array($key, $this->getAllowedConfigKeys())) {
+ throw new \InvalidArgumentException('Unknown config key');
+ }
+
+ if (!in_array($value, $this->getAllowedConfigValues($key))
+ && !empty($this->getAllowedConfigValues($key))) {
+ throw new \InvalidArgumentException('Invalid config value');
+ }
+
+ // Cast boolean values
+ if (is_bool($this->getDefaultConfigValue($key))) {
+ $value = $value === '1';
+ }
+
+ $config = $this->getConfigs();
+ $config[$view][$key] = $value;
+
+ $this->config->setUserValue($this->user->getUID(), Application::APP_ID, self::CONFIG_KEY, json_encode($config));
+ }
+
+ /**
+ * Get the current user configs array for a given view
+ *
+ * @return array
+ */
+ public function getConfig(string $view): array {
+ if ($this->user === null) {
+ throw new \Exception('No user logged in');
+ }
+
+ $userId = $this->user->getUID();
+ $configs = json_decode($this->config->getUserValue($userId, Application::APP_ID, self::CONFIG_KEY, '[]'), true);
+
+ if (!isset($configs[$view])) {
+ $configs[$view] = [];
+ }
+
+ // Extend undefined values with defaults
+ return array_reduce(self::ALLOWED_CONFIGS, function ($carry, $config) use ($view, $configs) {
+ $key = $config['key'];
+ $carry[$key] = $configs[$view][$key] ?? $this->getDefaultConfigValue($key);
+ return $carry;
+ }, []);
+ }
+
+ /**
+ * Get the current user configs array
+ *
+ * @return array
+ */
+ public function getConfigs(): array {
+ if ($this->user === null) {
+ throw new \Exception('No user logged in');
+ }
+
+ $userId = $this->user->getUID();
+ $configs = json_decode($this->config->getUserValue($userId, Application::APP_ID, self::CONFIG_KEY, '[]'), true);
+ $views = array_keys($configs);
+
+ return array_reduce($views, function ($carry, $view) use ($configs) {
+ $carry[$view] = $this->getConfig($view);
+ return $carry;
+ }, []);
+ }
+}
diff --git a/apps/files/lib/Settings/DeclarativeAdminSettings.php b/apps/files/lib/Settings/DeclarativeAdminSettings.php
new file mode 100644
index 00000000000..bbf97cc4d32
--- /dev/null
+++ b/apps/files/lib/Settings/DeclarativeAdminSettings.php
@@ -0,0 +1,67 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files\Settings;
+
+use OCA\Files\Service\SettingsService;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\Settings\DeclarativeSettingsTypes;
+use OCP\Settings\IDeclarativeSettingsFormWithHandlers;
+
+class DeclarativeAdminSettings implements IDeclarativeSettingsFormWithHandlers {
+
+ public function __construct(
+ private IL10N $l,
+ private SettingsService $service,
+ private IURLGenerator $urlGenerator,
+ ) {
+ }
+
+ public function getValue(string $fieldId, IUser $user): mixed {
+ return match($fieldId) {
+ 'windows_support' => $this->service->hasFilesWindowsSupport(),
+ default => throw new \InvalidArgumentException('Unexpected field id ' . $fieldId),
+ };
+ }
+
+ public function setValue(string $fieldId, mixed $value, IUser $user): void {
+ switch ($fieldId) {
+ case 'windows_support':
+ $this->service->setFilesWindowsSupport((bool)$value);
+ break;
+ }
+ }
+
+ public function getSchema(): array {
+ return [
+ 'id' => 'files-filename-support',
+ 'priority' => 10,
+ 'section_type' => DeclarativeSettingsTypes::SECTION_TYPE_ADMIN,
+ 'section_id' => 'server',
+ 'storage_type' => DeclarativeSettingsTypes::STORAGE_TYPE_EXTERNAL,
+ 'title' => $this->l->t('Files compatibility'),
+ 'doc_url' => $this->urlGenerator->linkToDocs('admin-windows-compatible-filenames'),
+ 'description' => (
+ $this->l->t('Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.')
+ . "\n" . $this->l->t('After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.')
+ . "\n" . $this->l->t('It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.')
+ ),
+
+ 'fields' => [
+ [
+ 'id' => 'windows_support',
+ 'title' => $this->l->t('Enforce Windows compatibility'),
+ 'description' => $this->l->t('This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.'),
+ 'type' => DeclarativeSettingsTypes::CHECKBOX,
+ 'default' => false,
+ ],
+ ],
+ ];
+ }
+}
diff --git a/apps/files/lib/Settings/PersonalSettings.php b/apps/files/lib/Settings/PersonalSettings.php
index c62a1b9d62d..fe43265bc13 100644
--- a/apps/files/lib/Settings/PersonalSettings.php
+++ b/apps/files/lib/Settings/PersonalSettings.php
@@ -3,34 +3,19 @@
declare(strict_types=1);
/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Settings;
use OCA\Files\AppInfo\Application;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Settings\ISettings;
+use OCP\Util;
class PersonalSettings implements ISettings {
public function getForm(): TemplateResponse {
+ Util::addScript(Application::APP_ID, 'settings-personal');
return new TemplateResponse(Application::APP_ID, 'settings-personal');
}
diff --git a/apps/files/list.php b/apps/files/list.php
deleted file mode 100644
index 09dc217139c..00000000000
--- a/apps/files/list.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-use OCP\Share\IManager;
-
-$config = \OC::$server->getConfig();
-$userSession = \OC::$server->getUserSession();
-// TODO: move this to the generated config.js
-/** @var IManager $shareManager */
-$shareManager = \OC::$server->get(IManager::class);
-$publicUploadEnabled = $shareManager->shareApiLinkAllowPublicUpload() ? 'yes' : 'no';
-
-$showgridview = $config->getUserValue($userSession->getUser()->getUID(), 'files', 'show_grid', false);
-
-// renders the controls and table headers template
-$tmpl = new OCP\Template('files', 'list', '');
-
-// gridview not available for ie
-$tmpl->assign('showgridview', $showgridview);
-$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
-$tmpl->printPage();
diff --git a/apps/files/openapi.json b/apps/files/openapi.json
new file mode 100644
index 00000000000..c5d6053075c
--- /dev/null
+++ b/apps/files/openapi.json
@@ -0,0 +1,2469 @@
+{
+ "openapi": "3.0.3",
+ "info": {
+ "title": "files",
+ "version": "0.0.1",
+ "description": "File Management",
+ "license": {
+ "name": "agpl"
+ }
+ },
+ "components": {
+ "securitySchemes": {
+ "basic_auth": {
+ "type": "http",
+ "scheme": "basic"
+ },
+ "bearer_auth": {
+ "type": "http",
+ "scheme": "bearer"
+ }
+ },
+ "schemas": {
+ "Capabilities": {
+ "type": "object",
+ "required": [
+ "files"
+ ],
+ "properties": {
+ "files": {
+ "type": "object",
+ "required": [
+ "windows_compatible_filenames",
+ "$comment",
+ "bigfilechunking",
+ "blacklisted_files",
+ "forbidden_filenames",
+ "forbidden_filename_basenames",
+ "forbidden_filename_characters",
+ "forbidden_filename_extensions",
+ "chunked_upload",
+ "file_conversions",
+ "directEditing"
+ ],
+ "properties": {
+ "windows_compatible_filenames": {
+ "type": "boolean"
+ },
+ "$comment": {
+ "type": "string",
+ "nullable": true
+ },
+ "bigfilechunking": {
+ "type": "boolean"
+ },
+ "blacklisted_files": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "forbidden_filenames": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "forbidden_filename_basenames": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "forbidden_filename_characters": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "forbidden_filename_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "chunked_upload": {
+ "type": "object",
+ "required": [
+ "max_size",
+ "max_parallel_count"
+ ],
+ "properties": {
+ "max_size": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "max_parallel_count": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "file_conversions": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "from",
+ "to",
+ "extension",
+ "displayName"
+ ],
+ "properties": {
+ "from": {
+ "type": "string"
+ },
+ "to": {
+ "type": "string"
+ },
+ "extension": {
+ "type": "string"
+ },
+ "displayName": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "directEditing": {
+ "type": "object",
+ "required": [
+ "url",
+ "etag",
+ "supportsFileId"
+ ],
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "etag": {
+ "type": "string"
+ },
+ "supportsFileId": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "FolderTree": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "basename",
+ "children"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "basename": {
+ "type": "string"
+ },
+ "displayName": {
+ "type": "string"
+ },
+ "children": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ }
+ }
+ }
+ },
+ "OCSMeta": {
+ "type": "object",
+ "required": [
+ "status",
+ "statuscode"
+ ],
+ "properties": {
+ "status": {
+ "type": "string"
+ },
+ "statuscode": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "totalitems": {
+ "type": "string"
+ },
+ "itemsperpage": {
+ "type": "string"
+ }
+ }
+ },
+ "Template": {
+ "type": "object",
+ "required": [
+ "templateType",
+ "templateId",
+ "basename",
+ "etag",
+ "fileid",
+ "filename",
+ "lastmod",
+ "mime",
+ "size",
+ "type",
+ "hasPreview",
+ "previewUrl",
+ "fields"
+ ],
+ "properties": {
+ "templateType": {
+ "type": "string"
+ },
+ "templateId": {
+ "type": "string"
+ },
+ "basename": {
+ "type": "string"
+ },
+ "etag": {
+ "type": "string"
+ },
+ "fileid": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "filename": {
+ "type": "string"
+ },
+ "lastmod": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "mime": {
+ "type": "string"
+ },
+ "size": {
+ "anyOf": [
+ {
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "type": "number",
+ "format": "double"
+ }
+ ]
+ },
+ "type": {
+ "type": "string"
+ },
+ "hasPreview": {
+ "type": "boolean"
+ },
+ "previewUrl": {
+ "type": "string",
+ "nullable": true
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TemplateField"
+ }
+ }
+ }
+ },
+ "TemplateField": {
+ "type": "object",
+ "required": [
+ "index",
+ "type",
+ "alias",
+ "tag",
+ "id"
+ ],
+ "properties": {
+ "index": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "alias": {
+ "type": "string",
+ "nullable": true
+ },
+ "tag": {
+ "type": "string",
+ "nullable": true
+ },
+ "id": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ },
+ "content": {
+ "type": "string"
+ },
+ "checked": {
+ "type": "boolean"
+ }
+ }
+ },
+ "TemplateFile": {
+ "type": "object",
+ "required": [
+ "basename",
+ "etag",
+ "fileid",
+ "filename",
+ "lastmod",
+ "mime",
+ "size",
+ "type",
+ "hasPreview"
+ ],
+ "properties": {
+ "basename": {
+ "type": "string"
+ },
+ "etag": {
+ "type": "string"
+ },
+ "fileid": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "filename": {
+ "type": "string",
+ "nullable": true
+ },
+ "lastmod": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "mime": {
+ "type": "string"
+ },
+ "size": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "type": {
+ "type": "string"
+ },
+ "hasPreview": {
+ "type": "boolean"
+ }
+ }
+ },
+ "TemplateFileCreator": {
+ "type": "object",
+ "required": [
+ "app",
+ "label",
+ "extension",
+ "iconClass",
+ "iconSvgInline",
+ "mimetypes",
+ "ratio",
+ "actionLabel"
+ ],
+ "properties": {
+ "app": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "extension": {
+ "type": "string"
+ },
+ "iconClass": {
+ "type": "string",
+ "nullable": true
+ },
+ "iconSvgInline": {
+ "type": "string",
+ "nullable": true
+ },
+ "mimetypes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ratio": {
+ "type": "number",
+ "format": "double",
+ "nullable": true
+ },
+ "actionLabel": {
+ "type": "string"
+ }
+ }
+ },
+ "TemplateFileCreatorWithTemplates": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/TemplateFileCreator"
+ },
+ {
+ "type": "object",
+ "required": [
+ "templates"
+ ],
+ "properties": {
+ "templates": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Template"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ "paths": {
+ "/index.php/apps/files/api/v1/thumbnail/{x}/{y}/{file}": {
+ "get": {
+ "operationId": "api-get-thumbnail",
+ "summary": "Gets a thumbnail of the specified file",
+ "deprecated": true,
+ "tags": [
+ "api"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "x",
+ "in": "path",
+ "description": "Width of the thumbnail",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "y",
+ "in": "path",
+ "description": "Height of the thumbnail",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "file",
+ "in": "path",
+ "description": "URL-encoded filename",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "pattern": "^.+$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Thumbnail returned",
+ "content": {
+ "*/*": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Getting thumbnail is not possible",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "File not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/directEditing": {
+ "get": {
+ "operationId": "direct_editing-info",
+ "summary": "Get the direct editing capabilities",
+ "tags": [
+ "direct_editing"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Direct editing capabilities returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "editors",
+ "creators"
+ ],
+ "properties": {
+ "editors": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "mimetypes",
+ "optionalMimetypes",
+ "secure"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "mimetypes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "optionalMimetypes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "secure": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "creators": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "required": [
+ "id",
+ "editor",
+ "name",
+ "extension",
+ "templates",
+ "mimetypes"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "editor": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "extension": {
+ "type": "string"
+ },
+ "templates": {
+ "type": "boolean"
+ },
+ "mimetypes": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/directEditing/templates/{editorId}/{creatorId}": {
+ "get": {
+ "operationId": "direct_editing-templates",
+ "summary": "Get the templates for direct editing",
+ "tags": [
+ "direct_editing"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "editorId",
+ "in": "path",
+ "description": "ID of the editor",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "creatorId",
+ "in": "path",
+ "description": "ID of the creator",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Templates returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "templates"
+ ],
+ "properties": {
+ "templates": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "required": [
+ "id",
+ "title",
+ "preview",
+ "extension",
+ "mimetype"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "preview": {
+ "type": "string",
+ "nullable": true
+ },
+ "extension": {
+ "type": "string"
+ },
+ "mimetype": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/directEditing/open": {
+ "post": {
+ "operationId": "direct_editing-open",
+ "summary": "Open a file for direct editing",
+ "tags": [
+ "direct_editing"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "Path of the file"
+ },
+ "editorId": {
+ "type": "string",
+ "nullable": true,
+ "default": null,
+ "description": "ID of the editor"
+ },
+ "fileId": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true,
+ "default": null,
+ "description": "ID of the file"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "URL for direct editing returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Opening file is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/directEditing/create": {
+ "post": {
+ "operationId": "direct_editing-create",
+ "summary": "Create a file for direct editing",
+ "tags": [
+ "direct_editing"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "path",
+ "editorId",
+ "creatorId"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "Path of the file"
+ },
+ "editorId": {
+ "type": "string",
+ "description": "ID of the editor"
+ },
+ "creatorId": {
+ "type": "string",
+ "description": "ID of the creator"
+ },
+ "templateId": {
+ "type": "string",
+ "nullable": true,
+ "default": null,
+ "description": "ID of the template"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "URL for direct editing returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Opening file is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/templates": {
+ "get": {
+ "operationId": "template-list",
+ "summary": "List the available templates",
+ "tags": [
+ "template"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Available templates returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TemplateFileCreatorWithTemplates"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/templates/fields/{fileId}": {
+ "get": {
+ "operationId": "template-list-template-fields",
+ "summary": "List the fields for the template specified by the given file ID",
+ "tags": [
+ "template"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "fileId",
+ "in": "path",
+ "description": "File ID of the template",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Fields returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/TemplateField"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/templates/create": {
+ "post": {
+ "operationId": "template-create",
+ "summary": "Create a template",
+ "tags": [
+ "template"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "filePath"
+ ],
+ "properties": {
+ "filePath": {
+ "type": "string",
+ "description": "Path of the file"
+ },
+ "templatePath": {
+ "type": "string",
+ "default": "",
+ "description": "Name of the template"
+ },
+ "templateType": {
+ "type": "string",
+ "default": "user",
+ "description": "Type of the template"
+ },
+ "templateFields": {
+ "type": "array",
+ "default": [],
+ "description": "Fields of the template",
+ "items": {
+ "$ref": "#/components/schemas/TemplateField"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Template created successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "$ref": "#/components/schemas/TemplateFile"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Creating template is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/templates/path": {
+ "post": {
+ "operationId": "template-path",
+ "summary": "Initialize the template directory",
+ "tags": [
+ "template"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "templatePath": {
+ "type": "string",
+ "default": "",
+ "description": "Path of the template directory"
+ },
+ "copySystemTemplates": {
+ "type": "boolean",
+ "default": false,
+ "description": "Whether to copy the system templates to the template directory"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Template directory initialized successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "template_path",
+ "templates"
+ ],
+ "properties": {
+ "template_path": {
+ "type": "string"
+ },
+ "templates": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TemplateFileCreator"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Initializing the template directory is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/transferownership": {
+ "post": {
+ "operationId": "transfer_ownership-transfer",
+ "summary": "Transfer the ownership to another user",
+ "tags": [
+ "transfer_ownership"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "recipient",
+ "path"
+ ],
+ "properties": {
+ "recipient": {
+ "type": "string",
+ "description": "Username of the recipient"
+ },
+ "path": {
+ "type": "string",
+ "description": "Path of the file"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Ownership transferred successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Transferring ownership is not possible",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Transferring ownership is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/transferownership/{id}": {
+ "post": {
+ "operationId": "transfer_ownership-accept",
+ "summary": "Accept an ownership transfer",
+ "tags": [
+ "transfer_ownership"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of the ownership transfer",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Ownership transfer accepted successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Accepting ownership transfer is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Ownership transfer not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "transfer_ownership-reject",
+ "summary": "Reject an ownership transfer",
+ "tags": [
+ "transfer_ownership"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "ID of the ownership transfer",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Ownership transfer rejected successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Rejecting ownership transfer is not allowed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Ownership transfer not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/openlocaleditor": {
+ "post": {
+ "operationId": "open_local_editor-create",
+ "summary": "Create a local editor",
+ "tags": [
+ "open_local_editor"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "Path of the file"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Local editor returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "userId",
+ "pathHash",
+ "expirationTime",
+ "token"
+ ],
+ "properties": {
+ "userId": {
+ "type": "string",
+ "nullable": true
+ },
+ "pathHash": {
+ "type": "string"
+ },
+ "expirationTime": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "token": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/openlocaleditor/{token}": {
+ "post": {
+ "operationId": "open_local_editor-validate",
+ "summary": "Validate a local editor",
+ "tags": [
+ "open_local_editor"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "Path of the file"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "token",
+ "in": "path",
+ "description": "Token of the local editor",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Local editor validated successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "userId",
+ "pathHash",
+ "expirationTime",
+ "token"
+ ],
+ "properties": {
+ "userId": {
+ "type": "string"
+ },
+ "pathHash": {
+ "type": "string"
+ },
+ "expirationTime": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "token": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Local editor not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/folder-tree": {
+ "get": {
+ "operationId": "api-get-folder-tree",
+ "summary": "Returns the folder tree of the user",
+ "tags": [
+ "api"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "path",
+ "in": "query",
+ "description": "The path relative to the user folder",
+ "schema": {
+ "type": "string",
+ "default": "/"
+ }
+ },
+ {
+ "name": "depth",
+ "in": "query",
+ "description": "The depth of the tree",
+ "schema": {
+ "type": "integer",
+ "format": "int64",
+ "default": 1
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Folder tree returned successfully",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FolderTree"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid folder path",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Folder not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/files/api/v1/convert": {
+ "post": {
+ "operationId": "conversion_api-convert",
+ "summary": "Converts a file from one MIME type to another",
+ "tags": [
+ "conversion_api"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "fileId",
+ "targetMimeType"
+ ],
+ "properties": {
+ "fileId": {
+ "type": "integer",
+ "format": "int64",
+ "description": "ID of the file to be converted"
+ },
+ "targetMimeType": {
+ "type": "string",
+ "description": "The MIME type to which you want to convert the file"
+ },
+ "destination": {
+ "type": "string",
+ "nullable": true,
+ "default": null,
+ "description": "The target path of the converted file. Written to a temporary file if left empty"
+ }
+ }
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "File was converted and written to the destination or temporary file",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "path",
+ "fileId"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "fileId": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The file to be converted was not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "tags": []
+}
diff --git a/apps/files/openapi.json.license b/apps/files/openapi.json.license
new file mode 100644
index 00000000000..83559daa9dc
--- /dev/null
+++ b/apps/files/openapi.json.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file
diff --git a/apps/files/recentlist.php b/apps/files/recentlist.php
deleted file mode 100644
index 874ecca957c..00000000000
--- a/apps/files/recentlist.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-$config = \OC::$server->getConfig();
-$userSession = \OC::$server->getUserSession();
-
-$showgridview = $config->getUserValue($userSession->getUser()->getUID(), 'files', 'show_grid', false);
-
-$tmpl = new OCP\Template('files', 'recentlist', '');
-
-// gridview not available for ie
-$tmpl->assign('showgridview', $showgridview);
-
-$tmpl->printPage();
diff --git a/apps/files/simplelist.php b/apps/files/simplelist.php
deleted file mode 100644
index b20bdcc9c63..00000000000
--- a/apps/files/simplelist.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-// TODO: move to handlebars
-$config = \OC::$server->getConfig();
-$userSession = \OC::$server->getUserSession();
-
-$showgridview = $config->getUserValue($userSession->getUser()->getUID(), 'files', 'show_grid', false);
-
-// renders the controls and table headers template
-$tmpl = new OCP\Template('files', 'simplelist', '');
-
-// gridview not available for ie
-$tmpl->assign('showgridview', $showgridview);
-$tmpl->printPage();
diff --git a/apps/files/src/FilesApp.vue b/apps/files/src/FilesApp.vue
new file mode 100644
index 00000000000..6fc02113162
--- /dev/null
+++ b/apps/files/src/FilesApp.vue
@@ -0,0 +1,40 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+ -->
+<template>
+ <NcContent app-name="files">
+ <Navigation v-if="!isPublic" />
+ <FilesList :is-public="isPublic" />
+ </NcContent>
+</template>
+
+<script lang="ts">
+import { isPublicShare } from '@nextcloud/sharing/public'
+import { defineComponent } from 'vue'
+import NcContent from '@nextcloud/vue/components/NcContent'
+import Navigation from './views/Navigation.vue'
+import FilesList from './views/FilesList.vue'
+import { useHotKeys } from './composables/useHotKeys'
+
+export default defineComponent({
+ name: 'FilesApp',
+
+ components: {
+ NcContent,
+ FilesList,
+ Navigation,
+ },
+
+ setup() {
+ // Register global hotkeys
+ useHotKeys()
+
+ const isPublic = isPublicShare()
+
+ return {
+ isPublic,
+ }
+ },
+})
+</script>
diff --git a/apps/files/src/actions/convertAction.ts b/apps/files/src/actions/convertAction.ts
new file mode 100644
index 00000000000..4992dea312b
--- /dev/null
+++ b/apps/files/src/actions/convertAction.ts
@@ -0,0 +1,81 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, View } from '@nextcloud/files'
+
+import { FileAction, registerFileAction } from '@nextcloud/files'
+import { generateUrl } from '@nextcloud/router'
+import { getCapabilities } from '@nextcloud/capabilities'
+import { t } from '@nextcloud/l10n'
+
+import AutoRenewSvg from '@mdi/svg/svg/autorenew.svg?raw'
+
+import { convertFile, convertFiles } from './convertUtils'
+
+type ConversionsProvider = {
+ from: string,
+ to: string,
+ displayName: string,
+}
+
+export const ACTION_CONVERT = 'convert'
+export const registerConvertActions = () => {
+ // Generate sub actions
+ const convertProviders = getCapabilities()?.files?.file_conversions as ConversionsProvider[] ?? []
+ const actions = convertProviders.map(({ to, from, displayName }) => {
+ return new FileAction({
+ id: `convert-${from}-${to}`,
+ displayName: () => t('files', 'Save as {displayName}', { displayName }),
+ iconSvgInline: () => generateIconSvg(to),
+ enabled: (nodes: Node[]) => {
+ // Check that all nodes have the same mime type
+ return nodes.every(node => from === node.mime)
+ },
+
+ async exec(node: Node) {
+ // If we're here, we know that the node has a fileid
+ convertFile(node.fileid as number, to)
+
+ // Silently terminate, we'll handle the UI in the background
+ return null
+ },
+
+ async execBatch(nodes: Node[]) {
+ const fileIds = nodes.map(node => node.fileid).filter(Boolean) as number[]
+ convertFiles(fileIds, to)
+
+ // Silently terminate, we'll handle the UI in the background
+ return Array(nodes.length).fill(null)
+ },
+
+ parent: ACTION_CONVERT,
+ })
+ })
+
+ // Register main action
+ registerFileAction(new FileAction({
+ id: ACTION_CONVERT,
+ displayName: () => t('files', 'Save as …'),
+ iconSvgInline: () => AutoRenewSvg,
+ enabled: (nodes: Node[], view: View) => {
+ return actions.some(action => action.enabled!(nodes, view))
+ },
+ async exec() {
+ return null
+ },
+ order: 25,
+ }))
+
+ // Register sub actions
+ actions.forEach(registerFileAction)
+}
+
+export const generateIconSvg = (mime: string) => {
+ // Generate icon based on mime type
+ const url = generateUrl('/core/mimeicon?mime=' + encodeURIComponent(mime))
+ return `<svg width="32" height="32" viewBox="0 0 32 32"
+ xmlns="http://www.w3.org/2000/svg">
+ <image href="${url}" height="32" width="32" />
+ </svg>`
+}
diff --git a/apps/files/src/actions/convertUtils.ts b/apps/files/src/actions/convertUtils.ts
new file mode 100644
index 00000000000..0ace3747d9c
--- /dev/null
+++ b/apps/files/src/actions/convertUtils.ts
@@ -0,0 +1,139 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { AxiosResponse, AxiosError } from '@nextcloud/axios'
+import type { OCSResponse } from '@nextcloud/typings/ocs'
+
+import { emit } from '@nextcloud/event-bus'
+import { generateOcsUrl } from '@nextcloud/router'
+import { showError, showLoading, showSuccess } from '@nextcloud/dialogs'
+import { n, t } from '@nextcloud/l10n'
+import axios, { isAxiosError } from '@nextcloud/axios'
+import PQueue from 'p-queue'
+
+import { fetchNode } from '../services/WebdavClient.ts'
+import logger from '../logger'
+
+type ConversionResponse = {
+ path: string
+ fileId: number
+}
+
+interface PromiseRejectedResult<T> {
+ status: 'rejected'
+ reason: T
+}
+
+type PromiseSettledResult<T, E> = PromiseFulfilledResult<T> | PromiseRejectedResult<E>;
+type ConversionSuccess = AxiosResponse<OCSResponse<ConversionResponse>>
+type ConversionError = AxiosError<OCSResponse<ConversionResponse>>
+
+const queue = new PQueue({ concurrency: 5 })
+const requestConversion = function(fileId: number, targetMimeType: string): Promise<AxiosResponse> {
+ return axios.post(generateOcsUrl('/apps/files/api/v1/convert'), {
+ fileId,
+ targetMimeType,
+ })
+}
+
+export const convertFiles = async function(fileIds: number[], targetMimeType: string) {
+ const conversions = fileIds.map(fileId => queue.add(() => requestConversion(fileId, targetMimeType)))
+
+ // Start conversion
+ const toast = showLoading(t('files', 'Converting files …'))
+
+ // Handle results
+ try {
+ const results = await Promise.allSettled(conversions) as PromiseSettledResult<ConversionSuccess, ConversionError>[]
+ const failed = results.filter(result => result.status === 'rejected') as PromiseRejectedResult<ConversionError>[]
+ if (failed.length > 0) {
+ const messages = failed.map(result => result.reason?.response?.data?.ocs?.meta?.message)
+ logger.error('Failed to convert files', { fileIds, targetMimeType, messages })
+
+ // If all failed files have the same error message, show it
+ if (new Set(messages).size === 1 && typeof messages[0] === 'string') {
+ showError(t('files', 'Failed to convert files: {message}', { message: messages[0] }))
+ return
+ }
+
+ if (failed.length === fileIds.length) {
+ showError(t('files', 'All files failed to be converted'))
+ return
+ }
+
+ // A single file failed and if we have a message for the failed file, show it
+ if (failed.length === 1 && messages[0]) {
+ showError(t('files', 'One file could not be converted: {message}', { message: messages[0] }))
+ return
+ }
+
+ // We already check above when all files failed
+ // if we're here, we have a mix of failed and successful files
+ showError(n('files', 'One file could not be converted', '%n files could not be converted', failed.length))
+ showSuccess(n('files', 'One file successfully converted', '%n files successfully converted', fileIds.length - failed.length))
+ return
+ }
+
+ // All files converted
+ showSuccess(t('files', 'Files successfully converted'))
+
+ // Extract files that are within the current directory
+ // in batch mode, you might have files from different directories
+ // ⚠️, let's get the actual current dir, as the one from the action
+ // might have changed as the user navigated away
+ const currentDir = window.OCP.Files.Router.query.dir as string
+ const newPaths = results
+ .filter(result => result.status === 'fulfilled')
+ .map(result => result.value.data.ocs.data.path)
+ .filter(path => path.startsWith(currentDir))
+
+ // Fetch the new files
+ logger.debug('Files to fetch', { newPaths })
+ const newFiles = await Promise.all(newPaths.map(path => fetchNode(path)))
+
+ // Inform the file list about the new files
+ newFiles.forEach(file => emit('files:node:created', file))
+
+ // Switch to the new files
+ const firstSuccess = results[0] as PromiseFulfilledResult<ConversionSuccess>
+ const newFileId = firstSuccess.value.data.ocs.data.fileId
+ window.OCP.Files.Router.goToRoute(null, { ...window.OCP.Files.Router.params, fileid: newFileId.toString() }, window.OCP.Files.Router.query)
+ } catch (error) {
+ // Should not happen as we use allSettled and handle errors above
+ showError(t('files', 'Failed to convert files'))
+ logger.error('Failed to convert files', { fileIds, targetMimeType, error })
+ } finally {
+ // Hide loading toast
+ toast.hideToast()
+ }
+}
+
+export const convertFile = async function(fileId: number, targetMimeType: string) {
+ const toast = showLoading(t('files', 'Converting file …'))
+
+ try {
+ const result = await queue.add(() => requestConversion(fileId, targetMimeType)) as AxiosResponse<OCSResponse<ConversionResponse>>
+ showSuccess(t('files', 'File successfully converted'))
+
+ // Inform the file list about the new file
+ const newFile = await fetchNode(result.data.ocs.data.path)
+ emit('files:node:created', newFile)
+
+ // Switch to the new file
+ const newFileId = result.data.ocs.data.fileId
+ window.OCP.Files.Router.goToRoute(null, { ...window.OCP.Files.Router.params, fileid: newFileId.toString() }, window.OCP.Files.Router.query)
+ } catch (error) {
+ // If the server returned an error message, show it
+ if (isAxiosError(error) && error.response?.data?.ocs?.meta?.message) {
+ showError(t('files', 'Failed to convert file: {message}', { message: error.response.data.ocs.meta.message }))
+ return
+ }
+
+ logger.error('Failed to convert file', { fileId, targetMimeType, error })
+ showError(t('files', 'Failed to convert file'))
+ } finally {
+ // Hide loading toast
+ toast.hideToast()
+ }
+}
diff --git a/apps/files/src/actions/deleteAction.spec.ts b/apps/files/src/actions/deleteAction.spec.ts
new file mode 100644
index 00000000000..845d29962a7
--- /dev/null
+++ b/apps/files/src/actions/deleteAction.spec.ts
@@ -0,0 +1,449 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Folder, Permission, View, FileAction } from '@nextcloud/files'
+import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
+
+import axios from '@nextcloud/axios'
+import * as capabilities from '@nextcloud/capabilities'
+import * as eventBus from '@nextcloud/event-bus'
+
+import { action } from './deleteAction'
+import logger from '../logger'
+import { shouldAskForConfirmation } from './deleteUtils'
+
+vi.mock('@nextcloud/auth')
+vi.mock('@nextcloud/axios')
+vi.mock('@nextcloud/capabilities')
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+const trashbinView = {
+ id: 'trashbin',
+ name: 'Trashbin',
+} as View
+
+describe('Delete action conditions tests', () => {
+ beforeEach(() => {
+ vi.restoreAllMocks()
+ })
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ 'is-mount-root': true,
+ 'mount-type': 'shared',
+ },
+ })
+
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ const folder2 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ 'is-mount-root': true,
+ 'mount-type': 'shared',
+ },
+ })
+
+ const folder3 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ 'is-mount-root': true,
+ 'mount-type': 'external',
+ },
+ })
+
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('delete')
+ expect(action.displayName([file], view)).toBe('Delete file')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(100)
+ })
+
+ test('Default folder displayName', () => {
+ expect(action.displayName([folder], view)).toBe('Delete folder')
+ })
+
+ test('Default trashbin view displayName', () => {
+ expect(action.displayName([file], trashbinView)).toBe('Delete permanently')
+ })
+
+ test('Trashbin disabled displayName', () => {
+ vi.spyOn(capabilities, 'getCapabilities').mockImplementation(() => {
+ return {
+ files: {},
+ }
+ })
+ expect(action.displayName([file], view)).toBe('Delete permanently')
+ expect(capabilities.getCapabilities).toBeCalledTimes(1)
+ })
+
+ test('Shared root node displayName', () => {
+ expect(action.displayName([file2], view)).toBe('Leave this share')
+ expect(action.displayName([folder2], view)).toBe('Leave this share')
+ expect(action.displayName([file2, folder2], view)).toBe('Leave these shares')
+ })
+
+ test('External storage root node displayName', () => {
+ expect(action.displayName([folder3], view)).toBe('Disconnect storage')
+ expect(action.displayName([folder3, folder3], view)).toBe('Disconnect storages')
+ })
+
+ test('Shared and owned nodes displayName', () => {
+ expect(action.displayName([file, file2], view)).toBe('Delete and unshare')
+ })
+})
+
+describe('Delete action enabled tests', () => {
+ let initialState: HTMLInputElement
+
+ afterEach(() => {
+ document.body.removeChild(initialState)
+ })
+
+ beforeEach(() => {
+ initialState = document.createElement('input')
+ initialState.setAttribute('type', 'hidden')
+ initialState.setAttribute('id', 'initial-state-files_trashbin-config')
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: true,
+ })))
+ document.body.appendChild(initialState)
+ })
+
+ test('Enabled with DELETE permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled without DELETE permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled without nodes', () => {
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], view)).toBe(false)
+ })
+
+ test('Disabled if not all nodes can be deleted', () => {
+ const folder1 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/Foo/',
+ owner: 'test',
+ permissions: Permission.DELETE,
+ })
+ const folder2 = new Folder({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/Bar/',
+ owner: 'test',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder1], view)).toBe(true)
+ expect(action.enabled!([folder2], view)).toBe(false)
+ expect(action.enabled!([folder1, folder2], view)).toBe(false)
+ })
+
+ test('Disabled if not allowed', () => {
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: false,
+ })))
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], view)).toBe(false)
+ })
+})
+
+describe('Delete action execute tests', () => {
+ afterEach(() => {
+ vi.restoreAllMocks()
+ })
+ test('Delete action', async () => {
+ vi.spyOn(axios, 'delete')
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(true)
+ expect(axios.delete).toBeCalledTimes(1)
+ expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/test/foobar.txt')
+
+ expect(eventBus.emit).toBeCalledTimes(1)
+ expect(eventBus.emit).toBeCalledWith('files:node:deleted', file)
+ })
+
+ test('Delete action batch', async () => {
+ vi.spyOn(axios, 'delete')
+ vi.spyOn(eventBus, 'emit')
+
+ const confirmMock = vi.fn()
+ window.OC = { dialogs: { confirmDestructive: confirmMock } }
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file2 = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.execBatch!([file1, file2], view, '/')
+
+ // Not enough nodes to trigger a confirmation dialog
+ expect(confirmMock).toBeCalledTimes(0)
+
+ expect(exec).toStrictEqual([true, true])
+ expect(axios.delete).toBeCalledTimes(2)
+ expect(axios.delete).toHaveBeenNthCalledWith(1, 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(2, 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt')
+
+ expect(eventBus.emit).toBeCalledTimes(2)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:node:deleted', file1)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:deleted', file2)
+ })
+
+ test('Delete action batch large set', async () => {
+ vi.spyOn(axios, 'delete')
+ vi.spyOn(eventBus, 'emit')
+
+ // Emulate the confirmation dialog to always confirm
+ const confirmMock = vi.fn().mockImplementation((a, b, c, resolve) => resolve(true))
+ window.OC = { dialogs: { confirmDestructive: confirmMock } }
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file2 = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file3 = new File({
+ id: 3,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/baz.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file4 = new File({
+ id: 4,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/qux.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file5 = new File({
+ id: 5,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/quux.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.execBatch!([file1, file2, file3, file4, file5], view, '/')
+
+ // Enough nodes to trigger a confirmation dialog
+ expect(confirmMock).toBeCalledTimes(1)
+
+ expect(exec).toStrictEqual([true, true, true, true, true])
+ expect(axios.delete).toBeCalledTimes(5)
+ expect(axios.delete).toHaveBeenNthCalledWith(1, 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(2, 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(3, 'https://cloud.domain.com/remote.php/dav/files/test/baz.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(4, 'https://cloud.domain.com/remote.php/dav/files/test/qux.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(5, 'https://cloud.domain.com/remote.php/dav/files/test/quux.txt')
+
+ expect(eventBus.emit).toBeCalledTimes(5)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:node:deleted', file1)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:deleted', file2)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(3, 'files:node:deleted', file3)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(4, 'files:node:deleted', file4)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(5, 'files:node:deleted', file5)
+ })
+
+ test('Delete action batch dialog enabled', async () => {
+ // Enable the confirmation dialog
+ eventBus.emit('files:config:updated', { key: 'show_dialog_deletion', value: true })
+ expect(shouldAskForConfirmation()).toBe(true)
+
+ vi.spyOn(axios, 'delete')
+ vi.spyOn(eventBus, 'emit')
+ vi.spyOn(capabilities, 'getCapabilities').mockImplementation(() => {
+ return {
+ files: {},
+ }
+ })
+
+ // Emulate the confirmation dialog to always confirm
+ const confirmMock = vi.fn().mockImplementation((a, b, c, resolve) => resolve(true))
+ window.OC = { dialogs: { confirmDestructive: confirmMock } }
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const file2 = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.execBatch!([file1, file2], view, '/')
+
+ // Will trigger a confirmation dialog because trashbin app is disabled
+ expect(confirmMock).toBeCalledTimes(1)
+
+ expect(exec).toStrictEqual([true, true])
+ expect(axios.delete).toBeCalledTimes(2)
+ expect(axios.delete).toHaveBeenNthCalledWith(1, 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt')
+ expect(axios.delete).toHaveBeenNthCalledWith(2, 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt')
+
+ expect(eventBus.emit).toBeCalledTimes(2)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:node:deleted', file1)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:deleted', file2)
+
+ eventBus.emit('files:config:updated', { key: 'show_dialog_deletion', value: false })
+ })
+
+ test('Delete fails', async () => {
+ vi.spyOn(axios, 'delete').mockImplementation(() => { throw new Error('Mock error') })
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(false)
+ expect(axios.delete).toBeCalledTimes(1)
+ expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/test/foobar.txt')
+
+ expect(eventBus.emit).toBeCalledTimes(0)
+ expect(logger.error).toBeCalledTimes(1)
+ })
+
+ test('Delete is cancelled with dialog enabled', async () => {
+ // Enable the confirmation dialog
+ eventBus.emit('files:config:updated', { key: 'show_dialog_deletion', value: true })
+
+ vi.spyOn(axios, 'delete')
+ vi.spyOn(eventBus, 'emit')
+ vi.spyOn(capabilities, 'getCapabilities').mockImplementation(() => {
+ return {
+ files: {},
+ }
+ })
+
+ // Emulate the confirmation dialog to always confirm
+ const confirmMock = vi.fn().mockImplementation((a, b, c, resolve) => resolve(false))
+ window.OC = { dialogs: { confirmDestructive: confirmMock } }
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt',
+ owner: 'test',
+ mime: 'text/plain',
+ permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
+ })
+
+ const exec = await action.execBatch!([file1], view, '/')
+
+ expect(confirmMock).toBeCalledTimes(1)
+
+ expect(exec).toStrictEqual([null])
+ expect(axios.delete).toBeCalledTimes(0)
+
+ expect(eventBus.emit).toBeCalledTimes(0)
+
+ eventBus.emit('files:config:updated', { key: 'show_dialog_deletion', value: false })
+ })
+})
diff --git a/apps/files/src/actions/deleteAction.ts b/apps/files/src/actions/deleteAction.ts
new file mode 100644
index 00000000000..fa4fdfe8cdc
--- /dev/null
+++ b/apps/files/src/actions/deleteAction.ts
@@ -0,0 +1,113 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { Permission, Node, View, FileAction } from '@nextcloud/files'
+import { loadState } from '@nextcloud/initial-state'
+import PQueue from 'p-queue'
+
+import CloseSvg from '@mdi/svg/svg/close.svg?raw'
+import NetworkOffSvg from '@mdi/svg/svg/network-off.svg?raw'
+import TrashCanSvg from '@mdi/svg/svg/trash-can-outline.svg?raw'
+
+import { TRASHBIN_VIEW_ID } from '../../../files_trashbin/src/files_views/trashbinView.ts'
+import { askConfirmation, canDisconnectOnly, canUnshareOnly, deleteNode, displayName, shouldAskForConfirmation } from './deleteUtils.ts'
+import logger from '../logger.ts'
+
+const queue = new PQueue({ concurrency: 5 })
+
+export const ACTION_DELETE = 'delete'
+
+export const action = new FileAction({
+ id: ACTION_DELETE,
+ displayName,
+ iconSvgInline: (nodes: Node[]) => {
+ if (canUnshareOnly(nodes)) {
+ return CloseSvg
+ }
+
+ if (canDisconnectOnly(nodes)) {
+ return NetworkOffSvg
+ }
+
+ return TrashCanSvg
+ },
+
+ enabled(nodes: Node[], view: View): boolean {
+ if (view.id === TRASHBIN_VIEW_ID) {
+ const config = loadState('files_trashbin', 'config', { allow_delete: true })
+ if (config.allow_delete === false) {
+ return false
+ }
+ }
+
+ return nodes.length > 0 && nodes
+ .map(node => node.permissions)
+ .every(permission => (permission & Permission.DELETE) !== 0)
+ },
+
+ async exec(node: Node, view: View) {
+ try {
+ let confirm = true
+
+ // Trick to detect if the action was called from a keyboard event
+ // we need to make sure the method calling have its named containing 'keydown'
+ // here we use `onKeydown` method from the FileEntryActions component
+ const callStack = new Error().stack || ''
+ const isCalledFromEventListener = callStack.toLocaleLowerCase().includes('keydown')
+
+ if (shouldAskForConfirmation() || isCalledFromEventListener) {
+ confirm = await askConfirmation([node], view)
+ }
+
+ // If the user cancels the deletion, we don't want to do anything
+ if (confirm === false) {
+ return null
+ }
+
+ await deleteNode(node)
+
+ return true
+ } catch (error) {
+ logger.error('Error while deleting a file', { error, source: node.source, node })
+ return false
+ }
+ },
+
+ async execBatch(nodes: Node[], view: View): Promise<(boolean | null)[]> {
+ let confirm = true
+
+ if (shouldAskForConfirmation()) {
+ confirm = await askConfirmation(nodes, view)
+ } else if (nodes.length >= 5 && !canUnshareOnly(nodes) && !canDisconnectOnly(nodes)) {
+ confirm = await askConfirmation(nodes, view)
+ }
+
+ // If the user cancels the deletion, we don't want to do anything
+ if (confirm === false) {
+ return Promise.all(nodes.map(() => null))
+ }
+
+ // Map each node to a promise that resolves with the result of exec(node)
+ const promises = nodes.map(node => {
+ // Create a promise that resolves with the result of exec(node)
+ const promise = new Promise<boolean>(resolve => {
+ queue.add(async () => {
+ try {
+ await deleteNode(node)
+ resolve(true)
+ } catch (error) {
+ logger.error('Error while deleting a file', { error, source: node.source, node })
+ resolve(false)
+ }
+ })
+ })
+ return promise
+ })
+
+ return Promise.all(promises)
+ },
+
+ destructive: true,
+ order: 100,
+})
diff --git a/apps/files/src/actions/deleteUtils.ts b/apps/files/src/actions/deleteUtils.ts
new file mode 100644
index 00000000000..1ca7859b6c5
--- /dev/null
+++ b/apps/files/src/actions/deleteUtils.ts
@@ -0,0 +1,141 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Capabilities } from '../types'
+import type { Node, View } from '@nextcloud/files'
+
+import { emit } from '@nextcloud/event-bus'
+import { FileType } from '@nextcloud/files'
+import { getCapabilities } from '@nextcloud/capabilities'
+import { n, t } from '@nextcloud/l10n'
+import axios from '@nextcloud/axios'
+import { useUserConfigStore } from '../store/userconfig'
+import { getPinia } from '../store'
+
+export const isTrashbinEnabled = () => (getCapabilities() as Capabilities)?.files?.undelete === true
+
+export const canUnshareOnly = (nodes: Node[]) => {
+ return nodes.every(node => node.attributes['is-mount-root'] === true
+ && node.attributes['mount-type'] === 'shared')
+}
+
+export const canDisconnectOnly = (nodes: Node[]) => {
+ return nodes.every(node => node.attributes['is-mount-root'] === true
+ && node.attributes['mount-type'] === 'external')
+}
+
+export const isMixedUnshareAndDelete = (nodes: Node[]) => {
+ if (nodes.length === 1) {
+ return false
+ }
+
+ const hasSharedItems = nodes.some(node => canUnshareOnly([node]))
+ const hasDeleteItems = nodes.some(node => !canUnshareOnly([node]))
+ return hasSharedItems && hasDeleteItems
+}
+
+export const isAllFiles = (nodes: Node[]) => {
+ return !nodes.some(node => node.type !== FileType.File)
+}
+
+export const isAllFolders = (nodes: Node[]) => {
+ return !nodes.some(node => node.type !== FileType.Folder)
+}
+
+export const displayName = (nodes: Node[], view: View) => {
+ /**
+ * If those nodes are all the root node of a
+ * share, we can only unshare them.
+ */
+ if (canUnshareOnly(nodes)) {
+ if (nodes.length === 1) {
+ return t('files', 'Leave this share')
+ }
+ return t('files', 'Leave these shares')
+ }
+
+ /**
+ * If those nodes are all the root node of an
+ * external storage, we can only disconnect it.
+ */
+ if (canDisconnectOnly(nodes)) {
+ if (nodes.length === 1) {
+ return t('files', 'Disconnect storage')
+ }
+ return t('files', 'Disconnect storages')
+ }
+
+ /**
+ * If we're in the trashbin, we can only delete permanently
+ */
+ if (view.id === 'trashbin' || !isTrashbinEnabled()) {
+ return t('files', 'Delete permanently')
+ }
+
+ /**
+ * If we're in the sharing view, we can only unshare
+ */
+ if (isMixedUnshareAndDelete(nodes)) {
+ return t('files', 'Delete and unshare')
+ }
+
+ /**
+ * If we're only selecting files, use proper wording
+ */
+ if (isAllFiles(nodes)) {
+ if (nodes.length === 1) {
+ return t('files', 'Delete file')
+ }
+ return t('files', 'Delete files')
+ }
+
+ /**
+ * If we're only selecting folders, use proper wording
+ */
+ if (isAllFolders(nodes)) {
+ if (nodes.length === 1) {
+ return t('files', 'Delete folder')
+ }
+ return t('files', 'Delete folders')
+ }
+
+ return t('files', 'Delete')
+}
+
+export const shouldAskForConfirmation = () => {
+ const userConfig = useUserConfigStore(getPinia())
+ return userConfig.userConfig.show_dialog_deletion !== false
+}
+
+export const askConfirmation = async (nodes: Node[], view: View) => {
+ const message = view.id === 'trashbin' || !isTrashbinEnabled()
+ ? n('files', 'You are about to permanently delete {count} item', 'You are about to permanently delete {count} items', nodes.length, { count: nodes.length })
+ : n('files', 'You are about to delete {count} item', 'You are about to delete {count} items', nodes.length, { count: nodes.length })
+
+ return new Promise<boolean>(resolve => {
+ // TODO: Use the new dialog API
+ window.OC.dialogs.confirmDestructive(
+ message,
+ t('files', 'Confirm deletion'),
+ {
+ type: window.OC.dialogs.YES_NO_BUTTONS,
+ confirm: displayName(nodes, view),
+ confirmClasses: 'error',
+ cancel: t('files', 'Cancel'),
+ },
+ (decision: boolean) => {
+ resolve(decision)
+ },
+ )
+ })
+}
+
+export const deleteNode = async (node: Node) => {
+ await axios.delete(node.encodedSource)
+
+ // Let's delete even if it's moved to the trashbin
+ // since it has been removed from the current view
+ // and changing the view will trigger a reload anyway.
+ emit('files:node:deleted', node)
+}
diff --git a/apps/files/src/actions/downloadAction.spec.ts b/apps/files/src/actions/downloadAction.spec.ts
new file mode 100644
index 00000000000..8d5612d982b
--- /dev/null
+++ b/apps/files/src/actions/downloadAction.spec.ts
@@ -0,0 +1,191 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Folder, Permission, View, FileAction, DefaultType } from '@nextcloud/files'
+import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
+
+import { action } from './downloadAction'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+// Mock webroot variable
+beforeAll(() => {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (window as any)._oc_webroot = ''
+})
+
+describe('Download action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('download')
+ expect(action.displayName([], view)).toBe('Download')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBe(DefaultType.DEFAULT)
+ expect(action.order).toBe(30)
+ })
+})
+
+describe('Download action enabled tests', () => {
+ test('Enabled with READ permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled without READ permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled if not all nodes have READ permissions', () => {
+ const folder1 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+ const folder2 = new Folder({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Bar/',
+ owner: 'admin',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder1], view)).toBe(true)
+ expect(action.enabled!([folder2], view)).toBe(false)
+ expect(action.enabled!([folder1, folder2], view)).toBe(false)
+ })
+
+ test('Disabled without nodes', () => {
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], view)).toBe(false)
+ })
+})
+
+describe('Download action execute tests', () => {
+ const link = {
+ click: vi.fn(),
+ } as unknown as HTMLAnchorElement
+
+ beforeEach(() => {
+ vi.resetAllMocks()
+ vi.spyOn(document, 'createElement').mockImplementation(() => link)
+ })
+
+ test('Download single file', async () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(link.download).toBe('foobar.txt')
+ expect(link.href).toEqual('https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt')
+ expect(link.click).toHaveBeenCalledTimes(1)
+ })
+
+ test('Download single file with batch', async () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.execBatch!([file], view, '/')
+
+ // Silent action
+ expect(exec).toStrictEqual([null])
+ expect(link.download).toEqual('foobar.txt')
+ expect(link.href).toEqual('https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt')
+ expect(link.click).toHaveBeenCalledTimes(1)
+ })
+
+ test('Download single file with displayname set', async () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ displayname: 'baz.txt',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.execBatch!([file], view, '/')
+
+ // Silent action
+ expect(exec).toStrictEqual([null])
+ expect(link.download).toEqual('baz.txt')
+ expect(link.href).toEqual('https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt')
+ expect(link.click).toHaveBeenCalledTimes(1)
+ })
+
+ test('Download single folder', async () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(folder, view, '/')
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(link.download).toEqual('')
+ expect(link.href).toMatch('https://cloud.domain.com/remote.php/dav/files/admin/FooBar/?accept=zip')
+ expect(link.click).toHaveBeenCalledTimes(1)
+ })
+
+ test('Download multiple nodes', async () => {
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Dir/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Dir/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.execBatch!([file1, file2], view, '/Dir')
+
+ // Silent action
+ expect(exec).toStrictEqual([null, null])
+ expect(link.download).toEqual('')
+ expect(link.href).toMatch('https://cloud.domain.com/remote.php/dav/files/admin/Dir/?accept=zip&files=%5B%22foo.txt%22%2C%22bar.txt%22%5D')
+ expect(link.click).toHaveBeenCalledTimes(1)
+ })
+})
diff --git a/apps/files/src/actions/downloadAction.ts b/apps/files/src/actions/downloadAction.ts
new file mode 100644
index 00000000000..8abd87972ee
--- /dev/null
+++ b/apps/files/src/actions/downloadAction.ts
@@ -0,0 +1,114 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, View } from '@nextcloud/files'
+import { FileAction, FileType, DefaultType } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { isDownloadable } from '../utils/permissions'
+
+import ArrowDownSvg from '@mdi/svg/svg/arrow-down.svg?raw'
+
+/**
+ * Trigger downloading a file.
+ *
+ * @param url The url of the asset to download
+ * @param name Optionally the recommended name of the download (browsers might ignore it)
+ */
+function triggerDownload(url: string, name?: string) {
+ const hiddenElement = document.createElement('a')
+ hiddenElement.download = name ?? ''
+ hiddenElement.href = url
+ hiddenElement.click()
+}
+
+/**
+ * Find the longest common path prefix of both input paths
+ * @param first The first path
+ * @param second The second path
+ */
+function longestCommonPath(first: string, second: string): string {
+ const firstSegments = first.split('/').filter(Boolean)
+ const secondSegments = second.split('/').filter(Boolean)
+ let base = ''
+ for (const [index, segment] of firstSegments.entries()) {
+ if (index >= second.length) {
+ break
+ }
+ if (segment !== secondSegments[index]) {
+ break
+ }
+ const sep = base === '' ? '' : '/'
+ base = `${base}${sep}${segment}`
+ }
+ return base
+}
+
+const downloadNodes = function(nodes: Node[]) {
+ let url: URL
+
+ if (nodes.length === 1) {
+ if (nodes[0].type === FileType.File) {
+ return triggerDownload(nodes[0].encodedSource, nodes[0].displayname)
+ } else {
+ url = new URL(nodes[0].encodedSource)
+ url.searchParams.append('accept', 'zip')
+ }
+ } else {
+ url = new URL(nodes[0].encodedSource)
+ let base = url.pathname
+ for (const node of nodes.slice(1)) {
+ base = longestCommonPath(base, (new URL(node.encodedSource).pathname))
+ }
+ url.pathname = base
+
+ // The URL contains the path encoded so we need to decode as the query.append will re-encode it
+ const filenames = nodes.map((node) => decodeURIComponent(node.encodedSource.slice(url.href.length + 1)))
+ url.searchParams.append('accept', 'zip')
+ url.searchParams.append('files', JSON.stringify(filenames))
+ }
+
+ if (url.pathname.at(-1) !== '/') {
+ url.pathname = `${url.pathname}/`
+ }
+
+ return triggerDownload(url.href)
+}
+
+export const action = new FileAction({
+ id: 'download',
+ default: DefaultType.DEFAULT,
+
+ displayName: () => t('files', 'Download'),
+ iconSvgInline: () => ArrowDownSvg,
+
+ enabled(nodes: Node[], view: View) {
+ if (nodes.length === 0) {
+ return false
+ }
+
+ // We can only download dav files and folders.
+ if (nodes.some(node => !node.isDavResource)) {
+ return false
+ }
+
+ // Trashbin does not allow batch download
+ if (nodes.length > 1 && view.id === 'trashbin') {
+ return false
+ }
+
+ return nodes.every(isDownloadable)
+ },
+
+ async exec(node: Node) {
+ downloadNodes([node])
+ return null
+ },
+
+ async execBatch(nodes: Node[]) {
+ downloadNodes(nodes)
+ return new Array(nodes.length).fill(null)
+ },
+
+ order: 30,
+})
diff --git a/apps/files/src/actions/favoriteAction.spec.ts b/apps/files/src/actions/favoriteAction.spec.ts
new file mode 100644
index 00000000000..96768c4887a
--- /dev/null
+++ b/apps/files/src/actions/favoriteAction.spec.ts
@@ -0,0 +1,381 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Permission, View, FileAction } from '@nextcloud/files'
+import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
+
+import { action } from './favoriteAction'
+import axios from '@nextcloud/axios'
+import * as eventBus from '@nextcloud/event-bus'
+import * as favoriteAction from './favoriteAction'
+import logger from '../logger'
+
+vi.mock('@nextcloud/auth')
+vi.mock('@nextcloud/axios')
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+const favoriteView = {
+ id: 'favorites',
+ name: 'Favorites',
+} as View
+
+// Mock webroot variable
+beforeAll(() => {
+ window.OC = {
+ ...window.OC,
+ TAG_FAVORITE: '_$!<Favorite>!$_',
+ };
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (window as any)._oc_webroot = ''
+})
+
+describe('Favorite action conditions tests', () => {
+ test('Default values', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('favorite')
+ expect(action.displayName([file], view)).toBe('Add to favorites')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(-50)
+ })
+
+ test('Display name is Remove from favorites if already in favorites', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ expect(action.displayName([file], view)).toBe('Remove from favorites')
+ })
+
+ test('Display name for multiple state files', () => {
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 1,
+ },
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 0,
+ },
+ })
+ const file3 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ expect(action.displayName([file1, file2, file3], view)).toBe('Add to favorites')
+ expect(action.displayName([file1, file2], view)).toBe('Add to favorites')
+ expect(action.displayName([file2, file3], view)).toBe('Add to favorites')
+ expect(action.displayName([file1, file3], view)).toBe('Remove from favorites')
+ })
+})
+
+describe('Favorite action enabled tests', () => {
+ test('Enabled for dav file', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled for non-dav ressources', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://domain.com/data/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+})
+
+describe('Favorite action execute tests', () => {
+ beforeEach(() => { vi.resetAllMocks() })
+
+ test('Favorite triggers tag addition', async () => {
+ vi.spyOn(axios, 'post')
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(true)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/foobar.txt', { tags: ['_$!<Favorite>!$_'] })
+
+ // Check node change propagation
+ expect(file.attributes.favorite).toBe(1)
+ expect(eventBus.emit).toBeCalledTimes(1)
+ expect(eventBus.emit).toBeCalledWith('files:favorites:added', file)
+ })
+
+ test('Favorite triggers tag removal', async () => {
+ vi.spyOn(axios, 'post')
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(true)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/foobar.txt', { tags: [] })
+
+ // Check node change propagation
+ expect(file.attributes.favorite).toBe(0)
+ expect(eventBus.emit).toBeCalledTimes(1)
+ expect(eventBus.emit).toBeCalledWith('files:favorites:removed', file)
+ })
+
+ test('Favorite triggers node removal if favorite view and root dir', async () => {
+ vi.spyOn(axios, 'post')
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ const exec = await action.exec(file, favoriteView, '/')
+
+ expect(exec).toBe(true)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/foobar.txt', { tags: [] })
+
+ // Check node change propagation
+ expect(file.attributes.favorite).toBe(0)
+ expect(eventBus.emit).toBeCalledTimes(2)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:node:deleted', file)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:favorites:removed', file)
+ })
+
+ test('Favorite does NOT triggers node removal if favorite view but NOT root dir', async () => {
+ vi.spyOn(axios, 'post')
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar/foobar.txt',
+ root: '/files/admin',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ const exec = await action.exec(file, favoriteView, '/')
+
+ expect(exec).toBe(true)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/Foo/Bar/foobar.txt', { tags: [] })
+
+ // Check node change propagation
+ expect(file.attributes.favorite).toBe(0)
+ expect(eventBus.emit).toBeCalledTimes(1)
+ expect(eventBus.emit).toBeCalledWith('files:favorites:removed', file)
+ })
+
+ test('Favorite fails and show error', async () => {
+ const error = new Error('Mock error')
+ vi.spyOn(axios, 'post').mockImplementation(() => { throw new Error('Mock error') })
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 0,
+ },
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(false)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/foobar.txt', { tags: ['_$!<Favorite>!$_'] })
+
+ // Check node change propagation
+ expect(logger.error).toBeCalledTimes(1)
+ expect(logger.error).toBeCalledWith('Error while adding a file to favourites', { error, source: file.source, node: file })
+ expect(file.attributes.favorite).toBe(0)
+ expect(eventBus.emit).toBeCalledTimes(0)
+ })
+
+ test('Removing from favorites fails and show error', async () => {
+ const error = new Error('Mock error')
+ vi.spyOn(axios, 'post').mockImplementation(() => { throw error })
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+
+ const file = new File({
+ id: 1,
+ source: 'http://localhost/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(exec).toBe(false)
+
+ // Check POST request
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('/index.php/apps/files/api/v1/files/foobar.txt', { tags: [] })
+
+ // Check node change propagation
+ expect(logger.error).toBeCalledTimes(1)
+ expect(logger.error).toBeCalledWith('Error while removing a file from favourites', { error, source: file.source, node: file })
+ expect(file.attributes.favorite).toBe(1)
+ expect(eventBus.emit).toBeCalledTimes(0)
+ })
+})
+
+describe('Favorite action batch execute tests', () => {
+ beforeEach(() => { vi.restoreAllMocks() })
+
+ test('Favorite action batch execute with mixed files', async () => {
+ vi.spyOn(favoriteAction, 'favoriteNode')
+ vi.spyOn(axios, 'post')
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 1,
+ },
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 0,
+ },
+ })
+
+ // Mixed states triggers favorite action
+ const exec = await action.execBatch!([file1, file2], view, '/')
+ expect(exec).toStrictEqual([true, true])
+ expect([file1, file2].every(file => file.attributes.favorite === 1)).toBe(true)
+
+ expect(axios.post).toBeCalledTimes(2)
+ expect(axios.post).toHaveBeenNthCalledWith(1, '/index.php/apps/files/api/v1/files/foo.txt', { tags: ['_$!<Favorite>!$_'] })
+ expect(axios.post).toHaveBeenNthCalledWith(2, '/index.php/apps/files/api/v1/files/bar.txt', { tags: ['_$!<Favorite>!$_'] })
+ })
+
+ test('Remove from favorite action batch execute with favorites only files', async () => {
+ vi.spyOn(favoriteAction, 'favoriteNode')
+ vi.spyOn(axios, 'post')
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 1,
+ },
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ // Mixed states triggers favorite action
+ const exec = await action.execBatch!([file1, file2], view, '/')
+ expect(exec).toStrictEqual([true, true])
+ expect([file1, file2].every(file => file.attributes.favorite === 0)).toBe(true)
+
+ expect(axios.post).toBeCalledTimes(2)
+ expect(axios.post).toHaveBeenNthCalledWith(1, '/index.php/apps/files/api/v1/files/foo.txt', { tags: [] })
+ expect(axios.post).toHaveBeenNthCalledWith(2, '/index.php/apps/files/api/v1/files/bar.txt', { tags: [] })
+ })
+})
diff --git a/apps/files/src/actions/favoriteAction.ts b/apps/files/src/actions/favoriteAction.ts
new file mode 100644
index 00000000000..b0e1e3a0817
--- /dev/null
+++ b/apps/files/src/actions/favoriteAction.ts
@@ -0,0 +1,119 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, View } from '@nextcloud/files'
+
+import { emit } from '@nextcloud/event-bus'
+import { Permission, FileAction } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { encodePath } from '@nextcloud/paths'
+import { generateUrl } from '@nextcloud/router'
+import { isPublicShare } from '@nextcloud/sharing/public'
+import axios from '@nextcloud/axios'
+import PQueue from 'p-queue'
+import Vue from 'vue'
+
+import StarOutlineSvg from '@mdi/svg/svg/star-outline.svg?raw'
+import StarSvg from '@mdi/svg/svg/star.svg?raw'
+
+import logger from '../logger.ts'
+
+export const ACTION_FAVORITE = 'favorite'
+
+const queue = new PQueue({ concurrency: 5 })
+
+// If any of the nodes is not favorited, we display the favorite action.
+const shouldFavorite = (nodes: Node[]): boolean => {
+ return nodes.some(node => node.attributes.favorite !== 1)
+}
+
+export const favoriteNode = async (node: Node, view: View, willFavorite: boolean): Promise<boolean> => {
+ try {
+ // TODO: migrate to webdav tags plugin
+ const url = generateUrl('/apps/files/api/v1/files') + encodePath(node.path)
+ await axios.post(url, {
+ tags: willFavorite
+ ? [window.OC.TAG_FAVORITE]
+ : [],
+ })
+
+ // Let's delete if we are in the favourites view
+ // AND if it is removed from the user favorites
+ // AND it's in the root of the favorites view
+ if (view.id === 'favorites' && !willFavorite && node.dirname === '/') {
+ emit('files:node:deleted', node)
+ }
+
+ // Update the node webdav attribute
+ Vue.set(node.attributes, 'favorite', willFavorite ? 1 : 0)
+
+ // Dispatch event to whoever is interested
+ if (willFavorite) {
+ emit('files:favorites:added', node)
+ } else {
+ emit('files:favorites:removed', node)
+ }
+
+ return true
+ } catch (error) {
+ const action = willFavorite ? 'adding a file to favourites' : 'removing a file from favourites'
+ logger.error('Error while ' + action, { error, source: node.source, node })
+ return false
+ }
+}
+
+export const action = new FileAction({
+ id: ACTION_FAVORITE,
+ displayName(nodes: Node[]) {
+ return shouldFavorite(nodes)
+ ? t('files', 'Add to favorites')
+ : t('files', 'Remove from favorites')
+ },
+ iconSvgInline: (nodes: Node[]) => {
+ return shouldFavorite(nodes)
+ ? StarOutlineSvg
+ : StarSvg
+ },
+
+ enabled(nodes: Node[]) {
+ // Not enabled for public shares
+ if (isPublicShare()) {
+ return false
+ }
+
+ // We can only favorite nodes if they are located in files
+ return nodes.every(node => node.root?.startsWith?.('/files'))
+ // and we have permissions
+ && nodes.every(node => node.permissions !== Permission.NONE)
+ },
+
+ async exec(node: Node, view: View) {
+ const willFavorite = shouldFavorite([node])
+ return await favoriteNode(node, view, willFavorite)
+ },
+ async execBatch(nodes: Node[], view: View) {
+ const willFavorite = shouldFavorite(nodes)
+
+ // Map each node to a promise that resolves with the result of exec(node)
+ const promises = nodes.map(node => {
+ // Create a promise that resolves with the result of exec(node)
+ const promise = new Promise<boolean>(resolve => {
+ queue.add(async () => {
+ try {
+ await favoriteNode(node, view, willFavorite)
+ resolve(true)
+ } catch (error) {
+ logger.error('Error while adding file to favorite', { error, source: node.source, node })
+ resolve(false)
+ }
+ })
+ })
+ return promise
+ })
+
+ return Promise.all(promises)
+ },
+
+ order: -50,
+})
diff --git a/apps/files/src/actions/moveOrCopyAction.ts b/apps/files/src/actions/moveOrCopyAction.ts
new file mode 100644
index 00000000000..06e32c98090
--- /dev/null
+++ b/apps/files/src/actions/moveOrCopyAction.ts
@@ -0,0 +1,373 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Folder, Node, View } from '@nextcloud/files'
+import type { IFilePickerButton } from '@nextcloud/dialogs'
+import type { FileStat, ResponseDataDetailed, WebDAVClientError } from 'webdav'
+import type { MoveCopyResult } from './moveOrCopyActionUtils'
+
+import { isAxiosError } from '@nextcloud/axios'
+import { FilePickerClosed, getFilePickerBuilder, showError, showInfo, TOAST_PERMANENT_TIMEOUT } from '@nextcloud/dialogs'
+import { emit } from '@nextcloud/event-bus'
+import { FileAction, FileType, NodeStatus, davGetClient, davRootPath, davResultToNode, davGetDefaultPropfind, getUniqueName, Permission } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { openConflictPicker, hasConflict } from '@nextcloud/upload'
+import { basename, join } from 'path'
+import Vue from 'vue'
+
+import CopyIconSvg from '@mdi/svg/svg/folder-multiple-outline.svg?raw'
+import FolderMoveSvg from '@mdi/svg/svg/folder-move-outline.svg?raw'
+
+import { MoveCopyAction, canCopy, canMove, getQueue } from './moveOrCopyActionUtils'
+import { getContents } from '../services/Files'
+import logger from '../logger'
+
+/**
+ * Return the action that is possible for the given nodes
+ * @param {Node[]} nodes The nodes to check against
+ * @return {MoveCopyAction} The action that is possible for the given nodes
+ */
+const getActionForNodes = (nodes: Node[]): MoveCopyAction => {
+ if (canMove(nodes)) {
+ if (canCopy(nodes)) {
+ return MoveCopyAction.MOVE_OR_COPY
+ }
+ return MoveCopyAction.MOVE
+ }
+
+ // Assuming we can copy as the enabled checks for copy permissions
+ return MoveCopyAction.COPY
+}
+
+/**
+ * Create a loading notification toast
+ * @param mode The move or copy mode
+ * @param source Name of the node that is copied / moved
+ * @param destination Destination path
+ * @return {() => void} Function to hide the notification
+ */
+function createLoadingNotification(mode: MoveCopyAction, source: string, destination: string): () => void {
+ const text = mode === MoveCopyAction.MOVE ? t('files', 'Moving "{source}" to "{destination}" …', { source, destination }) : t('files', 'Copying "{source}" to "{destination}" …', { source, destination })
+
+ let toast: ReturnType<typeof showInfo>|undefined
+ toast = showInfo(
+ `<span class="icon icon-loading-small toast-loading-icon"></span> ${text}`,
+ {
+ isHTML: true,
+ timeout: TOAST_PERMANENT_TIMEOUT,
+ onRemove: () => { toast?.hideToast(); toast = undefined },
+ },
+ )
+ return () => toast && toast.hideToast()
+}
+
+/**
+ * Handle the copy/move of a node to a destination
+ * This can be imported and used by other scripts/components on server
+ * @param {Node} node The node to copy/move
+ * @param {Folder} destination The destination to copy/move the node to
+ * @param {MoveCopyAction} method The method to use for the copy/move
+ * @param {boolean} overwrite Whether to overwrite the destination if it exists
+ * @return {Promise<void>} A promise that resolves when the copy/move is done
+ */
+export const handleCopyMoveNodeTo = async (node: Node, destination: Folder, method: MoveCopyAction.COPY | MoveCopyAction.MOVE, overwrite = false) => {
+ if (!destination) {
+ return
+ }
+
+ if (destination.type !== FileType.Folder) {
+ throw new Error(t('files', 'Destination is not a folder'))
+ }
+
+ // Do not allow to MOVE a node to the same folder it is already located
+ if (method === MoveCopyAction.MOVE && node.dirname === destination.path) {
+ throw new Error(t('files', 'This file/folder is already in that directory'))
+ }
+
+ /**
+ * Example:
+ * - node: /foo/bar/file.txt -> path = /foo/bar/file.txt, destination: /foo
+ * Allow move of /foo does not start with /foo/bar/file.txt so allow
+ * - node: /foo , destination: /foo/bar
+ * Do not allow as it would copy foo within itself
+ * - node: /foo/bar.txt, destination: /foo
+ * Allow copy a file to the same directory
+ * - node: "/foo/bar", destination: "/foo/bar 1"
+ * Allow to move or copy but we need to check with trailing / otherwise it would report false positive
+ */
+ if (`${destination.path}/`.startsWith(`${node.path}/`)) {
+ throw new Error(t('files', 'You cannot move a file/folder onto itself or into a subfolder of itself'))
+ }
+
+ // Set loading state
+ Vue.set(node, 'status', NodeStatus.LOADING)
+ const actionFinished = createLoadingNotification(method, node.basename, destination.path)
+
+ const queue = getQueue()
+ return await queue.add(async () => {
+ const copySuffix = (index: number) => {
+ if (index === 1) {
+ return t('files', '(copy)') // TRANSLATORS: Mark a file as a copy of another file
+ }
+ return t('files', '(copy %n)', undefined, index) // TRANSLATORS: Meaning it is the n'th copy of a file
+ }
+
+ try {
+ const client = davGetClient()
+ const currentPath = join(davRootPath, node.path)
+ const destinationPath = join(davRootPath, destination.path)
+
+ if (method === MoveCopyAction.COPY) {
+ let target = node.basename
+ // If we do not allow overwriting then find an unique name
+ if (!overwrite) {
+ const otherNodes = await client.getDirectoryContents(destinationPath) as FileStat[]
+ target = getUniqueName(
+ node.basename,
+ otherNodes.map((n) => n.basename),
+ {
+ suffix: copySuffix,
+ ignoreFileExtension: node.type === FileType.Folder,
+ },
+ )
+ }
+ await client.copyFile(currentPath, join(destinationPath, target))
+ // If the node is copied into current directory the view needs to be updated
+ if (node.dirname === destination.path) {
+ const { data } = await client.stat(
+ join(destinationPath, target),
+ {
+ details: true,
+ data: davGetDefaultPropfind(),
+ },
+ ) as ResponseDataDetailed<FileStat>
+ emit('files:node:created', davResultToNode(data))
+ }
+ } else {
+ // show conflict file popup if we do not allow overwriting
+ if (!overwrite) {
+ const otherNodes = await getContents(destination.path)
+ if (hasConflict([node], otherNodes.contents)) {
+ try {
+ // Let the user choose what to do with the conflicting files
+ const { selected, renamed } = await openConflictPicker(destination.path, [node], otherNodes.contents)
+ // two empty arrays: either only old files or conflict skipped -> no action required
+ if (!selected.length && !renamed.length) {
+ return
+ }
+ } catch (error) {
+ // User cancelled
+ return
+ }
+ }
+ }
+ // getting here means either no conflict, file was renamed to keep both files
+ // in a conflict, or the selected file was chosen to be kept during the conflict
+ try {
+ await client.moveFile(currentPath, join(destinationPath, node.basename))
+ } catch (error) {
+ const parser = new DOMParser()
+ const text = await (error as WebDAVClientError).response?.text()
+ const message = parser.parseFromString(text ?? '', 'text/xml')
+ .querySelector('message')?.textContent
+ if (message) {
+ showError(message)
+ }
+ throw error
+ }
+ // Delete the node as it will be fetched again
+ // when navigating to the destination folder
+ emit('files:node:deleted', node)
+ }
+ } catch (error) {
+ if (isAxiosError(error)) {
+ if (error.response?.status === 412) {
+ throw new Error(t('files', 'A file or folder with that name already exists in this folder'))
+ } else if (error.response?.status === 423) {
+ throw new Error(t('files', 'The files are locked'))
+ } else if (error.response?.status === 404) {
+ throw new Error(t('files', 'The file does not exist anymore'))
+ } else if (error.message) {
+ throw new Error(error.message)
+ }
+ }
+ logger.debug(error as Error)
+ throw new Error()
+ } finally {
+ Vue.set(node, 'status', '')
+ actionFinished()
+ }
+ })
+}
+
+/**
+ * Open a file picker for the given action
+ * @param action The action to open the file picker for
+ * @param dir The directory to start the file picker in
+ * @param nodes The nodes to move/copy
+ * @return The picked destination or false if cancelled by user
+ */
+async function openFilePickerForAction(
+ action: MoveCopyAction,
+ dir = '/',
+ nodes: Node[],
+): Promise<MoveCopyResult | false> {
+ const { resolve, reject, promise } = Promise.withResolvers<MoveCopyResult | false>()
+ const fileIDs = nodes.map(node => node.fileid).filter(Boolean)
+ const filePicker = getFilePickerBuilder(t('files', 'Choose destination'))
+ .allowDirectories(true)
+ .setFilter((n: Node) => {
+ // We don't want to show the current nodes in the file picker
+ return !fileIDs.includes(n.fileid)
+ })
+ .setMimeTypeFilter([])
+ .setMultiSelect(false)
+ .startAt(dir)
+ .setButtonFactory((selection: Node[], path: string) => {
+ const buttons: IFilePickerButton[] = []
+ const target = basename(path)
+
+ const dirnames = nodes.map(node => node.dirname)
+ const paths = nodes.map(node => node.path)
+
+ if (action === MoveCopyAction.COPY || action === MoveCopyAction.MOVE_OR_COPY) {
+ buttons.push({
+ label: target ? t('files', 'Copy to {target}', { target }, undefined, { escape: false, sanitize: false }) : t('files', 'Copy'),
+ type: 'primary',
+ icon: CopyIconSvg,
+ disabled: selection.some((node) => (node.permissions & Permission.CREATE) === 0),
+ async callback(destination: Node[]) {
+ resolve({
+ destination: destination[0] as Folder,
+ action: MoveCopyAction.COPY,
+ } as MoveCopyResult)
+ },
+ })
+ }
+
+ // Invalid MOVE targets (but valid copy targets)
+ if (dirnames.includes(path)) {
+ // This file/folder is already in that directory
+ return buttons
+ }
+
+ if (paths.includes(path)) {
+ // You cannot move a file/folder onto itself
+ return buttons
+ }
+
+ if (selection.some((node) => (node.permissions & Permission.CREATE) === 0)) {
+ // Missing 'CREATE' permissions for selected destination
+ return buttons
+ }
+
+ if (action === MoveCopyAction.MOVE || action === MoveCopyAction.MOVE_OR_COPY) {
+ buttons.push({
+ label: target ? t('files', 'Move to {target}', { target }, undefined, { escape: false, sanitize: false }) : t('files', 'Move'),
+ type: action === MoveCopyAction.MOVE ? 'primary' : 'secondary',
+ icon: FolderMoveSvg,
+ async callback(destination: Node[]) {
+ resolve({
+ destination: destination[0] as Folder,
+ action: MoveCopyAction.MOVE,
+ } as MoveCopyResult)
+ },
+ })
+ }
+
+ return buttons
+ })
+ .build()
+
+ filePicker.pick()
+ .catch((error: Error) => {
+ logger.debug(error as Error)
+ if (error instanceof FilePickerClosed) {
+ resolve(false)
+ } else {
+ reject(new Error(t('files', 'Move or copy operation failed')))
+ }
+ })
+
+ return promise
+}
+
+export const ACTION_COPY_MOVE = 'move-copy'
+export const action = new FileAction({
+ id: ACTION_COPY_MOVE,
+ displayName(nodes: Node[]) {
+ switch (getActionForNodes(nodes)) {
+ case MoveCopyAction.MOVE:
+ return t('files', 'Move')
+ case MoveCopyAction.COPY:
+ return t('files', 'Copy')
+ case MoveCopyAction.MOVE_OR_COPY:
+ return t('files', 'Move or copy')
+ }
+ },
+ iconSvgInline: () => FolderMoveSvg,
+ enabled(nodes: Node[], view: View) {
+ // We can not copy or move in single file shares
+ if (view.id === 'public-file-share') {
+ return false
+ }
+ // We only support moving/copying files within the user folder
+ if (!nodes.every(node => node.root?.startsWith('/files/'))) {
+ return false
+ }
+ return nodes.length > 0 && (canMove(nodes) || canCopy(nodes))
+ },
+
+ async exec(node: Node, view: View, dir: string) {
+ const action = getActionForNodes([node])
+ let result
+ try {
+ result = await openFilePickerForAction(action, dir, [node])
+ } catch (e) {
+ logger.error(e as Error)
+ return false
+ }
+ if (result === false) {
+ return null
+ }
+
+ try {
+ await handleCopyMoveNodeTo(node, result.destination, result.action)
+ return true
+ } catch (error) {
+ if (error instanceof Error && !!error.message) {
+ showError(error.message)
+ // Silent action as we handle the toast
+ return null
+ }
+ return false
+ }
+ },
+
+ async execBatch(nodes: Node[], view: View, dir: string) {
+ const action = getActionForNodes(nodes)
+ const result = await openFilePickerForAction(action, dir, nodes)
+ // Handle cancellation silently
+ if (result === false) {
+ return nodes.map(() => null)
+ }
+
+ const promises = nodes.map(async node => {
+ try {
+ await handleCopyMoveNodeTo(node, result.destination, result.action)
+ return true
+ } catch (error) {
+ logger.error(`Failed to ${result.action} node`, { node, error })
+ return false
+ }
+ })
+
+ // We need to keep the selection on error!
+ // So we do not return null, and for batch action
+ // we let the front handle the error.
+ return await Promise.all(promises)
+ },
+
+ order: 15,
+})
diff --git a/apps/files/src/actions/moveOrCopyActionUtils.ts b/apps/files/src/actions/moveOrCopyActionUtils.ts
new file mode 100644
index 00000000000..0372e8f4bc7
--- /dev/null
+++ b/apps/files/src/actions/moveOrCopyActionUtils.ts
@@ -0,0 +1,71 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Folder, Node } from '@nextcloud/files'
+import type { ShareAttribute } from '../../../files_sharing/src/sharing'
+
+import { Permission } from '@nextcloud/files'
+import { isPublicShare } from '@nextcloud/sharing/public'
+import PQueue from 'p-queue'
+import { loadState } from '@nextcloud/initial-state'
+
+const sharePermissions = loadState<number>('files_sharing', 'sharePermissions', Permission.NONE)
+
+// This is the processing queue. We only want to allow 3 concurrent requests
+let queue: PQueue
+
+// Maximum number of concurrent operations
+const MAX_CONCURRENCY = 5
+
+/**
+ * Get the processing queue
+ */
+export const getQueue = () => {
+ if (!queue) {
+ queue = new PQueue({ concurrency: MAX_CONCURRENCY })
+ }
+ return queue
+}
+
+export enum MoveCopyAction {
+ MOVE = 'Move',
+ COPY = 'Copy',
+ MOVE_OR_COPY = 'move-or-copy',
+}
+
+export type MoveCopyResult = {
+ destination: Folder
+ action: MoveCopyAction.COPY | MoveCopyAction.MOVE
+}
+
+export const canMove = (nodes: Node[]) => {
+ const minPermission = nodes.reduce((min, node) => Math.min(min, node.permissions), Permission.ALL)
+ return Boolean(minPermission & Permission.DELETE)
+}
+
+export const canDownload = (nodes: Node[]) => {
+ return nodes.every(node => {
+ const shareAttributes = JSON.parse(node.attributes?.['share-attributes'] ?? '[]') as Array<ShareAttribute>
+ return !shareAttributes.some(attribute => attribute.scope === 'permissions' && attribute.value === false && attribute.key === 'download')
+
+ })
+}
+
+export const canCopy = (nodes: Node[]) => {
+ // a shared file cannot be copied if the download is disabled
+ if (!canDownload(nodes)) {
+ return false
+ }
+ // it cannot be copied if the user has only view permissions
+ if (nodes.some((node) => node.permissions === Permission.NONE)) {
+ return false
+ }
+ // on public shares all files have the same permission so copy is only possible if write permission is granted
+ if (isPublicShare()) {
+ return Boolean(sharePermissions & Permission.CREATE)
+ }
+ // otherwise permission is granted
+ return true
+}
diff --git a/apps/files/src/actions/openFolderAction.spec.ts b/apps/files/src/actions/openFolderAction.spec.ts
new file mode 100644
index 00000000000..066ad5d86d8
--- /dev/null
+++ b/apps/files/src/actions/openFolderAction.spec.ts
@@ -0,0 +1,147 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Folder, Node, Permission, View, DefaultType, FileAction } from '@nextcloud/files'
+import { describe, expect, test, vi } from 'vitest'
+
+import { action } from './openFolderAction'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+describe('Open folder action conditions tests', () => {
+ test('Default values', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('open-folder')
+ expect(action.displayName([folder], view)).toBe('Open folder FooBar')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBe(DefaultType.HIDDEN)
+ expect(action.order).toBe(-100)
+ })
+})
+
+describe('Open folder action enabled tests', () => {
+ test('Enabled for folders', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(true)
+ })
+
+ test('Disabled for non-dav ressources', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://domain.com/data/FooBar/',
+ owner: 'admin',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(false)
+ })
+
+ test('Disabled if more than one node', () => {
+ const folder1 = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+ const folder2 = new Folder({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Bar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder1, folder2], view)).toBe(false)
+ })
+
+ test('Disabled for files', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled without READ permissions', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(false)
+ })
+})
+
+describe('Open folder action execute tests', () => {
+ test('Open folder', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(folder, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/FooBar' })
+ })
+
+ test('Open folder fails without node', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const exec = await action.exec(null as unknown as Node, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+
+ test('Open folder fails without Folder', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+})
diff --git a/apps/files/src/actions/openFolderAction.ts b/apps/files/src/actions/openFolderAction.ts
new file mode 100644
index 00000000000..8719f7a93fb
--- /dev/null
+++ b/apps/files/src/actions/openFolderAction.ts
@@ -0,0 +1,50 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { Permission, Node, FileType, View, FileAction, DefaultType } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
+
+export const action = new FileAction({
+ id: 'open-folder',
+ displayName(files: Node[]) {
+ // Only works on single node
+ const displayName = files[0].displayname
+ return t('files', 'Open folder {displayName}', { displayName })
+ },
+ iconSvgInline: () => FolderSvg,
+
+ enabled(nodes: Node[]) {
+ // Only works on single node
+ if (nodes.length !== 1) {
+ return false
+ }
+
+ const node = nodes[0]
+
+ if (!node.isDavRessource) {
+ return false
+ }
+
+ return node.type === FileType.Folder
+ && (node.permissions & Permission.READ) !== 0
+ },
+
+ async exec(node: Node, view: View) {
+ if (!node || node.type !== FileType.Folder) {
+ return false
+ }
+
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { view: view.id, fileid: String(node.fileid) },
+ { dir: node.path },
+ )
+ return null
+ },
+
+ // Main action if enabled, meaning folders only
+ default: DefaultType.HIDDEN,
+ order: -100,
+})
diff --git a/apps/files/src/actions/openInFilesAction.spec.ts b/apps/files/src/actions/openInFilesAction.spec.ts
new file mode 100644
index 00000000000..3ccd15fa2d2
--- /dev/null
+++ b/apps/files/src/actions/openInFilesAction.spec.ts
@@ -0,0 +1,86 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { action } from './openInFilesAction'
+import { describe, expect, test, vi } from 'vitest'
+import { File, Folder, Permission, View, DefaultType, FileAction } from '@nextcloud/files'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+const recentView = {
+ id: 'recent',
+ name: 'Recent',
+} as View
+
+describe('Open in files action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('open-in-files')
+ expect(action.displayName([], recentView)).toBe('Open in Files')
+ expect(action.iconSvgInline([], recentView)).toBe('')
+ expect(action.default).toBe(DefaultType.HIDDEN)
+ expect(action.order).toBe(-1000)
+ expect(action.inline).toBeUndefined()
+ })
+})
+
+describe('Open in files action enabled tests', () => {
+ test('Enabled with on valid view', () => {
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], recentView)).toBe(true)
+ })
+
+ test('Disabled on wrong view', () => {
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], view)).toBe(false)
+ })
+})
+
+describe('Open in files action execute tests', () => {
+ test('Open in files', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ root: '/files/admin',
+ permissions: Permission.ALL,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/Foo', openfile: 'true' })
+ })
+
+ test('Open in files with folder', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/Bar',
+ owner: 'admin',
+ root: '/files/admin',
+ permissions: Permission.ALL,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/Foo/Bar', openfile: 'true' })
+ })
+})
diff --git a/apps/files/src/actions/openInFilesAction.ts b/apps/files/src/actions/openInFilesAction.ts
new file mode 100644
index 00000000000..9e10b1ac74e
--- /dev/null
+++ b/apps/files/src/actions/openInFilesAction.ts
@@ -0,0 +1,38 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Node } from '@nextcloud/files'
+
+import { t } from '@nextcloud/l10n'
+import { FileType, FileAction, DefaultType } from '@nextcloud/files'
+import { VIEW_ID as SEARCH_VIEW_ID } from '../views/search'
+
+export const action = new FileAction({
+ id: 'open-in-files',
+ displayName: () => t('files', 'Open in Files'),
+ iconSvgInline: () => '',
+
+ enabled(nodes, view) {
+ return view.id === 'recent' || view.id === SEARCH_VIEW_ID
+ },
+
+ async exec(node: Node) {
+ let dir = node.dirname
+ if (node.type === FileType.Folder) {
+ dir = dir + '/' + node.basename
+ }
+
+ window.OCP.Files.Router.goToRoute(
+ null, // use default route
+ { view: 'files', fileid: String(node.fileid) },
+ { dir, openfile: 'true' },
+ )
+ return null
+ },
+
+ // Before openFolderAction
+ order: -1000,
+ default: DefaultType.HIDDEN,
+})
diff --git a/apps/files/src/actions/openLocallyAction.spec.ts b/apps/files/src/actions/openLocallyAction.spec.ts
new file mode 100644
index 00000000000..860bd6233f4
--- /dev/null
+++ b/apps/files/src/actions/openLocallyAction.spec.ts
@@ -0,0 +1,170 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Permission, View, FileAction } from '@nextcloud/files'
+import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
+
+import axios from '@nextcloud/axios'
+import * as nextcloudDialogs from '@nextcloud/dialogs'
+import { action } from './openLocallyAction'
+
+vi.mock('@nextcloud/auth')
+vi.mock('@nextcloud/axios')
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+// Mock web root variable
+beforeAll(() => {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (window as any)._oc_webroot = '';
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (window as any).OCA = { Viewer: { open: vi.fn() } }
+})
+
+describe('Open locally action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('edit-locally')
+ expect(action.displayName([], view)).toBe('Open locally')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(25)
+ })
+})
+
+describe('Open locally action enabled tests', () => {
+ test('Enabled for file with UPDATE permission', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled for non-dav resources', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://domain.com/data/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled if more than one node', () => {
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file1, file2], view)).toBe(false)
+ })
+
+ test('Disabled for files', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled without UPDATE permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+})
+
+describe('Open locally action execute tests', () => {
+ let spyShowDialog
+ beforeEach(() => {
+ vi.resetAllMocks()
+ spyShowDialog = vi.spyOn(nextcloudDialogs.Dialog.prototype, 'show')
+ .mockImplementation(() => Promise.resolve())
+ })
+
+ test('Open locally opens proper URL', async () => {
+ vi.spyOn(axios, 'post').mockImplementation(async () => ({
+ data: { ocs: { data: { token: 'foobar' } } },
+ }))
+ const showError = vi.spyOn(nextcloudDialogs, 'showError')
+ const windowOpenSpy = vi.spyOn(window, 'open').mockImplementation(() => null)
+
+ const file = new File({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.UPDATE,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(spyShowDialog).toBeCalled()
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('http://nextcloud.local/ocs/v2.php/apps/files/api/v1/openlocaleditor?format=json', { path: '/foobar.txt' })
+ expect(showError).toBeCalledTimes(0)
+ expect(windowOpenSpy).toBeCalledWith('nc://open/test@nextcloud.local/foobar.txt?token=foobar', '_self')
+ })
+
+ test('Open locally fails and shows error', async () => {
+ vi.spyOn(axios, 'post').mockImplementation(async () => ({}))
+ const showError = vi.spyOn(nextcloudDialogs, 'showError')
+
+ const file = new File({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.UPDATE,
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ expect(spyShowDialog).toBeCalled()
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(axios.post).toBeCalledTimes(1)
+ expect(axios.post).toBeCalledWith('http://nextcloud.local/ocs/v2.php/apps/files/api/v1/openlocaleditor?format=json', { path: '/foobar.txt' })
+ expect(showError).toBeCalledTimes(1)
+ expect(showError).toBeCalledWith('Failed to redirect to client')
+ expect(window.location.href).toBe('http://nextcloud.local/')
+ })
+})
diff --git a/apps/files/src/actions/openLocallyAction.ts b/apps/files/src/actions/openLocallyAction.ts
new file mode 100644
index 00000000000..986b304210c
--- /dev/null
+++ b/apps/files/src/actions/openLocallyAction.ts
@@ -0,0 +1,114 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { encodePath } from '@nextcloud/paths'
+import { generateOcsUrl } from '@nextcloud/router'
+import { getCurrentUser } from '@nextcloud/auth'
+import { FileAction, Permission, type Node } from '@nextcloud/files'
+import { showError, DialogBuilder } from '@nextcloud/dialogs'
+import { translate as t } from '@nextcloud/l10n'
+import axios from '@nextcloud/axios'
+import LaptopSvg from '@mdi/svg/svg/laptop.svg?raw'
+import IconWeb from '@mdi/svg/svg/web.svg?raw'
+import { isPublicShare } from '@nextcloud/sharing/public'
+
+export const action = new FileAction({
+ id: 'edit-locally',
+ displayName: () => t('files', 'Open locally'),
+ iconSvgInline: () => LaptopSvg,
+
+ // Only works on single files
+ enabled(nodes: Node[]) {
+ // Only works on single node
+ if (nodes.length !== 1) {
+ return false
+ }
+
+ // does not work with shares
+ if (isPublicShare()) {
+ return false
+ }
+
+ return (nodes[0].permissions & Permission.UPDATE) !== 0
+ },
+
+ async exec(node: Node) {
+ await attemptOpenLocalClient(node.path)
+ return null
+ },
+
+ order: 25,
+})
+
+/**
+ * Try to open the path in the Nextcloud client.
+ *
+ * If this fails a dialog is shown with 3 options:
+ * 1. Retry: If it fails no further dialog is shown.
+ * 2. Open online: The viewer is used to open the file.
+ * 3. Close the dialog and nothing happens (abort).
+ *
+ * @param path - The path to open
+ */
+async function attemptOpenLocalClient(path: string) {
+ await openLocalClient(path)
+ const result = await confirmLocalEditDialog()
+ if (result === 'local') {
+ await openLocalClient(path)
+ } else if (result === 'online') {
+ window.OCA.Viewer.open({ path })
+ }
+}
+
+/**
+ * Try to open a file in the Nextcloud client.
+ * There is no way to get notified if this action was successfull.
+ *
+ * @param path - Path to open
+ */
+async function openLocalClient(path: string): Promise<void> {
+ const link = generateOcsUrl('apps/files/api/v1') + '/openlocaleditor?format=json'
+
+ try {
+ const result = await axios.post(link, { path })
+ const uid = getCurrentUser()?.uid
+ let url = `nc://open/${uid}@` + window.location.host + encodePath(path)
+ url += '?token=' + result.data.ocs.data.token
+
+ window.open(url, '_self')
+ } catch (error) {
+ showError(t('files', 'Failed to redirect to client'))
+ }
+}
+
+/**
+ * Open the confirmation dialog.
+ */
+async function confirmLocalEditDialog(): Promise<'online'|'local'|false> {
+ let result: 'online'|'local'|false = false
+ const dialog = (new DialogBuilder())
+ .setName(t('files', 'Open file locally'))
+ .setText(t('files', 'The file should now open on your device. If it doesn\'t, please check that you have the desktop app installed.'))
+ .setButtons([
+ {
+ label: t('files', 'Retry and close'),
+ type: 'secondary',
+ callback: () => {
+ result = 'local'
+ },
+ },
+ {
+ label: t('files', 'Open online'),
+ icon: IconWeb,
+ type: 'primary',
+ callback: () => {
+ result = 'online'
+ },
+ },
+ ])
+ .build()
+
+ await dialog.show()
+ return result
+}
diff --git a/apps/files/src/actions/renameAction.spec.ts b/apps/files/src/actions/renameAction.spec.ts
new file mode 100644
index 00000000000..1f9c9209d41
--- /dev/null
+++ b/apps/files/src/actions/renameAction.spec.ts
@@ -0,0 +1,100 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { action } from './renameAction'
+import { File, Folder, Permission, View, FileAction } from '@nextcloud/files'
+import * as eventBus from '@nextcloud/event-bus'
+import { describe, expect, test, vi, beforeEach } from 'vitest'
+import { useFilesStore } from '../store/files'
+import { getPinia } from '../store/index.ts'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+beforeEach(() => {
+ const root = new Folder({ owner: 'test', source: 'https://cloud.domain.com/remote.php/dav/files/admin/', id: 1, permissions: Permission.CREATE })
+ const files = useFilesStore(getPinia())
+ files.setRoot({ service: 'files', root })
+})
+
+describe('Rename action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('rename')
+ expect(action.displayName([], view)).toBe('Rename')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(10)
+ })
+})
+
+describe('Rename action enabled tests', () => {
+ test('Enabled for node with UPDATE permission', () => {
+ const file = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.UPDATE | Permission.DELETE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled for node without DELETE permission', () => {
+ const file = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled if more than one node', () => {
+ window.OCA = { Files: { Sidebar: {} } }
+
+ const file1 = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+ const file2 = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file1, file2], view)).toBe(false)
+ })
+})
+
+describe('Rename action exec tests', () => {
+ test('Rename', async () => {
+ vi.spyOn(eventBus, 'emit')
+
+ const file = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+
+ // Silent action
+ expect(exec).toBe(null)
+ expect(eventBus.emit).toBeCalledTimes(1)
+ expect(eventBus.emit).toHaveBeenCalledWith('files:node:rename', file)
+ })
+})
diff --git a/apps/files/src/actions/renameAction.ts b/apps/files/src/actions/renameAction.ts
new file mode 100644
index 00000000000..715ecb7563e
--- /dev/null
+++ b/apps/files/src/actions/renameAction.ts
@@ -0,0 +1,50 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { emit } from '@nextcloud/event-bus'
+import { Permission, type Node, FileAction, View } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import PencilSvg from '@mdi/svg/svg/pencil-outline.svg?raw'
+import { getPinia } from '../store'
+import { useFilesStore } from '../store/files'
+import { dirname } from 'path'
+
+export const ACTION_RENAME = 'rename'
+
+export const action = new FileAction({
+ id: ACTION_RENAME,
+ displayName: () => t('files', 'Rename'),
+ iconSvgInline: () => PencilSvg,
+
+ enabled: (nodes: Node[], view: View) => {
+ if (nodes.length === 0) {
+ return false
+ }
+
+ // Disable for single file shares
+ if (view.id === 'public-file-share') {
+ return false
+ }
+
+ const node = nodes[0]
+ const filesStore = useFilesStore(getPinia())
+ const parentNode = node.dirname === '/'
+ ? filesStore.getRoot(view.id)
+ : filesStore.getNode(dirname(node.source))
+ const parentPermissions = parentNode?.permissions || Permission.NONE
+
+ // Only enable if the node have the delete permission
+ // and if the parent folder allows creating files
+ return Boolean(node.permissions & Permission.DELETE)
+ && Boolean(parentPermissions & Permission.CREATE)
+ },
+
+ async exec(node: Node) {
+ // Renaming is a built-in feature of the files app
+ emit('files:node:rename', node)
+ return null
+ },
+
+ order: 10,
+})
diff --git a/apps/files/src/actions/sidebarAction.spec.ts b/apps/files/src/actions/sidebarAction.spec.ts
new file mode 100644
index 00000000000..9085bf595ad
--- /dev/null
+++ b/apps/files/src/actions/sidebarAction.spec.ts
@@ -0,0 +1,185 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Permission, View, FileAction, Folder } from '@nextcloud/files'
+import { describe, expect, test, vi } from 'vitest'
+
+import { action } from './sidebarAction'
+import logger from '../logger'
+
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+describe('Open sidebar action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('details')
+ expect(action.displayName([], view)).toBe('Details')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(-50)
+ })
+})
+
+describe('Open sidebar action enabled tests', () => {
+ test('Enabled for ressources within user root folder', () => {
+ window.OCA = { Files: { Sidebar: {} } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled without permissions', () => {
+ window.OCA = { Files: { Sidebar: {} } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+
+ })
+
+ test('Disabled if more than one node', () => {
+ window.OCA = { Files: { Sidebar: {} } }
+
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file1, file2], view)).toBe(false)
+ })
+
+ test('Disabled if no Sidebar', () => {
+ window.OCA = {}
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled for non-dav ressources', () => {
+ window.OCA = { Files: { Sidebar: {} } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://domain.com/documents/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+})
+
+describe('Open sidebar action exec tests', () => {
+ test('Open sidebar', async () => {
+ const openMock = vi.fn()
+ const defaultTabMock = vi.fn()
+ window.OCA = { Files: { Sidebar: { open: openMock, setActiveTab: defaultTabMock } } }
+
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(openMock).toBeCalledWith('/foobar.txt')
+ expect(defaultTabMock).toBeCalledWith('sharing')
+ expect(goToRouteMock).toBeCalledWith(
+ null,
+ { view: view.id, fileid: '1' },
+ { dir: '/', opendetails: 'true' },
+ true,
+ )
+ })
+
+ test('Open sidebar for folder', async () => {
+ const openMock = vi.fn()
+ const defaultTabMock = vi.fn()
+ window.OCA = { Files: { Sidebar: { open: openMock, setActiveTab: defaultTabMock } } }
+
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar',
+ owner: 'admin',
+ mime: 'httpd/unix-directory',
+ })
+
+ const exec = await action.exec(file, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(openMock).toBeCalledWith('/foobar')
+ expect(defaultTabMock).toBeCalledWith('sharing')
+ expect(goToRouteMock).toBeCalledWith(
+ null,
+ { view: view.id, fileid: '1' },
+ { dir: '/', opendetails: 'true' },
+ true,
+ )
+ })
+
+ test('Open sidebar fails', async () => {
+ const openMock = vi.fn(() => { throw new Error('Mock error') })
+ const defaultTabMock = vi.fn()
+ window.OCA = { Files: { Sidebar: { open: openMock, setActiveTab: defaultTabMock } } }
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ const exec = await action.exec(file, view, '/')
+ expect(exec).toBe(false)
+ expect(openMock).toBeCalledTimes(1)
+ expect(logger.error).toBeCalledTimes(1)
+ })
+})
diff --git a/apps/files/src/actions/sidebarAction.ts b/apps/files/src/actions/sidebarAction.ts
new file mode 100644
index 00000000000..8f020b4ee8d
--- /dev/null
+++ b/apps/files/src/actions/sidebarAction.ts
@@ -0,0 +1,74 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, View } from '@nextcloud/files'
+
+import { Permission, FileAction } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { isPublicShare } from '@nextcloud/sharing/public'
+
+import InformationSvg from '@mdi/svg/svg/information-variant.svg?raw'
+
+import logger from '../logger.ts'
+
+export const ACTION_DETAILS = 'details'
+
+export const action = new FileAction({
+ id: ACTION_DETAILS,
+ displayName: () => t('files', 'Details'),
+ iconSvgInline: () => InformationSvg,
+
+ // Sidebar currently supports user folder only, /files/USER
+ enabled: (nodes: Node[]) => {
+ if (isPublicShare()) {
+ return false
+ }
+
+ // Only works on single node
+ if (nodes.length !== 1) {
+ return false
+ }
+
+ if (!nodes[0]) {
+ return false
+ }
+
+ // Only work if the sidebar is available
+ if (!window?.OCA?.Files?.Sidebar) {
+ return false
+ }
+
+ return (nodes[0].root?.startsWith('/files/') && nodes[0].permissions !== Permission.NONE) ?? false
+ },
+
+ async exec(node: Node, view: View, dir: string) {
+ try {
+ // If the sidebar is already open for the current file, do nothing
+ if (window.OCA.Files.Sidebar.file === node.path) {
+ logger.debug('Sidebar already open for this file', { node })
+ return null
+ }
+ // Open sidebar and set active tab to sharing by default
+ window.OCA.Files.Sidebar.setActiveTab('sharing')
+
+ // TODO: migrate Sidebar to use a Node instead
+ await window.OCA.Files.Sidebar.open(node.path)
+
+ // Silently update current fileid
+ window.OCP?.Files?.Router?.goToRoute(
+ null,
+ { view: view.id, fileid: String(node.fileid) },
+ { ...window.OCP.Files.Router.query, dir, opendetails: 'true' },
+ true,
+ )
+
+ return null
+ } catch (error) {
+ logger.error('Error while opening sidebar', { error })
+ return false
+ }
+ },
+
+ order: -50,
+})
diff --git a/apps/files/src/actions/viewInFolderAction.spec.ts b/apps/files/src/actions/viewInFolderAction.spec.ts
new file mode 100644
index 00000000000..bd618c8a89f
--- /dev/null
+++ b/apps/files/src/actions/viewInFolderAction.spec.ts
@@ -0,0 +1,193 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { File, Folder, Node, Permission, View, FileAction } from '@nextcloud/files'
+import { describe, expect, test, vi } from 'vitest'
+import { action } from './viewInFolderAction'
+
+const view = {
+ id: 'trashbin',
+ name: 'Trashbin',
+} as View
+
+const viewFiles = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+describe('View in folder action conditions tests', () => {
+ test('Default values', () => {
+ expect(action).toBeInstanceOf(FileAction)
+ expect(action.id).toBe('view-in-folder')
+ expect(action.displayName([], view)).toBe('View in folder')
+ expect(action.iconSvgInline([], view)).toMatch(/<svg.+<\/svg>/)
+ expect(action.default).toBeUndefined()
+ expect(action.order).toBe(80)
+ expect(action.enabled).toBeDefined()
+ })
+})
+
+describe('View in folder action enabled tests', () => {
+ test('Enabled for trashbin', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(true)
+ })
+
+ test('Disabled for files', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], viewFiles)).toBe(false)
+ })
+
+ test('Disabled without permissions', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.NONE,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled for non-dav ressources', () => {
+ const file = new File({
+ id: 1,
+ source: 'https://domain.com/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+
+ test('Disabled if more than one node', () => {
+ const file1 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+ const file2 = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file1, file2], view)).toBe(false)
+ })
+
+ test('Disabled for folders', () => {
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/FooBar/',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([folder], view)).toBe(false)
+ })
+
+ test('Disabled for files outside the user root folder', () => {
+ const file = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/trashbin/admin/trash/image.jpg.d1731053878',
+ owner: 'admin',
+ permissions: Permission.READ,
+ })
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([file], view)).toBe(false)
+ })
+})
+
+describe('View in folder action execute tests', () => {
+ test('View in folder', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(file, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/' })
+ })
+
+ test('View in (sub) folder', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const file = new File({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/Bar/foobar.txt',
+ root: '/files/admin',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.READ,
+ })
+
+ const exec = await action.exec(file, view, '/')
+ // Silent action
+ expect(exec).toBe(null)
+ expect(goToRouteMock).toBeCalledTimes(1)
+ expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/Foo/Bar' })
+ })
+
+ test('View in folder fails without node', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const exec = await action.exec(null as unknown as Node, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+
+ test('View in folder fails without File', async () => {
+ const goToRouteMock = vi.fn()
+ // @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
+ window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
+
+ const folder = new Folder({
+ id: 1,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
+ owner: 'admin',
+ })
+
+ const exec = await action.exec(folder, view, '/')
+ expect(exec).toBe(false)
+ expect(goToRouteMock).toBeCalledTimes(0)
+ })
+})
diff --git a/apps/files/src/actions/viewInFolderAction.ts b/apps/files/src/actions/viewInFolderAction.ts
new file mode 100644
index 00000000000..b22393c1152
--- /dev/null
+++ b/apps/files/src/actions/viewInFolderAction.ts
@@ -0,0 +1,68 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, View } from '@nextcloud/files'
+
+import { isPublicShare } from '@nextcloud/sharing/public'
+import { FileAction, FileType, Permission } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+
+import FolderMoveSvg from '@mdi/svg/svg/folder-move-outline.svg?raw'
+
+export const action = new FileAction({
+ id: 'view-in-folder',
+ displayName() {
+ return t('files', 'View in folder')
+ },
+ iconSvgInline: () => FolderMoveSvg,
+
+ enabled(nodes: Node[], view: View) {
+ // Not enabled for public shares
+ if (isPublicShare()) {
+ return false
+ }
+
+ // Only works outside of the main files view
+ if (view.id === 'files') {
+ return false
+ }
+
+ // Only works on single node
+ if (nodes.length !== 1) {
+ return false
+ }
+
+ const node = nodes[0]
+
+ if (!node.isDavRessource) {
+ return false
+ }
+
+ // Can only view files that are in the user root folder
+ if (!node.root?.startsWith('/files')) {
+ return false
+ }
+
+ if (node.permissions === Permission.NONE) {
+ return false
+ }
+
+ return node.type === FileType.File
+ },
+
+ async exec(node: Node) {
+ if (!node || node.type !== FileType.File) {
+ return false
+ }
+
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { view: 'files', fileid: String(node.fileid) },
+ { dir: node.dirname },
+ )
+ return null
+ },
+
+ order: 80,
+})
diff --git a/apps/files/src/components/BreadCrumbs.vue b/apps/files/src/components/BreadCrumbs.vue
new file mode 100644
index 00000000000..8458fd65f3d
--- /dev/null
+++ b/apps/files/src/components/BreadCrumbs.vue
@@ -0,0 +1,310 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <NcBreadcrumbs data-cy-files-content-breadcrumbs
+ :aria-label="t('files', 'Current directory path')"
+ class="files-list__breadcrumbs"
+ :class="{ 'files-list__breadcrumbs--with-progress': wrapUploadProgressBar }">
+ <!-- Current path sections -->
+ <NcBreadcrumb v-for="(section, index) in sections"
+ :key="section.dir"
+ v-bind="section"
+ dir="auto"
+ :to="section.to"
+ :force-icon-text="index === 0 && fileListWidth >= 486"
+ :title="titleForSection(index, section)"
+ :aria-description="ariaForSection(section)"
+ @click.native="onClick(section.to)"
+ @dragover.native="onDragOver($event, section.dir)"
+ @drop="onDrop($event, section.dir)">
+ <template v-if="index === 0" #icon>
+ <NcIconSvgWrapper :size="20"
+ :svg="viewIcon" />
+ </template>
+ </NcBreadcrumb>
+
+ <!-- Forward the actions slot -->
+ <template #actions>
+ <slot name="actions" />
+ </template>
+ </NcBreadcrumbs>
+</template>
+
+<script lang="ts">
+import type { Node } from '@nextcloud/files'
+import type { FileSource } from '../types.ts'
+
+import { basename } from 'path'
+import { defineComponent } from 'vue'
+import { Permission } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import HomeSvg from '@mdi/svg/svg/home.svg?raw'
+import NcBreadcrumb from '@nextcloud/vue/components/NcBreadcrumb'
+import NcBreadcrumbs from '@nextcloud/vue/components/NcBreadcrumbs'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+
+import { useNavigation } from '../composables/useNavigation.ts'
+import { onDropInternalFiles, dataTransferToFileTree, onDropExternalFiles } from '../services/DropService.ts'
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import { showError } from '@nextcloud/dialogs'
+import { useDragAndDropStore } from '../store/dragging.ts'
+import { useFilesStore } from '../store/files.ts'
+import { usePathsStore } from '../store/paths.ts'
+import { useSelectionStore } from '../store/selection.ts'
+import { useUploaderStore } from '../store/uploader.ts'
+import logger from '../logger'
+
+export default defineComponent({
+ name: 'BreadCrumbs',
+
+ components: {
+ NcBreadcrumbs,
+ NcBreadcrumb,
+ NcIconSvgWrapper,
+ },
+
+ props: {
+ path: {
+ type: String,
+ default: '/',
+ },
+ },
+
+ setup() {
+ const draggingStore = useDragAndDropStore()
+ const filesStore = useFilesStore()
+ const pathsStore = usePathsStore()
+ const selectionStore = useSelectionStore()
+ const uploaderStore = useUploaderStore()
+ const fileListWidth = useFileListWidth()
+ const { currentView, views } = useNavigation()
+
+ return {
+ draggingStore,
+ filesStore,
+ pathsStore,
+ selectionStore,
+ uploaderStore,
+
+ currentView,
+ fileListWidth,
+ views,
+ }
+ },
+
+ computed: {
+ dirs(): string[] {
+ const cumulativePath = (acc: string) => (value: string) => (acc += `${value}/`)
+ // Generate a cumulative path for each path segment: ['/', '/foo', '/foo/bar', ...] etc
+ const paths: string[] = this.path.split('/').filter(Boolean).map(cumulativePath('/'))
+ // Strip away trailing slash
+ return ['/', ...paths.map((path: string) => path.replace(/^(.+)\/$/, '$1'))]
+ },
+
+ sections() {
+ return this.dirs.map((dir: string, index: number) => {
+ const source = this.getFileSourceFromPath(dir)
+ const node: Node | undefined = source ? this.getNodeFromSource(source) : undefined
+ return {
+ dir,
+ exact: true,
+ name: this.getDirDisplayName(dir),
+ to: this.getTo(dir, node),
+ // disable drop on current directory
+ disableDrop: index === this.dirs.length - 1,
+ }
+ })
+ },
+
+ isUploadInProgress(): boolean {
+ return this.uploaderStore.queue.length !== 0
+ },
+
+ // Hide breadcrumbs if an upload is ongoing
+ wrapUploadProgressBar(): boolean {
+ // if an upload is ongoing, and on small screens / mobile, then
+ // show the progress bar for the upload below breadcrumbs
+ return this.isUploadInProgress && this.fileListWidth < 512
+ },
+
+ // used to show the views icon for the first breadcrumb
+ viewIcon(): string {
+ return this.currentView?.icon ?? HomeSvg
+ },
+
+ selectedFiles() {
+ return this.selectionStore.selected as FileSource[]
+ },
+
+ draggingFiles() {
+ return this.draggingStore.dragging as FileSource[]
+ },
+ },
+
+ methods: {
+ getNodeFromSource(source: FileSource): Node | undefined {
+ return this.filesStore.getNode(source)
+ },
+ getFileSourceFromPath(path: string): FileSource | null {
+ return (this.currentView && this.pathsStore.getPath(this.currentView.id, path)) ?? null
+ },
+ getDirDisplayName(path: string): string {
+ if (path === '/') {
+ return this.currentView?.name || t('files', 'Home')
+ }
+
+ const source = this.getFileSourceFromPath(path)
+ const node = source ? this.getNodeFromSource(source) : undefined
+ return node?.displayname || basename(path)
+ },
+
+ getTo(dir: string, node?: Node): Record<string, unknown> {
+ if (dir === '/') {
+ return {
+ ...this.$route,
+ params: { view: this.currentView?.id },
+ query: {},
+ }
+ }
+ if (node === undefined) {
+ const view = this.views.find(view => view.params?.dir === dir)
+ return {
+ ...this.$route,
+ params: { fileid: view?.params?.fileid ?? '' },
+ query: { dir },
+ }
+ }
+ return {
+ ...this.$route,
+ params: { fileid: String(node.fileid) },
+ query: { dir: node.path },
+ }
+ },
+
+ onClick(to) {
+ if (to?.query?.dir === this.$route.query.dir) {
+ this.$emit('reload')
+ }
+ },
+
+ onDragOver(event: DragEvent, path: string) {
+ if (!event.dataTransfer) {
+ return
+ }
+
+ // Cannot drop on the current directory
+ if (path === this.dirs[this.dirs.length - 1]) {
+ event.dataTransfer.dropEffect = 'none'
+ return
+ }
+
+ // Handle copy/move drag and drop
+ if (event.ctrlKey) {
+ event.dataTransfer.dropEffect = 'copy'
+ } else {
+ event.dataTransfer.dropEffect = 'move'
+ }
+ },
+
+ async onDrop(event: DragEvent, path: string) {
+ // skip if native drop like text drag and drop from files names
+ if (!this.draggingFiles && !event.dataTransfer?.items?.length) {
+ return
+ }
+
+ // Do not stop propagation, so the main content
+ // drop event can be triggered too and clear the
+ // dragover state on the DragAndDropNotice component.
+ event.preventDefault()
+
+ // Caching the selection
+ const selection = this.draggingFiles
+ const items = [...event.dataTransfer?.items || []] as DataTransferItem[]
+
+ // We need to process the dataTransfer ASAP before the
+ // browser clears it. This is why we cache the items too.
+ const fileTree = await dataTransferToFileTree(items)
+
+ // We might not have the target directory fetched yet
+ const contents = await this.currentView?.getContents(path)
+ const folder = contents?.folder
+ if (!folder) {
+ showError(this.t('files', 'Target folder does not exist any more'))
+ return
+ }
+
+ const canDrop = (folder.permissions & Permission.CREATE) !== 0
+ const isCopy = event.ctrlKey
+
+ // If another button is pressed, cancel it. This
+ // allows cancelling the drag with the right click.
+ if (!canDrop || event.button !== 0) {
+ return
+ }
+
+ logger.debug('Dropped', { event, folder, selection, fileTree })
+
+ // Check whether we're uploading files
+ if (fileTree.contents.length > 0) {
+ await onDropExternalFiles(fileTree, folder, contents.contents)
+ return
+ }
+
+ // Else we're moving/copying files
+ const nodes = selection.map(source => this.filesStore.getNode(source)) as Node[]
+ await onDropInternalFiles(nodes, folder, contents.contents, isCopy)
+
+ // Reset selection after we dropped the files
+ // if the dropped files are within the selection
+ if (selection.some(source => this.selectedFiles.includes(source))) {
+ logger.debug('Dropped selection, resetting select store...')
+ this.selectionStore.reset()
+ }
+ },
+
+ titleForSection(index, section) {
+ if (section?.to?.query?.dir === this.$route.query.dir) {
+ return t('files', 'Reload current directory')
+ } else if (index === 0) {
+ return t('files', 'Go to the "{dir}" directory', section)
+ }
+ return null
+ },
+
+ ariaForSection(section) {
+ if (section?.to?.query?.dir === this.$route.query.dir) {
+ return t('files', 'Reload current directory')
+ }
+ return null
+ },
+
+ t,
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.files-list__breadcrumbs {
+ // Take as much space as possible
+ flex: 1 1 100% !important;
+ width: 100%;
+ height: 100%;
+ margin-block: 0;
+ margin-inline: 10px;
+ min-width: 0;
+
+ :deep() {
+ a {
+ cursor: pointer !important;
+ }
+ }
+
+ &--with-progress {
+ flex-direction: column !important;
+ align-items: flex-start !important;
+ }
+}
+</style>
diff --git a/apps/files/src/components/CustomElementRender.vue b/apps/files/src/components/CustomElementRender.vue
new file mode 100644
index 00000000000..b08d3ba5ee5
--- /dev/null
+++ b/apps/files/src/components/CustomElementRender.vue
@@ -0,0 +1,54 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <span />
+</template>
+
+<script lang="ts">
+/**
+ * This component is used to render custom
+ * elements provided by an API. Vue doesn't allow
+ * to directly render an HTMLElement, so we can do
+ * this magic here.
+ */
+export default {
+ name: 'CustomElementRender',
+ props: {
+ source: {
+ type: Object,
+ required: true,
+ },
+ currentView: {
+ type: Object,
+ required: true,
+ },
+ render: {
+ type: Function,
+ required: true,
+ },
+ },
+ watch: {
+ source() {
+ this.updateRootElement()
+ },
+ currentView() {
+ this.updateRootElement()
+ },
+ },
+ mounted() {
+ this.updateRootElement()
+ },
+ methods: {
+ async updateRootElement() {
+ const element = await this.render(this.source, this.currentView)
+ if (element) {
+ this.$el.replaceChildren(element)
+ } else {
+ this.$el.replaceChildren()
+ }
+ },
+ },
+}
+</script>
diff --git a/apps/files/src/components/DragAndDropNotice.vue b/apps/files/src/components/DragAndDropNotice.vue
new file mode 100644
index 00000000000..c7684d5c205
--- /dev/null
+++ b/apps/files/src/components/DragAndDropNotice.vue
@@ -0,0 +1,262 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <div v-show="dragover"
+ data-cy-files-drag-drop-area
+ class="files-list__drag-drop-notice"
+ @drop="onDrop">
+ <div class="files-list__drag-drop-notice-wrapper">
+ <template v-if="canUpload && !isQuotaExceeded">
+ <TrayArrowDownIcon :size="48" />
+ <h3 class="files-list-drag-drop-notice__title">
+ {{ t('files', 'Drag and drop files here to upload') }}
+ </h3>
+ </template>
+
+ <!-- Not permitted to drop files here -->
+ <template v-else>
+ <h3 class="files-list-drag-drop-notice__title">
+ {{ cantUploadLabel }}
+ </h3>
+ </template>
+ </div>
+ </div>
+</template>
+
+<script lang="ts">
+import type { Folder } from '@nextcloud/files'
+
+import { Permission } from '@nextcloud/files'
+import { showError } from '@nextcloud/dialogs'
+import { translate as t } from '@nextcloud/l10n'
+import { UploadStatus } from '@nextcloud/upload'
+import { defineComponent, type PropType } from 'vue'
+import debounce from 'debounce'
+
+import TrayArrowDownIcon from 'vue-material-design-icons/TrayArrowDown.vue'
+
+import { useNavigation } from '../composables/useNavigation'
+import { dataTransferToFileTree, onDropExternalFiles } from '../services/DropService'
+import logger from '../logger.ts'
+import type { RawLocation } from 'vue-router'
+
+export default defineComponent({
+ name: 'DragAndDropNotice',
+
+ components: {
+ TrayArrowDownIcon,
+ },
+
+ props: {
+ currentFolder: {
+ type: Object as PropType<Folder>,
+ required: true,
+ },
+ },
+
+ setup() {
+ const { currentView } = useNavigation()
+
+ return {
+ currentView,
+ }
+ },
+
+ data() {
+ return {
+ dragover: false,
+ }
+ },
+
+ computed: {
+ /**
+ * Check if the current folder has create permissions
+ */
+ canUpload() {
+ return this.currentFolder && (this.currentFolder.permissions & Permission.CREATE) !== 0
+ },
+ isQuotaExceeded() {
+ return this.currentFolder?.attributes?.['quota-available-bytes'] === 0
+ },
+
+ cantUploadLabel() {
+ if (this.isQuotaExceeded) {
+ return this.t('files', 'Your have used your space quota and cannot upload files anymore')
+ } else if (!this.canUpload) {
+ return this.t('files', 'You do not have permission to upload or create files here.')
+ }
+ return null
+ },
+
+ /**
+ * Debounced function to reset the drag over state
+ * Required as Firefox has a bug where no dragleave is emitted:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=656164
+ */
+ resetDragOver() {
+ return debounce(() => {
+ this.dragover = false
+ }, 3000)
+ },
+ },
+
+ mounted() {
+ // Add events on parent to cover both the table and DragAndDrop notice
+ const mainContent = window.document.getElementById('app-content-vue') as HTMLElement
+ mainContent.addEventListener('dragover', this.onDragOver)
+ mainContent.addEventListener('dragleave', this.onDragLeave)
+ mainContent.addEventListener('drop', this.onContentDrop)
+ },
+
+ beforeDestroy() {
+ const mainContent = window.document.getElementById('app-content-vue') as HTMLElement
+ mainContent.removeEventListener('dragover', this.onDragOver)
+ mainContent.removeEventListener('dragleave', this.onDragLeave)
+ mainContent.removeEventListener('drop', this.onContentDrop)
+ },
+
+ methods: {
+ onDragOver(event: DragEvent) {
+ // Needed to keep the drag/drop events chain working
+ event.preventDefault()
+
+ const isForeignFile = event.dataTransfer?.types.includes('Files')
+ if (isForeignFile) {
+ // Only handle uploading of outside files (not Nextcloud files)
+ this.dragover = true
+ this.resetDragOver()
+ }
+ },
+
+ onDragLeave(event: DragEvent) {
+ // Counter bubbling, make sure we're ending the drag
+ // only when we're leaving the current element
+ // Avoid flickering
+ const currentTarget = event.currentTarget as HTMLElement
+ if (currentTarget?.contains((event.relatedTarget ?? event.target) as HTMLElement)) {
+ return
+ }
+
+ if (this.dragover) {
+ this.dragover = false
+ this.resetDragOver.clear()
+ }
+ },
+
+ onContentDrop(event: DragEvent) {
+ logger.debug('Drag and drop cancelled, dropped on empty space', { event })
+ event.preventDefault()
+ if (this.dragover) {
+ this.dragover = false
+ this.resetDragOver.clear()
+ }
+ },
+
+ async onDrop(event: DragEvent) {
+ // cantUploadLabel is null if we can upload
+ if (this.cantUploadLabel) {
+ showError(this.cantUploadLabel)
+ return
+ }
+
+ if (this.$el.querySelector('tbody')?.contains(event.target as Node)) {
+ return
+ }
+
+ event.preventDefault()
+ event.stopPropagation()
+
+ // Caching the selection
+ const items: DataTransferItem[] = [...event.dataTransfer?.items || []]
+
+ // We need to process the dataTransfer ASAP before the
+ // browser clears it. This is why we cache the items too.
+ const fileTree = await dataTransferToFileTree(items)
+
+ // We might not have the target directory fetched yet
+ const contents = await this.currentView?.getContents(this.currentFolder.path)
+ const folder = contents?.folder
+ if (!folder) {
+ showError(this.t('files', 'Target folder does not exist any more'))
+ return
+ }
+
+ // If another button is pressed, cancel it. This
+ // allows cancelling the drag with the right click.
+ if (event.button) {
+ return
+ }
+
+ logger.debug('Dropped', { event, folder, fileTree })
+
+ // Check whether we're uploading files
+ const uploads = await onDropExternalFiles(fileTree, folder, contents.contents)
+
+ // Scroll to last successful upload in current directory if terminated
+ const lastUpload = uploads.findLast((upload) => upload.status !== UploadStatus.FAILED
+ && !upload.file.webkitRelativePath.includes('/')
+ && upload.response?.headers?.['oc-fileid']
+ // Only use the last ID if it's in the current folder
+ && upload.source.replace(folder.source, '').split('/').length === 2)
+
+ if (lastUpload !== undefined) {
+ logger.debug('Scrolling to last upload in current folder', { lastUpload })
+ const location: RawLocation = {
+ path: this.$route.path,
+ // Keep params but change file id
+ params: {
+ ...this.$route.params,
+ fileid: String(lastUpload.response!.headers['oc-fileid']),
+ },
+ query: {
+ ...this.$route.query,
+ },
+ }
+ // Remove open file from query
+ delete location.query.openfile
+ this.$router.push(location)
+ }
+
+ this.dragover = false
+ this.resetDragOver.clear()
+ },
+
+ t,
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.files-list__drag-drop-notice {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ // Breadcrumbs height + row thead height
+ min-height: calc(58px + 44px);
+ margin: 0;
+ user-select: none;
+ color: var(--color-text-maxcontrast);
+ background-color: var(--color-main-background);
+ border-color: black;
+
+ h3 {
+ margin-inline-start: 16px;
+ color: inherit;
+ }
+
+ &-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 15vh;
+ max-height: 70%;
+ padding: 0 5vw;
+ border: 2px var(--color-border-dark) dashed;
+ border-radius: var(--border-radius-large);
+ }
+}
+
+</style>
diff --git a/apps/files/src/components/DragAndDropPreview.vue b/apps/files/src/components/DragAndDropPreview.vue
new file mode 100644
index 00000000000..72fd98d43fb
--- /dev/null
+++ b/apps/files/src/components/DragAndDropPreview.vue
@@ -0,0 +1,165 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <div class="files-list-drag-image">
+ <span class="files-list-drag-image__icon">
+ <span ref="previewImg" />
+ <FolderIcon v-if="isSingleFolder" />
+ <FileMultipleIcon v-else />
+ </span>
+ <span class="files-list-drag-image__name">{{ name }}</span>
+ </div>
+</template>
+
+<script lang="ts">
+import { FileType, Node, formatFileSize } from '@nextcloud/files'
+import Vue from 'vue'
+
+import FileMultipleIcon from 'vue-material-design-icons/FileMultiple.vue'
+import FolderIcon from 'vue-material-design-icons/Folder.vue'
+
+import { getSummaryFor } from '../utils/fileUtils.ts'
+
+export default Vue.extend({
+ name: 'DragAndDropPreview',
+
+ components: {
+ FileMultipleIcon,
+ FolderIcon,
+ },
+
+ data() {
+ return {
+ nodes: [] as Node[],
+ }
+ },
+
+ computed: {
+ isSingleNode() {
+ return this.nodes.length === 1
+ },
+ isSingleFolder() {
+ return this.isSingleNode
+ && this.nodes[0].type === FileType.Folder
+ },
+
+ name() {
+ if (!this.size) {
+ return this.summary
+ }
+ return `${this.summary} – ${this.size}`
+ },
+ size() {
+ const totalSize = this.nodes.reduce((total, node) => total + node.size || 0, 0)
+ const size = parseInt(totalSize, 10) || 0
+ if (typeof size !== 'number' || size < 0) {
+ return null
+ }
+ return formatFileSize(size, true)
+ },
+ summary(): string {
+ if (this.isSingleNode) {
+ const node = this.nodes[0]
+ return node.attributes?.displayname || node.basename
+ }
+
+ return getSummaryFor(this.nodes)
+ },
+ },
+
+ methods: {
+ update(nodes: Node[]) {
+ this.nodes = nodes
+ this.$refs.previewImg.replaceChildren()
+
+ // Clone icon node from the list
+ nodes.slice(0, 3).forEach(node => {
+ const preview = document.querySelector(`[data-cy-files-list-row-fileid="${node.fileid}"] .files-list__row-icon img`)
+ if (preview) {
+ const previewElmt = this.$refs.previewImg as HTMLElement
+ previewElmt.appendChild(preview.parentNode.cloneNode(true))
+ }
+ })
+
+ this.$nextTick(() => {
+ this.$emit('loaded', this.$el)
+ })
+ },
+ },
+})
+</script>
+
+<style lang="scss">
+$size: 28px;
+$stack-shift: 6px;
+
+.files-list-drag-image {
+ position: absolute;
+ top: -9999px;
+ inset-inline-start: -9999px;
+ display: flex;
+ overflow: hidden;
+ align-items: center;
+ height: $size + $stack-shift;
+ padding: $stack-shift $stack-shift * 2;
+ background: var(--color-main-background);
+
+ &__icon,
+ .files-list__row-icon-preview-container {
+ display: flex;
+ overflow: hidden;
+ align-items: center;
+ justify-content: center;
+ width: $size - $stack-shift;
+ height: $size - $stack-shift;;
+ border-radius: var(--border-radius);
+ }
+
+ &__icon {
+ overflow: visible;
+ margin-inline-end: $stack-shift * 2;
+
+ img {
+ max-width: 100%;
+ max-height: 100%;
+ }
+
+ .material-design-icon {
+ color: var(--color-text-maxcontrast);
+ &.folder-icon {
+ color: var(--color-primary-element);
+ }
+ }
+
+ // Previews container
+ > span {
+ display: flex;
+
+ // Stack effect if more than one element
+ // Max 3 elements
+ > .files-list__row-icon-preview-container + .files-list__row-icon-preview-container {
+ margin-top: $stack-shift;
+ margin-inline-start: $stack-shift * 2 - $size;
+ & + .files-list__row-icon-preview-container {
+ margin-top: $stack-shift * 2;
+ }
+ }
+
+ // If we have manually clone the preview,
+ // let's hide any fallback icons
+ &:not(:empty) + * {
+ display: none;
+ }
+ }
+ }
+
+ &__name {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+}
+
+</style>
diff --git a/apps/files/src/components/FileEntry.vue b/apps/files/src/components/FileEntry.vue
new file mode 100644
index 00000000000..d66c3fa0ed7
--- /dev/null
+++ b/apps/files/src/components/FileEntry.vue
@@ -0,0 +1,276 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <tr :class="{
+ 'files-list__row--dragover': dragover,
+ 'files-list__row--loading': isLoading,
+ 'files-list__row--active': isActive,
+ }"
+ data-cy-files-list-row
+ :data-cy-files-list-row-fileid="fileid"
+ :data-cy-files-list-row-name="source.basename"
+ :draggable="canDrag"
+ class="files-list__row"
+ v-on="rowListeners">
+ <!-- Failed indicator -->
+ <span v-if="isFailedSource" class="files-list__row--failed" />
+
+ <!-- Checkbox -->
+ <FileEntryCheckbox :fileid="fileid"
+ :is-loading="isLoading"
+ :nodes="nodes"
+ :source="source" />
+
+ <!-- Link to file -->
+ <td class="files-list__row-name" data-cy-files-list-row-name>
+ <!-- Icon or preview -->
+ <FileEntryPreview ref="preview"
+ :source="source"
+ :dragover="dragover"
+ @auxclick.native="execDefaultAction"
+ @click.native="execDefaultAction" />
+
+ <FileEntryName ref="name"
+ :basename="basename"
+ :extension="extension"
+ :nodes="nodes"
+ :source="source"
+ @auxclick.native="execDefaultAction"
+ @click.native="execDefaultAction" />
+ </td>
+
+ <!-- Actions -->
+ <FileEntryActions v-show="!isRenamingSmallScreen"
+ ref="actions"
+ :class="`files-list__row-actions-${uniqueId}`"
+ :opened.sync="openedMenu"
+ :source="source" />
+
+ <!-- Mime -->
+ <td v-if="isMimeAvailable"
+ :title="mime"
+ class="files-list__row-mime"
+ data-cy-files-list-row-mime
+ @click="openDetailsIfAvailable">
+ <span>{{ mime }}</span>
+ </td>
+
+ <!-- Size -->
+ <td v-if="!compact && isSizeAvailable"
+ :style="sizeOpacity"
+ class="files-list__row-size"
+ data-cy-files-list-row-size
+ @click="openDetailsIfAvailable">
+ <span>{{ size }}</span>
+ </td>
+
+ <!-- Mtime -->
+ <td v-if="!compact && isMtimeAvailable"
+ :style="mtimeOpacity"
+ class="files-list__row-mtime"
+ data-cy-files-list-row-mtime
+ @click="openDetailsIfAvailable">
+ <NcDateTime v-if="mtime"
+ ignore-seconds
+ :timestamp="mtime" />
+ <span v-else>{{ t('files', 'Unknown date') }}</span>
+ </td>
+
+ <!-- View columns -->
+ <td v-for="column in columns"
+ :key="column.id"
+ :class="`files-list__row-${currentView.id}-${column.id}`"
+ class="files-list__row-column-custom"
+ :data-cy-files-list-row-column-custom="column.id"
+ @click="openDetailsIfAvailable">
+ <CustomElementRender :current-view="currentView"
+ :render="column.render"
+ :source="source" />
+ </td>
+ </tr>
+</template>
+
+<script lang="ts">
+import { FileType, formatFileSize } from '@nextcloud/files'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+import { defineComponent } from 'vue'
+import { t } from '@nextcloud/l10n'
+import NcDateTime from '@nextcloud/vue/components/NcDateTime'
+
+import { useNavigation } from '../composables/useNavigation.ts'
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+import { useActionsMenuStore } from '../store/actionsmenu.ts'
+import { useDragAndDropStore } from '../store/dragging.ts'
+import { useFilesStore } from '../store/files.ts'
+import { useRenamingStore } from '../store/renaming.ts'
+import { useSelectionStore } from '../store/selection.ts'
+
+import CustomElementRender from './CustomElementRender.vue'
+import FileEntryActions from './FileEntry/FileEntryActions.vue'
+import FileEntryCheckbox from './FileEntry/FileEntryCheckbox.vue'
+import FileEntryMixin from './FileEntryMixin.ts'
+import FileEntryName from './FileEntry/FileEntryName.vue'
+import FileEntryPreview from './FileEntry/FileEntryPreview.vue'
+
+export default defineComponent({
+ name: 'FileEntry',
+
+ components: {
+ CustomElementRender,
+ FileEntryActions,
+ FileEntryCheckbox,
+ FileEntryName,
+ FileEntryPreview,
+ NcDateTime,
+ },
+
+ mixins: [
+ FileEntryMixin,
+ ],
+
+ props: {
+ isMimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ isSizeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ const actionsMenuStore = useActionsMenuStore()
+ const draggingStore = useDragAndDropStore()
+ const filesStore = useFilesStore()
+ const renamingStore = useRenamingStore()
+ const selectionStore = useSelectionStore()
+ const filesListWidth = useFileListWidth()
+ // The file list is guaranteed to be only shown with active view - thus we can set the `loaded` flag
+ const { currentView } = useNavigation(true)
+ const {
+ directory: currentDir,
+ fileId: currentFileId,
+ } = useRouteParameters()
+
+ return {
+ actionsMenuStore,
+ draggingStore,
+ filesStore,
+ renamingStore,
+ selectionStore,
+
+ currentDir,
+ currentFileId,
+ currentView,
+ filesListWidth,
+ }
+ },
+
+ computed: {
+ /**
+ * Conditionally add drag and drop listeners
+ * Do not add drag start and over listeners on renaming to allow to drag and drop text
+ */
+ rowListeners() {
+ const conditionals = this.isRenaming
+ ? {}
+ : {
+ dragstart: this.onDragStart,
+ dragover: this.onDragOver,
+ }
+
+ return {
+ ...conditionals,
+ contextmenu: this.onRightClick,
+ dragleave: this.onDragLeave,
+ dragend: this.onDragEnd,
+ drop: this.onDrop,
+ }
+ },
+ columns() {
+ // Hide columns if the list is too small
+ if (this.filesListWidth < 512 || this.compact) {
+ return []
+ }
+ return this.currentView.columns || []
+ },
+
+ mime() {
+ if (this.source.type === FileType.Folder) {
+ return this.t('files', 'Folder')
+ }
+
+ if (!this.source.mime || this.source.mime === 'application/octet-stream') {
+ return t('files', 'Unknown file type')
+ }
+
+ if (window.OC?.MimeTypeList?.names?.[this.source.mime]) {
+ return window.OC.MimeTypeList.names[this.source.mime]
+ }
+
+ const baseType = this.source.mime.split('/')[0]
+ const ext = this.source?.extension?.toUpperCase().replace(/^\./, '') || ''
+ if (baseType === 'image') {
+ return t('files', '{ext} image', { ext })
+ }
+ if (baseType === 'video') {
+ return t('files', '{ext} video', { ext })
+ }
+ if (baseType === 'audio') {
+ return t('files', '{ext} audio', { ext })
+ }
+ if (baseType === 'text') {
+ return t('files', '{ext} text', { ext })
+ }
+
+ return this.source.mime
+ },
+ size() {
+ const size = this.source.size
+ if (size === undefined || isNaN(size) || size < 0) {
+ return this.t('files', 'Pending')
+ }
+ return formatFileSize(size, true)
+ },
+
+ sizeOpacity() {
+ const maxOpacitySize = 10 * 1024 * 1024
+
+ const size = this.source.size
+ if (size === undefined || isNaN(size) || size < 0) {
+ return {}
+ }
+
+ const ratio = Math.round(Math.min(100, 100 * Math.pow((size / maxOpacitySize), 2)))
+ return {
+ color: `color-mix(in srgb, var(--color-main-text) ${ratio}%, var(--color-text-maxcontrast))`,
+ }
+ },
+ },
+
+ created() {
+ useHotKey('Enter', this.triggerDefaultAction, {
+ stop: true,
+ prevent: true,
+ })
+ },
+
+ methods: {
+ formatFileSize,
+
+ triggerDefaultAction() {
+ // Don't react to the event if the file row is not active
+ if (!this.isActive) {
+ return
+ }
+
+ this.defaultFileAction?.exec(this.source, this.currentView, this.currentDir)
+ },
+ },
+})
+</script>
diff --git a/apps/files/src/components/FileEntry/CollectivesIcon.vue b/apps/files/src/components/FileEntry/CollectivesIcon.vue
new file mode 100644
index 00000000000..e22b30f4378
--- /dev/null
+++ b/apps/files/src/components/FileEntry/CollectivesIcon.vue
@@ -0,0 +1,45 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+ -->
+<template>
+ <span :aria-hidden="!title"
+ :aria-label="title"
+ class="material-design-icon collectives-icon"
+ role="img"
+ v-bind="$attrs"
+ @click="$emit('click', $event)">
+ <svg :fill="fillColor"
+ class="material-design-icon__svg"
+ :width="size"
+ :height="size"
+ viewBox="0 0 16 16">
+ <path d="M2.9,8.8c0-1.2,0.4-2.4,1.2-3.3L0.3,6c-0.2,0-0.3,0.3-0.1,0.4l2.7,2.6C2.9,9,2.9,8.9,2.9,8.8z" />
+ <path d="M8,3.7c0.7,0,1.3,0.1,1.9,0.4L8.2,0.6c-0.1-0.2-0.3-0.2-0.4,0L6.1,4C6.7,3.8,7.3,3.7,8,3.7z" />
+ <path d="M3.7,11.5L3,15.2c0,0.2,0.2,0.4,0.4,0.3l3.3-1.7C5.4,13.4,4.4,12.6,3.7,11.5z" />
+ <path d="M15.7,6l-3.7-0.5c0.7,0.9,1.2,2,1.2,3.3c0,0.1,0,0.2,0,0.3l2.7-2.6C15.9,6.3,15.9,6.1,15.7,6z" />
+ <path d="M12.3,11.5c-0.7,1.1-1.8,1.9-3,2.2l3.3,1.7c0.2,0.1,0.4-0.1,0.4-0.3L12.3,11.5z" />
+ <path d="M9.6,10.1c-0.4,0.5-1,0.8-1.6,0.8c-1.1,0-2-0.9-2.1-2C5.9,7.7,6.8,6.7,8,6.7c0.6,0,1.1,0.3,1.5,0.7 c0.1,0.1,0.1,0.1,0.2,0.1h1.4c0.2,0,0.4-0.2,0.3-0.5c-0.7-1.3-2.1-2.2-3.8-2.1C5.8,5,4.3,6.6,4.1,8.5C4,10.8,5.8,12.7,8,12.7 c1.6,0,2.9-0.9,3.5-2.3c0.1-0.2-0.1-0.4-0.3-0.4H9.9C9.8,10,9.7,10,9.6,10.1z" />
+ </svg>
+ </span>
+</template>
+
+<script>
+export default {
+ name: 'CollectivesIcon',
+ props: {
+ title: {
+ type: String,
+ default: '',
+ },
+ fillColor: {
+ type: String,
+ default: 'currentColor',
+ },
+ size: {
+ type: Number,
+ default: 24,
+ },
+ },
+}
+</script>
diff --git a/apps/files/src/components/FileEntry/FavoriteIcon.vue b/apps/files/src/components/FileEntry/FavoriteIcon.vue
new file mode 100644
index 00000000000..c66cb8fbd7f
--- /dev/null
+++ b/apps/files/src/components/FileEntry/FavoriteIcon.vue
@@ -0,0 +1,76 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcIconSvgWrapper class="favorite-marker-icon" :name="t('files', 'Favorite')" :svg="StarSvg" />
+</template>
+
+<script lang="ts">
+import { translate as t } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import StarSvg from '@mdi/svg/svg/star.svg?raw'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+
+/**
+ * A favorite icon to be used for overlaying favorite entries like the file preview / icon
+ * It has a stroke around the star icon to ensure enough contrast for accessibility.
+ *
+ * If the background has a hover state you might want to also apply it to the stroke like this:
+ * ```scss
+ * .parent:hover :deep(.favorite-marker-icon svg path) {
+ * stroke: var(--color-background-hover);
+ * }
+ * ```
+ */
+export default defineComponent({
+ name: 'FavoriteIcon',
+ components: {
+ NcIconSvgWrapper,
+ },
+ data() {
+ return {
+ StarSvg,
+ }
+ },
+ async mounted() {
+ await this.$nextTick()
+ // MDI default viewBox is "0 0 24 24" but we add a stroke of 10px so we must adjust it
+ const el = this.$el.querySelector('svg')
+ el?.setAttribute?.('viewBox', '-4 -4 30 30')
+ },
+ methods: {
+ t,
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.favorite-marker-icon {
+ color: var(--color-favorite);
+ // Override NcIconSvgWrapper defaults (clickable area)
+ min-width: unset !important;
+ min-height: unset !important;
+
+ :deep() {
+ svg {
+ // We added a stroke for a11y so we must increase the size to include the stroke
+ width: 20px !important;
+ height: 20px !important;
+
+ // Override NcIconSvgWrapper defaults of 20px
+ max-width: unset !important;
+ max-height: unset !important;
+
+ // Sow a border around the icon for better contrast
+ path {
+ stroke: var(--color-main-background);
+ stroke-width: 8px;
+ stroke-linejoin: round;
+ paint-order: stroke;
+ }
+ }
+ }
+}
+</style>
diff --git a/apps/files/src/components/FileEntry/FileEntryActions.vue b/apps/files/src/components/FileEntry/FileEntryActions.vue
new file mode 100644
index 00000000000..5c537d878fe
--- /dev/null
+++ b/apps/files/src/components/FileEntry/FileEntryActions.vue
@@ -0,0 +1,399 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <td class="files-list__row-actions"
+ data-cy-files-list-row-actions>
+ <!-- Render actions -->
+ <CustomElementRender v-for="action in enabledRenderActions"
+ :key="action.id"
+ :class="'files-list__row-action-' + action.id"
+ :current-view="currentView"
+ :render="action.renderInline"
+ :source="source"
+ class="files-list__row-action--inline" />
+
+ <!-- Menu actions -->
+ <NcActions ref="actionsMenu"
+ :boundaries-element="getBoundariesElement"
+ :container="getBoundariesElement"
+ :force-name="true"
+ type="tertiary"
+ :force-menu="enabledInlineActions.length === 0 /* forceMenu only if no inline actions */"
+ :inline="enabledInlineActions.length"
+ :open="openedMenu"
+ @close="onMenuClose"
+ @closed="onMenuClosed">
+ <!-- Non-destructive actions list -->
+ <!-- Please keep this block in sync with the destructive actions block below -->
+ <NcActionButton v-for="action, index in renderedNonDestructiveActions"
+ :key="action.id"
+ :ref="`action-${action.id}`"
+ class="files-list__row-action"
+ :class="{
+ [`files-list__row-action-${action.id}`]: true,
+ 'files-list__row-action--inline': index < enabledInlineActions.length,
+ 'files-list__row-action--menu': isValidMenu(action),
+ }"
+ :close-after-click="!isValidMenu(action)"
+ :data-cy-files-list-row-action="action.id"
+ :is-menu="isValidMenu(action)"
+ :aria-label="action.title?.([source], currentView)"
+ :title="action.title?.([source], currentView)"
+ @click="onActionClick(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="isLoadingAction(action)" />
+ <NcIconSvgWrapper v-else
+ class="files-list__row-action-icon"
+ :svg="action.iconSvgInline([source], currentView)" />
+ </template>
+ {{ actionDisplayName(action) }}
+ </NcActionButton>
+
+ <!-- Destructive actions list -->
+ <template v-if="renderedDestructiveActions.length > 0">
+ <NcActionSeparator />
+ <NcActionButton v-for="action, index in renderedDestructiveActions"
+ :key="action.id"
+ :ref="`action-${action.id}`"
+ class="files-list__row-action"
+ :class="{
+ [`files-list__row-action-${action.id}`]: true,
+ 'files-list__row-action--inline': index < enabledInlineActions.length,
+ 'files-list__row-action--menu': isValidMenu(action),
+ 'files-list__row-action--destructive': true,
+ }"
+ :close-after-click="!isValidMenu(action)"
+ :data-cy-files-list-row-action="action.id"
+ :is-menu="isValidMenu(action)"
+ :aria-label="action.title?.([source], currentView)"
+ :title="action.title?.([source], currentView)"
+ @click="onActionClick(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="isLoadingAction(action)" />
+ <NcIconSvgWrapper v-else
+ class="files-list__row-action-icon"
+ :svg="action.iconSvgInline([source], currentView)" />
+ </template>
+ {{ actionDisplayName(action) }}
+ </NcActionButton>
+ </template>
+
+ <!-- Submenu actions list-->
+ <template v-if="openedSubmenu && enabledSubmenuActions[openedSubmenu?.id]">
+ <!-- Back to top-level button -->
+ <NcActionButton class="files-list__row-action-back" data-cy-files-list-row-action="menu-back" @click="onBackToMenuClick(openedSubmenu)">
+ <template #icon>
+ <ArrowLeftIcon />
+ </template>
+ {{ t('files', 'Back') }}
+ </NcActionButton>
+ <NcActionSeparator />
+
+ <!-- Submenu actions -->
+ <NcActionButton v-for="action in enabledSubmenuActions[openedSubmenu?.id]"
+ :key="action.id"
+ :class="`files-list__row-action-${action.id}`"
+ class="files-list__row-action--submenu"
+ close-after-click
+ :data-cy-files-list-row-action="action.id"
+ :aria-label="action.title?.([source], currentView)"
+ :title="action.title?.([source], currentView)"
+ @click="onActionClick(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="isLoadingAction(action)" />
+ <NcIconSvgWrapper v-else :svg="action.iconSvgInline([source], currentView)" />
+ </template>
+ {{ actionDisplayName(action) }}
+ </NcActionButton>
+ </template>
+ </NcActions>
+ </td>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+import type { FileAction, Node } from '@nextcloud/files'
+
+import { DefaultType, NodeStatus } from '@nextcloud/files'
+import { defineComponent, inject } from 'vue'
+import { t } from '@nextcloud/l10n'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+
+import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
+import CustomElementRender from '../CustomElementRender.vue'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcActions from '@nextcloud/vue/components/NcActions'
+import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
+
+import { executeAction } from '../../utils/actionUtils.ts'
+import { useActiveStore } from '../../store/active.ts'
+import { useFileListWidth } from '../../composables/useFileListWidth.ts'
+import { useNavigation } from '../../composables/useNavigation'
+import { useRouteParameters } from '../../composables/useRouteParameters.ts'
+import actionsMixins from '../../mixins/actionsMixin.ts'
+import logger from '../../logger.ts'
+
+export default defineComponent({
+ name: 'FileEntryActions',
+
+ components: {
+ ArrowLeftIcon,
+ CustomElementRender,
+ NcActionButton,
+ NcActions,
+ NcActionSeparator,
+ NcIconSvgWrapper,
+ NcLoadingIcon,
+ },
+
+ mixins: [actionsMixins],
+
+ props: {
+ opened: {
+ type: Boolean,
+ default: false,
+ },
+ source: {
+ type: Object as PropType<Node>,
+ required: true,
+ },
+ gridMode: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ // The file list is guaranteed to be only shown with active view - thus we can set the `loaded` flag
+ const { currentView } = useNavigation(true)
+ const { directory: currentDir } = useRouteParameters()
+
+ const activeStore = useActiveStore()
+ const filesListWidth = useFileListWidth()
+ const enabledFileActions = inject<FileAction[]>('enabledFileActions', [])
+ return {
+ activeStore,
+ currentDir,
+ currentView,
+ enabledFileActions,
+ filesListWidth,
+ t,
+ }
+ },
+
+ computed: {
+ isActive() {
+ return this.activeStore?.activeNode?.source === this.source.source
+ },
+
+ isLoading() {
+ return this.source.status === NodeStatus.LOADING
+ },
+
+ // Enabled action that are displayed inline
+ enabledInlineActions() {
+ if (this.filesListWidth < 768 || this.gridMode) {
+ return []
+ }
+ return this.enabledFileActions.filter(action => {
+ try {
+ return action?.inline?.(this.source, this.currentView)
+ } catch (error) {
+ logger.error('Error while checking if action is inline', { action, error })
+ return false
+ }
+ })
+ },
+
+ // Enabled action that are displayed inline with a custom render function
+ enabledRenderActions() {
+ if (this.gridMode) {
+ return []
+ }
+ return this.enabledFileActions.filter(action => typeof action.renderInline === 'function')
+ },
+
+ // Actions shown in the menu
+ enabledMenuActions() {
+ // If we're in a submenu, only render the inline
+ // actions before the filtered submenu
+ if (this.openedSubmenu) {
+ return this.enabledInlineActions
+ }
+
+ const actions = [
+ // Showing inline first for the NcActions inline prop
+ ...this.enabledInlineActions,
+ // Then the rest
+ ...this.enabledFileActions.filter(action => action.default !== DefaultType.HIDDEN && typeof action.renderInline !== 'function'),
+ ].filter((value, index, self) => {
+ // Then we filter duplicates to prevent inline actions to be shown twice
+ return index === self.findIndex(action => action.id === value.id)
+ })
+
+ // Generate list of all top-level actions ids
+ const topActionsIds = actions.filter(action => !action.parent).map(action => action.id) as string[]
+
+ // Filter actions that are not top-level AND have a valid parent
+ return actions.filter(action => !(action.parent && topActionsIds.includes(action.parent)))
+ },
+
+ renderedNonDestructiveActions() {
+ return this.enabledMenuActions.filter(action => !action.destructive)
+ },
+
+ renderedDestructiveActions() {
+ return this.enabledMenuActions.filter(action => action.destructive)
+ },
+
+ openedMenu: {
+ get() {
+ return this.opened
+ },
+ set(value) {
+ this.$emit('update:opened', value)
+ },
+ },
+
+ /**
+ * Making this a function in case the files-list
+ * reference changes in the future. That way we're
+ * sure there is one at the time we call it.
+ */
+ getBoundariesElement() {
+ return document.querySelector('.app-content > .files-list')
+ },
+ },
+
+ watch: {
+ // Close any submenu when the menu state changes
+ openedMenu() {
+ this.openedSubmenu = null
+ },
+ },
+
+ created() {
+ useHotKey('Escape', this.onKeyDown, {
+ stop: true,
+ prevent: true,
+ })
+
+ useHotKey('a', this.onKeyDown, {
+ stop: true,
+ prevent: true,
+ })
+ },
+
+ methods: {
+ actionDisplayName(action: FileAction) {
+ try {
+ if ((this.gridMode || (this.filesListWidth < 768 && action.inline)) && typeof action.title === 'function') {
+ // if an inline action is rendered in the menu for
+ // lack of space we use the title first if defined
+ const title = action.title([this.source], this.currentView)
+ if (title) return title
+ }
+ return action.displayName([this.source], this.currentView)
+ } catch (error) {
+ logger.error('Error while getting action display name', { action, error })
+ // Not ideal, but better than nothing
+ return action.id
+ }
+ },
+
+ isLoadingAction(action: FileAction) {
+ if (!this.isActive) {
+ return false
+ }
+ return this.activeStore?.activeAction?.id === action.id
+ },
+
+ async onActionClick(action) {
+ // If the action is a submenu, we open it
+ if (this.enabledSubmenuActions[action.id]) {
+ this.openedSubmenu = action
+ return
+ }
+
+ // Make sure we set the node as active
+ this.activeStore.activeNode = this.source
+
+ // Execute the action
+ await executeAction(action)
+ },
+
+ onKeyDown(event: KeyboardEvent) {
+ // Don't react to the event if the file row is not active
+ if (!this.isActive) {
+ return
+ }
+
+ // ESC close the action menu if opened
+ if (event.key === 'Escape' && this.openedMenu) {
+ this.openedMenu = false
+ }
+
+ // a open the action menu
+ if (event.key === 'a' && !this.openedMenu) {
+ this.openedMenu = true
+ }
+ },
+
+ onMenuClose() {
+ // We reset the submenu state when the menu is closing
+ this.openedSubmenu = null
+ },
+
+ onMenuClosed() {
+ // We reset the actions menu state when the menu is finally closed
+ this.openedMenu = false
+ },
+ },
+})
+</script>
+
+<style lang="scss">
+// Allow right click to define the position of the menu
+// only if defined
+main.app-content[style*="mouse-pos-x"] .v-popper__popper {
+ transform: translate3d(var(--mouse-pos-x), var(--mouse-pos-y), 0px) !important;
+
+ // If the menu is too close to the bottom, we move it up
+ &[data-popper-placement="top"] {
+ // 34px added to align with the top of the cursor
+ transform: translate3d(var(--mouse-pos-x), calc(var(--mouse-pos-y) - 50vh + 34px), 0px) !important;
+ }
+ // Hide arrow if floating
+ .v-popper__arrow-container {
+ display: none;
+ }
+}
+</style>
+
+<style scoped lang="scss">
+.files-list__row-action {
+ --max-icon-size: calc(var(--default-clickable-area) - 2 * var(--default-grid-baseline));
+
+ // inline icons can have clickable area size so they still fit into the row
+ &.files-list__row-action--inline {
+ --max-icon-size: var(--default-clickable-area);
+ }
+
+ // Some icons exceed the default size so we need to enforce a max width and height
+ .files-list__row-action-icon :deep(svg) {
+ max-height: var(--max-icon-size) !important;
+ max-width: var(--max-icon-size) !important;
+ }
+
+ &.files-list__row-action--destructive {
+ ::deep(button) {
+ color: var(--color-error) !important;
+ }
+ }
+}
+
+</style>
diff --git a/apps/files/src/components/FileEntry/FileEntryCheckbox.vue b/apps/files/src/components/FileEntry/FileEntryCheckbox.vue
new file mode 100644
index 00000000000..5b80a971118
--- /dev/null
+++ b/apps/files/src/components/FileEntry/FileEntryCheckbox.vue
@@ -0,0 +1,173 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <td class="files-list__row-checkbox"
+ @keyup.esc.exact="resetSelection">
+ <NcLoadingIcon v-if="isLoading" :name="loadingLabel" />
+ <NcCheckboxRadioSwitch v-else
+ :aria-label="ariaLabel"
+ :checked="isSelected"
+ data-cy-files-list-row-checkbox
+ @update:checked="onSelectionChange" />
+ </td>
+</template>
+
+<script lang="ts">
+import type { Node } from '@nextcloud/files'
+import type { PropType } from 'vue'
+import type { FileSource } from '../../types.ts'
+
+import { FileType } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+import { defineComponent } from 'vue'
+
+import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
+import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
+
+import { useActiveStore } from '../../store/active.ts'
+import { useKeyboardStore } from '../../store/keyboard.ts'
+import { useSelectionStore } from '../../store/selection.ts'
+import logger from '../../logger.ts'
+
+export default defineComponent({
+ name: 'FileEntryCheckbox',
+
+ components: {
+ NcCheckboxRadioSwitch,
+ NcLoadingIcon,
+ },
+
+ props: {
+ fileid: {
+ type: Number,
+ required: true,
+ },
+ isLoading: {
+ type: Boolean,
+ default: false,
+ },
+ nodes: {
+ type: Array as PropType<Node[]>,
+ required: true,
+ },
+ source: {
+ type: Object as PropType<Node>,
+ required: true,
+ },
+ },
+
+ setup() {
+ const selectionStore = useSelectionStore()
+ const keyboardStore = useKeyboardStore()
+ const activeStore = useActiveStore()
+
+ return {
+ activeStore,
+ keyboardStore,
+ selectionStore,
+ t,
+ }
+ },
+
+ computed: {
+ isActive() {
+ return this.activeStore.activeNode?.source === this.source.source
+ },
+
+ selectedFiles() {
+ return this.selectionStore.selected
+ },
+ isSelected() {
+ return this.selectedFiles.includes(this.source.source)
+ },
+ index() {
+ return this.nodes.findIndex((node: Node) => node.source === this.source.source)
+ },
+ isFile() {
+ return this.source.type === FileType.File
+ },
+ ariaLabel() {
+ return this.isFile
+ ? t('files', 'Toggle selection for file "{displayName}"', { displayName: this.source.basename })
+ : t('files', 'Toggle selection for folder "{displayName}"', { displayName: this.source.basename })
+ },
+ loadingLabel() {
+ return this.isFile
+ ? t('files', 'File is loading')
+ : t('files', 'Folder is loading')
+ },
+ },
+
+ created() {
+ // ctrl+space toggle selection
+ useHotKey(' ', this.onToggleSelect, {
+ stop: true,
+ prevent: true,
+ ctrl: true,
+ })
+
+ // ctrl+shift+space toggle range selection
+ useHotKey(' ', this.onToggleSelect, {
+ stop: true,
+ prevent: true,
+ ctrl: true,
+ shift: true,
+ })
+ },
+
+ methods: {
+ onSelectionChange(selected: boolean) {
+ const newSelectedIndex = this.index
+ const lastSelectedIndex = this.selectionStore.lastSelectedIndex
+
+ // Get the last selected and select all files in between
+ if (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) {
+ const isAlreadySelected = this.selectedFiles.includes(this.source.source)
+
+ const start = Math.min(newSelectedIndex, lastSelectedIndex)
+ const end = Math.max(lastSelectedIndex, newSelectedIndex)
+
+ const lastSelection = this.selectionStore.lastSelection
+ const filesToSelect = this.nodes
+ .map(file => file.source)
+ .slice(start, end + 1)
+ .filter(Boolean) as FileSource[]
+
+ // If already selected, update the new selection _without_ the current file
+ const selection = [...lastSelection, ...filesToSelect]
+ .filter(source => !isAlreadySelected || source !== this.source.source)
+
+ logger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected })
+ // Keep previous lastSelectedIndex to be use for further shift selections
+ this.selectionStore.set(selection)
+ return
+ }
+
+ const selection = selected
+ ? [...this.selectedFiles, this.source.source]
+ : this.selectedFiles.filter(source => source !== this.source.source)
+
+ logger.debug('Updating selection', { selection })
+ this.selectionStore.set(selection)
+ this.selectionStore.setLastIndex(newSelectedIndex)
+ },
+
+ resetSelection() {
+ this.selectionStore.reset()
+ },
+
+ onToggleSelect() {
+ // Don't react if the node is not active
+ if (!this.isActive) {
+ return
+ }
+
+ logger.debug('Toggling selection for file', { source: this.source })
+ this.onSelectionChange(!this.isSelected)
+ },
+ },
+})
+</script>
diff --git a/apps/files/src/components/FileEntry/FileEntryName.vue b/apps/files/src/components/FileEntry/FileEntryName.vue
new file mode 100644
index 00000000000..418f9581eb6
--- /dev/null
+++ b/apps/files/src/components/FileEntry/FileEntryName.vue
@@ -0,0 +1,288 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <!-- Rename input -->
+ <form v-if="isRenaming"
+ ref="renameForm"
+ v-on-click-outside="onRename"
+ :aria-label="t('files', 'Rename file')"
+ class="files-list__row-rename"
+ @submit.prevent.stop="onRename">
+ <NcTextField ref="renameInput"
+ :label="renameLabel"
+ :autofocus="true"
+ :minlength="1"
+ :required="true"
+ :value.sync="newName"
+ enterkeyhint="done"
+ @keyup.esc="stopRenaming" />
+ </form>
+
+ <component :is="linkTo.is"
+ v-else
+ ref="basename"
+ class="files-list__row-name-link"
+ data-cy-files-list-row-name-link
+ v-bind="linkTo.params">
+ <!-- Filename -->
+ <span class="files-list__row-name-text" dir="auto">
+ <!-- Keep the filename stuck to the extension to avoid whitespace rendering issues-->
+ <span class="files-list__row-name-" v-text="basename" />
+ <span v-if="userConfigStore.userConfig.show_files_extensions" class="files-list__row-name-ext" v-text="extension" />
+ </span>
+ </component>
+</template>
+
+<script lang="ts">
+import type { FileAction, Node } from '@nextcloud/files'
+import type { PropType } from 'vue'
+
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { FileType, NodeStatus } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { defineComponent, inject } from 'vue'
+
+import NcTextField from '@nextcloud/vue/components/NcTextField'
+
+import { getFilenameValidity } from '../../utils/filenameValidity.ts'
+import { useFileListWidth } from '../../composables/useFileListWidth.ts'
+import { useNavigation } from '../../composables/useNavigation.ts'
+import { useRenamingStore } from '../../store/renaming.ts'
+import { useRouteParameters } from '../../composables/useRouteParameters.ts'
+import { useUserConfigStore } from '../../store/userconfig.ts'
+import logger from '../../logger.ts'
+
+export default defineComponent({
+ name: 'FileEntryName',
+
+ components: {
+ NcTextField,
+ },
+
+ props: {
+ /**
+ * The filename without extension
+ */
+ basename: {
+ type: String,
+ required: true,
+ },
+ /**
+ * The extension of the filename
+ */
+ extension: {
+ type: String,
+ required: true,
+ },
+ nodes: {
+ type: Array as PropType<Node[]>,
+ required: true,
+ },
+ source: {
+ type: Object as PropType<Node>,
+ required: true,
+ },
+ gridMode: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ // The file list is guaranteed to be only shown with active view - thus we can set the `loaded` flag
+ const { currentView } = useNavigation(true)
+ const { directory } = useRouteParameters()
+ const filesListWidth = useFileListWidth()
+ const renamingStore = useRenamingStore()
+ const userConfigStore = useUserConfigStore()
+
+ const defaultFileAction = inject<FileAction | undefined>('defaultFileAction')
+
+ return {
+ currentView,
+ defaultFileAction,
+ directory,
+ filesListWidth,
+
+ renamingStore,
+ userConfigStore,
+ }
+ },
+
+ computed: {
+ isRenaming() {
+ return this.renamingStore.renamingNode === this.source
+ },
+ isRenamingSmallScreen() {
+ return this.isRenaming && this.filesListWidth < 512
+ },
+ newName: {
+ get(): string {
+ return this.renamingStore.newNodeName
+ },
+ set(newName: string) {
+ this.renamingStore.newNodeName = newName
+ },
+ },
+
+ renameLabel() {
+ const matchLabel: Record<FileType, string> = {
+ [FileType.File]: t('files', 'Filename'),
+ [FileType.Folder]: t('files', 'Folder name'),
+ }
+ return matchLabel[this.source.type]
+ },
+
+ linkTo() {
+ if (this.source.status === NodeStatus.FAILED) {
+ return {
+ is: 'span',
+ params: {
+ title: t('files', 'This node is unavailable'),
+ },
+ }
+ }
+
+ if (this.defaultFileAction) {
+ const displayName = this.defaultFileAction.displayName([this.source], this.currentView)
+ return {
+ is: 'button',
+ params: {
+ 'aria-label': displayName,
+ title: displayName,
+ tabindex: '0',
+ },
+ }
+ }
+
+ // nothing interactive here, there is no default action
+ // so if not even the download action works we only can show the list entry
+ return {
+ is: 'span',
+ }
+ },
+ },
+
+ watch: {
+ /**
+ * If renaming starts, select the filename
+ * in the input, without the extension.
+ * @param renaming
+ */
+ isRenaming: {
+ immediate: true,
+ handler(renaming: boolean) {
+ if (renaming) {
+ this.startRenaming()
+ }
+ },
+ },
+
+ newName() {
+ // Check validity of the new name
+ const newName = this.newName.trim?.() || ''
+ const input = (this.$refs.renameInput as Vue|undefined)?.$el.querySelector('input')
+ if (!input) {
+ return
+ }
+
+ let validity = getFilenameValidity(newName)
+ // Checking if already exists
+ if (validity === '' && this.checkIfNodeExists(newName)) {
+ validity = t('files', 'Another entry with the same name already exists.')
+ }
+ this.$nextTick(() => {
+ if (this.isRenaming) {
+ input.setCustomValidity(validity)
+ input.reportValidity()
+ }
+ })
+ },
+ },
+
+ methods: {
+ checkIfNodeExists(name: string) {
+ return this.nodes.find(node => node.basename === name && node !== this.source)
+ },
+
+ startRenaming() {
+ this.$nextTick(() => {
+ // Using split to get the true string length
+ const input = (this.$refs.renameInput as Vue|undefined)?.$el.querySelector('input')
+ if (!input) {
+ logger.error('Could not find the rename input')
+ return
+ }
+ input.focus()
+ const length = this.source.basename.length - (this.source.extension ?? '').length
+ input.setSelectionRange(0, length)
+
+ // Trigger a keyup event to update the input validity
+ input.dispatchEvent(new Event('keyup'))
+ })
+ },
+
+ stopRenaming() {
+ if (!this.isRenaming) {
+ return
+ }
+
+ // Reset the renaming store
+ this.renamingStore.$reset()
+ },
+
+ // Rename and move the file
+ async onRename() {
+ const newName = this.newName.trim?.() || ''
+ const form = this.$refs.renameForm as HTMLFormElement
+ if (!form.checkValidity()) {
+ showError(t('files', 'Invalid filename.') + ' ' + getFilenameValidity(newName))
+ return
+ }
+
+ const oldName = this.source.basename
+ if (newName === oldName) {
+ this.stopRenaming()
+ return
+ }
+
+ try {
+ const status = await this.renamingStore.rename()
+ if (status) {
+ showSuccess(
+ t('files', 'Renamed "{oldName}" to "{newName}"', { oldName, newName: this.source.basename }),
+ )
+ this.$nextTick(() => {
+ const nameContainer = this.$refs.basename as HTMLElement | undefined
+ nameContainer?.focus()
+ })
+ } else {
+ // Was cancelled - meaning the renaming state is just reset
+ }
+ } catch (error) {
+ logger.error(error as Error)
+ showError((error as Error).message)
+ // And ensure we reset to the renaming state
+ this.startRenaming()
+ }
+ },
+
+ t,
+ },
+})
+</script>
+
+<style scoped lang="scss">
+button.files-list__row-name-link {
+ background-color: unset;
+ border: none;
+ font-weight: normal;
+
+ &:active {
+ // No active styles - handled by the row entry
+ background-color: unset !important;
+ }
+}
+</style>
diff --git a/apps/files/src/components/FileEntry/FileEntryPreview.vue b/apps/files/src/components/FileEntry/FileEntryPreview.vue
new file mode 100644
index 00000000000..3d0fffe7584
--- /dev/null
+++ b/apps/files/src/components/FileEntry/FileEntryPreview.vue
@@ -0,0 +1,300 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <span class="files-list__row-icon">
+ <template v-if="source.type === 'folder'">
+ <FolderOpenIcon v-if="dragover" v-once />
+ <template v-else>
+ <FolderIcon v-once />
+ <OverlayIcon :is="folderOverlay"
+ v-if="folderOverlay"
+ class="files-list__row-icon-overlay" />
+ </template>
+ </template>
+
+ <!-- Decorative images, should not be aria documented -->
+ <span v-else-if="previewUrl" class="files-list__row-icon-preview-container">
+ <canvas v-if="hasBlurhash && (backgroundFailed === true || !backgroundLoaded)"
+ ref="canvas"
+ class="files-list__row-icon-blurhash"
+ aria-hidden="true" />
+ <img v-if="backgroundFailed !== true"
+ :key="source.fileid"
+ ref="previewImg"
+ alt=""
+ class="files-list__row-icon-preview"
+ :class="{'files-list__row-icon-preview--loaded': backgroundFailed === false}"
+ loading="lazy"
+ :src="previewUrl"
+ @error="onBackgroundError"
+ @load="onBackgroundLoad">
+ </span>
+
+ <FileIcon v-else v-once />
+
+ <!-- Favorite icon -->
+ <span v-if="isFavorite" class="files-list__row-icon-favorite">
+ <FavoriteIcon v-once />
+ </span>
+
+ <OverlayIcon :is="fileOverlay"
+ v-if="fileOverlay"
+ class="files-list__row-icon-overlay files-list__row-icon-overlay--file" />
+ </span>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+import type { UserConfig } from '../../types.ts'
+
+import { Node, FileType } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { generateUrl } from '@nextcloud/router'
+import { ShareType } from '@nextcloud/sharing'
+import { getSharingToken, isPublicShare } from '@nextcloud/sharing/public'
+import { decode } from 'blurhash'
+import { defineComponent } from 'vue'
+
+import AccountGroupIcon from 'vue-material-design-icons/AccountGroup.vue'
+import AccountPlusIcon from 'vue-material-design-icons/AccountPlus.vue'
+import FileIcon from 'vue-material-design-icons/File.vue'
+import FolderIcon from 'vue-material-design-icons/Folder.vue'
+import FolderOpenIcon from 'vue-material-design-icons/FolderOpen.vue'
+import KeyIcon from 'vue-material-design-icons/Key.vue'
+import LinkIcon from 'vue-material-design-icons/Link.vue'
+import NetworkIcon from 'vue-material-design-icons/NetworkOutline.vue'
+import TagIcon from 'vue-material-design-icons/Tag.vue'
+import PlayCircleIcon from 'vue-material-design-icons/PlayCircle.vue'
+
+import CollectivesIcon from './CollectivesIcon.vue'
+import FavoriteIcon from './FavoriteIcon.vue'
+
+import { isLivePhoto } from '../../services/LivePhotos'
+import { useUserConfigStore } from '../../store/userconfig.ts'
+import logger from '../../logger.ts'
+
+export default defineComponent({
+ name: 'FileEntryPreview',
+
+ components: {
+ AccountGroupIcon,
+ AccountPlusIcon,
+ CollectivesIcon,
+ FavoriteIcon,
+ FileIcon,
+ FolderIcon,
+ FolderOpenIcon,
+ KeyIcon,
+ LinkIcon,
+ NetworkIcon,
+ TagIcon,
+ },
+
+ props: {
+ source: {
+ type: Object as PropType<Node>,
+ required: true,
+ },
+ dragover: {
+ type: Boolean,
+ default: false,
+ },
+ gridMode: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ const userConfigStore = useUserConfigStore()
+ const isPublic = isPublicShare()
+ const publicSharingToken = getSharingToken()
+
+ return {
+ userConfigStore,
+
+ isPublic,
+ publicSharingToken,
+ }
+ },
+
+ data() {
+ return {
+ backgroundFailed: undefined as boolean | undefined,
+ backgroundLoaded: false,
+ }
+ },
+
+ computed: {
+ isFavorite(): boolean {
+ return this.source.attributes.favorite === 1
+ },
+
+ userConfig(): UserConfig {
+ return this.userConfigStore.userConfig
+ },
+ cropPreviews(): boolean {
+ return this.userConfig.crop_image_previews === true
+ },
+
+ previewUrl() {
+ if (this.source.type === FileType.Folder) {
+ return null
+ }
+
+ if (this.backgroundFailed === true) {
+ return null
+ }
+
+ if (this.source.attributes['has-preview'] !== true
+ && this.source.mime !== undefined
+ && this.source.mime !== 'application/octet-stream'
+ ) {
+ const previewUrl = generateUrl('/core/mimeicon?mime={mime}', {
+ mime: this.source.mime,
+ })
+ const url = new URL(window.location.origin + previewUrl)
+ return url.href
+ }
+
+ try {
+ const previewUrl = this.source.attributes.previewUrl
+ || (this.isPublic
+ ? generateUrl('/apps/files_sharing/publicpreview/{token}?file={file}', {
+ token: this.publicSharingToken,
+ file: this.source.path,
+ })
+ : generateUrl('/core/preview?fileId={fileid}', {
+ fileid: String(this.source.fileid),
+ })
+ )
+ const url = new URL(window.location.origin + previewUrl)
+
+ // Request tiny previews
+ url.searchParams.set('x', this.gridMode ? '128' : '32')
+ url.searchParams.set('y', this.gridMode ? '128' : '32')
+ url.searchParams.set('mimeFallback', 'true')
+
+ // Etag to force refresh preview on change
+ const etag = this.source?.attributes?.etag || ''
+ url.searchParams.set('v', etag.slice(0, 6))
+
+ // Handle cropping
+ url.searchParams.set('a', this.cropPreviews === true ? '0' : '1')
+ return url.href
+ } catch (e) {
+ return null
+ }
+ },
+
+ fileOverlay() {
+ if (isLivePhoto(this.source)) {
+ return PlayCircleIcon
+ }
+
+ return null
+ },
+
+ folderOverlay() {
+ if (this.source.type !== FileType.Folder) {
+ return null
+ }
+
+ // Encrypted folders
+ if (this.source?.attributes?.['is-encrypted'] === 1) {
+ return KeyIcon
+ }
+
+ // System tags
+ if (this.source?.attributes?.['is-tag']) {
+ return TagIcon
+ }
+
+ // Link and mail shared folders
+ const shareTypes = Object.values(this.source?.attributes?.['share-types'] || {}).flat() as number[]
+ if (shareTypes.some(type => type === ShareType.Link || type === ShareType.Email)) {
+ return LinkIcon
+ }
+
+ // Shared folders
+ if (shareTypes.length > 0) {
+ return AccountPlusIcon
+ }
+
+ switch (this.source?.attributes?.['mount-type']) {
+ case 'external':
+ case 'external-session':
+ return NetworkIcon
+ case 'group':
+ return AccountGroupIcon
+ case 'collective':
+ return CollectivesIcon
+ case 'shared':
+ return AccountPlusIcon
+ }
+
+ return null
+ },
+
+ hasBlurhash() {
+ return this.source.attributes['metadata-blurhash'] !== undefined
+ },
+ },
+
+ mounted() {
+ if (this.hasBlurhash && this.$refs.canvas) {
+ this.drawBlurhash()
+ }
+ },
+
+ methods: {
+ // Called from FileEntry
+ reset() {
+ // Reset background state to cancel any ongoing requests
+ this.backgroundFailed = undefined
+ this.backgroundLoaded = false
+ const previewImg = this.$refs.previewImg as HTMLImageElement | undefined
+ if (previewImg) {
+ previewImg.src = ''
+ }
+ },
+
+ onBackgroundLoad() {
+ this.backgroundFailed = false
+ this.backgroundLoaded = true
+ },
+
+ onBackgroundError(event) {
+ // Do not fail if we just reset the background
+ if (event.target?.src === '') {
+ return
+ }
+ this.backgroundFailed = true
+ this.backgroundLoaded = false
+ },
+
+ drawBlurhash() {
+ const canvas = this.$refs.canvas as HTMLCanvasElement
+
+ const width = canvas.width
+ const height = canvas.height
+
+ const pixels = decode(this.source.attributes['metadata-blurhash'], width, height)
+
+ const ctx = canvas.getContext('2d')
+ if (ctx === null) {
+ logger.error('Cannot create context for blurhash canvas')
+ return
+ }
+
+ const imageData = ctx.createImageData(width, height)
+ imageData.data.set(pixels)
+ ctx.putImageData(imageData, 0, 0)
+ },
+
+ t,
+ },
+})
+</script>
diff --git a/apps/files/src/components/FileEntryGrid.vue b/apps/files/src/components/FileEntryGrid.vue
new file mode 100644
index 00000000000..1bd0572f53b
--- /dev/null
+++ b/apps/files/src/components/FileEntryGrid.vue
@@ -0,0 +1,135 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <tr :class="{'files-list__row--active': isActive, 'files-list__row--dragover': dragover, 'files-list__row--loading': isLoading}"
+ data-cy-files-list-row
+ :data-cy-files-list-row-fileid="fileid"
+ :data-cy-files-list-row-name="source.basename"
+ :draggable="canDrag"
+ class="files-list__row"
+ @contextmenu="onRightClick"
+ @dragover="onDragOver"
+ @dragleave="onDragLeave"
+ @dragstart="onDragStart"
+ @dragend="onDragEnd"
+ @drop="onDrop">
+ <!-- Failed indicator -->
+ <span v-if="isFailedSource" class="files-list__row--failed" />
+
+ <!-- Checkbox -->
+ <FileEntryCheckbox :fileid="fileid"
+ :is-loading="isLoading"
+ :nodes="nodes"
+ :source="source" />
+
+ <!-- Link to file -->
+ <td class="files-list__row-name" data-cy-files-list-row-name>
+ <!-- Icon or preview -->
+ <FileEntryPreview ref="preview"
+ :dragover="dragover"
+ :grid-mode="true"
+ :source="source"
+ @auxclick.native="execDefaultAction"
+ @click.native="execDefaultAction" />
+
+ <FileEntryName ref="name"
+ :basename="basename"
+ :extension="extension"
+ :grid-mode="true"
+ :nodes="nodes"
+ :source="source"
+ @auxclick.native="execDefaultAction"
+ @click.native="execDefaultAction" />
+ </td>
+
+ <!-- Mtime -->
+ <td v-if="!compact && isMtimeAvailable"
+ :style="mtimeOpacity"
+ class="files-list__row-mtime"
+ data-cy-files-list-row-mtime
+ @click="openDetailsIfAvailable">
+ <NcDateTime v-if="mtime"
+ ignore-seconds
+ :timestamp="mtime" />
+ </td>
+
+ <!-- Actions -->
+ <FileEntryActions ref="actions"
+ :class="`files-list__row-actions-${uniqueId}`"
+ :grid-mode="true"
+ :opened.sync="openedMenu"
+ :source="source" />
+ </tr>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue'
+
+import NcDateTime from '@nextcloud/vue/components/NcDateTime'
+
+import { useNavigation } from '../composables/useNavigation.ts'
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+import { useActionsMenuStore } from '../store/actionsmenu.ts'
+import { useDragAndDropStore } from '../store/dragging.ts'
+import { useFilesStore } from '../store/files.ts'
+import { useRenamingStore } from '../store/renaming.ts'
+import { useSelectionStore } from '../store/selection.ts'
+import FileEntryMixin from './FileEntryMixin.ts'
+import FileEntryActions from './FileEntry/FileEntryActions.vue'
+import FileEntryCheckbox from './FileEntry/FileEntryCheckbox.vue'
+import FileEntryName from './FileEntry/FileEntryName.vue'
+import FileEntryPreview from './FileEntry/FileEntryPreview.vue'
+
+export default defineComponent({
+ name: 'FileEntryGrid',
+
+ components: {
+ FileEntryActions,
+ FileEntryCheckbox,
+ FileEntryName,
+ FileEntryPreview,
+ NcDateTime,
+ },
+
+ mixins: [
+ FileEntryMixin,
+ ],
+
+ inheritAttrs: false,
+
+ setup() {
+ const actionsMenuStore = useActionsMenuStore()
+ const draggingStore = useDragAndDropStore()
+ const filesStore = useFilesStore()
+ const renamingStore = useRenamingStore()
+ const selectionStore = useSelectionStore()
+ // The file list is guaranteed to be only shown with active view - thus we can set the `loaded` flag
+ const { currentView } = useNavigation(true)
+ const {
+ directory: currentDir,
+ fileId: currentFileId,
+ } = useRouteParameters()
+
+ return {
+ actionsMenuStore,
+ draggingStore,
+ filesStore,
+ renamingStore,
+ selectionStore,
+
+ currentDir,
+ currentFileId,
+ currentView,
+ }
+ },
+
+ data() {
+ return {
+ gridMode: true,
+ }
+ },
+})
+</script>
diff --git a/apps/files/src/components/FileEntryMixin.ts b/apps/files/src/components/FileEntryMixin.ts
new file mode 100644
index 00000000000..735490c45b3
--- /dev/null
+++ b/apps/files/src/components/FileEntryMixin.ts
@@ -0,0 +1,509 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { PropType } from 'vue'
+import type { FileSource } from '../types.ts'
+
+import { extname } from 'path'
+import { FileType, Permission, Folder, File as NcFile, NodeStatus, Node, getFileActions } from '@nextcloud/files'
+import { generateUrl } from '@nextcloud/router'
+import { isPublicShare } from '@nextcloud/sharing/public'
+import { showError } from '@nextcloud/dialogs'
+import { t } from '@nextcloud/l10n'
+import { vOnClickOutside } from '@vueuse/components'
+import Vue, { computed, defineComponent } from 'vue'
+
+import { action as sidebarAction } from '../actions/sidebarAction.ts'
+import { dataTransferToFileTree, onDropExternalFiles, onDropInternalFiles } from '../services/DropService.ts'
+import { getDragAndDropPreview } from '../utils/dragUtils.ts'
+import { hashCode } from '../utils/hashUtils.ts'
+import { isDownloadable } from '../utils/permissions.ts'
+import logger from '../logger.ts'
+
+Vue.directive('onClickOutside', vOnClickOutside)
+
+const actions = getFileActions()
+
+export default defineComponent({
+ props: {
+ source: {
+ type: [Folder, NcFile, Node] as PropType<Node>,
+ required: true,
+ },
+ nodes: {
+ type: Array as PropType<Node[]>,
+ required: true,
+ },
+ filesListWidth: {
+ type: Number,
+ default: 0,
+ },
+ isMtimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ compact: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ provide() {
+ return {
+ defaultFileAction: computed(() => this.defaultFileAction),
+ enabledFileActions: computed(() => this.enabledFileActions),
+ }
+ },
+
+ data() {
+ return {
+ dragover: false,
+ gridMode: false,
+ }
+ },
+
+ computed: {
+ fileid() {
+ return this.source.fileid ?? 0
+ },
+
+ uniqueId() {
+ return hashCode(this.source.source)
+ },
+
+ isLoading() {
+ return this.source.status === NodeStatus.LOADING
+ },
+
+ /**
+ * The display name of the current node
+ * Either the nodes filename or a custom display name (e.g. for shares)
+ */
+ displayName() {
+ // basename fallback needed for apps using old `@nextcloud/files` prior 3.6.0
+ return this.source.displayname || this.source.basename
+ },
+ /**
+ * The display name without extension
+ */
+ basename() {
+ if (this.extension === '') {
+ return this.displayName
+ }
+ return this.displayName.slice(0, 0 - this.extension.length)
+ },
+ /**
+ * The extension of the file
+ */
+ extension() {
+ if (this.source.type === FileType.Folder) {
+ return ''
+ }
+
+ return extname(this.displayName)
+ },
+
+ draggingFiles() {
+ return this.draggingStore.dragging as FileSource[]
+ },
+ selectedFiles() {
+ return this.selectionStore.selected as FileSource[]
+ },
+ isSelected() {
+ return this.selectedFiles.includes(this.source.source)
+ },
+
+ isRenaming() {
+ return this.renamingStore.renamingNode === this.source
+ },
+ isRenamingSmallScreen() {
+ return this.isRenaming && this.filesListWidth < 512
+ },
+
+ isActive() {
+ return String(this.fileid) === String(this.currentFileId)
+ },
+
+ /**
+ * Check if the source is in a failed state after an API request
+ */
+ isFailedSource() {
+ return this.source.status === NodeStatus.FAILED
+ },
+
+ canDrag(): boolean {
+ if (this.isRenaming) {
+ return false
+ }
+
+ // Ignore if the node is not available
+ if (this.isFailedSource) {
+ return false
+ }
+
+ const canDrag = (node: Node): boolean => {
+ return (node?.permissions & Permission.UPDATE) !== 0
+ }
+
+ // If we're dragging a selection, we need to check all files
+ if (this.selectedFiles.length > 0) {
+ const nodes = this.selectedFiles.map(source => this.filesStore.getNode(source)) as Node[]
+ return nodes.every(canDrag)
+ }
+ return canDrag(this.source)
+ },
+
+ canDrop(): boolean {
+ if (this.source.type !== FileType.Folder) {
+ return false
+ }
+
+ // Ignore if the node is not available
+ if (this.isFailedSource) {
+ return false
+ }
+
+ // If the current folder is also being dragged, we can't drop it on itself
+ if (this.draggingFiles.includes(this.source.source)) {
+ return false
+ }
+
+ return (this.source.permissions & Permission.CREATE) !== 0
+ },
+
+ openedMenu: {
+ get() {
+ return this.actionsMenuStore.opened === this.uniqueId.toString()
+ },
+ set(opened) {
+ // If the menu is opened on another file entry, we ignore closed events
+ if (opened === false && this.actionsMenuStore.opened !== this.uniqueId.toString()) {
+ return
+ }
+
+ // If opened, we specify the current file id
+ // else we set it to null to close the menu
+ this.actionsMenuStore.opened = opened
+ ? this.uniqueId.toString()
+ : null
+ },
+ },
+
+ mtime() {
+ // If the mtime is not a valid date, return it as is
+ if (this.source.mtime && !isNaN(this.source.mtime.getDate())) {
+ return this.source.mtime
+ }
+
+ if (this.source.crtime && !isNaN(this.source.crtime.getDate())) {
+ return this.source.crtime
+ }
+
+ return null
+ },
+
+ mtimeOpacity() {
+ if (!this.mtime) {
+ return {}
+ }
+
+ // The time when we start reducing the opacity
+ const maxOpacityTime = 31 * 24 * 60 * 60 * 1000 // 31 days
+ // everything older than the maxOpacityTime will have the same value
+ const timeDiff = Date.now() - this.mtime.getTime()
+ if (timeDiff < 0) {
+ // this means we have an invalid mtime which is in the future!
+ return {}
+ }
+
+ // inversed time difference from 0 to maxOpacityTime (which would mean today)
+ const opacityTime = Math.max(0, maxOpacityTime - timeDiff)
+ // 100 = today, 0 = 31 days ago or older
+ const percentage = Math.round(opacityTime * 100 / maxOpacityTime)
+ return {
+ color: `color-mix(in srgb, var(--color-main-text) ${percentage}%, var(--color-text-maxcontrast))`,
+ }
+ },
+
+ /**
+ * Sorted actions that are enabled for this node
+ */
+ enabledFileActions() {
+ if (this.source.status === NodeStatus.FAILED) {
+ return []
+ }
+
+ return actions
+ .filter(action => {
+ if (!action.enabled) {
+ return true
+ }
+
+ // In case something goes wrong, since we don't want to break
+ // the entire list, we filter out actions that throw an error.
+ try {
+ return action.enabled([this.source], this.currentView)
+ } catch (error) {
+ logger.error('Error while checking action', { action, error })
+ return false
+ }
+ })
+ .sort((a, b) => (a.order || 0) - (b.order || 0))
+ },
+
+ defaultFileAction() {
+ return this.enabledFileActions.find((action) => action.default !== undefined)
+ },
+ },
+
+ watch: {
+ /**
+ * When the source changes, reset the preview
+ * and fetch the new one.
+ * @param newSource The new value of the source prop
+ * @param oldSource The previous value
+ */
+ source(newSource: Node, oldSource: Node) {
+ if (newSource.source !== oldSource.source) {
+ this.resetState()
+ }
+ },
+
+ openedMenu() {
+ // Checking if the menu is really closed and not
+ // just a change in the open state to another file entry.
+ if (this.actionsMenuStore.opened === null) {
+ // Reset any right menu position potentially set
+ logger.debug('All actions menu closed, resetting right menu position...')
+ const root = this.$el?.closest('main.app-content') as HTMLElement
+ if (root !== null) {
+ root.style.removeProperty('--mouse-pos-x')
+ root.style.removeProperty('--mouse-pos-y')
+ }
+ }
+ },
+ },
+
+ beforeDestroy() {
+ this.resetState()
+ },
+
+ methods: {
+ resetState() {
+ // Reset the preview state
+ this.$refs?.preview?.reset?.()
+
+ // Close menu
+ this.openedMenu = false
+ },
+
+ // Open the actions menu on right click
+ onRightClick(event) {
+ // If already opened, fallback to default browser
+ if (this.openedMenu) {
+ return
+ }
+
+ // Ignore right click if the node is not available
+ if (this.isFailedSource) {
+ return
+ }
+
+ // The grid mode is compact enough to not care about
+ // the actions menu mouse position
+ if (!this.gridMode) {
+ // Actions menu is contained within the app content
+ const root = this.$el?.closest('main.app-content') as HTMLElement
+ const contentRect = root.getBoundingClientRect()
+ // Using Math.min/max to prevent the menu from going out of the AppContent
+ // 200 = max width of the menu
+ logger.debug('Setting actions menu position...')
+ root.style.setProperty('--mouse-pos-x', Math.max(0, event.clientX - contentRect.left - 200) + 'px')
+ root.style.setProperty('--mouse-pos-y', Math.max(0, event.clientY - contentRect.top) + 'px')
+ } else {
+ // Reset any right menu position potentially set
+ const root = this.$el?.closest('main.app-content') as HTMLElement
+ root.style.removeProperty('--mouse-pos-x')
+ root.style.removeProperty('--mouse-pos-y')
+ }
+
+ // If the clicked row is in the selection, open global menu
+ const isMoreThanOneSelected = this.selectedFiles.length > 1
+ this.actionsMenuStore.opened = this.isSelected && isMoreThanOneSelected ? 'global' : this.uniqueId.toString()
+
+ // Prevent any browser defaults
+ event.preventDefault()
+ event.stopPropagation()
+ },
+
+ execDefaultAction(event: MouseEvent) {
+ // Ignore click if we are renaming
+ if (this.isRenaming) {
+ return
+ }
+
+ // Ignore right click (button & 2) and any auxiliary button expect mouse-wheel (button & 4)
+ if (Boolean(event.button & 2) || event.button > 4) {
+ return
+ }
+
+ // Ignore if the node is not available
+ if (this.isFailedSource) {
+ return
+ }
+
+ // if ctrl+click / cmd+click (MacOS uses the meta key) or middle mouse button (button & 4), open in new tab
+ // also if there is no default action use this as a fallback
+ const metaKeyPressed = event.ctrlKey || event.metaKey || event.button === 1
+ if (metaKeyPressed || !this.defaultFileAction) {
+ // If no download permission, then we can not allow to download (direct link) the files
+ if (isPublicShare() && !isDownloadable(this.source)) {
+ return
+ }
+
+ const url = isPublicShare()
+ ? this.source.encodedSource
+ : generateUrl('/f/{fileId}', { fileId: this.fileid })
+ event.preventDefault()
+ event.stopPropagation()
+
+ // Open the file in a new tab if the meta key or the middle mouse button is clicked
+ window.open(url, metaKeyPressed ? '_blank' : '_self')
+ return
+ }
+
+ // every special case handled so just execute the default action
+ event.preventDefault()
+ event.stopPropagation()
+ // Execute the first default action if any
+ this.defaultFileAction.exec(this.source, this.currentView, this.currentDir)
+ },
+
+ openDetailsIfAvailable(event) {
+ event.preventDefault()
+ event.stopPropagation()
+ if (sidebarAction?.enabled?.([this.source], this.currentView)) {
+ sidebarAction.exec(this.source, this.currentView, this.currentDir)
+ }
+ },
+
+ onDragOver(event: DragEvent) {
+ this.dragover = this.canDrop
+ if (!this.canDrop) {
+ event.dataTransfer.dropEffect = 'none'
+ return
+ }
+
+ // Handle copy/move drag and drop
+ if (event.ctrlKey) {
+ event.dataTransfer.dropEffect = 'copy'
+ } else {
+ event.dataTransfer.dropEffect = 'move'
+ }
+ },
+ onDragLeave(event: DragEvent) {
+ // Counter bubbling, make sure we're ending the drag
+ // only when we're leaving the current element
+ const currentTarget = event.currentTarget as HTMLElement
+ if (currentTarget?.contains(event.relatedTarget as HTMLElement)) {
+ return
+ }
+
+ this.dragover = false
+ },
+
+ async onDragStart(event: DragEvent) {
+ event.stopPropagation()
+ if (!this.canDrag || !this.fileid) {
+ event.preventDefault()
+ event.stopPropagation()
+ return
+ }
+
+ logger.debug('Drag started', { event })
+
+ // Make sure that we're not dragging a file like the preview
+ event.dataTransfer?.clearData?.()
+
+ // Reset any renaming
+ this.renamingStore.$reset()
+
+ // Dragging set of files, if we're dragging a file
+ // that is already selected, we use the entire selection
+ if (this.selectedFiles.includes(this.source.source)) {
+ this.draggingStore.set(this.selectedFiles)
+ } else {
+ this.draggingStore.set([this.source.source])
+ }
+
+ const nodes = this.draggingStore.dragging
+ .map(source => this.filesStore.getNode(source)) as Node[]
+
+ const image = await getDragAndDropPreview(nodes)
+ event.dataTransfer?.setDragImage(image, -10, -10)
+ },
+ onDragEnd() {
+ this.draggingStore.reset()
+ this.dragover = false
+ logger.debug('Drag ended')
+ },
+
+ async onDrop(event: DragEvent) {
+ // skip if native drop like text drag and drop from files names
+ if (!this.draggingFiles && !event.dataTransfer?.items?.length) {
+ return
+ }
+
+ event.preventDefault()
+ event.stopPropagation()
+
+ // Caching the selection
+ const selection = this.draggingFiles
+ const items = [...event.dataTransfer?.items || []] as DataTransferItem[]
+
+ // We need to process the dataTransfer ASAP before the
+ // browser clears it. This is why we cache the items too.
+ const fileTree = await dataTransferToFileTree(items)
+
+ // We might not have the target directory fetched yet
+ const contents = await this.currentView?.getContents(this.source.path)
+ const folder = contents?.folder
+ if (!folder) {
+ showError(this.t('files', 'Target folder does not exist any more'))
+ return
+ }
+
+ // If another button is pressed, cancel it. This
+ // allows cancelling the drag with the right click.
+ if (!this.canDrop || event.button) {
+ return
+ }
+
+ const isCopy = event.ctrlKey
+ this.dragover = false
+
+ logger.debug('Dropped', { event, folder, selection, fileTree })
+
+ // Check whether we're uploading files
+ if (selection.length === 0 && fileTree.contents.length > 0) {
+ await onDropExternalFiles(fileTree, folder, contents.contents)
+ return
+ }
+
+ // Else we're moving/copying files
+ const nodes = selection.map(source => this.filesStore.getNode(source)) as Node[]
+ await onDropInternalFiles(nodes, folder, contents.contents, isCopy)
+
+ // Reset selection after we dropped the files
+ // if the dropped files are within the selection
+ if (selection.some(source => this.selectedFiles.includes(source))) {
+ logger.debug('Dropped selection, resetting select store...')
+ this.selectionStore.reset()
+ }
+ },
+
+ t,
+ },
+})
diff --git a/apps/files/src/components/FileListFilter/FileListFilter.vue b/apps/files/src/components/FileListFilter/FileListFilter.vue
new file mode 100644
index 00000000000..bd3ac867ed5
--- /dev/null
+++ b/apps/files/src/components/FileListFilter/FileListFilter.vue
@@ -0,0 +1,53 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcActions force-menu
+ :type="isActive ? 'secondary' : 'tertiary'"
+ :menu-name="filterName">
+ <template #icon>
+ <slot name="icon" />
+ </template>
+ <slot />
+
+ <template v-if="isActive">
+ <NcActionSeparator />
+ <NcActionButton class="files-list-filter__clear-button"
+ close-after-click
+ @click="$emit('reset-filter')">
+ {{ t('files', 'Clear filter') }}
+ </NcActionButton>
+ </template>
+ </NcActions>
+</template>
+
+<script setup lang="ts">
+import { t } from '@nextcloud/l10n'
+import NcActions from '@nextcloud/vue/components/NcActions'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
+
+defineProps<{
+ isActive: boolean
+ filterName: string
+}>()
+
+defineEmits<{
+ (event: 'reset-filter'): void
+}>()
+</script>
+
+<style scoped>
+.files-list-filter__clear-button :deep(.action-button__text) {
+ color: var(--color-error-text);
+}
+
+:deep(.button-vue) {
+ font-weight: normal !important;
+
+ * {
+ font-weight: normal !important;
+ }
+}
+</style>
diff --git a/apps/files/src/components/FileListFilter/FileListFilterModified.vue b/apps/files/src/components/FileListFilter/FileListFilterModified.vue
new file mode 100644
index 00000000000..3a843b2bc3e
--- /dev/null
+++ b/apps/files/src/components/FileListFilter/FileListFilterModified.vue
@@ -0,0 +1,107 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <FileListFilter :is-active="isActive"
+ :filter-name="t('files', 'Modified')"
+ @reset-filter="resetFilter">
+ <template #icon>
+ <NcIconSvgWrapper :path="mdiCalendarRangeOutline" />
+ </template>
+ <NcActionButton v-for="preset of timePresets"
+ :key="preset.id"
+ type="radio"
+ close-after-click
+ :model-value.sync="selectedOption"
+ :value="preset.id">
+ {{ preset.label }}
+ </NcActionButton>
+ <!-- TODO: Custom time range -->
+ </FileListFilter>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+import type { ITimePreset } from '../../filters/ModifiedFilter.ts'
+
+import { mdiCalendarRangeOutline } from '@mdi/js'
+import { translate as t } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import FileListFilter from './FileListFilter.vue'
+
+export default defineComponent({
+ components: {
+ FileListFilter,
+ NcActionButton,
+ NcIconSvgWrapper,
+ },
+
+ props: {
+ timePresets: {
+ type: Array as PropType<ITimePreset[]>,
+ required: true,
+ },
+ },
+
+ setup() {
+ return {
+ // icons used in template
+ mdiCalendarRangeOutline,
+ }
+ },
+
+ data() {
+ return {
+ selectedOption: null as string | null,
+ timeRangeEnd: null as number | null,
+ timeRangeStart: null as number | null,
+ }
+ },
+
+ computed: {
+ /**
+ * Is the filter currently active
+ */
+ isActive() {
+ return this.selectedOption !== null
+ },
+
+ currentPreset() {
+ return this.timePresets.find(({ id }) => id === this.selectedOption) ?? null
+ },
+ },
+
+ watch: {
+ selectedOption() {
+ if (this.selectedOption === null) {
+ this.$emit('update:preset')
+ } else {
+ const preset = this.currentPreset
+ this.$emit('update:preset', preset)
+ }
+ },
+ },
+
+ methods: {
+ t,
+
+ resetFilter() {
+ this.selectedOption = null
+ this.timeRangeEnd = null
+ this.timeRangeStart = null
+ },
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.files-list-filter-time {
+ &__clear-button :deep(.action-button__text) {
+ color: var(--color-error-text);
+ }
+}
+</style>
diff --git a/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue b/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue
new file mode 100644
index 00000000000..938be171f6d
--- /dev/null
+++ b/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue
@@ -0,0 +1,47 @@
+<!--
+ - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <NcButton v-show="isVisible" @click="onClick">
+ {{ t('files', 'Search everywhere') }}
+ </NcButton>
+</template>
+
+<script setup lang="ts">
+import { t } from '@nextcloud/l10n'
+import { ref } from 'vue'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import { getPinia } from '../../store/index.ts'
+import { useSearchStore } from '../../store/search.ts'
+
+const isVisible = ref(false)
+
+defineExpose({
+ hideButton,
+ showButton,
+})
+
+/**
+ * Hide the button - called by the filter class
+ */
+function hideButton() {
+ isVisible.value = false
+}
+
+/**
+ * Show the button - called by the filter class
+ */
+function showButton() {
+ isVisible.value = true
+}
+
+/**
+ * Button click handler to make the filtering a global search.
+ */
+function onClick() {
+ const searchStore = useSearchStore(getPinia())
+ searchStore.scope = 'globally'
+}
+</script>
diff --git a/apps/files/src/components/FileListFilter/FileListFilterType.vue b/apps/files/src/components/FileListFilter/FileListFilterType.vue
new file mode 100644
index 00000000000..d3ad791513f
--- /dev/null
+++ b/apps/files/src/components/FileListFilter/FileListFilterType.vue
@@ -0,0 +1,122 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <FileListFilter class="file-list-filter-type"
+ :is-active="isActive"
+ :filter-name="t('files', 'Type')"
+ @reset-filter="resetFilter">
+ <template #icon>
+ <NcIconSvgWrapper :path="mdiFileOutline" />
+ </template>
+ <NcActionButton v-for="fileType of typePresets"
+ :key="fileType.id"
+ type="checkbox"
+ :model-value="selectedOptions.includes(fileType)"
+ @click="toggleOption(fileType)">
+ <template #icon>
+ <NcIconSvgWrapper :svg="fileType.icon" />
+ </template>
+ {{ fileType.label }}
+ </NcActionButton>
+ </FileListFilter>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+import type { ITypePreset } from '../../filters/TypeFilter.ts'
+
+import { mdiFileOutline } from '@mdi/js'
+import { translate as t } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import FileListFilter from './FileListFilter.vue'
+
+export default defineComponent({
+ name: 'FileListFilterType',
+
+ components: {
+ FileListFilter,
+ NcActionButton,
+ NcIconSvgWrapper,
+ },
+
+ props: {
+ presets: {
+ type: Array as PropType<ITypePreset[]>,
+ default: () => [],
+ },
+ typePresets: {
+ type: Array as PropType<ITypePreset[]>,
+ required: true,
+ },
+ },
+
+ setup() {
+ return {
+ mdiFileOutline,
+ t,
+ }
+ },
+
+ data() {
+ return {
+ selectedOptions: [] as ITypePreset[],
+ }
+ },
+
+ computed: {
+ isActive() {
+ return this.selectedOptions.length > 0
+ },
+ },
+
+ watch: {
+ /** Reset selected options if property is changed */
+ presets() {
+ this.selectedOptions = this.presets ?? []
+ },
+ selectedOptions(newValue, oldValue) {
+ if (this.selectedOptions.length === 0) {
+ if (oldValue.length !== 0) {
+ this.$emit('update:presets')
+ }
+ } else {
+ this.$emit('update:presets', this.selectedOptions)
+ }
+ },
+ },
+
+ mounted() {
+ this.selectedOptions = this.presets ?? []
+ },
+
+ methods: {
+ resetFilter() {
+ this.selectedOptions = []
+ },
+
+ /**
+ * Toggle option from selected option
+ * @param option The option to toggle
+ */
+ toggleOption(option: ITypePreset) {
+ const idx = this.selectedOptions.indexOf(option)
+ if (idx !== -1) {
+ this.selectedOptions.splice(idx, 1)
+ } else {
+ this.selectedOptions.push(option)
+ }
+ },
+ },
+})
+</script>
+
+<style>
+.file-list-filter-type {
+ max-width: 220px;
+}
+</style>
diff --git a/apps/files/src/components/FileListFilters.vue b/apps/files/src/components/FileListFilters.vue
new file mode 100644
index 00000000000..7f0d71fd85a
--- /dev/null
+++ b/apps/files/src/components/FileListFilters.vue
@@ -0,0 +1,74 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <div class="file-list-filters">
+ <div class="file-list-filters__filter" data-cy-files-filters>
+ <span v-for="filter of visualFilters"
+ :key="filter.id"
+ ref="filterElements" />
+ </div>
+ <ul v-if="activeChips.length > 0" class="file-list-filters__active" :aria-label="t('files', 'Active filters')">
+ <li v-for="(chip, index) of activeChips" :key="index">
+ <NcChip :aria-label-close="t('files', 'Remove filter')"
+ :icon-svg="chip.icon"
+ :text="chip.text"
+ @close="chip.onclick">
+ <template v-if="chip.user" #icon>
+ <NcAvatar disable-menu
+ :show-user-status="false"
+ :size="24"
+ :user="chip.user" />
+ </template>
+ </NcChip>
+ </li>
+ </ul>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { t } from '@nextcloud/l10n'
+import { computed, ref, watchEffect } from 'vue'
+import { useFiltersStore } from '../store/filters.ts'
+
+import NcAvatar from '@nextcloud/vue/components/NcAvatar'
+import NcChip from '@nextcloud/vue/components/NcChip'
+
+const filterStore = useFiltersStore()
+const visualFilters = computed(() => filterStore.filtersWithUI)
+const activeChips = computed(() => filterStore.activeChips)
+
+const filterElements = ref<HTMLElement[]>([])
+watchEffect(() => {
+ filterElements.value
+ .forEach((el, index) => visualFilters.value[index].mount(el))
+})
+</script>
+
+<style scoped lang="scss">
+.file-list-filters {
+ display: flex;
+ flex-direction: column;
+ gap: var(--default-grid-baseline);
+ height: 100%;
+ width: 100%;
+
+ &__filter {
+ display: flex;
+ align-items: start;
+ justify-content: start;
+ gap: calc(var(--default-grid-baseline, 4px) * 2);
+
+ > * {
+ flex: 0 1 fit-content;
+ }
+ }
+
+ &__active {
+ display: flex;
+ flex-direction: row;
+ gap: calc(var(--default-grid-baseline, 4px) * 2);
+ }
+}
+</style>
diff --git a/apps/files/src/components/FilesListHeader.vue b/apps/files/src/components/FilesListHeader.vue
new file mode 100644
index 00000000000..31458398028
--- /dev/null
+++ b/apps/files/src/components/FilesListHeader.vue
@@ -0,0 +1,100 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <div v-show="enabled" :class="`files-list__header-${header.id}`">
+ <span ref="mount" />
+ </div>
+</template>
+
+<script lang="ts">
+import type { Folder, Header, View } from '@nextcloud/files'
+import type { PropType } from 'vue'
+
+import PQueue from 'p-queue'
+
+import logger from '../logger.ts'
+
+/**
+ * This component is used to render custom
+ * elements provided by an API. Vue doesn't allow
+ * to directly render an HTMLElement, so we can do
+ * this magic here.
+ */
+export default {
+ name: 'FilesListHeader',
+ props: {
+ header: {
+ type: Object as PropType<Header>,
+ required: true,
+ },
+ currentFolder: {
+ type: Object as PropType<Folder>,
+ required: true,
+ },
+ currentView: {
+ type: Object as PropType<View>,
+ required: true,
+ },
+ },
+ setup() {
+ // Create a queue to ensure that the header is only rendered once at a time
+ const queue = new PQueue({ concurrency: 1 })
+
+ return {
+ queue,
+ }
+ },
+ computed: {
+ enabled() {
+ return this.header.enabled?.(this.currentFolder, this.currentView) ?? true
+ },
+ },
+ watch: {
+ enabled(enabled) {
+ if (!enabled) {
+ return
+ }
+ // If the header is enabled, we need to render it
+ logger.debug(`Enabled ${this.header.id} FilesListHeader`, { header: this.header })
+ this.queueUpdate(this.currentFolder, this.currentView)
+ },
+ currentFolder(folder: Folder) {
+ // This method can be used to queue an update of the header
+ // It will ensure that the header is only updated once at a time
+ this.queueUpdate(folder, this.currentView)
+ },
+ currentView(view: View) {
+ this.queueUpdate(this.currentFolder, view)
+ },
+ },
+
+ mounted() {
+ logger.debug(`Mounted ${this.header.id} FilesListHeader`, { header: this.header })
+ const initialRender = () => this.header.render(this.$refs.mount as HTMLElement, this.currentFolder, this.currentView)
+ this.queue.add(initialRender).then(() => {
+ logger.debug(`Rendered ${this.header.id} FilesListHeader`, { header: this.header })
+ }).catch((error) => {
+ logger.error(`Error rendering ${this.header.id} FilesListHeader`, { header: this.header, error })
+ })
+ },
+ destroyed() {
+ logger.debug(`Destroyed ${this.header.id} FilesListHeader`, { header: this.header })
+ },
+
+ methods: {
+ queueUpdate(currentFolder: Folder, currentView: View) {
+ // This method can be used to queue an update of the header
+ // It will ensure that the header is only updated once at a time
+ this.queue.add(() => this.header.updated(currentFolder, currentView))
+ .then(() => {
+ logger.debug(`Updated ${this.header.id} FilesListHeader`, { header: this.header })
+ })
+ .catch((error) => {
+ logger.error(`Error updating ${this.header.id} FilesListHeader`, { header: this.header, error })
+ })
+ },
+ },
+}
+</script>
diff --git a/apps/files/src/components/FilesListTableFooter.vue b/apps/files/src/components/FilesListTableFooter.vue
new file mode 100644
index 00000000000..9e8cdc159ee
--- /dev/null
+++ b/apps/files/src/components/FilesListTableFooter.vue
@@ -0,0 +1,164 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <tr>
+ <th class="files-list__row-checkbox">
+ <!-- TRANSLATORS Label for a table footer which summarizes the columns of the table -->
+ <span class="hidden-visually">{{ t('files', 'Total rows summary') }}</span>
+ </th>
+
+ <!-- Link to file -->
+ <td class="files-list__row-name">
+ <!-- Icon or preview -->
+ <span class="files-list__row-icon" />
+
+ <!-- Summary -->
+ <span>{{ summary }}</span>
+ </td>
+
+ <!-- Actions -->
+ <td class="files-list__row-actions" />
+
+ <!-- Mime -->
+ <td v-if="isMimeAvailable"
+ class="files-list__column files-list__row-mime" />
+
+ <!-- Size -->
+ <td v-if="isSizeAvailable"
+ class="files-list__column files-list__row-size">
+ <span>{{ totalSize }}</span>
+ </td>
+
+ <!-- Mtime -->
+ <td v-if="isMtimeAvailable"
+ class="files-list__column files-list__row-mtime" />
+
+ <!-- Custom views columns -->
+ <th v-for="column in columns"
+ :key="column.id"
+ :class="classForColumn(column)">
+ <span>{{ column.summary?.(nodes, currentView) }}</span>
+ </th>
+ </tr>
+</template>
+
+<script lang="ts">
+import type { Node } from '@nextcloud/files'
+import type { PropType } from 'vue'
+
+import { View, formatFileSize } from '@nextcloud/files'
+import { translate } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import { useFilesStore } from '../store/files.ts'
+import { usePathsStore } from '../store/paths.ts'
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+
+export default defineComponent({
+ name: 'FilesListTableFooter',
+
+ props: {
+ currentView: {
+ type: View,
+ required: true,
+ },
+ isMimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ isMtimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ isSizeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ nodes: {
+ type: Array as PropType<Node[]>,
+ required: true,
+ },
+ summary: {
+ type: String,
+ default: '',
+ },
+ filesListWidth: {
+ type: Number,
+ default: 0,
+ },
+ },
+
+ setup() {
+ const pathsStore = usePathsStore()
+ const filesStore = useFilesStore()
+ const { directory } = useRouteParameters()
+ return {
+ filesStore,
+ pathsStore,
+ directory,
+ }
+ },
+
+ computed: {
+ currentFolder() {
+ if (!this.currentView?.id) {
+ return
+ }
+
+ if (this.directory === '/') {
+ return this.filesStore.getRoot(this.currentView.id)
+ }
+ const fileId = this.pathsStore.getPath(this.currentView.id, this.directory)!
+ return this.filesStore.getNode(fileId)
+ },
+
+ columns() {
+ // Hide columns if the list is too small
+ if (this.filesListWidth < 512) {
+ return []
+ }
+ return this.currentView?.columns || []
+ },
+
+ totalSize() {
+ // If we have the size already, let's use it
+ if (this.currentFolder?.size) {
+ return formatFileSize(this.currentFolder.size, true)
+ }
+
+ // Otherwise let's compute it
+ return formatFileSize(this.nodes.reduce((total, node) => total + (node.size ?? 0), 0), true)
+ },
+ },
+
+ methods: {
+ classForColumn(column) {
+ return {
+ 'files-list__row-column-custom': true,
+ [`files-list__row-${this.currentView.id}-${column.id}`]: true,
+ }
+ },
+
+ t: translate,
+ },
+})
+</script>
+
+<style scoped lang="scss">
+// Scoped row
+tr {
+ margin-bottom: var(--body-container-margin);
+ border-top: 1px solid var(--color-border);
+ // Prevent hover effect on the whole row
+ background-color: transparent !important;
+ border-bottom: none !important;
+
+ td {
+ user-select: none;
+ // Make sure the cell colors don't apply to column headers
+ color: var(--color-text-maxcontrast) !important;
+ }
+}
+</style>
diff --git a/apps/files/src/components/FilesListTableHeader.vue b/apps/files/src/components/FilesListTableHeader.vue
new file mode 100644
index 00000000000..23e631199eb
--- /dev/null
+++ b/apps/files/src/components/FilesListTableHeader.vue
@@ -0,0 +1,237 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <tr class="files-list__row-head">
+ <th class="files-list__column files-list__row-checkbox"
+ @keyup.esc.exact="resetSelection">
+ <NcCheckboxRadioSwitch v-bind="selectAllBind" data-cy-files-list-selection-checkbox @update:checked="onToggleAll" />
+ </th>
+
+ <!-- Columns display -->
+
+ <!-- Link to file -->
+ <th class="files-list__column files-list__row-name files-list__column--sortable"
+ :aria-sort="ariaSortForMode('basename')">
+ <!-- Icon or preview -->
+ <span class="files-list__row-icon" />
+
+ <!-- Name -->
+ <FilesListTableHeaderButton :name="t('files', 'Name')" mode="basename" />
+ </th>
+
+ <!-- Actions -->
+ <th class="files-list__row-actions" />
+
+ <!-- Mime -->
+ <th v-if="isMimeAvailable"
+ class="files-list__column files-list__row-mime"
+ :class="{ 'files-list__column--sortable': isMimeAvailable }"
+ :aria-sort="ariaSortForMode('mime')">
+ <FilesListTableHeaderButton :name="t('files', 'File type')" mode="mime" />
+ </th>
+
+ <!-- Size -->
+ <th v-if="isSizeAvailable"
+ class="files-list__column files-list__row-size"
+ :class="{ 'files-list__column--sortable': isSizeAvailable }"
+ :aria-sort="ariaSortForMode('size')">
+ <FilesListTableHeaderButton :name="t('files', 'Size')" mode="size" />
+ </th>
+
+ <!-- Mtime -->
+ <th v-if="isMtimeAvailable"
+ class="files-list__column files-list__row-mtime"
+ :class="{ 'files-list__column--sortable': isMtimeAvailable }"
+ :aria-sort="ariaSortForMode('mtime')">
+ <FilesListTableHeaderButton :name="t('files', 'Modified')" mode="mtime" />
+ </th>
+
+ <!-- Custom views columns -->
+ <th v-for="column in columns"
+ :key="column.id"
+ :class="classForColumn(column)"
+ :aria-sort="ariaSortForMode(column.id)">
+ <FilesListTableHeaderButton v-if="!!column.sort" :name="column.title" :mode="column.id" />
+ <span v-else>
+ {{ column.title }}
+ </span>
+ </th>
+ </tr>
+</template>
+
+<script lang="ts">
+import type { Node } from '@nextcloud/files'
+import type { PropType } from 'vue'
+import type { FileSource } from '../types.ts'
+
+import { translate as t } from '@nextcloud/l10n'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+import { defineComponent } from 'vue'
+import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
+
+import { useFilesStore } from '../store/files.ts'
+import { useNavigation } from '../composables/useNavigation'
+import { useSelectionStore } from '../store/selection.ts'
+import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue'
+import filesSortingMixin from '../mixins/filesSorting.ts'
+import logger from '../logger.ts'
+
+export default defineComponent({
+ name: 'FilesListTableHeader',
+
+ components: {
+ FilesListTableHeaderButton,
+ NcCheckboxRadioSwitch,
+ },
+
+ mixins: [
+ filesSortingMixin,
+ ],
+
+ props: {
+ isMimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ isMtimeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ isSizeAvailable: {
+ type: Boolean,
+ default: false,
+ },
+ nodes: {
+ type: Array as PropType<Node[]>,
+ required: true,
+ },
+ filesListWidth: {
+ type: Number,
+ default: 0,
+ },
+ },
+
+ setup() {
+ const filesStore = useFilesStore()
+ const selectionStore = useSelectionStore()
+ const { currentView } = useNavigation()
+
+ return {
+ filesStore,
+ selectionStore,
+
+ currentView,
+ }
+ },
+
+ computed: {
+ columns() {
+ // Hide columns if the list is too small
+ if (this.filesListWidth < 512) {
+ return []
+ }
+ return this.currentView?.columns || []
+ },
+
+ dir() {
+ // Remove any trailing slash but leave root slash
+ return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1')
+ },
+
+ selectAllBind() {
+ const label = t('files', 'Toggle selection for all files and folders')
+ return {
+ 'aria-label': label,
+ checked: this.isAllSelected,
+ indeterminate: this.isSomeSelected,
+ title: label,
+ }
+ },
+
+ selectedNodes() {
+ return this.selectionStore.selected
+ },
+
+ isAllSelected() {
+ return this.selectedNodes.length === this.nodes.length
+ },
+
+ isNoneSelected() {
+ return this.selectedNodes.length === 0
+ },
+
+ isSomeSelected() {
+ return !this.isAllSelected && !this.isNoneSelected
+ },
+ },
+
+ created() {
+ // ctrl+a selects all
+ useHotKey('a', this.onToggleAll, {
+ ctrl: true,
+ stop: true,
+ prevent: true,
+ })
+
+ // Escape key cancels selection
+ useHotKey('Escape', this.resetSelection, {
+ stop: true,
+ prevent: true,
+ })
+ },
+
+ methods: {
+ ariaSortForMode(mode: string): 'ascending'|'descending'|null {
+ if (this.sortingMode === mode) {
+ return this.isAscSorting ? 'ascending' : 'descending'
+ }
+ return null
+ },
+
+ classForColumn(column) {
+ return {
+ 'files-list__column': true,
+ 'files-list__column--sortable': !!column.sort,
+ 'files-list__row-column-custom': true,
+ [`files-list__row-${this.currentView?.id}-${column.id}`]: true,
+ }
+ },
+
+ onToggleAll(selected = true) {
+ if (selected) {
+ const selection = this.nodes.map(node => node.source).filter(Boolean) as FileSource[]
+ logger.debug('Added all nodes to selection', { selection })
+ this.selectionStore.setLastIndex(null)
+ this.selectionStore.set(selection)
+ } else {
+ logger.debug('Cleared selection')
+ this.selectionStore.reset()
+ }
+ },
+
+ resetSelection() {
+ if (this.isNoneSelected) {
+ return
+ }
+ this.selectionStore.reset()
+ },
+
+ t,
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.files-list__column {
+ user-select: none;
+ // Make sure the cell colors don't apply to column headers
+ color: var(--color-text-maxcontrast) !important;
+
+ &--sortable {
+ cursor: pointer;
+ }
+}
+
+</style>
diff --git a/apps/files/src/components/FilesListTableHeaderActions.vue b/apps/files/src/components/FilesListTableHeaderActions.vue
new file mode 100644
index 00000000000..6a808355c58
--- /dev/null
+++ b/apps/files/src/components/FilesListTableHeaderActions.vue
@@ -0,0 +1,337 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <div class="files-list__column files-list__row-actions-batch" data-cy-files-list-selection-actions>
+ <NcActions ref="actionsMenu"
+ container="#app-content-vue"
+ :boundaries-element="boundariesElement"
+ :disabled="!!loading || areSomeNodesLoading"
+ :force-name="true"
+ :inline="enabledInlineActions.length"
+ :menu-name="enabledInlineActions.length <= 1 ? t('files', 'Actions') : null"
+ :open.sync="openedMenu"
+ @close="openedSubmenu = null">
+ <!-- Default actions list-->
+ <NcActionButton v-for="action in enabledMenuActions"
+ :key="action.id"
+ :ref="`action-batch-${action.id}`"
+ :class="{
+ [`files-list__row-actions-batch-${action.id}`]: true,
+ [`files-list__row-actions-batch--menu`]: isValidMenu(action)
+ }"
+ :close-after-click="!isValidMenu(action)"
+ :data-cy-files-list-selection-action="action.id"
+ :is-menu="isValidMenu(action)"
+ :aria-label="action.displayName(nodes, currentView) + ' ' + t('files', '(selected)') /** TRANSLATORS: Selected like 'selected files and folders' */"
+ :title="action.title?.(nodes, currentView)"
+ @click="onActionClick(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="loading === action.id" :size="18" />
+ <NcIconSvgWrapper v-else :svg="action.iconSvgInline(nodes, currentView)" />
+ </template>
+ {{ action.displayName(nodes, currentView) }}
+ </NcActionButton>
+
+ <!-- Submenu actions list-->
+ <template v-if="openedSubmenu && enabledSubmenuActions[openedSubmenu?.id]">
+ <!-- Back to top-level button -->
+ <NcActionButton class="files-list__row-actions-batch-back" data-cy-files-list-selection-action="menu-back" @click="onBackToMenuClick(openedSubmenu)">
+ <template #icon>
+ <ArrowLeftIcon />
+ </template>
+ {{ t('files', 'Back') }}
+ </NcActionButton>
+ <NcActionSeparator />
+
+ <!-- Submenu actions -->
+ <NcActionButton v-for="action in enabledSubmenuActions[openedSubmenu?.id]"
+ :key="action.id"
+ :class="`files-list__row-actions-batch-${action.id}`"
+ class="files-list__row-actions-batch--submenu"
+ close-after-click
+ :data-cy-files-list-selection-action="action.id"
+ :aria-label="action.displayName(nodes, currentView) + ' ' + t('files', '(selected)') /** TRANSLATORS: Selected like 'selected files and folders' */"
+ :title="action.title?.(nodes, currentView)"
+ @click="onActionClick(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="loading === action.id" :size="18" />
+ <NcIconSvgWrapper v-else :svg="action.iconSvgInline(nodes, currentView)" />
+ </template>
+ {{ action.displayName(nodes, currentView) }}
+ </NcActionButton>
+ </template>
+ </NcActions>
+ </div>
+</template>
+
+<script lang="ts">
+import type { FileAction, Node, View } from '@nextcloud/files'
+import type { PropType } from 'vue'
+import type { FileSource } from '../types'
+
+import { getFileActions, NodeStatus, DefaultType } from '@nextcloud/files'
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { translate } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcActions from '@nextcloud/vue/components/NcActions'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
+
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import { useActionsMenuStore } from '../store/actionsmenu.ts'
+import { useFilesStore } from '../store/files.ts'
+import { useSelectionStore } from '../store/selection.ts'
+import actionsMixins from '../mixins/actionsMixin.ts'
+import logger from '../logger.ts'
+
+// The registered actions list
+const actions = getFileActions()
+
+export default defineComponent({
+ name: 'FilesListTableHeaderActions',
+
+ components: {
+ ArrowLeftIcon,
+ NcActions,
+ NcActionButton,
+ NcIconSvgWrapper,
+ NcLoadingIcon,
+ },
+
+ mixins: [actionsMixins],
+
+ props: {
+ currentView: {
+ type: Object as PropType<View>,
+ required: true,
+ },
+ selectedNodes: {
+ type: Array as PropType<FileSource[]>,
+ default: () => ([]),
+ },
+ },
+
+ setup() {
+ const actionsMenuStore = useActionsMenuStore()
+ const filesStore = useFilesStore()
+ const selectionStore = useSelectionStore()
+ const fileListWidth = useFileListWidth()
+ const { directory } = useRouteParameters()
+
+ const boundariesElement = document.getElementById('app-content-vue')
+
+ return {
+ directory,
+ fileListWidth,
+
+ actionsMenuStore,
+ filesStore,
+ selectionStore,
+
+ boundariesElement,
+ }
+ },
+
+ data() {
+ return {
+ loading: null,
+ }
+ },
+
+ computed: {
+ enabledFileActions(): FileAction[] {
+ return actions
+ // We don't handle renderInline actions in this component
+ .filter(action => !action.renderInline)
+ // We don't handle actions that are not visible
+ .filter(action => action.default !== DefaultType.HIDDEN)
+ .filter(action => !action.enabled || action.enabled(this.nodes, this.currentView))
+ .sort((a, b) => (a.order || 0) - (b.order || 0))
+ },
+
+ /**
+ * Return the list of enabled actions that are
+ * allowed to be rendered inlined.
+ * This means that they are not within a menu, nor
+ * being the parent of submenu actions.
+ */
+ enabledInlineActions(): FileAction[] {
+ return this.enabledFileActions
+ // Remove all actions that are not top-level actions
+ .filter(action => action.parent === undefined)
+ // Remove all actions that are not batch actions
+ .filter(action => action.execBatch !== undefined)
+ // Remove all top-menu entries
+ .filter(action => !this.isValidMenu(action))
+ // Return a maximum actions to fit the screen
+ .slice(0, this.inlineActions)
+ },
+
+ /**
+ * Return the rest of enabled actions that are not
+ * rendered inlined.
+ */
+ enabledMenuActions(): FileAction[] {
+ // If we're in a submenu, only render the inline
+ // actions before the filtered submenu
+ if (this.openedSubmenu) {
+ return this.enabledInlineActions
+ }
+
+ // We filter duplicates to prevent inline actions to be shown twice
+ const actions = this.enabledFileActions.filter((value, index, self) => {
+ return index === self.findIndex(action => action.id === value.id)
+ })
+
+ // Generate list of all top-level actions ids
+ const childrenActionsIds = actions.filter(action => action.parent).map(action => action.parent) as string[]
+
+ const menuActions = actions
+ .filter(action => {
+ // If the action is not a batch action, we need
+ // to make sure it's a top-level parent entry
+ // and that we have some children actions bound to it
+ if (!action.execBatch) {
+ return childrenActionsIds.includes(action.id)
+ }
+
+ // Rendering second-level actions is done in the template
+ // when openedSubmenu is set.
+ if (action.parent) {
+ return false
+ }
+
+ return true
+ })
+ .filter(action => !this.enabledInlineActions.includes(action))
+
+ // Make sure we render the inline actions first
+ // and then the rest of the actions.
+ // We do NOT want nested actions to be rendered inlined
+ return [...this.enabledInlineActions, ...menuActions]
+ },
+
+ nodes() {
+ return this.selectedNodes
+ .map(source => this.getNode(source))
+ .filter(Boolean) as Node[]
+ },
+
+ areSomeNodesLoading() {
+ return this.nodes.some(node => node.status === NodeStatus.LOADING)
+ },
+
+ openedMenu: {
+ get() {
+ return this.actionsMenuStore.opened === 'global'
+ },
+ set(opened) {
+ this.actionsMenuStore.opened = opened ? 'global' : null
+ },
+ },
+
+ inlineActions() {
+ if (this.fileListWidth < 512) {
+ return 0
+ }
+ if (this.fileListWidth < 768) {
+ return 1
+ }
+ if (this.fileListWidth < 1024) {
+ return 2
+ }
+ return 3
+ },
+ },
+
+ methods: {
+ /**
+ * Get a cached note from the store
+ *
+ * @param source The source of the node to get
+ */
+ getNode(source: string): Node|undefined {
+ return this.filesStore.getNode(source)
+ },
+
+ async onActionClick(action) {
+ // If the action is a submenu, we open it
+ if (this.enabledSubmenuActions[action.id]) {
+ this.openedSubmenu = action
+ return
+ }
+
+ let displayName = action.id
+ try {
+ displayName = action.displayName(this.nodes, this.currentView)
+ } catch (error) {
+ logger.error('Error while getting action display name', { action, error })
+ }
+
+ const selectionSources = this.selectedNodes
+ try {
+ // Set loading markers
+ this.loading = action.id
+ this.nodes.forEach(node => {
+ this.$set(node, 'status', NodeStatus.LOADING)
+ })
+
+ // Dispatch action execution
+ const results = await action.execBatch(this.nodes, this.currentView, this.directory)
+
+ // Check if all actions returned null
+ if (!results.some(result => result !== null)) {
+ // If the actions returned null, we stay silent
+ this.selectionStore.reset()
+ return
+ }
+
+ // Handle potential failures
+ if (results.some(result => result === false)) {
+ // Remove the failed ids from the selection
+ const failedSources = selectionSources
+ .filter((source, index) => results[index] === false)
+ this.selectionStore.set(failedSources)
+
+ if (results.some(result => result === null)) {
+ // If some actions returned null, we assume that the dev
+ // is handling the error messages and we stay silent
+ return
+ }
+
+ showError(this.t('files', '{displayName}: failed on some elements', { displayName }))
+ return
+ }
+
+ // Show success message and clear selection
+ showSuccess(this.t('files', '{displayName}: done', { displayName }))
+ this.selectionStore.reset()
+ } catch (e) {
+ logger.error('Error while executing action', { action, e })
+ showError(this.t('files', '{displayName}: failed', { displayName }))
+ } finally {
+ // Remove loading markers
+ this.loading = null
+ this.nodes.forEach(node => {
+ this.$set(node, 'status', undefined)
+ })
+ }
+ },
+
+ t: translate,
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.files-list__row-actions-batch {
+ flex: 1 1 100% !important;
+ max-width: 100%;
+}
+</style>
diff --git a/apps/files/src/components/FilesListTableHeaderButton.vue b/apps/files/src/components/FilesListTableHeaderButton.vue
new file mode 100644
index 00000000000..d2e14a5495f
--- /dev/null
+++ b/apps/files/src/components/FilesListTableHeaderButton.vue
@@ -0,0 +1,91 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcButton :class="['files-list__column-sort-button', {
+ 'files-list__column-sort-button--active': sortingMode === mode,
+ 'files-list__column-sort-button--size': sortingMode === 'size',
+ }]"
+ :alignment="mode === 'size' ? 'end' : 'start-reverse'"
+ type="tertiary"
+ :title="name"
+ @click="toggleSortBy(mode)">
+ <template #icon>
+ <MenuUp v-if="sortingMode !== mode || isAscSorting" class="files-list__column-sort-button-icon" />
+ <MenuDown v-else class="files-list__column-sort-button-icon" />
+ </template>
+ <span class="files-list__column-sort-button-text">{{ name }}</span>
+ </NcButton>
+</template>
+
+<script lang="ts">
+import { translate } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import MenuDown from 'vue-material-design-icons/MenuDown.vue'
+import MenuUp from 'vue-material-design-icons/MenuUp.vue'
+import NcButton from '@nextcloud/vue/components/NcButton'
+
+import filesSortingMixin from '../mixins/filesSorting.ts'
+
+export default defineComponent({
+ name: 'FilesListTableHeaderButton',
+
+ components: {
+ MenuDown,
+ MenuUp,
+ NcButton,
+ },
+
+ mixins: [
+ filesSortingMixin,
+ ],
+
+ props: {
+ name: {
+ type: String,
+ required: true,
+ },
+ mode: {
+ type: String,
+ required: true,
+ },
+ },
+
+ methods: {
+ t: translate,
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.files-list__column-sort-button {
+ // Compensate for cells margin
+ margin: 0 calc(var(--button-padding, var(--cell-margin)) * -1);
+ min-width: calc(100% - 3 * var(--cell-margin))!important;
+
+ &-text {
+ color: var(--color-text-maxcontrast);
+ font-weight: normal;
+ }
+
+ &-icon {
+ color: var(--color-text-maxcontrast);
+ opacity: 0;
+ transition: opacity var(--animation-quick);
+ inset-inline-start: -10px;
+ }
+
+ &--size &-icon {
+ inset-inline-start: 10px;
+ }
+
+ &--active &-icon,
+ &:hover &-icon,
+ &:focus &-icon,
+ &:active &-icon {
+ opacity: 1;
+ }
+}
+</style>
diff --git a/apps/files/src/components/FilesListVirtual.vue b/apps/files/src/components/FilesListVirtual.vue
new file mode 100644
index 00000000000..47b8ef19b19
--- /dev/null
+++ b/apps/files/src/components/FilesListVirtual.vue
@@ -0,0 +1,1035 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <VirtualList ref="table"
+ :data-component="userConfig.grid_view ? FileEntryGrid : FileEntry"
+ :data-key="'source'"
+ :data-sources="nodes"
+ :grid-mode="userConfig.grid_view"
+ :extra-props="{
+ isMimeAvailable,
+ isMtimeAvailable,
+ isSizeAvailable,
+ nodes,
+ }"
+ :scroll-to-index="scrollToIndex"
+ :caption="caption">
+ <template #filters>
+ <FileListFilters />
+ </template>
+
+ <template v-if="!isNoneSelected" #header-overlay>
+ <span class="files-list__selected">
+ {{ n('files', '{count} selected', '{count} selected', selectedNodes.length, { count: selectedNodes.length }) }}
+ </span>
+ <FilesListTableHeaderActions :current-view="currentView"
+ :selected-nodes="selectedNodes" />
+ </template>
+
+ <template #before>
+ <!-- Headers -->
+ <FilesListHeader v-for="header in headers"
+ :key="header.id"
+ :current-folder="currentFolder"
+ :current-view="currentView"
+ :header="header" />
+ </template>
+
+ <!-- Thead-->
+ <template #header>
+ <!-- Table header and sort buttons -->
+ <FilesListTableHeader ref="thead"
+ :files-list-width="fileListWidth"
+ :is-mime-available="isMimeAvailable"
+ :is-mtime-available="isMtimeAvailable"
+ :is-size-available="isSizeAvailable"
+ :nodes="nodes" />
+ </template>
+
+ <!-- Body replacement if no files are available -->
+ <template #empty>
+ <slot name="empty" />
+ </template>
+
+ <!-- Tfoot-->
+ <template #footer>
+ <FilesListTableFooter :current-view="currentView"
+ :files-list-width="fileListWidth"
+ :is-mime-available="isMimeAvailable"
+ :is-mtime-available="isMtimeAvailable"
+ :is-size-available="isSizeAvailable"
+ :nodes="nodes"
+ :summary="summary" />
+ </template>
+ </VirtualList>
+</template>
+
+<script lang="ts">
+import type { UserConfig } from '../types'
+import type { Node as NcNode } from '@nextcloud/files'
+import type { ComponentPublicInstance, PropType } from 'vue'
+
+import { Folder, Permission, View, getFileActions, FileType } from '@nextcloud/files'
+import { showError } from '@nextcloud/dialogs'
+import { subscribe, unsubscribe } from '@nextcloud/event-bus'
+import { n, t } from '@nextcloud/l10n'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+import { defineComponent } from 'vue'
+
+import { action as sidebarAction } from '../actions/sidebarAction.ts'
+import { useActiveStore } from '../store/active.ts'
+import { useFileListHeaders } from '../composables/useFileListHeaders.ts'
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+import { useSelectionStore } from '../store/selection.js'
+import { useUserConfigStore } from '../store/userconfig.ts'
+import logger from '../logger.ts'
+
+import FileEntry from './FileEntry.vue'
+import FileEntryGrid from './FileEntryGrid.vue'
+import FileListFilters from './FileListFilters.vue'
+import FilesListHeader from './FilesListHeader.vue'
+import FilesListTableFooter from './FilesListTableFooter.vue'
+import FilesListTableHeader from './FilesListTableHeader.vue'
+import FilesListTableHeaderActions from './FilesListTableHeaderActions.vue'
+import VirtualList from './VirtualList.vue'
+
+export default defineComponent({
+ name: 'FilesListVirtual',
+
+ components: {
+ FileListFilters,
+ FilesListHeader,
+ FilesListTableFooter,
+ FilesListTableHeader,
+ VirtualList,
+ FilesListTableHeaderActions,
+ },
+
+ props: {
+ currentView: {
+ type: View,
+ required: true,
+ },
+ currentFolder: {
+ type: Folder,
+ required: true,
+ },
+ nodes: {
+ type: Array as PropType<NcNode[]>,
+ required: true,
+ },
+ summary: {
+ type: String,
+ required: true,
+ },
+ },
+
+ setup() {
+ const activeStore = useActiveStore()
+ const selectionStore = useSelectionStore()
+ const userConfigStore = useUserConfigStore()
+
+ const fileListWidth = useFileListWidth()
+ const { fileId, openDetails, openFile } = useRouteParameters()
+
+ return {
+ fileId,
+ fileListWidth,
+ headers: useFileListHeaders(),
+ openDetails,
+ openFile,
+
+ activeStore,
+ selectionStore,
+ userConfigStore,
+
+ n,
+ t,
+ }
+ },
+
+ data() {
+ return {
+ FileEntry,
+ FileEntryGrid,
+ scrollToIndex: 0,
+ }
+ },
+
+ computed: {
+ userConfig(): UserConfig {
+ return this.userConfigStore.userConfig
+ },
+
+ isMimeAvailable() {
+ if (!this.userConfig.show_mime_column) {
+ return false
+ }
+ // Hide mime column on narrow screens
+ if (this.fileListWidth < 1024) {
+ return false
+ }
+ return this.nodes.some(node => node.mime !== undefined || node.mime !== 'application/octet-stream')
+ },
+ isMtimeAvailable() {
+ // Hide mtime column on narrow screens
+ if (this.fileListWidth < 768) {
+ return false
+ }
+ return this.nodes.some(node => node.mtime !== undefined)
+ },
+ isSizeAvailable() {
+ // Hide size column on narrow screens
+ if (this.fileListWidth < 768) {
+ return false
+ }
+ return this.nodes.some(node => node.size !== undefined)
+ },
+
+ cantUpload() {
+ return this.currentFolder && (this.currentFolder.permissions & Permission.CREATE) === 0
+ },
+
+ isQuotaExceeded() {
+ return this.currentFolder?.attributes?.['quota-available-bytes'] === 0
+ },
+
+ caption() {
+ const defaultCaption = t('files', 'List of files and folders.')
+ const viewCaption = this.currentView.caption || defaultCaption
+ const cantUploadCaption = this.cantUpload ? t('files', 'You do not have permission to upload or create files here.') : null
+ const quotaExceededCaption = this.isQuotaExceeded ? t('files', 'You have used your space quota and cannot upload files anymore.') : null
+ const sortableCaption = t('files', 'Column headers with buttons are sortable.')
+ const virtualListNote = t('files', 'This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.')
+ return [
+ viewCaption,
+ cantUploadCaption,
+ quotaExceededCaption,
+ sortableCaption,
+ virtualListNote,
+ ].filter(Boolean).join('\n')
+ },
+
+ selectedNodes() {
+ return this.selectionStore.selected
+ },
+
+ isNoneSelected() {
+ return this.selectedNodes.length === 0
+ },
+
+ isEmpty() {
+ return this.nodes.length === 0
+ },
+ },
+
+ watch: {
+ // If nodes gets populated and we have a fileId,
+ // an openFile or openDetails, we fire the appropriate actions.
+ isEmpty() {
+ this.handleOpenQueries()
+ },
+ fileId() {
+ this.handleOpenQueries()
+ },
+ openFile() {
+ this.handleOpenQueries()
+ },
+ openDetails() {
+ this.handleOpenQueries()
+ },
+ },
+
+ created() {
+ useHotKey('Escape', this.unselectFile, {
+ stop: true,
+ prevent: true,
+ })
+
+ useHotKey(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'], this.onKeyDown, {
+ stop: true,
+ prevent: true,
+ })
+ },
+
+ mounted() {
+ // Add events on parent to cover both the table and DragAndDrop notice
+ const mainContent = window.document.querySelector('main.app-content') as HTMLElement
+ mainContent.addEventListener('dragover', this.onDragOver)
+ subscribe('files:sidebar:closed', this.onSidebarClosed)
+ },
+
+ beforeDestroy() {
+ const mainContent = window.document.querySelector('main.app-content') as HTMLElement
+ mainContent.removeEventListener('dragover', this.onDragOver)
+ unsubscribe('files:sidebar:closed', this.onSidebarClosed)
+ },
+
+ methods: {
+ handleOpenQueries() {
+ // If the list is empty, or we don't have a fileId,
+ // there's nothing to be done.
+ if (this.isEmpty || !this.fileId) {
+ return
+ }
+
+ logger.debug('FilesListVirtual: checking for requested fileId, openFile or openDetails', {
+ nodes: this.nodes,
+ fileId: this.fileId,
+ openFile: this.openFile,
+ openDetails: this.openDetails,
+ })
+
+ if (this.openFile) {
+ this.handleOpenFile(this.fileId)
+ }
+
+ if (this.openDetails) {
+ this.openSidebarForFile(this.fileId)
+ }
+
+ if (this.fileId) {
+ this.scrollToFile(this.fileId, false)
+ }
+ },
+
+ openSidebarForFile(fileId) {
+ // Open the sidebar for the given URL fileid
+ // iif we just loaded the app.
+ const node = this.nodes.find(n => n.fileid === fileId) as NcNode
+ if (node && sidebarAction?.enabled?.([node], this.currentView)) {
+ logger.debug('Opening sidebar on file ' + node.path, { node })
+ sidebarAction.exec(node, this.currentView, this.currentFolder.path)
+ return
+ }
+ logger.warn(`Failed to open sidebar on file ${fileId}, file isn't cached yet !`, { fileId, node })
+ },
+
+ scrollToFile(fileId: number|null, warn = true) {
+ if (fileId) {
+ // Do not uselessly scroll to the top of the list.
+ if (fileId === this.currentFolder.fileid) {
+ return
+ }
+
+ const index = this.nodes.findIndex(node => node.fileid === fileId)
+ if (warn && index === -1 && fileId !== this.currentFolder.fileid) {
+ showError(t('files', 'File not found'))
+ }
+
+ this.scrollToIndex = Math.max(0, index)
+ logger.debug('Scrolling to file ' + fileId, { fileId, index })
+ }
+ },
+
+ /**
+ * Unselect the current file and clear open parameters from the URL
+ */
+ unselectFile() {
+ const query = { ...this.$route.query }
+ delete query.openfile
+ delete query.opendetails
+
+ this.activeStore.activeNode = undefined
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { ...this.$route.params, fileid: String(this.currentFolder.fileid ?? '') },
+ query,
+ true,
+ )
+ },
+
+ // When sidebar is closed, we remove the openDetails parameter from the URL
+ onSidebarClosed() {
+ if (this.openDetails) {
+ const query = { ...this.$route.query }
+ delete query.opendetails
+ window.OCP.Files.Router.goToRoute(
+ null,
+ this.$route.params,
+ query,
+ )
+ }
+ },
+
+ /**
+ * Handle opening a file (e.g. by ?openfile=true)
+ * @param fileId File to open
+ */
+ async handleOpenFile(fileId: number) {
+ const node = this.nodes.find(n => n.fileid === fileId) as NcNode
+ if (node === undefined) {
+ return
+ }
+
+ if (node.type === FileType.File) {
+ const defaultAction = getFileActions()
+ // Get only default actions (visible and hidden)
+ .filter((action) => !!action?.default)
+ // Find actions that are either always enabled or enabled for the current node
+ .filter((action) => !action.enabled || action.enabled([node], this.currentView))
+ .filter((action) => action.id !== 'download')
+ // Sort enabled default actions by order
+ .sort((a, b) => (a.order || 0) - (b.order || 0))
+ // Get the first one
+ .at(0)
+
+ // Some file types do not have a default action (e.g. they can only be downloaded)
+ // So if there is an enabled default action, so execute it
+ if (defaultAction) {
+ logger.debug('Opening file ' + node.path, { node })
+ return await defaultAction.exec(node, this.currentView, this.currentFolder.path)
+ }
+ }
+ // The file is either a folder or has no default action other than downloading
+ // in this case we need to open the details instead and remove the route from the history
+ logger.debug('Ignore `openfile` query and replacing with `opendetails` for ' + node.path, { node })
+ window.OCP.Files.Router.goToRoute(
+ null,
+ this.$route.params,
+ { ...this.$route.query, openfile: undefined, opendetails: '' },
+ true, // silent update of the URL
+ )
+ },
+
+ onDragOver(event: DragEvent) {
+ // Detect if we're only dragging existing files or not
+ const isForeignFile = event.dataTransfer?.types.includes('Files')
+ if (isForeignFile) {
+ // Only handle uploading of existing Nextcloud files
+ // See DragAndDropNotice for handling of foreign files
+ return
+ }
+
+ event.preventDefault()
+ event.stopPropagation()
+
+ const tableElement = (this.$refs.table as ComponentPublicInstance<typeof VirtualList>).$el
+ const tableTop = tableElement.getBoundingClientRect().top
+ const tableBottom = tableTop + tableElement.getBoundingClientRect().height
+
+ // If reaching top, scroll up. Using 100 because of the floating header
+ if (event.clientY < tableTop + 100) {
+ tableElement.scrollTop = tableElement.scrollTop - 25
+ return
+ }
+
+ // If reaching bottom, scroll down
+ if (event.clientY > tableBottom - 50) {
+ tableElement.scrollTop = tableElement.scrollTop + 25
+ }
+ },
+
+ onKeyDown(event: KeyboardEvent) {
+ // Up and down arrow keys
+ if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
+ const columnCount = this.$refs.table?.columnCount ?? 1
+ const index = this.nodes.findIndex(node => node.fileid === this.fileId) ?? 0
+ const nextIndex = event.key === 'ArrowUp' ? index - columnCount : index + columnCount
+ if (nextIndex < 0 || nextIndex >= this.nodes.length) {
+ return
+ }
+
+ const nextNode = this.nodes[nextIndex]
+
+ if (nextNode && nextNode?.fileid) {
+ this.setActiveNode(nextNode)
+ }
+ }
+
+ // if grid mode, left and right arrow keys
+ if (this.userConfig.grid_view && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {
+ const index = this.nodes.findIndex(node => node.fileid === this.fileId) ?? 0
+ const nextIndex = event.key === 'ArrowLeft' ? index - 1 : index + 1
+ if (nextIndex < 0 || nextIndex >= this.nodes.length) {
+ return
+ }
+
+ const nextNode = this.nodes[nextIndex]
+
+ if (nextNode && nextNode?.fileid) {
+ this.setActiveNode(nextNode)
+ }
+ }
+ },
+
+ setActiveNode(node: NcNode & { fileid: number }) {
+ logger.debug('Navigating to file ' + node.path, { node, fileid: node.fileid })
+ this.scrollToFile(node.fileid)
+
+ // Remove openfile and opendetails from the URL
+ const query = { ...this.$route.query }
+ delete query.openfile
+ delete query.opendetails
+
+ this.activeStore.activeNode = node
+
+ // Silent update of the URL
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { ...this.$route.params, fileid: String(node.fileid) },
+ query,
+ true,
+ )
+ },
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.files-list {
+ --row-height: 44px;
+ --cell-margin: 14px;
+
+ --checkbox-padding: calc((var(--row-height) - var(--checkbox-size)) / 2);
+ --checkbox-size: 24px;
+ --clickable-area: var(--default-clickable-area);
+ --icon-preview-size: 24px;
+
+ --fixed-block-start-position: var(--default-clickable-area);
+ display: flex;
+ flex-direction: column;
+ overflow: auto;
+ height: 100%;
+ will-change: scroll-position;
+
+ &:has(.file-list-filters__active) {
+ --fixed-block-start-position: calc(var(--default-clickable-area) + var(--default-grid-baseline) + var(--clickable-area-small));
+ }
+
+ & :deep() {
+ // Table head, body and footer
+ tbody {
+ will-change: padding;
+ contain: layout paint style;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ // Necessary for virtual scrolling absolute
+ position: relative;
+
+ /* Hover effect on tbody lines only */
+ tr {
+ contain: strict;
+ &:hover,
+ &:focus {
+ background-color: var(--color-background-dark);
+ }
+ }
+ }
+
+ // Before table and thead
+ .files-list__before {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .files-list__selected {
+ padding-inline-end: 12px;
+ white-space: nowrap;
+ }
+
+ .files-list__table {
+ display: block;
+
+ &.files-list__table--with-thead-overlay {
+ // Hide the table header below the overlay
+ margin-block-start: calc(-1 * var(--row-height));
+ }
+
+ // Visually hide the table when there are no files
+ &--hidden {
+ visibility: hidden;
+ z-index: -1;
+ opacity: 0;
+ }
+ }
+
+ .files-list__filters {
+ // Pinned on top when scrolling above table header
+ position: sticky;
+ top: 0;
+ // ensure there is a background to hide the file list on scroll
+ background-color: var(--color-main-background);
+ z-index: 10;
+ // fixed the size
+ padding-inline: var(--row-height) var(--default-grid-baseline, 4px);
+ height: var(--fixed-block-start-position);
+ width: 100%;
+ }
+
+ .files-list__thead-overlay {
+ // Pinned on top when scrolling
+ position: sticky;
+ top: var(--fixed-block-start-position);
+ // Save space for a row checkbox
+ margin-inline-start: var(--row-height);
+ // More than .files-list__thead
+ z-index: 20;
+
+ display: flex;
+ align-items: center;
+
+ // Reuse row styles
+ background-color: var(--color-main-background);
+ border-block-end: 1px solid var(--color-border);
+ height: var(--row-height);
+ flex: 0 0 var(--row-height);
+ }
+
+ .files-list__thead,
+ .files-list__tfoot {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ background-color: var(--color-main-background);
+ }
+
+ // Table header
+ .files-list__thead {
+ // Pinned on top when scrolling
+ position: sticky;
+ z-index: 10;
+ top: var(--fixed-block-start-position);
+ }
+
+ // Empty content
+ .files-list__empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ }
+
+ tr {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ border-block-end: 1px solid var(--color-border);
+ box-sizing: border-box;
+ user-select: none;
+ height: var(--row-height);
+ }
+
+ td, th {
+ display: flex;
+ align-items: center;
+ flex: 0 0 auto;
+ justify-content: start;
+ width: var(--row-height);
+ height: var(--row-height);
+ margin: 0;
+ padding: 0;
+ color: var(--color-text-maxcontrast);
+ border: none;
+
+ // Columns should try to add any text
+ // node wrapped in a span. That should help
+ // with the ellipsis on overflow.
+ span {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+
+ .files-list__row--failed {
+ position: absolute;
+ display: block;
+ top: 0;
+ inset-inline: 0;
+ bottom: 0;
+ opacity: .1;
+ z-index: -1;
+ background: var(--color-error);
+ }
+
+ .files-list__row-checkbox {
+ justify-content: center;
+
+ .checkbox-radio-switch {
+ display: flex;
+ justify-content: center;
+
+ --icon-size: var(--checkbox-size);
+
+ label.checkbox-radio-switch__label {
+ width: var(--clickable-area);
+ height: var(--clickable-area);
+ margin: 0;
+ padding: calc((var(--clickable-area) - var(--checkbox-size)) / 2);
+ }
+
+ .checkbox-radio-switch__icon {
+ margin: 0 !important;
+ }
+ }
+ }
+
+ .files-list__row {
+ &:hover, &:focus, &:active, &--active, &--dragover {
+ // WCAG AA compliant
+ background-color: var(--color-background-hover);
+ // text-maxcontrast have been designed to pass WCAG AA over
+ // a white background, we need to adjust then.
+ --color-text-maxcontrast: var(--color-main-text);
+ > * {
+ --color-border: var(--color-border-dark);
+ }
+
+ // Hover state of the row should also change the favorite markers background
+ .favorite-marker-icon svg path {
+ stroke: var(--color-background-hover);
+ }
+ }
+
+ &--dragover * {
+ // Prevent dropping on row children
+ pointer-events: none;
+ }
+ }
+
+ // Entry preview or mime icon
+ .files-list__row-icon {
+ position: relative;
+ display: flex;
+ overflow: visible;
+ align-items: center;
+ // No shrinking or growing allowed
+ flex: 0 0 var(--icon-preview-size);
+ justify-content: center;
+ width: var(--icon-preview-size);
+ height: 100%;
+ // Show same padding as the checkbox right padding for visual balance
+ margin-inline-end: var(--checkbox-padding);
+ color: var(--color-primary-element);
+
+ // Icon is also clickable
+ * {
+ cursor: pointer;
+ }
+
+ & > span {
+ justify-content: flex-start;
+
+ &:not(.files-list__row-icon-favorite) svg {
+ width: var(--icon-preview-size);
+ height: var(--icon-preview-size);
+ }
+
+ // Slightly increase the size of the folder icon
+ &.folder-icon,
+ &.folder-open-icon {
+ margin: -3px;
+ svg {
+ width: calc(var(--icon-preview-size) + 6px);
+ height: calc(var(--icon-preview-size) + 6px);
+ }
+ }
+ }
+
+ &-preview-container {
+ position: relative; // Needed for the blurshash to be positioned correctly
+ overflow: hidden;
+ width: var(--icon-preview-size);
+ height: var(--icon-preview-size);
+ border-radius: var(--border-radius);
+ }
+
+ &-blurhash {
+ position: absolute;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+ height: 100%;
+ width: 100%;
+ object-fit: cover;
+ }
+
+ &-preview {
+ // Center and contain the preview
+ object-fit: contain;
+ object-position: center;
+
+ height: 100%;
+ width: 100%;
+
+ /* Preview not loaded animation effect */
+ &:not(.files-list__row-icon-preview--loaded) {
+ background: var(--color-loading-dark);
+ // animation: preview-gradient-fade 1.2s ease-in-out infinite;
+ }
+ }
+
+ &-favorite {
+ position: absolute;
+ top: 0px;
+ inset-inline-end: -10px;
+ }
+
+ // File and folder overlay
+ &-overlay {
+ position: absolute;
+ max-height: calc(var(--icon-preview-size) * 0.6);
+ max-width: calc(var(--icon-preview-size) * 0.6);
+ color: var(--color-primary-element-text);
+ // better alignment with the folder icon
+ margin-block-start: 2px;
+
+ // Improve icon contrast with a background for files
+ &--file {
+ color: var(--color-main-text);
+ background: var(--color-main-background);
+ border-radius: 100%;
+ }
+ }
+ }
+
+ // Entry link
+ .files-list__row-name {
+ // Prevent link from overflowing
+ overflow: hidden;
+ // Take as much space as possible
+ flex: 1 1 auto;
+
+ button.files-list__row-name-link {
+ display: flex;
+ align-items: center;
+ text-align: start;
+ // Fill cell height and width
+ width: 100%;
+ height: 100%;
+ // Necessary for flex grow to work
+ min-width: 0;
+ margin: 0;
+ padding: 0;
+
+ // Already added to the inner text, see rule below
+ &:focus-visible {
+ outline: none !important;
+ }
+
+ // Keyboard indicator a11y
+ &:focus .files-list__row-name-text {
+ outline: var(--border-width-input-focused) solid var(--color-main-text) !important;
+ border-radius: var(--border-radius-element);
+ }
+ &:focus:not(:focus-visible) .files-list__row-name-text {
+ outline: none !important;
+ }
+ }
+
+ .files-list__row-name-text {
+ color: var(--color-main-text);
+ // Make some space for the outline
+ padding: var(--default-grid-baseline) calc(2 * var(--default-grid-baseline));
+ padding-inline-start: -10px;
+ // Align two name and ext
+ display: inline-flex;
+ }
+
+ .files-list__row-name-ext {
+ color: var(--color-text-maxcontrast);
+ // always show the extension
+ overflow: visible;
+ }
+ }
+
+ // Rename form
+ .files-list__row-rename {
+ width: 100%;
+ max-width: 600px;
+ input {
+ width: 100%;
+ // Align with text, 0 - padding - border
+ margin-inline-start: -8px;
+ padding: 2px 6px;
+ border-width: 2px;
+
+ &:invalid {
+ // Show red border on invalid input
+ border-color: var(--color-error);
+ color: red;
+ }
+ }
+ }
+
+ .files-list__row-actions {
+ // take as much space as necessary
+ width: auto;
+
+ // Add margin to all cells after the actions
+ & ~ td,
+ & ~ th {
+ margin: 0 var(--cell-margin);
+ }
+
+ button {
+ .button-vue__text {
+ // Remove bold from default button styling
+ font-weight: normal;
+ }
+ }
+ }
+
+ .files-list__row-action--inline {
+ margin-inline-end: 7px;
+ }
+
+ .files-list__row-mime,
+ .files-list__row-mtime,
+ .files-list__row-size {
+ color: var(--color-text-maxcontrast);
+ }
+
+ .files-list__row-size {
+ width: calc(var(--row-height) * 2);
+ // Right align content/text
+ justify-content: flex-end;
+ }
+
+ .files-list__row-mtime {
+ width: calc(var(--row-height) * 2.5);
+ }
+
+ .files-list__row-mime {
+ width: calc(var(--row-height) * 3.5);
+ }
+
+ .files-list__row-column-custom {
+ width: calc(var(--row-height) * 2.5);
+ }
+ }
+}
+
+@media screen and (max-width: 512px) {
+ .files-list :deep(.files-list__filters) {
+ // Reduce padding on mobile
+ padding-inline: var(--default-grid-baseline, 4px);
+ }
+}
+
+</style>
+
+<style lang="scss">
+// Grid mode
+.files-list--grid tbody.files-list__tbody {
+ --item-padding: 16px;
+ --icon-preview-size: 166px;
+ --name-height: var(--default-clickable-area);
+ --mtime-height: calc(var(--font-size-small) + var(--default-grid-baseline));
+ --row-width: calc(var(--icon-preview-size) + var(--item-padding) * 2);
+ --row-height: calc(var(--icon-preview-size) + var(--name-height) + var(--mtime-height) + var(--item-padding) * 2);
+ --checkbox-padding: 0px;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, var(--row-width));
+
+ align-content: center;
+ align-items: center;
+ justify-content: space-around;
+ justify-items: center;
+
+ tr {
+ display: flex;
+ flex-direction: column;
+ width: var(--row-width);
+ height: var(--row-height);
+ border: none;
+ border-radius: var(--border-radius-large);
+ padding: var(--item-padding);
+ }
+
+ // Checkbox in the top left
+ .files-list__row-checkbox {
+ position: absolute;
+ z-index: 9;
+ top: calc(var(--item-padding) / 2);
+ inset-inline-start: calc(var(--item-padding) / 2);
+ overflow: hidden;
+ --checkbox-container-size: 44px;
+ width: var(--checkbox-container-size);
+ height: var(--checkbox-container-size);
+
+ // Add a background to the checkbox so we do not see the image through it.
+ .checkbox-radio-switch__content::after {
+ content: '';
+ width: 16px;
+ height: 16px;
+ position: absolute;
+ inset-inline-start: 50%;
+ margin-inline-start: -8px;
+ z-index: -1;
+ background: var(--color-main-background);
+ }
+ }
+
+ // Star icon in the top right
+ .files-list__row-icon-favorite {
+ position: absolute;
+ top: 0;
+ inset-inline-end: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--clickable-area);
+ height: var(--clickable-area);
+ }
+
+ .files-list__row-name {
+ display: flex;
+ flex-direction: column;
+ width: var(--icon-preview-size);
+ height: calc(var(--icon-preview-size) + var(--name-height));
+ // Ensure that the name outline is visible.
+ overflow: visible;
+
+ span.files-list__row-icon {
+ width: var(--icon-preview-size);
+ height: var(--icon-preview-size);
+ }
+
+ .files-list__row-name-text {
+ margin: 0;
+ // Ensure that the outline is not too close to the text.
+ margin-inline-start: -4px;
+ padding: 0px 4px;
+ }
+ }
+
+ .files-list__row-mtime {
+ width: var(--icon-preview-size);
+ height: var(--mtime-height);
+ font-size: var(--font-size-small);
+ }
+
+ .files-list__row-actions {
+ position: absolute;
+ inset-inline-end: calc(var(--clickable-area) / 4);
+ inset-block-end: calc(var(--mtime-height) / 2);
+ width: var(--clickable-area);
+ height: var(--clickable-area);
+ }
+}
+
+@media screen and (max-width: 768px) {
+ // there is no mtime
+ .files-list--grid tbody.files-list__tbody {
+ --mtime-height: 0px;
+
+ // so we move the action to the name
+ .files-list__row-actions {
+ inset-block-end: var(--item-padding);
+ }
+
+ // and we need to keep space on the name for the actions
+ .files-list__row-name-text {
+ padding-inline-end: var(--clickable-area) !important;
+ }
+ }
+}
+</style>
diff --git a/apps/files/src/components/FilesNavigationItem.vue b/apps/files/src/components/FilesNavigationItem.vue
new file mode 100644
index 00000000000..c29bc00c67f
--- /dev/null
+++ b/apps/files/src/components/FilesNavigationItem.vue
@@ -0,0 +1,182 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <Fragment>
+ <NcAppNavigationItem v-for="view in currentViews"
+ :key="view.id"
+ class="files-navigation__item"
+ allow-collapse
+ :loading="view.loading"
+ :data-cy-files-navigation-item="view.id"
+ :exact="useExactRouteMatching(view)"
+ :icon="view.iconClass"
+ :name="view.name"
+ :open="isExpanded(view)"
+ :pinned="view.sticky"
+ :to="generateToNavigation(view)"
+ :style="style"
+ @update:open="(open) => onOpen(open, view)">
+ <template v-if="view.icon" #icon>
+ <NcIconSvgWrapper :svg="view.icon" />
+ </template>
+
+ <!-- Hack to force the collapse icon to be displayed -->
+ <li v-if="view.loadChildViews && !view.loaded" style="display: none" />
+
+ <!-- Recursively nest child views -->
+ <FilesNavigationItem v-if="hasChildViews(view)"
+ :parent="view"
+ :level="level + 1"
+ :views="filterView(views, parent.id)" />
+ </NcAppNavigationItem>
+ </Fragment>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+import type { View } from '@nextcloud/files'
+
+import { defineComponent } from 'vue'
+import { Fragment } from 'vue-frag'
+
+import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+
+import { useNavigation } from '../composables/useNavigation.js'
+import { useViewConfigStore } from '../store/viewConfig.js'
+
+const maxLevel = 7 // Limit nesting to not exceed max call stack size
+
+export default defineComponent({
+ name: 'FilesNavigationItem',
+
+ components: {
+ Fragment,
+ NcAppNavigationItem,
+ NcIconSvgWrapper,
+ },
+
+ props: {
+ parent: {
+ type: Object as PropType<View>,
+ default: () => ({}),
+ },
+ level: {
+ type: Number,
+ default: 0,
+ },
+ views: {
+ type: Object as PropType<Record<string, View[]>>,
+ default: () => ({}),
+ },
+ },
+
+ setup() {
+ const { currentView } = useNavigation()
+ const viewConfigStore = useViewConfigStore()
+ return {
+ currentView,
+ viewConfigStore,
+ }
+ },
+
+ computed: {
+ currentViews(): View[] {
+ if (this.level >= maxLevel) { // Filter for all remaining decendants beyond the max level
+ return (Object.values(this.views).reduce((acc, views) => [...acc, ...views], []) as View[])
+ .filter(view => view.params?.dir.startsWith(this.parent.params?.dir))
+ }
+ return this.filterVisible(this.views[this.parent.id] ?? [])
+ },
+
+ style() {
+ if (this.level === 0 || this.level === 1 || this.level > maxLevel) { // Left-align deepest entry with center of app navigation, do not add any more visual indentation after this level
+ return null
+ }
+ return {
+ 'padding-left': '16px',
+ }
+ },
+ },
+
+ methods: {
+ filterVisible(views: View[]) {
+ return views.filter(({ id, hidden }) => id === this.currentView?.id || hidden !== true)
+ },
+
+ hasChildViews(view: View): boolean {
+ if (this.level >= maxLevel) {
+ return false
+ }
+ return this.filterVisible(this.views[view.id] ?? []).length > 0
+ },
+
+ /**
+ * Only use exact route matching on routes with child views
+ * Because if a view does not have children (like the files view) then multiple routes might be matched for it
+ * Like for the 'files' view this does not work because of optional 'fileid' param so /files and /files/1234 are both in the 'files' view
+ * @param view The view to check
+ */
+ useExactRouteMatching(view: View): boolean {
+ return this.hasChildViews(view)
+ },
+
+ /**
+ * Generate the route to a view
+ * @param view View to generate "to" navigation for
+ */
+ generateToNavigation(view: View) {
+ if (view.params) {
+ const { dir } = view.params
+ return { name: 'filelist', params: { ...view.params }, query: { dir } }
+ }
+ return { name: 'filelist', params: { view: view.id } }
+ },
+
+ /**
+ * Check if a view is expanded by user config
+ * or fallback to the default value.
+ * @param view View to check if expanded
+ */
+ isExpanded(view: View): boolean {
+ return typeof this.viewConfigStore.getConfig(view.id)?.expanded === 'boolean'
+ ? this.viewConfigStore.getConfig(view.id).expanded === true
+ : view.expanded === true
+ },
+
+ /**
+ * Expand/collapse a a view with children and permanently
+ * save this setting in the server.
+ * @param open True if open
+ * @param view View
+ */
+ async onOpen(open: boolean, view: View) {
+ // Invert state
+ const isExpanded = this.isExpanded(view)
+ // Update the view expanded state, might not be necessary
+ view.expanded = !isExpanded
+ this.viewConfigStore.update(view.id, 'expanded', !isExpanded)
+ if (open && view.loadChildViews) {
+ await view.loadChildViews(view)
+ }
+ },
+
+ /**
+ * Return the view map with the specified view id removed
+ *
+ * @param viewMap Map of views
+ * @param id View id
+ */
+ filterView(viewMap: Record<string, View[]>, id: string): Record<string, View[]> {
+ return Object.fromEntries(
+ Object.entries(viewMap)
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ .filter(([viewId, _views]) => viewId !== id),
+ )
+ },
+ },
+})
+</script>
diff --git a/apps/files/src/components/FilesNavigationSearch.vue b/apps/files/src/components/FilesNavigationSearch.vue
new file mode 100644
index 00000000000..0890dffcb39
--- /dev/null
+++ b/apps/files/src/components/FilesNavigationSearch.vue
@@ -0,0 +1,86 @@
+<!--
+ - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<script setup lang="ts">
+import { mdiMagnify, mdiSearchWeb } from '@mdi/js'
+import { t } from '@nextcloud/l10n'
+import { computed } from 'vue'
+import NcActions from '@nextcloud/vue/components/NcActions'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcAppNavigationSearch from '@nextcloud/vue/components/NcAppNavigationSearch'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import { onBeforeNavigation } from '../composables/useBeforeNavigation.ts'
+import { useNavigation } from '../composables/useNavigation.ts'
+import { useSearchStore } from '../store/search.ts'
+import { VIEW_ID } from '../views/search.ts'
+
+const { currentView } = useNavigation(true)
+const searchStore = useSearchStore()
+
+/**
+ * When the route is changed from search view to something different
+ * we need to clear the search box.
+ */
+onBeforeNavigation((to, from, next) => {
+ if (to.params.view !== VIEW_ID && from.params.view === VIEW_ID) {
+ // we are leaving the search view so unset the query
+ searchStore.query = ''
+ searchStore.scope = 'filter'
+ } else if (to.params.view === VIEW_ID && from.params.view === VIEW_ID) {
+ // fix the query if the user refreshed the view
+ if (searchStore.query && !to.query.query) {
+ // @ts-expect-error This is a weird issue with vue-router v4 and will be fixed in v5 (vue 3)
+ return next({
+ ...to,
+ query: {
+ ...to.query,
+ query: searchStore.query,
+ },
+ })
+ }
+ }
+ next()
+})
+
+/**
+ * Are we currently on the search view.
+ * Needed to disable the action menu (we cannot change the search mode there)
+ */
+const isSearchView = computed(() => currentView.value.id === VIEW_ID)
+
+/**
+ * Different searchbox label depending if filtering or searching
+ */
+const searchLabel = computed(() => {
+ if (searchStore.scope === 'globally') {
+ return t('files', 'Search everywhere …')
+ }
+ return t('files', 'Search here …')
+})
+</script>
+
+<template>
+ <NcAppNavigationSearch v-model="searchStore.query" :label="searchLabel">
+ <template #actions>
+ <NcActions :aria-label="t('files', 'Search scope options')" :disabled="isSearchView">
+ <template #icon>
+ <NcIconSvgWrapper :path="searchStore.scope === 'globally' ? mdiSearchWeb : mdiMagnify" />
+ </template>
+ <NcActionButton close-after-click @click="searchStore.scope = 'filter'">
+ <template #icon>
+ <NcIconSvgWrapper :path="mdiMagnify" />
+ </template>
+ {{ t('files', 'Search here') }}
+ </NcActionButton>
+ <NcActionButton close-after-click @click="searchStore.scope = 'globally'">
+ <template #icon>
+ <NcIconSvgWrapper :path="mdiSearchWeb" />
+ </template>
+ {{ t('files', 'Search everywhere') }}
+ </NcActionButton>
+ </NcActions>
+ </template>
+ </NcAppNavigationSearch>
+</template>
diff --git a/apps/files/src/components/LegacyView.vue b/apps/files/src/components/LegacyView.vue
index 4a50ed558f0..b5a792d9029 100644
--- a/apps/files/src/components/LegacyView.vue
+++ b/apps/files/src/components/LegacyView.vue
@@ -1,24 +1,7 @@
<!--
- - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @author John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<div />
@@ -50,10 +33,8 @@ export default {
},
methods: {
setFileInfo(fileInfo) {
- this.component.setFileInfo(new OCA.Files.FileInfoModel(fileInfo))
+ this.component.setFileInfo(fileInfo)
},
},
}
</script>
-<style>
-</style>
diff --git a/apps/files/src/components/NavigationQuota.vue b/apps/files/src/components/NavigationQuota.vue
new file mode 100644
index 00000000000..46c8e5c9af4
--- /dev/null
+++ b/apps/files/src/components/NavigationQuota.vue
@@ -0,0 +1,184 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+ -->
+<template>
+ <NcAppNavigationItem v-if="storageStats"
+ :aria-description="t('files', 'Storage information')"
+ :class="{ 'app-navigation-entry__settings-quota--not-unlimited': storageStats.quota >= 0}"
+ :loading="loadingStorageStats"
+ :name="storageStatsTitle"
+ :title="storageStatsTooltip"
+ class="app-navigation-entry__settings-quota"
+ data-cy-files-navigation-settings-quota
+ @click.stop.prevent="debounceUpdateStorageStats">
+ <ChartPie slot="icon" :size="20" />
+
+ <!-- Progress bar -->
+ <NcProgressBar v-if="storageStats.quota >= 0"
+ slot="extra"
+ :aria-label="t('files', 'Storage quota')"
+ :error="storageStats.relative > 80"
+ :value="Math.min(storageStats.relative, 100)" />
+ </NcAppNavigationItem>
+</template>
+
+<script>
+import { debounce, throttle } from 'throttle-debounce'
+import { formatFileSize } from '@nextcloud/files'
+import { generateUrl } from '@nextcloud/router'
+import { loadState } from '@nextcloud/initial-state'
+import { showError } from '@nextcloud/dialogs'
+import { subscribe } from '@nextcloud/event-bus'
+import { translate } from '@nextcloud/l10n'
+import axios from '@nextcloud/axios'
+
+import ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'
+import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
+import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
+
+import logger from '../logger.ts'
+
+export default {
+ name: 'NavigationQuota',
+
+ components: {
+ ChartPie,
+ NcAppNavigationItem,
+ NcProgressBar,
+ },
+
+ data() {
+ return {
+ loadingStorageStats: false,
+ storageStats: loadState('files', 'storageStats', null),
+ }
+ },
+
+ computed: {
+ storageStatsTitle() {
+ const usedQuotaByte = formatFileSize(this.storageStats?.used, false, false)
+ const quotaByte = formatFileSize(this.storageStats?.total, false, false)
+
+ // If no quota set
+ if (this.storageStats?.quota < 0) {
+ return this.t('files', '{usedQuotaByte} used', { usedQuotaByte })
+ }
+
+ return this.t('files', '{used} of {quota} used', {
+ used: usedQuotaByte,
+ quota: quotaByte,
+ })
+ },
+ storageStatsTooltip() {
+ if (!this.storageStats.relative) {
+ return ''
+ }
+
+ return this.t('files', '{relative}% used', this.storageStats)
+ },
+ },
+
+ beforeMount() {
+ /**
+ * Update storage stats every minute
+ * TODO: remove when all views are migrated to Vue
+ */
+ setInterval(this.throttleUpdateStorageStats, 60 * 1000)
+
+ subscribe('files:node:created', this.throttleUpdateStorageStats)
+ subscribe('files:node:deleted', this.throttleUpdateStorageStats)
+ subscribe('files:node:moved', this.throttleUpdateStorageStats)
+ subscribe('files:node:updated', this.throttleUpdateStorageStats)
+ },
+
+ mounted() {
+ // If the user has a quota set, warn if the available account storage is <=0
+ //
+ // NOTE: This doesn't catch situations where actual *server*
+ // disk (non-quota) space is low, but those should probably
+ // be handled differently anyway since a regular user can't
+ // can't do much about them (If we did want to indicate server disk
+ // space matters to users, we'd probably want to use a warning
+ // specific to that situation anyhow. So this covers warning covers
+ // our primary day-to-day concern (individual account quota usage).
+ //
+ if (this.storageStats?.quota > 0 && this.storageStats?.free === 0) {
+ this.showStorageFullWarning()
+ }
+ },
+
+ methods: {
+ // From user input
+ debounceUpdateStorageStats: debounce(200, function(event) {
+ this.updateStorageStats(event)
+ }),
+ // From interval or event bus
+ throttleUpdateStorageStats: throttle(1000, function(event) {
+ this.updateStorageStats(event)
+ }),
+
+ /**
+ * Update the storage stats
+ * Throttled at max 1 refresh per minute
+ *
+ * @param {Event} [event] if user interaction
+ */
+ async updateStorageStats(event = null) {
+ if (this.loadingStorageStats) {
+ return
+ }
+
+ this.loadingStorageStats = true
+ try {
+ const response = await axios.get(generateUrl('/apps/files/api/v1/stats'))
+ if (!response?.data?.data) {
+ throw new Error('Invalid storage stats')
+ }
+
+ // Warn the user if the available account storage changed from > 0 to 0
+ // (unless only because quota was intentionally set to 0 by admin in the interim)
+ if (this.storageStats?.free > 0 && response.data.data?.free === 0 && response.data.data?.quota > 0) {
+ this.showStorageFullWarning()
+ }
+
+ this.storageStats = response.data.data
+ } catch (error) {
+ logger.error('Could not refresh storage stats', { error })
+ // Only show to the user if it was manually triggered
+ if (event) {
+ showError(t('files', 'Could not refresh storage stats'))
+ }
+ } finally {
+ this.loadingStorageStats = false
+ }
+ },
+
+ showStorageFullWarning() {
+ showError(this.t('files', 'Your storage is full, files can not be updated or synced anymore!'))
+ },
+
+ t: translate,
+ },
+}
+</script>
+
+<style lang="scss" scoped>
+// User storage stats display
+.app-navigation-entry__settings-quota {
+ // Align title with progress and icon
+ --app-navigation-quota-margin: calc((var(--default-clickable-area) - 24px) / 2); // 20px icon size and 4px progress bar
+
+ &--not-unlimited :deep(.app-navigation-entry__name) {
+ line-height: 1;
+ margin-top: var(--app-navigation-quota-margin);
+ }
+
+ progress {
+ position: absolute;
+ bottom: var(--app-navigation-quota-margin);
+ margin-inline-start: var(--default-clickable-area);
+ width: calc(100% - (1.5 * var(--default-clickable-area)));
+ }
+}
+</style>
diff --git a/apps/files/src/components/NewNodeDialog.vue b/apps/files/src/components/NewNodeDialog.vue
new file mode 100644
index 00000000000..ca10935940d
--- /dev/null
+++ b/apps/files/src/components/NewNodeDialog.vue
@@ -0,0 +1,168 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcDialog data-cy-files-new-node-dialog
+ :name="name"
+ :open="open"
+ close-on-click-outside
+ out-transition
+ @update:open="emit('close', null)">
+ <template #actions>
+ <NcButton data-cy-files-new-node-dialog-submit
+ type="primary"
+ :disabled="validity !== ''"
+ @click="submit">
+ {{ t('files', 'Create') }}
+ </NcButton>
+ </template>
+ <form ref="formElement"
+ class="new-node-dialog__form"
+ @submit.prevent="emit('close', localDefaultName)">
+ <NcTextField ref="nameInput"
+ data-cy-files-new-node-dialog-input
+ :error="validity !== ''"
+ :helper-text="validity"
+ :label="label"
+ :value.sync="localDefaultName" />
+
+ <!-- Hidden file warning -->
+ <NcNoteCard v-if="isHiddenFileName"
+ type="warning"
+ :text="t('files', 'Files starting with a dot are hidden by default')" />
+ </form>
+ </NcDialog>
+</template>
+
+<script setup lang="ts">
+import type { ComponentPublicInstance, PropType } from 'vue'
+import { getUniqueName } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { extname } from 'path'
+import { computed, nextTick, onMounted, ref, watch, watchEffect } from 'vue'
+import { getFilenameValidity } from '../utils/filenameValidity.ts'
+
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcDialog from '@nextcloud/vue/components/NcDialog'
+import NcTextField from '@nextcloud/vue/components/NcTextField'
+import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
+
+const props = defineProps({
+ /**
+ * The name to be used by default
+ */
+ defaultName: {
+ type: String,
+ default: t('files', 'New folder'),
+ },
+ /**
+ * Other files that are in the current directory
+ */
+ otherNames: {
+ type: Array as PropType<string[]>,
+ default: () => [],
+ },
+ /**
+ * Open state of the dialog
+ */
+ open: {
+ type: Boolean,
+ default: true,
+ },
+ /**
+ * Dialog name
+ */
+ name: {
+ type: String,
+ default: t('files', 'Create new folder'),
+ },
+ /**
+ * Input label
+ */
+ label: {
+ type: String,
+ default: t('files', 'Folder name'),
+ },
+})
+
+const emit = defineEmits<{
+ (event: 'close', name: string | null): void
+}>()
+
+const localDefaultName = ref<string>(props.defaultName)
+const nameInput = ref<ComponentPublicInstance>()
+const formElement = ref<HTMLFormElement>()
+const validity = ref('')
+
+const isHiddenFileName = computed(() => {
+ // Check if the name starts with a dot, which indicates a hidden file
+ return localDefaultName.value.trim().startsWith('.')
+})
+
+/**
+ * Focus the filename input field
+ */
+function focusInput() {
+ nextTick(() => {
+ // get the input element
+ const input = nameInput.value?.$el.querySelector('input')
+ if (!props.open || !input) {
+ return
+ }
+
+ // length of the basename
+ const length = localDefaultName.value.length - extname(localDefaultName.value).length
+ // focus the input
+ input.focus()
+ // and set the selection to the basename (name without extension)
+ input.setSelectionRange(0, length)
+ })
+}
+
+/**
+ * Trigger submit on the form
+ */
+function submit() {
+ formElement.value?.requestSubmit()
+}
+
+// Reset local name on props change
+watch(() => [props.defaultName, props.otherNames], () => {
+ localDefaultName.value = getUniqueName(props.defaultName, props.otherNames).trim()
+})
+
+// Validate the local name
+watchEffect(() => {
+ if (props.otherNames.includes(localDefaultName.value.trim())) {
+ validity.value = t('files', 'This name is already in use.')
+ } else {
+ validity.value = getFilenameValidity(localDefaultName.value.trim())
+ }
+ const input = nameInput.value?.$el.querySelector('input')
+ if (input) {
+ input.setCustomValidity(validity.value)
+ input.reportValidity()
+ }
+})
+
+// Ensure the input is focussed even if the dialog is already mounted but not open
+watch(() => props.open, () => {
+ nextTick(() => {
+ focusInput()
+ })
+})
+
+onMounted(() => {
+ // on mounted lets use the unique name
+ localDefaultName.value = getUniqueName(localDefaultName.value, props.otherNames).trim()
+ nextTick(() => focusInput())
+})
+</script>
+
+<style scoped>
+.new-node-dialog__form {
+ /* Ensure the dialog does not jump when there is a validity error */
+ min-height: calc(2 * var(--default-clickable-area));
+}
+</style>
diff --git a/apps/files/src/components/PersonalSettings.vue b/apps/files/src/components/PersonalSettings.vue
index 1431ae4053a..b076b0c1e3d 100644
--- a/apps/files/src/components/PersonalSettings.vue
+++ b/apps/files/src/components/PersonalSettings.vue
@@ -1,23 +1,7 @@
<!--
- - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- -
- - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -->
+ - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<div id="files-personal-settings" class="section">
@@ -27,7 +11,7 @@
</template>
<script>
-import TransferOwnershipDialogue from './TransferOwnershipDialogue'
+import TransferOwnershipDialogue from './TransferOwnershipDialogue.vue'
export default {
name: 'PersonalSettings',
diff --git a/apps/files/src/components/Setting.vue b/apps/files/src/components/Setting.vue
index b50a938cb52..7a9ffb137a2 100644
--- a/apps/files/src/components/Setting.vue
+++ b/apps/files/src/components/Setting.vue
@@ -1,24 +1,7 @@
<!--
- - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev>
- -
- - @author Gary Kim <gary@garykim.dev>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<div />
@@ -37,5 +20,3 @@ export default {
},
}
</script>
-<style>
-</style>
diff --git a/apps/files/src/components/SidebarTab.vue b/apps/files/src/components/SidebarTab.vue
index ad80f91d431..d86e5da9d20 100644
--- a/apps/files/src/components/SidebarTab.vue
+++ b/apps/files/src/components/SidebarTab.vue
@@ -1,50 +1,35 @@
-
<!--
- - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @author John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
- <AppSidebarTab :id="id"
+ <NcAppSidebarTab :id="id"
ref="tab"
:name="name"
:icon="icon"
@bottomReached="onScrollBottomReached">
+ <template #icon>
+ <slot name="icon" />
+ </template>
<!-- Fallback loading -->
- <EmptyContent v-if="loading" icon="icon-loading" />
+ <NcEmptyContent v-if="loading" icon="icon-loading" />
<!-- Using a dummy div as Vue mount replace the element directly
It does NOT append to the content -->
<div ref="mount" />
- </AppSidebarTab>
+ </NcAppSidebarTab>
</template>
<script>
-import AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'
-import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
+import NcAppSidebarTab from '@nextcloud/vue/components/NcAppSidebarTab'
+import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
export default {
name: 'SidebarTab',
components: {
- AppSidebarTab,
- EmptyContent,
+ NcAppSidebarTab,
+ NcEmptyContent,
},
props: {
@@ -63,7 +48,7 @@ export default {
},
icon: {
type: String,
- required: true,
+ default: '',
},
/**
diff --git a/apps/files/src/components/TemplateFiller.vue b/apps/files/src/components/TemplateFiller.vue
new file mode 100644
index 00000000000..3f1db8dfd58
--- /dev/null
+++ b/apps/files/src/components/TemplateFiller.vue
@@ -0,0 +1,122 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <NcModal label-id="template-field-modal__label">
+ <div class="template-field-modal__content">
+ <form>
+ <h3 id="template-field-modal__label">
+ {{ t('files', 'Fill template fields') }}
+ </h3>
+
+ <div v-for="field in fields" :key="field.index">
+ <component :is="getFieldComponent(field.type)"
+ v-if="fieldHasLabel(field)"
+ :field="field"
+ @input="trackInput" />
+ </div>
+ </form>
+ </div>
+
+ <div class="template-field-modal__buttons">
+ <NcLoadingIcon v-if="loading" :name="t('files', 'Submitting fields …')" />
+ <NcButton aria-label="Submit button"
+ type="primary"
+ @click="submit">
+ {{ t('files', 'Submit') }}
+ </NcButton>
+ </div>
+ </NcModal>
+</template>
+
+<script>
+import { defineComponent } from 'vue'
+import { t } from '@nextcloud/l10n'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
+import NcModal from '@nextcloud/vue/components/NcModal'
+import TemplateRichTextField from './TemplateFiller/TemplateRichTextField.vue'
+import TemplateCheckboxField from './TemplateFiller/TemplateCheckboxField.vue'
+
+export default defineComponent({
+ name: 'TemplateFiller',
+
+ components: {
+ NcModal,
+ NcButton,
+ NcLoadingIcon,
+ TemplateRichTextField,
+ TemplateCheckboxField,
+ },
+
+ props: {
+ fields: {
+ type: Array,
+ default: () => [],
+ },
+ onSubmit: {
+ type: Function,
+ default: async () => {},
+ },
+ },
+
+ data() {
+ return {
+ localFields: {},
+ loading: false,
+ }
+ },
+
+ methods: {
+ t,
+ trackInput({ index, property, value }) {
+ if (!this.localFields[index]) {
+ this.localFields[index] = {}
+ }
+
+ this.localFields[index][property] = value
+ },
+ getFieldComponent(fieldType) {
+ const fieldComponentType = fieldType.split('-')
+ .map((str) => {
+ return str.charAt(0).toUpperCase() + str.slice(1)
+ })
+ .join('')
+
+ return `Template${fieldComponentType}Field`
+ },
+ fieldHasLabel(field) {
+ return field.name || field.alias
+ },
+ async submit() {
+ this.loading = true
+
+ await this.onSubmit(this.localFields)
+
+ this.$emit('close')
+ },
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+$modal-margin: calc(var(--default-grid-baseline) * 4);
+
+.template-field-modal__content {
+ padding: $modal-margin;
+
+ h3 {
+ text-align: center;
+ }
+}
+
+.template-field-modal__buttons {
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--default-grid-baseline);
+ margin: $modal-margin;
+ margin-top: 0;
+}
+</style>
diff --git a/apps/files/src/components/TemplateFiller/TemplateCheckboxField.vue b/apps/files/src/components/TemplateFiller/TemplateCheckboxField.vue
new file mode 100644
index 00000000000..18536171bd2
--- /dev/null
+++ b/apps/files/src/components/TemplateFiller/TemplateCheckboxField.vue
@@ -0,0 +1,68 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <div class="template-field__checkbox">
+ <NcCheckboxRadioSwitch :id="fieldId"
+ :checked.sync="value"
+ type="switch"
+ @update:checked="input">
+ {{ fieldLabel }}
+ </NcCheckboxRadioSwitch>
+ </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue'
+import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
+
+export default defineComponent({
+ name: 'TemplateCheckboxField',
+
+ components: {
+ NcCheckboxRadioSwitch,
+ },
+
+ props: {
+ field: {
+ type: Object,
+ default: () => {},
+ },
+ },
+
+ data() {
+ return {
+ value: this.field.checked ?? false,
+ }
+ },
+
+ computed: {
+ fieldLabel() {
+ const label = this.field.name || this.field.alias
+
+ return label.charAt(0).toUpperCase() + label.slice(1)
+ },
+ fieldId() {
+ return 'checkbox-field' + this.field.index
+ },
+ },
+
+ methods: {
+ input() {
+ this.$emit('input', {
+ index: this.field.index,
+ property: 'checked',
+ value: this.value,
+ })
+ },
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.template-field__checkbox {
+ margin: 20px 0;
+}
+</style>
diff --git a/apps/files/src/components/TemplateFiller/TemplateRichTextField.vue b/apps/files/src/components/TemplateFiller/TemplateRichTextField.vue
new file mode 100644
index 00000000000..f49819f7e7c
--- /dev/null
+++ b/apps/files/src/components/TemplateFiller/TemplateRichTextField.vue
@@ -0,0 +1,77 @@
+<!--
+ - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <div class="template-field__text">
+ <label :for="fieldId">
+ {{ fieldLabel }}
+ </label>
+
+ <NcTextField :id="fieldId"
+ type="text"
+ :value.sync="value"
+ :label="fieldLabel"
+ :label-outside="true"
+ :placeholder="field.content"
+ @input="input" />
+ </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue'
+import NcTextField from '@nextcloud/vue/components/NcTextField'
+
+export default defineComponent({
+ name: 'TemplateRichTextField',
+
+ components: {
+ NcTextField,
+ },
+
+ props: {
+ field: {
+ type: Object,
+ default: () => {},
+ },
+ },
+
+ data() {
+ return {
+ value: '',
+ }
+ },
+
+ computed: {
+ fieldLabel() {
+ const label = this.field.name || this.field.alias
+
+ return (label.charAt(0).toUpperCase() + label.slice(1))
+ },
+ fieldId() {
+ return 'text-field' + this.field.index
+ },
+ },
+
+ methods: {
+ input() {
+ this.$emit('input', {
+ index: this.field.index,
+ property: 'content',
+ value: this.value,
+ })
+ },
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.template-field__text {
+ margin: 20px 0;
+
+ label {
+ font-weight: bold;
+ }
+}
+</style>
diff --git a/apps/files/src/components/TemplatePreview.vue b/apps/files/src/components/TemplatePreview.vue
index ad152af9ea3..7927948d3af 100644
--- a/apps/files/src/components/TemplatePreview.vue
+++ b/apps/files/src/components/TemplatePreview.vue
@@ -1,35 +1,19 @@
<!--
- - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @author John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<li class="template-picker__item">
<input :id="id"
+ ref="input"
:checked="checked"
type="radio"
class="radio"
name="template-picker"
@change="onCheck">
- <label :for="id" class="template-picker__label">
+ <label :for="id" class="template-picker__label" @click="onClick">
<div class="template-picker__preview"
:class="failedPreview ? 'template-picker__preview--failed' : ''">
<img class="template-picker__image"
@@ -47,9 +31,9 @@
</template>
<script>
+import { encodePath } from '@nextcloud/paths'
import { generateUrl } from '@nextcloud/router'
-import { encodeFilePath } from '../utils/fileUtils'
-import { getToken, isPublic } from '../utils/davUtils'
+import { isPublicShare, getSharingToken } from '@nextcloud/sharing/public'
// preview width generation
const previewWidth = 256
@@ -123,8 +107,8 @@ export default {
return this.previewUrl
}
// TODO: find a nicer standard way of doing this?
- if (isPublic()) {
- return generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodeFilePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)
+ if (isPublicShare()) {
+ return generateUrl(`/apps/files_sharing/publicpreview/${getSharingToken()}?fileId=${this.fileid}&file=${encodePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)
}
return generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)
},
@@ -141,6 +125,14 @@ export default {
onFailure() {
this.failedPreview = true
},
+ focus() {
+ this.$refs.input?.focus()
+ },
+ onClick() {
+ if (this.checked) {
+ this.$emit('confirm-click', this.fileid)
+ }
+ },
},
}
</script>
@@ -182,7 +174,7 @@ export default {
border-radius: var(--border-radius-large);
input:checked + label > & {
- border-color: var(--color-primary);
+ border-color: var(--color-primary-element);
}
&--failed {
@@ -209,12 +201,9 @@ export default {
}
&__title {
- overflow: hidden;
// also count preview border
- max-width: calc(var(--width) + 2*2px);
+ max-width: calc(var(--width) + 2 * 2px);
padding: var(--margin);
- white-space: nowrap;
- text-overflow: ellipsis;
}
}
diff --git a/apps/files/src/components/TransferOwnershipDialogue.vue b/apps/files/src/components/TransferOwnershipDialogue.vue
index 22e2a22b009..3d668da8144 100644
--- a/apps/files/src/components/TransferOwnershipDialogue.vue
+++ b/apps/files/src/components/TransferOwnershipDialogue.vue
@@ -1,23 +1,7 @@
<!--
- - @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- -
- - @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -->
+ - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
<div>
@@ -25,41 +9,33 @@
<form @submit.prevent="submit">
<p class="transfer-select-row">
<span>{{ readableDirectory }}</span>
- <Button v-if="directory === undefined" @click.prevent="start">
+ <NcButton v-if="directory === undefined"
+ class="transfer-select-row__choose_button"
+ @click.prevent="start">
{{ t('files', 'Choose file or folder to transfer') }}
- </Button>
- <Button v-else @click.prevent="start">
+ </NcButton>
+ <NcButton v-else @click.prevent="start">
{{ t('files', 'Change') }}
- </Button>
- <span class="error">{{ directoryPickerError }}</span>
+ </NcButton>
</p>
- <p class="new-owner-row">
+ <p class="new-owner">
<label for="targetUser">
<span>{{ t('files', 'New owner') }}</span>
</label>
- <Multiselect id="targetUser"
- v-model="selectedUser"
+ <NcSelect v-model="selectedUser"
+ input-id="targetUser"
:options="formatedUserSuggestions"
:multiple="false"
- :searchable="true"
- :placeholder="t('files', 'Search users')"
- :preselect-first="true"
- :preserve-search="true"
:loading="loadingUsers"
- track-by="user"
- label="displayName"
- :internal-search="false"
- :clear-on-select="false"
:user-select="true"
- class="middle-align"
- @search-change="findUserDebounced" />
+ @search="findUserDebounced" />
</p>
<p>
- <input type="submit"
- class="primary"
- :value="submitButtonText"
+ <NcButton native-type="submit"
+ type="primary"
:disabled="!canSubmit">
- <span class="error">{{ submitError }}</span>
+ {{ submitButtonText }}
+ </NcButton>
</p>
</form>
</div>
@@ -69,16 +45,15 @@
import axios from '@nextcloud/axios'
import debounce from 'debounce'
import { generateOcsUrl } from '@nextcloud/router'
-import { getFilePickerBuilder, showSuccess } from '@nextcloud/dialogs'
-import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
+import { getFilePickerBuilder, showSuccess, showError } from '@nextcloud/dialogs'
+import NcSelect from '@nextcloud/vue/components/NcSelect'
import Vue from 'vue'
-import Button from '@nextcloud/vue/dist/Components/Button'
+import NcButton from '@nextcloud/vue/components/NcButton'
-import logger from '../logger'
+import logger from '../logger.ts'
const picker = getFilePickerBuilder(t('files', 'Choose a file or folder to transfer'))
.setMultiSelect(false)
- .setModal(true)
.setType(1)
.allowDirectories()
.build()
@@ -86,8 +61,8 @@ const picker = getFilePickerBuilder(t('files', 'Choose a file or folder to trans
export default {
name: 'TransferOwnershipDialogue',
components: {
- Multiselect,
- Button,
+ NcSelect,
+ NcButton,
},
data() {
return {
@@ -113,6 +88,7 @@ export default {
user: user.uid,
displayName: user.displayName,
icon: 'icon-user',
+ subname: user.shareWithDisplayNameUnique,
}
})
},
@@ -152,6 +128,7 @@ export default {
logger.error(`Selecting object for transfer aborted: ${error.message || 'Unknown error'}`, { error })
this.directoryPickerError = error.message || t('files', 'Unknown error')
+ showError(this.directoryPickerError)
})
},
async findUser(query) {
@@ -178,6 +155,7 @@ export default {
Vue.set(this.userSuggestions, user.value.shareWith, {
uid: user.value.shareWith,
displayName: user.label,
+ shareWithDisplayNameUnique: user.shareWithDisplayNameUnique,
})
})
} catch (error) {
@@ -213,10 +191,11 @@ export default {
logger.error('Could not send ownership transfer request', { error })
if (error?.response?.status === 403) {
- this.submitError = t('files', 'Cannot transfer ownership of a file or folder you don\'t own')
+ this.submitError = t('files', 'Cannot transfer ownership of a file or folder you do not own')
} else {
this.submitError = error.message || t('files', 'Unknown error')
}
+ showError(this.submitError)
})
},
},
@@ -224,33 +203,34 @@ export default {
</script>
<style scoped lang="scss">
-.middle-align {
- vertical-align: middle;
-}
p {
margin-top: 12px;
margin-bottom: 12px;
}
-.new-owner-row {
+
+.new-owner {
display: flex;
+ flex-direction: column;
+ max-width: 400px;
label {
display: flex;
align-items: center;
+ margin-bottom: calc(var(--default-grid-baseline) * 2);
span {
- margin-right: 8px;
+ margin-inline-end: 8px;
}
}
-
- .multiselect {
- flex-grow: 1;
- max-width: 280px;
- }
}
+
.transfer-select-row {
span {
- margin-right: 8px;
+ margin-inline-end: 8px;
+ }
+
+ &__choose_button {
+ width: min(100%, 400px) !important;
}
}
</style>
diff --git a/apps/files/src/components/VirtualList.vue b/apps/files/src/components/VirtualList.vue
new file mode 100644
index 00000000000..4746fedf863
--- /dev/null
+++ b/apps/files/src/components/VirtualList.vue
@@ -0,0 +1,424 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+ -->
+<template>
+ <div class="files-list"
+ :class="{ 'files-list--grid': gridMode }"
+ data-cy-files-list
+ @scroll.passive="onScroll">
+ <!-- Header -->
+ <div ref="before" class="files-list__before">
+ <slot name="before" />
+ </div>
+
+ <div ref="filters" class="files-list__filters">
+ <slot name="filters" />
+ </div>
+
+ <div v-if="!!$scopedSlots['header-overlay']" class="files-list__thead-overlay">
+ <slot name="header-overlay" />
+ </div>
+
+ <div v-if="dataSources.length === 0"
+ class="files-list__empty">
+ <slot name="empty" />
+ </div>
+
+ <table :aria-hidden="dataSources.length === 0"
+ :inert="dataSources.length === 0"
+ class="files-list__table"
+ :class="{
+ 'files-list__table--with-thead-overlay': !!$scopedSlots['header-overlay'],
+ 'files-list__table--hidden': dataSources.length === 0,
+ }">
+ <!-- Accessibility table caption for screen readers -->
+ <caption v-if="caption" class="hidden-visually">
+ {{ caption }}
+ </caption>
+
+ <!-- Header -->
+ <thead ref="thead" class="files-list__thead" data-cy-files-list-thead>
+ <slot name="header" />
+ </thead>
+
+ <!-- Body -->
+ <tbody :style="tbodyStyle"
+ class="files-list__tbody"
+ data-cy-files-list-tbody>
+ <component :is="dataComponent"
+ v-for="({key, item}, i) in renderedItems"
+ :key="key"
+ :source="item"
+ :index="i"
+ v-bind="extraProps" />
+ </tbody>
+
+ <!-- Footer -->
+ <tfoot ref="footer"
+ class="files-list__tfoot"
+ data-cy-files-list-tfoot>
+ <slot name="footer" />
+ </tfoot>
+ </table>
+ </div>
+</template>
+
+<script lang="ts">
+import type { File, Folder, Node } from '@nextcloud/files'
+import type { PropType } from 'vue'
+
+import { defineComponent } from 'vue'
+import debounce from 'debounce'
+
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import logger from '../logger.ts'
+
+interface RecycledPoolItem {
+ key: string,
+ item: Node,
+}
+
+type DataSource = File | Folder
+type DataSourceKey = keyof DataSource
+
+export default defineComponent({
+ name: 'VirtualList',
+
+ props: {
+ dataComponent: {
+ type: [Object, Function],
+ required: true,
+ },
+ dataKey: {
+ type: String as PropType<DataSourceKey>,
+ required: true,
+ },
+ dataSources: {
+ type: Array as PropType<DataSource[]>,
+ required: true,
+ },
+ extraProps: {
+ type: Object as PropType<Record<string, unknown>>,
+ default: () => ({}),
+ },
+ scrollToIndex: {
+ type: Number,
+ default: 0,
+ },
+ gridMode: {
+ type: Boolean,
+ default: false,
+ },
+ /**
+ * Visually hidden caption for the table accessibility
+ */
+ caption: {
+ type: String,
+ default: '',
+ },
+ },
+
+ setup() {
+ const fileListWidth = useFileListWidth()
+
+ return {
+ fileListWidth,
+ }
+ },
+
+ data() {
+ return {
+ index: this.scrollToIndex,
+ beforeHeight: 0,
+ footerHeight: 0,
+ headerHeight: 0,
+ tableHeight: 0,
+ resizeObserver: null as ResizeObserver | null,
+ }
+ },
+
+ computed: {
+ // Wait for measurements to be done before rendering
+ isReady() {
+ return this.tableHeight > 0
+ },
+
+ // Items to render before and after the visible area
+ bufferItems() {
+ if (this.gridMode) {
+ // 1 row before and after in grid mode
+ return this.columnCount
+ }
+ // 3 rows before and after
+ return 3
+ },
+
+ itemHeight() {
+ // Align with css in FilesListVirtual
+ // 166px + 32px (name) + 16px (mtime) + 16px (padding top and bottom)
+ return this.gridMode ? (166 + 32 + 16 + 16 + 16) : 44
+ },
+
+ // Grid mode only
+ itemWidth() {
+ // 166px + 16px x 2 (padding left and right)
+ return 166 + 16 + 16
+ },
+
+ /**
+ * The number of rows currently (fully!) visible
+ */
+ visibleRows(): number {
+ return Math.floor((this.tableHeight - this.headerHeight) / this.itemHeight)
+ },
+
+ /**
+ * Number of rows that will be rendered.
+ * This includes only visible + buffer rows.
+ */
+ rowCount(): number {
+ return this.visibleRows + (this.bufferItems / this.columnCount) * 2 + 1
+ },
+
+ /**
+ * Number of columns.
+ * 1 for list view otherwise depending on the file list width.
+ */
+ columnCount(): number {
+ if (!this.gridMode) {
+ return 1
+ }
+ return Math.floor(this.fileListWidth / this.itemWidth)
+ },
+
+ /**
+ * Index of the first item to be rendered
+ * The index can be any file, not just the first one
+ * But the start index is the first item to be rendered,
+ * which needs to align with the column count
+ */
+ startIndex() {
+ const firstColumnIndex = this.index - (this.index % this.columnCount)
+ return Math.max(0, firstColumnIndex - this.bufferItems)
+ },
+
+ /**
+ * Number of items to be rendered at the same time
+ * For list view this is the same as `rowCount`, for grid view this is `rowCount` * `columnCount`
+ */
+ shownItems() {
+ // If in grid mode, we need to multiply the number of rows by the number of columns
+ if (this.gridMode) {
+ return this.rowCount * this.columnCount
+ }
+
+ return this.rowCount
+ },
+
+ renderedItems(): RecycledPoolItem[] {
+ if (!this.isReady) {
+ return []
+ }
+
+ const items = this.dataSources.slice(this.startIndex, this.startIndex + this.shownItems) as Node[]
+
+ const oldItems = items.filter(item => Object.values(this.$_recycledPool).includes(item[this.dataKey]))
+ const oldItemsKeys = oldItems.map(item => item[this.dataKey] as string)
+ const unusedKeys = Object.keys(this.$_recycledPool).filter(key => !oldItemsKeys.includes(this.$_recycledPool[key]))
+
+ return items.map(item => {
+ const index = Object.values(this.$_recycledPool).indexOf(item[this.dataKey])
+ // If defined, let's keep the key
+ if (index !== -1) {
+ return {
+ key: Object.keys(this.$_recycledPool)[index],
+ item,
+ }
+ }
+
+ // Get and consume reusable key or generate a new one
+ const key = unusedKeys.pop() || Math.random().toString(36).substr(2)
+ this.$_recycledPool[key] = item[this.dataKey]
+ return { key, item }
+ })
+ },
+
+ /**
+ * The total number of rows that are available
+ */
+ totalRowCount() {
+ return Math.ceil(this.dataSources.length / this.columnCount)
+ },
+
+ tbodyStyle() {
+ // The number of (virtual) rows above the currently rendered ones.
+ // start index is aligned so this should always be an integer
+ const rowsAbove = Math.round(this.startIndex / this.columnCount)
+ // The number of (virtual) rows below the currently rendered ones.
+ const rowsBelow = Math.max(0, this.totalRowCount - rowsAbove - this.rowCount)
+
+ return {
+ paddingBlock: `${rowsAbove * this.itemHeight}px ${rowsBelow * this.itemHeight}px`,
+ minHeight: `${this.totalRowCount * this.itemHeight}px`,
+ }
+ },
+ },
+ watch: {
+ scrollToIndex(index) {
+ this.scrollTo(index)
+ },
+
+ totalRowCount() {
+ if (this.scrollToIndex) {
+ this.scrollTo(this.scrollToIndex)
+ }
+ },
+
+ columnCount(columnCount, oldColumnCount) {
+ if (oldColumnCount === 0) {
+ // We're initializing, the scroll position is handled on mounted
+ logger.debug('VirtualList: columnCount is 0, skipping scroll')
+ return
+ }
+ // If the column count changes in grid view,
+ // update the scroll position again
+ this.scrollTo(this.index)
+ },
+ },
+
+ mounted() {
+ this.$_recycledPool = {} as Record<string, DataSource[DataSourceKey]>
+
+ this.resizeObserver = new ResizeObserver(debounce(() => {
+ this.updateHeightVariables()
+ logger.debug('VirtualList: resizeObserver updated')
+ this.onScroll()
+ }, 100))
+ this.resizeObserver.observe(this.$el)
+ this.resizeObserver.observe(this.$refs.before as HTMLElement)
+ this.resizeObserver.observe(this.$refs.filters as HTMLElement)
+ this.resizeObserver.observe(this.$refs.footer as HTMLElement)
+
+ this.$nextTick(() => {
+ // Make sure height values are initialized
+ this.updateHeightVariables()
+ // If we need to scroll to an index we do so in the next tick.
+ // This is needed to apply updates from the initialization of the height variables
+ // which will update the tbody styles until next tick.
+ if (this.scrollToIndex) {
+ this.scrollTo(this.scrollToIndex)
+ }
+ })
+ },
+
+ beforeDestroy() {
+ if (this.resizeObserver) {
+ this.resizeObserver.disconnect()
+ }
+ },
+
+ methods: {
+ scrollTo(index: number) {
+ if (!this.$el || this.index === index) {
+ return
+ }
+
+ // Check if the content is smaller (not equal! keep the footer in mind) than the viewport
+ // meaning there is no scrollbar
+ if (this.totalRowCount < this.visibleRows) {
+ logger.debug('VirtualList: Skip scrolling, nothing to scroll', {
+ index,
+ totalRows: this.totalRowCount,
+ visibleRows: this.visibleRows,
+ })
+ return
+ }
+
+ // We can not scroll further as the last page of rows
+ // For the grid view we also need to account for all columns in that row (columnCount - 1)
+ const clampedIndex = (this.totalRowCount - this.visibleRows) * this.columnCount + (this.columnCount - 1)
+ // The scroll position
+ let scrollTop = this.indexToScrollPos(Math.min(index, clampedIndex))
+
+ // First we need to update the internal index for rendering.
+ // This will cause the <tbody> element to be resized allowing us to set the correct scroll position.
+ this.index = index
+
+ // If this is not the first row we can add a half row from above.
+ // This is to help users understand the table is scrolled and not items did not just disappear.
+ // But we also can only add a half row if we have enough rows below to scroll (visual rows / end of scrollable area)
+ if (index >= this.columnCount && index <= clampedIndex) {
+ scrollTop -= (this.itemHeight / 2)
+ // As we render one half row more we also need to adjust the internal index
+ this.index = index - this.columnCount
+ } else if (index > clampedIndex) {
+ // If we are on the last page we cannot scroll any further
+ // but we can at least scroll the footer into view
+ if (index <= (clampedIndex + this.columnCount)) {
+ // We only show have of the footer for the first of the last page
+ // To still show the previous row partly. Same reasoning as above:
+ // help the user understand that the table is scrolled not "magically trimmed"
+ scrollTop += this.footerHeight / 2
+ } else {
+ // We reached the very end of the files list and we are focussing not the first visible row
+ // so all we now can do is scroll to the end (footer)
+ scrollTop += this.footerHeight
+ }
+ }
+
+ // Now we need to wait for the <tbody> element to get resized so we can correctly apply the scrollTop position
+ this.$nextTick(() => {
+ this.$el.scrollTop = scrollTop
+ logger.debug(`VirtualList: scrolling to index ${index}`, {
+ clampedIndex, scrollTop, columnCount: this.columnCount, total: this.totalRowCount, visibleRows: this.visibleRows, beforeHeight: this.beforeHeight,
+ })
+ })
+ },
+
+ onScroll() {
+ this._onScrollHandle ??= requestAnimationFrame(() => {
+ this._onScrollHandle = null
+
+ const index = this.scrollPosToIndex(this.$el.scrollTop)
+ if (index === this.index) {
+ return
+ }
+
+ // Max 0 to prevent negative index
+ this.index = Math.max(0, Math.floor(index))
+ this.$emit('scroll')
+ })
+ },
+
+ // Convert scroll position to index
+ // It should be the opposite of `indexToScrollPos`
+ scrollPosToIndex(scrollPos: number): number {
+ const topScroll = scrollPos - this.beforeHeight
+ // Max 0 to prevent negative index
+ return Math.max(0, Math.floor(topScroll / this.itemHeight)) * this.columnCount
+ },
+
+ // Convert index to scroll position
+ // It should be the opposite of `scrollPosToIndex`
+ indexToScrollPos(index: number): number {
+ return Math.floor(index / this.columnCount) * this.itemHeight + this.beforeHeight
+ },
+
+ /**
+ * Update the height variables.
+ * To be called by resize observer and `onMount`
+ */
+ updateHeightVariables(): void {
+ this.tableHeight = this.$el?.clientHeight ?? 0
+ this.beforeHeight = (this.$refs.before as HTMLElement)?.clientHeight ?? 0
+ this.footerHeight = (this.$refs.footer as HTMLElement)?.clientHeight ?? 0
+
+ // Get the header height which consists of table header and filters
+ const theadHeight = (this.$refs.thead as HTMLElement)?.clientHeight ?? 0
+ const filterHeight = (this.$refs.filters as HTMLElement)?.clientHeight ?? 0
+ this.headerHeight = theadHeight + filterHeight
+ },
+ },
+})
+</script>
diff --git a/apps/files/src/composables/useBeforeNavigation.ts b/apps/files/src/composables/useBeforeNavigation.ts
new file mode 100644
index 00000000000..38b72e40fb3
--- /dev/null
+++ b/apps/files/src/composables/useBeforeNavigation.ts
@@ -0,0 +1,20 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { NavigationGuard } from 'vue-router'
+
+import { onUnmounted } from 'vue'
+import { useRouter } from 'vue-router/composables'
+
+/**
+ * Helper until we use Vue-Router v4 (Vue3).
+ *
+ * @param fn - The navigation guard
+ */
+export function onBeforeNavigation(fn: NavigationGuard) {
+ const router = useRouter()
+ const remove = router.beforeResolve(fn)
+ onUnmounted(remove)
+}
diff --git a/apps/files/src/composables/useFileListHeaders.spec.ts b/apps/files/src/composables/useFileListHeaders.spec.ts
new file mode 100644
index 00000000000..c407156412b
--- /dev/null
+++ b/apps/files/src/composables/useFileListHeaders.spec.ts
@@ -0,0 +1,41 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { Header } from '@nextcloud/files'
+import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { useFileListHeaders } from './useFileListHeaders.ts'
+
+const getFileListHeaders = vi.hoisted(() => vi.fn())
+
+vi.mock('@nextcloud/files', async (originalModule) => {
+ return {
+ ...(await originalModule()),
+ getFileListHeaders,
+ }
+})
+
+describe('useFileListHeaders', () => {
+ beforeEach(() => vi.resetAllMocks())
+
+ it('gets the headers', () => {
+ const header = new Header({ id: '1', order: 5, render: vi.fn(), updated: vi.fn() })
+ getFileListHeaders.mockImplementationOnce(() => [header])
+
+ const headers = useFileListHeaders()
+ expect(headers.value).toEqual([header])
+ expect(getFileListHeaders).toHaveBeenCalledOnce()
+ })
+
+ it('headers are sorted', () => {
+ const header = new Header({ id: '1', order: 10, render: vi.fn(), updated: vi.fn() })
+ const header2 = new Header({ id: '2', order: 5, render: vi.fn(), updated: vi.fn() })
+ getFileListHeaders.mockImplementationOnce(() => [header, header2])
+
+ const headers = useFileListHeaders()
+ // lower order first
+ expect(headers.value.map(({ id }) => id)).toStrictEqual(['2', '1'])
+ expect(getFileListHeaders).toHaveBeenCalledOnce()
+ })
+})
diff --git a/apps/files/src/composables/useFileListHeaders.ts b/apps/files/src/composables/useFileListHeaders.ts
new file mode 100644
index 00000000000..b57bcbb1432
--- /dev/null
+++ b/apps/files/src/composables/useFileListHeaders.ts
@@ -0,0 +1,19 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Header } from '@nextcloud/files'
+import type { ComputedRef } from 'vue'
+
+import { getFileListHeaders } from '@nextcloud/files'
+import { computed, ref } from 'vue'
+
+/**
+ * Get the registered and sorted file list headers.
+ */
+export function useFileListHeaders(): ComputedRef<Header[]> {
+ const headers = ref(getFileListHeaders())
+ const sorted = computed(() => [...headers.value].sort((a, b) => a.order - b.order) as Header[])
+
+ return sorted
+}
diff --git a/apps/files/src/composables/useFileListWidth.cy.ts b/apps/files/src/composables/useFileListWidth.cy.ts
new file mode 100644
index 00000000000..b0d42c4a2d6
--- /dev/null
+++ b/apps/files/src/composables/useFileListWidth.cy.ts
@@ -0,0 +1,56 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { defineComponent } from 'vue'
+import { useFileListWidth } from './useFileListWidth.ts'
+
+const ComponentMock = defineComponent({
+ template: '<div id="test-component" style="width: 100%;background: white;">{{ fileListWidth }}</div>',
+ setup() {
+ return {
+ fileListWidth: useFileListWidth(),
+ }
+ },
+})
+const FileListMock = defineComponent({
+ template: '<main id="app-content-vue" style="width: 100%;"><component-mock /></main>',
+ components: {
+ ComponentMock,
+ },
+})
+
+describe('composable: fileListWidth', () => {
+
+ it('Has initial value', () => {
+ cy.viewport(600, 400)
+
+ cy.mount(FileListMock, {})
+ cy.get('#app-content-vue')
+ .should('be.visible')
+ .and('contain.text', '600')
+ })
+
+ it('Is reactive to size change', () => {
+ cy.viewport(600, 400)
+ cy.mount(FileListMock)
+ cy.get('#app-content-vue').should('contain.text', '600')
+
+ cy.viewport(800, 400)
+ cy.screenshot()
+ cy.get('#app-content-vue').should('contain.text', '800')
+ })
+
+ it('Is reactive to style changes', () => {
+ cy.viewport(600, 400)
+ cy.mount(FileListMock)
+ cy.get('#app-content-vue')
+ .should('be.visible')
+ .and('contain.text', '600')
+ .invoke('attr', 'style', 'width: 100px')
+
+ cy.get('#app-content-vue')
+ .should('contain.text', '100')
+ })
+})
diff --git a/apps/files/src/composables/useFileListWidth.ts b/apps/files/src/composables/useFileListWidth.ts
new file mode 100644
index 00000000000..621ef204836
--- /dev/null
+++ b/apps/files/src/composables/useFileListWidth.ts
@@ -0,0 +1,50 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Ref } from 'vue'
+import { onMounted, readonly, ref } from 'vue'
+
+/** The element we observe */
+let element: HTMLElement | undefined
+
+/** The current width of the element */
+const width = ref(0)
+
+const observer = new ResizeObserver((elements) => {
+ if (elements[0].contentBoxSize) {
+ // use the newer `contentBoxSize` property if available
+ width.value = elements[0].contentBoxSize[0].inlineSize
+ } else {
+ // fall back to `contentRect`
+ width.value = elements[0].contentRect.width
+ }
+})
+
+/**
+ * Update the observed element if needed and reconfigure the observer
+ */
+function updateObserver() {
+ const el = document.querySelector<HTMLElement>('#app-content-vue') ?? document.body
+ if (el !== element) {
+ // if already observing: stop observing the old element
+ if (element) {
+ observer.unobserve(element)
+ }
+ // observe the new element if needed
+ observer.observe(el)
+ element = el
+ }
+}
+
+/**
+ * Get the reactive width of the file list
+ */
+export function useFileListWidth(): Readonly<Ref<number>> {
+ // Update the observer when the component is mounted (e.g. because this is the files app)
+ onMounted(updateObserver)
+ // Update the observer also in setup context, so we already have an initial value
+ updateObserver()
+
+ return readonly(width)
+}
diff --git a/apps/files/src/composables/useHotKeys.spec.ts b/apps/files/src/composables/useHotKeys.spec.ts
new file mode 100644
index 00000000000..9c001e8b5ff
--- /dev/null
+++ b/apps/files/src/composables/useHotKeys.spec.ts
@@ -0,0 +1,213 @@
+/*
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Location } from 'vue-router'
+
+import { File, Folder, Permission, View } from '@nextcloud/files'
+import { enableAutoDestroy, mount } from '@vue/test-utils'
+import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'
+import { defineComponent, nextTick } from 'vue'
+import axios from '@nextcloud/axios'
+
+import { getPinia } from '../store/index.ts'
+import { useActiveStore } from '../store/active.ts'
+import { useFilesStore } from '../store/files'
+
+import { action as deleteAction } from '../actions/deleteAction.ts'
+import { action as favoriteAction } from '../actions/favoriteAction.ts'
+import { action as renameAction } from '../actions/renameAction.ts'
+import { action as sidebarAction } from '../actions/sidebarAction.ts'
+import { useHotKeys } from './useHotKeys.ts'
+import { useUserConfigStore } from '../store/userconfig.ts'
+
+// this is the mocked current route
+const route = vi.hoisted(() => ({
+ name: 'test',
+ params: {
+ fileId: 123,
+ },
+ query: {
+ openFile: 'false',
+ dir: '/parent/dir',
+ },
+}))
+
+// mocked router
+const router = vi.hoisted(() => ({
+ push: vi.fn<(route: Location) => void>(),
+}))
+
+vi.mock('../actions/sidebarAction.ts', { spy: true })
+vi.mock('../actions/deleteAction.ts', { spy: true })
+vi.mock('../actions/favoriteAction.ts', { spy: true })
+vi.mock('../actions/renameAction.ts', { spy: true })
+
+vi.mock('vue-router/composables', () => ({
+ useRoute: vi.fn(() => route),
+ useRouter: vi.fn(() => router),
+}))
+
+let file: File
+const view = {
+ id: 'files',
+ name: 'Files',
+} as View
+
+const TestComponent = defineComponent({
+ name: 'test',
+ setup() {
+ useHotKeys()
+ },
+ template: '<div />',
+})
+
+describe('HotKeysService testing', () => {
+ const activeStore = useActiveStore(getPinia())
+
+ let initialState: HTMLInputElement
+
+ enableAutoDestroy(afterEach)
+
+ afterEach(() => {
+ document.body.removeChild(initialState)
+ })
+
+ beforeEach(() => {
+ // Make sure the router is reset before each test
+ router.push.mockClear()
+
+ // Make sure the file is reset before each test
+ file = new File({
+ id: 2,
+ source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
+ owner: 'admin',
+ mime: 'text/plain',
+ permissions: Permission.ALL,
+ })
+
+ const root = new Folder({ owner: 'test', source: 'https://cloud.domain.com/remote.php/dav/files/admin/', id: 1, permissions: Permission.CREATE })
+ const files = useFilesStore(getPinia())
+ files.setRoot({ service: 'files', root })
+
+ // Setting the view first as it reset the active node
+ activeStore.activeView = view
+ activeStore.activeNode = file
+
+ window.OCA = { Files: { Sidebar: { open: () => {}, setActiveTab: () => {} } } }
+ initialState = document.createElement('input')
+ initialState.setAttribute('type', 'hidden')
+ initialState.setAttribute('id', 'initial-state-files_trashbin-config')
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: true,
+ })))
+ document.body.appendChild(initialState)
+
+ mount(TestComponent)
+ })
+
+ it('Pressing d should open the sidebar once', () => {
+ dispatchEvent({ key: 'd', code: 'KeyD' })
+
+ // Modifier keys should not trigger the action
+ dispatchEvent({ key: 'd', code: 'KeyD', ctrlKey: true })
+ dispatchEvent({ key: 'd', code: 'KeyD', altKey: true })
+ dispatchEvent({ key: 'd', code: 'KeyD', shiftKey: true })
+ dispatchEvent({ key: 'd', code: 'KeyD', metaKey: true })
+
+ expect(sidebarAction.enabled).toHaveReturnedWith(true)
+ expect(sidebarAction.exec).toHaveBeenCalledOnce()
+ })
+
+ it('Pressing F2 should rename the file', () => {
+ dispatchEvent({ key: 'F2', code: 'F2' })
+
+ // Modifier keys should not trigger the action
+ dispatchEvent({ key: 'F2', code: 'F2', ctrlKey: true })
+ dispatchEvent({ key: 'F2', code: 'F2', altKey: true })
+ dispatchEvent({ key: 'F2', code: 'F2', shiftKey: true })
+ dispatchEvent({ key: 'F2', code: 'F2', metaKey: true })
+
+ expect(renameAction.enabled).toHaveReturnedWith(true)
+ expect(renameAction.exec).toHaveBeenCalledOnce()
+ })
+
+ it('Pressing s should toggle favorite', () => {
+ vi.spyOn(axios, 'post').mockImplementationOnce(() => Promise.resolve())
+ dispatchEvent({ key: 's', code: 'KeyS' })
+
+ // Modifier keys should not trigger the action
+ dispatchEvent({ key: 's', code: 'KeyS', ctrlKey: true })
+ dispatchEvent({ key: 's', code: 'KeyS', altKey: true })
+ dispatchEvent({ key: 's', code: 'KeyS', shiftKey: true })
+ dispatchEvent({ key: 's', code: 'KeyS', metaKey: true })
+
+ expect(favoriteAction.enabled).toHaveReturnedWith(true)
+ expect(favoriteAction.exec).toHaveBeenCalledOnce()
+ })
+
+ it('Pressing Delete should delete the file', async () => {
+ // @ts-expect-error unit testing
+ vi.spyOn(deleteAction._action, 'exec').mockResolvedValue(() => true)
+
+ dispatchEvent({ key: 'Delete', code: 'Delete' })
+
+ // Modifier keys should not trigger the action
+ dispatchEvent({ key: 'Delete', code: 'Delete', ctrlKey: true })
+ dispatchEvent({ key: 'Delete', code: 'Delete', altKey: true })
+ dispatchEvent({ key: 'Delete', code: 'Delete', shiftKey: true })
+ dispatchEvent({ key: 'Delete', code: 'Delete', metaKey: true })
+
+ expect(deleteAction.enabled).toHaveReturnedWith(true)
+ expect(deleteAction.exec).toHaveBeenCalledOnce()
+ })
+
+ it('Pressing alt+up should go to parent directory', () => {
+ expect(router.push).toHaveBeenCalledTimes(0)
+ dispatchEvent({ key: 'ArrowUp', code: 'ArrowUp', altKey: true })
+
+ expect(router.push).toHaveBeenCalledOnce()
+ expect(router.push.mock.calls[0][0].query?.dir).toBe('/parent')
+ })
+
+ it('Pressing v should toggle grid view', async () => {
+ vi.spyOn(axios, 'put').mockImplementationOnce(() => Promise.resolve())
+
+ const userConfigStore = useUserConfigStore(getPinia())
+ userConfigStore.userConfig.grid_view = false
+ expect(userConfigStore.userConfig.grid_view).toBe(false)
+
+ dispatchEvent({ key: 'v', code: 'KeyV' })
+ expect(userConfigStore.userConfig.grid_view).toBe(true)
+ })
+
+ it.each([
+ ['ctrlKey'],
+ ['altKey'],
+ // those meta keys are still triggering...
+ // ['shiftKey'],
+ // ['metaKey']
+ ])('Pressing v with modifier key %s should not toggle grid view', async (modifier: string) => {
+ vi.spyOn(axios, 'put').mockImplementationOnce(() => Promise.resolve())
+
+ const userConfigStore = useUserConfigStore(getPinia())
+ userConfigStore.userConfig.grid_view = false
+ expect(userConfigStore.userConfig.grid_view).toBe(false)
+
+ dispatchEvent(new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', [modifier]: true }))
+
+ await nextTick()
+
+ expect(userConfigStore.userConfig.grid_view).toBe(false)
+ })
+})
+
+/**
+ * Helper to dispatch the correct event.
+ *
+ * @param init - KeyboardEvent options
+ */
+function dispatchEvent(init: KeyboardEventInit) {
+ document.body.dispatchEvent(new KeyboardEvent('keydown', { ...init, bubbles: true }))
+}
diff --git a/apps/files/src/composables/useHotKeys.ts b/apps/files/src/composables/useHotKeys.ts
new file mode 100644
index 00000000000..ff56627b2f9
--- /dev/null
+++ b/apps/files/src/composables/useHotKeys.ts
@@ -0,0 +1,86 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+import { dirname } from 'path'
+import { useRoute, useRouter } from 'vue-router/composables'
+
+import { action as deleteAction } from '../actions/deleteAction.ts'
+import { action as favoriteAction } from '../actions/favoriteAction.ts'
+import { action as renameAction } from '../actions/renameAction.ts'
+import { action as sidebarAction } from '../actions/sidebarAction.ts'
+import { useUserConfigStore } from '../store/userconfig.ts'
+import { useRouteParameters } from './useRouteParameters.ts'
+import { executeAction } from '../utils/actionUtils.ts'
+import logger from '../logger.ts'
+
+/**
+ * This register the hotkeys for the Files app.
+ * As much as possible, we try to have all the hotkeys in one place.
+ * Please make sure to add tests for the hotkeys after adding a new one.
+ */
+export function useHotKeys(): void {
+ const userConfigStore = useUserConfigStore()
+ const { directory } = useRouteParameters()
+ const router = useRouter()
+ const route = useRoute()
+
+ // d opens the sidebar
+ useHotKey('d', () => executeAction(sidebarAction), {
+ stop: true,
+ prevent: true,
+ })
+
+ // F2 renames the file
+ useHotKey('F2', () => executeAction(renameAction), {
+ stop: true,
+ prevent: true,
+ })
+
+ // s toggle favorite
+ useHotKey('s', () => executeAction(favoriteAction), {
+ stop: true,
+ prevent: true,
+ })
+
+ // Delete deletes the file
+ useHotKey('Delete', () => executeAction(deleteAction), {
+ stop: true,
+ prevent: true,
+ })
+
+ // alt+up go to parent directory
+ useHotKey('ArrowUp', goToParentDir, {
+ stop: true,
+ prevent: true,
+ alt: true,
+ })
+
+ // v toggle grid view
+ useHotKey('v', toggleGridView, {
+ stop: true,
+ prevent: true,
+ })
+
+ logger.debug('Hotkeys registered')
+
+ /**
+ * Use the router to go to the parent directory
+ */
+ function goToParentDir() {
+ const dir = dirname(directory.value)
+
+ logger.debug('Navigating to parent directory', { dir })
+ router.push({ params: { ...route.params }, query: { ...route.query, dir } })
+ }
+
+ /**
+ * Toggle the grid view
+ */
+ function toggleGridView() {
+ const value = userConfigStore.userConfig.grid_view
+ logger.debug('Toggling grid view', { old: value, new: !value })
+ userConfigStore.update('grid_view', !value)
+ }
+}
diff --git a/apps/files/src/composables/useNavigation.spec.ts b/apps/files/src/composables/useNavigation.spec.ts
new file mode 100644
index 00000000000..b9eb671a181
--- /dev/null
+++ b/apps/files/src/composables/useNavigation.spec.ts
@@ -0,0 +1,106 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Navigation, View } from '@nextcloud/files'
+
+import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { mount } from '@vue/test-utils'
+import { defineComponent } from 'vue'
+
+import { useNavigation } from './useNavigation'
+import * as nextcloudFiles from '@nextcloud/files'
+
+// Just a wrapper so we can test the composable
+const TestComponent = defineComponent({
+ template: '<div></div>',
+ setup() {
+ const { currentView, views } = useNavigation()
+ return {
+ currentView,
+ views,
+ }
+ },
+})
+
+describe('Composables: useNavigation', () => {
+ const spy = vi.spyOn(nextcloudFiles, 'getNavigation')
+ let navigation: Navigation
+
+ describe('currentView', () => {
+ beforeEach(() => {
+ // eslint-disable-next-line import/namespace
+ navigation = new nextcloudFiles.Navigation()
+ spy.mockImplementation(() => navigation)
+ })
+
+ it('should return null without active navigation', () => {
+ const wrapper = mount(TestComponent)
+ expect((wrapper.vm as unknown as { currentView: View | null}).currentView).toBe(null)
+ })
+
+ it('should return already active navigation', async () => {
+ // eslint-disable-next-line import/namespace
+ const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+ navigation.register(view)
+ navigation.setActive(view)
+ // Now the navigation is already set it should take the active navigation
+ const wrapper = mount(TestComponent)
+ expect((wrapper.vm as unknown as { currentView: View | null}).currentView).toBe(view)
+ })
+
+ it('should be reactive on updating active navigation', async () => {
+ // eslint-disable-next-line import/namespace
+ const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+ navigation.register(view)
+ const wrapper = mount(TestComponent)
+
+ // no active navigation
+ expect((wrapper.vm as unknown as { currentView: View | null}).currentView).toBe(null)
+
+ navigation.setActive(view)
+ // Now the navigation is set it should take the active navigation
+ expect((wrapper.vm as unknown as { currentView: View | null}).currentView).toBe(view)
+ })
+ })
+
+ describe('views', () => {
+ beforeEach(() => {
+ // eslint-disable-next-line import/namespace
+ navigation = new nextcloudFiles.Navigation()
+ spy.mockImplementation(() => navigation)
+ })
+
+ it('should return empty array without registered views', () => {
+ const wrapper = mount(TestComponent)
+ expect((wrapper.vm as unknown as { views: View[]}).views).toStrictEqual([])
+ })
+
+ it('should return already registered views', () => {
+ // eslint-disable-next-line import/namespace
+ const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+ // register before mount
+ navigation.register(view)
+ // now mount and check that the view is listed
+ const wrapper = mount(TestComponent)
+ expect((wrapper.vm as unknown as { views: View[]}).views).toStrictEqual([view])
+ })
+
+ it('should be reactive on registering new views', () => {
+ // eslint-disable-next-line import/namespace
+ const view = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+ // eslint-disable-next-line import/namespace
+ const view2 = new nextcloudFiles.View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-2', name: 'My View 2', order: 1 })
+
+ // register before mount
+ navigation.register(view)
+ // now mount and check that the view is listed
+ const wrapper = mount(TestComponent)
+ expect((wrapper.vm as unknown as { views: View[]}).views).toStrictEqual([view])
+
+ // now register view 2 and check it is reactivly added
+ navigation.register(view2)
+ expect((wrapper.vm as unknown as { views: View[]}).views).toStrictEqual([view, view2])
+ })
+ })
+})
diff --git a/apps/files/src/composables/useNavigation.ts b/apps/files/src/composables/useNavigation.ts
new file mode 100644
index 00000000000..2a6f22a1232
--- /dev/null
+++ b/apps/files/src/composables/useNavigation.ts
@@ -0,0 +1,53 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { View } from '@nextcloud/files'
+import type { ShallowRef } from 'vue'
+
+import { getNavigation } from '@nextcloud/files'
+import { subscribe } from '@nextcloud/event-bus'
+import { onMounted, onUnmounted, shallowRef, triggerRef } from 'vue'
+
+/**
+ * Composable to get the currently active files view from the files navigation
+ * @param _loaded If set enforce a current view is loaded
+ */
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+export function useNavigation<T extends boolean>(_loaded?: T) {
+ type MaybeView = T extends true ? View : (View | null);
+ const navigation = getNavigation()
+ const views: ShallowRef<View[]> = shallowRef(navigation.views)
+ const currentView: ShallowRef<MaybeView> = shallowRef(navigation.active as MaybeView)
+
+ /**
+ * Event listener to update the `currentView`
+ * @param event The update event
+ */
+ function onUpdateActive(event: CustomEvent<View|null>) {
+ currentView.value = event.detail as MaybeView
+ }
+
+ /**
+ * Event listener to update all registered views
+ */
+ function onUpdateViews() {
+ views.value = navigation.views
+ triggerRef(views)
+ }
+
+ onMounted(() => {
+ navigation.addEventListener('update', onUpdateViews)
+ navigation.addEventListener('updateActive', onUpdateActive)
+ subscribe('files:navigation:updated', onUpdateViews)
+ })
+ onUnmounted(() => {
+ navigation.removeEventListener('update', onUpdateViews)
+ navigation.removeEventListener('updateActive', onUpdateActive)
+ })
+
+ return {
+ currentView,
+ views,
+ }
+}
diff --git a/apps/files/src/composables/useRouteParameters.ts b/apps/files/src/composables/useRouteParameters.ts
new file mode 100644
index 00000000000..dbb8ca7f081
--- /dev/null
+++ b/apps/files/src/composables/useRouteParameters.ts
@@ -0,0 +1,58 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { computed } from 'vue'
+import { useRoute } from 'vue-router/composables'
+
+/**
+ * Get information about the current route
+ */
+export function useRouteParameters() {
+
+ const route = useRoute()
+
+ /**
+ * Get the path of the current active directory
+ */
+ const directory = computed<string>(
+ () => String(route.query.dir || '/')
+ // Remove any trailing slash but leave root slash
+ .replace(/^(.+)\/$/, '$1'),
+ )
+
+ /**
+ * Get the current fileId used on the route
+ */
+ const fileId = computed<number | null>(() => {
+ const fileId = Number.parseInt(route.params.fileid ?? '0') || null
+ return Number.isNaN(fileId) ? null : fileId
+ })
+
+ /**
+ * State of `openFile` route param
+ */
+ const openFile = computed<boolean>(
+ // if `openfile` is set it is considered truthy, but allow to explicitly set it to 'false'
+ () => 'openfile' in route.query && (typeof route.query.openfile !== 'string' || route.query.openfile.toLocaleLowerCase() !== 'false'),
+ )
+
+ const openDetails = computed<boolean>(
+ // if `opendetails` is set it is considered truthy, but allow to explicitly set it to 'false'
+ () => 'opendetails' in route.query && (typeof route.query.opendetails !== 'string' || route.query.opendetails.toLocaleLowerCase() !== 'false'),
+ )
+
+ return {
+ /** Path of currently open directory */
+ directory,
+
+ /** Current active fileId */
+ fileId,
+
+ /** Should the active node should be opened (`openFile` route param) */
+ openFile,
+
+ /** Should the details sidebar be shown (`openDetails` route param) */
+ openDetails,
+ }
+}
diff --git a/apps/files/src/eventbus.d.ts b/apps/files/src/eventbus.d.ts
new file mode 100644
index 00000000000..ab8dbb63dfc
--- /dev/null
+++ b/apps/files/src/eventbus.d.ts
@@ -0,0 +1,36 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { IFileListFilter, Node, View } from '@nextcloud/files'
+import type { SearchScope } from './types'
+
+declare module '@nextcloud/event-bus' {
+ export interface NextcloudEvents {
+ // mapping of 'event name' => 'event type'
+ 'files:config:updated': { key: string, value: boolean }
+ 'files:view-config:updated': { key: string, value: string|number|boolean, view: string }
+
+ 'files:favorites:removed': Node
+ 'files:favorites:added': Node
+
+ 'files:filter:added': IFileListFilter
+ 'files:filter:removed': string
+ // the state of some filters has changed
+ 'files:filters:changed': undefined
+
+ 'files:navigation:changed': View
+
+ 'files:node:created': Node
+ 'files:node:deleted': Node
+ 'files:node:updated': Node
+ 'files:node:rename': Node
+ 'files:node:renamed': Node
+ 'files:node:moved': { node: Node, oldSource: string }
+
+ 'files:search:updated': { query: string, scope: SearchScope }
+ }
+}
+
+export {}
diff --git a/apps/files/src/files-app-settings.js b/apps/files/src/files-app-settings.js
deleted file mode 100644
index 491ea127ccd..00000000000
--- a/apps/files/src/files-app-settings.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author Gary Kim <gary@garykim.dev>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import Vue from 'vue'
-import Settings from './services/Settings'
-import SettingsView from './views/Settings'
-import Setting from './models/Setting'
-
-Vue.prototype.t = t
-
-// Init Files App Settings Service
-if (!window.OCA.Files) {
- window.OCA.Files = {}
-}
-Object.assign(window.OCA.Files, { Settings: new Settings() })
-Object.assign(window.OCA.Files.Settings, { Setting })
-
-window.addEventListener('DOMContentLoaded', function() {
- if (window.TESTING) {
- return
- }
- // Init Vue app
- // eslint-disable-next-line
- new Vue({
- el: '#files-app-settings',
- render: h => h(SettingsView),
- })
-
- const appSettingsHeader = document.getElementById('app-settings-header')
- if (appSettingsHeader) {
- appSettingsHeader.addEventListener('click', e => {
- const opened = e.currentTarget.children[0].classList.contains('opened')
- OCA.Files.Settings.settings.forEach(e => opened ? e.close() : e.open())
- })
- }
-})
diff --git a/apps/files/src/filters/FilenameFilter.ts b/apps/files/src/filters/FilenameFilter.ts
new file mode 100644
index 00000000000..f86269ccd99
--- /dev/null
+++ b/apps/files/src/filters/FilenameFilter.ts
@@ -0,0 +1,75 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { IFileListFilterChip, INode } from '@nextcloud/files'
+
+import { subscribe } from '@nextcloud/event-bus'
+import { FileListFilter, registerFileListFilter } from '@nextcloud/files'
+import { getPinia } from '../store/index.ts'
+import { useSearchStore } from '../store/search.ts'
+
+/**
+ * Register the filename filter
+ */
+export function registerFilenameFilter() {
+ registerFileListFilter(new FilenameFilter())
+}
+
+/**
+ * Simple file list filter controlled by the Navigation search box
+ */
+class FilenameFilter extends FileListFilter {
+
+ private searchQuery = ''
+
+ constructor() {
+ super('files:filename', 5)
+ subscribe('files:search:updated', ({ query, scope }) => {
+ if (scope === 'filter') {
+ this.updateQuery(query)
+ }
+ })
+ }
+
+ public filter(nodes: INode[]): INode[] {
+ const queryParts = this.searchQuery.toLocaleLowerCase().split(' ').filter(Boolean)
+ return nodes.filter((node) => {
+ const displayname = node.displayname.toLocaleLowerCase()
+ return queryParts.every((part) => displayname.includes(part))
+ })
+ }
+
+ public reset(): void {
+ this.updateQuery('')
+ }
+
+ public updateQuery(query: string) {
+ query = (query || '').trim()
+
+ // Only if the query is different we update the filter to prevent re-computing all nodes
+ if (query !== this.searchQuery) {
+ this.searchQuery = query
+ this.filterUpdated()
+
+ const chips: IFileListFilterChip[] = []
+ if (query !== '') {
+ chips.push({
+ text: query,
+ onclick: () => {
+ this.updateQuery('')
+ },
+ })
+ } else {
+ // make sure to also reset the search store when pressing the "X" on the filter chip
+ const store = useSearchStore(getPinia())
+ if (store.scope === 'filter') {
+ store.query = ''
+ }
+ }
+ this.updateChips(chips)
+ }
+ }
+
+}
diff --git a/apps/files/src/filters/HiddenFilesFilter.ts b/apps/files/src/filters/HiddenFilesFilter.ts
new file mode 100644
index 00000000000..e48881d4ab7
--- /dev/null
+++ b/apps/files/src/filters/HiddenFilesFilter.ts
@@ -0,0 +1,42 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { INode } from '@nextcloud/files'
+import type { UserConfig } from '../types'
+import { FileListFilter, registerFileListFilter } from '@nextcloud/files'
+import { subscribe } from '@nextcloud/event-bus'
+import { loadState } from '@nextcloud/initial-state'
+
+class HiddenFilesFilter extends FileListFilter {
+
+ private showHidden?: boolean
+
+ constructor() {
+ super('files:hidden', 0)
+ this.showHidden = loadState<Partial<UserConfig>>('files', 'config', { show_hidden: false }).show_hidden
+
+ subscribe('files:config:updated', ({ key, value }) => {
+ if (key === 'show_hidden') {
+ this.showHidden = Boolean(value)
+ this.filterUpdated()
+ }
+ })
+ }
+
+ public filter(nodes: INode[]): INode[] {
+ if (this.showHidden) {
+ return nodes
+ }
+ return nodes.filter((node) => (node.attributes.hidden !== true && !node.basename.startsWith('.')))
+ }
+
+}
+
+/**
+ * Register a file list filter to only show hidden files if enabled by user config
+ */
+export function registerHiddenFilesFilter() {
+ registerFileListFilter(new HiddenFilesFilter())
+}
diff --git a/apps/files/src/filters/ModifiedFilter.ts b/apps/files/src/filters/ModifiedFilter.ts
new file mode 100644
index 00000000000..e7d7c2f26a7
--- /dev/null
+++ b/apps/files/src/filters/ModifiedFilter.ts
@@ -0,0 +1,114 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { IFileListFilterChip, INode } from '@nextcloud/files'
+
+import { FileListFilter, registerFileListFilter } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import Vue from 'vue'
+import FileListFilterModified from '../components/FileListFilter/FileListFilterModified.vue'
+
+import calendarSvg from '@mdi/svg/svg/calendar.svg?raw'
+
+export interface ITimePreset {
+ id: string,
+ label: string,
+ filter: (time: number) => boolean
+}
+
+const startOfToday = () => (new Date()).setHours(0, 0, 0, 0)
+
+/**
+ * Available presets
+ */
+const timePresets: ITimePreset[] = [
+ {
+ id: 'today',
+ label: t('files', 'Today'),
+ filter: (time: number) => time > startOfToday(),
+ },
+ {
+ id: 'last-7',
+ label: t('files', 'Last 7 days'),
+ filter: (time: number) => time > (startOfToday() - (7 * 24 * 60 * 60 * 1000)),
+ },
+ {
+ id: 'last-30',
+ label: t('files', 'Last 30 days'),
+ filter: (time: number) => time > (startOfToday() - (30 * 24 * 60 * 60 * 1000)),
+ },
+ {
+ id: 'this-year',
+ label: t('files', 'This year ({year})', { year: (new Date()).getFullYear() }),
+ filter: (time: number) => time > (new Date(startOfToday())).setMonth(0, 1),
+ },
+ {
+ id: 'last-year',
+ label: t('files', 'Last year ({year})', { year: (new Date()).getFullYear() - 1 }),
+ filter: (time: number) => (time > (new Date(startOfToday())).setFullYear((new Date()).getFullYear() - 1, 0, 1)) && (time < (new Date(startOfToday())).setMonth(0, 1)),
+ },
+] as const
+
+class ModifiedFilter extends FileListFilter {
+
+ private currentInstance?: Vue
+ private currentPreset?: ITimePreset
+
+ constructor() {
+ super('files:modified', 50)
+ }
+
+ public mount(el: HTMLElement) {
+ if (this.currentInstance) {
+ this.currentInstance.$destroy()
+ }
+
+ const View = Vue.extend(FileListFilterModified as never)
+ this.currentInstance = new View({
+ propsData: {
+ timePresets,
+ },
+ el,
+ })
+ .$on('update:preset', this.setPreset.bind(this))
+ .$mount()
+ }
+
+ public filter(nodes: INode[]): INode[] {
+ if (!this.currentPreset) {
+ return nodes
+ }
+
+ return nodes.filter((node) => node.mtime === undefined || this.currentPreset!.filter(node.mtime.getTime()))
+ }
+
+ public reset(): void {
+ this.setPreset()
+ }
+
+ public setPreset(preset?: ITimePreset) {
+ this.currentPreset = preset
+ this.filterUpdated()
+
+ const chips: IFileListFilterChip[] = []
+ if (preset) {
+ chips.push({
+ icon: calendarSvg,
+ text: preset.label,
+ onclick: () => this.setPreset(),
+ })
+ } else {
+ (this.currentInstance as { resetFilter: () => void } | undefined)?.resetFilter()
+ }
+ this.updateChips(chips)
+ }
+
+}
+
+/**
+ * Register the file list filter by modification date
+ */
+export function registerModifiedFilter() {
+ registerFileListFilter(new ModifiedFilter())
+}
diff --git a/apps/files/src/filters/SearchFilter.ts b/apps/files/src/filters/SearchFilter.ts
new file mode 100644
index 00000000000..4c7231fd26a
--- /dev/null
+++ b/apps/files/src/filters/SearchFilter.ts
@@ -0,0 +1,49 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { INode } from '@nextcloud/files'
+import type { ComponentPublicInstance } from 'vue'
+
+import { subscribe } from '@nextcloud/event-bus'
+import { FileListFilter, registerFileListFilter } from '@nextcloud/files'
+import Vue from 'vue'
+import FileListFilterToSearch from '../components/FileListFilter/FileListFilterToSearch.vue'
+
+class SearchFilter extends FileListFilter {
+
+ private currentInstance?: ComponentPublicInstance<typeof FileListFilterToSearch>
+
+ constructor() {
+ super('files:filter-to-search', 999)
+ subscribe('files:search:updated', ({ query, scope }) => {
+ if (query && scope === 'filter') {
+ this.currentInstance?.showButton()
+ } else {
+ this.currentInstance?.hideButton()
+ }
+ })
+ }
+
+ public mount(el: HTMLElement) {
+ if (this.currentInstance) {
+ this.currentInstance.$destroy()
+ }
+
+ const View = Vue.extend(FileListFilterToSearch)
+ this.currentInstance = new View().$mount(el) as unknown as ComponentPublicInstance<typeof FileListFilterToSearch>
+ }
+
+ public filter(nodes: INode[]): INode[] {
+ return nodes
+ }
+
+}
+
+/**
+ * Register a file list filter to only show hidden files if enabled by user config
+ */
+export function registerFilterToSearchToggle() {
+ registerFileListFilter(new SearchFilter())
+}
diff --git a/apps/files/src/filters/TypeFilter.ts b/apps/files/src/filters/TypeFilter.ts
new file mode 100644
index 00000000000..3170e22b260
--- /dev/null
+++ b/apps/files/src/filters/TypeFilter.ts
@@ -0,0 +1,192 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { IFileListFilterChip, INode } from '@nextcloud/files'
+
+import { FileListFilter, registerFileListFilter } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import Vue from 'vue'
+import FileListFilterType from '../components/FileListFilter/FileListFilterType.vue'
+
+// TODO: Create a modern replacement for OC.MimeType...
+import svgDocument from '@mdi/svg/svg/file-document.svg?raw'
+import svgSpreadsheet from '@mdi/svg/svg/file-table-box.svg?raw'
+import svgPresentation from '@mdi/svg/svg/file-presentation-box.svg?raw'
+import svgPDF from '@mdi/svg/svg/file-pdf-box.svg?raw'
+import svgFolder from '@mdi/svg/svg/folder.svg?raw'
+import svgAudio from '@mdi/svg/svg/music.svg?raw'
+import svgImage from '@mdi/svg/svg/image.svg?raw'
+import svgMovie from '@mdi/svg/svg/movie.svg?raw'
+
+export interface ITypePreset {
+ id: string
+ label: string
+ icon: string
+ mime: string[]
+}
+
+const colorize = (svg: string, color: string) => {
+ return svg.replace('<path ', `<path fill="${color}" `)
+}
+
+/**
+ * Available presets
+ */
+const getTypePresets = async () => [
+ {
+ id: 'document',
+ label: t('files', 'Documents'),
+ icon: colorize(svgDocument, '#49abea'),
+ mime: ['x-office/document'],
+ },
+ {
+ id: 'spreadsheet',
+ label: t('files', 'Spreadsheets'),
+ icon: colorize(svgSpreadsheet, '#9abd4e'),
+ mime: ['x-office/spreadsheet'],
+ },
+ {
+ id: 'presentation',
+ label: t('files', 'Presentations'),
+ icon: colorize(svgPresentation, '#f0965f'),
+ mime: ['x-office/presentation'],
+ },
+ {
+ id: 'pdf',
+ label: t('files', 'PDFs'),
+ icon: colorize(svgPDF, '#dc5047'),
+ mime: ['application/pdf'],
+ },
+ {
+ id: 'folder',
+ label: t('files', 'Folders'),
+ icon: colorize(svgFolder, window.getComputedStyle(document.body).getPropertyValue('--color-primary-element')),
+ mime: ['httpd/unix-directory'],
+ },
+ {
+ id: 'audio',
+ label: t('files', 'Audio'),
+ icon: svgAudio,
+ mime: ['audio'],
+ },
+ {
+ id: 'image',
+ // TRANSLATORS: This is for filtering files, e.g. PNG or JPEG, so photos, drawings, or images in general
+ label: t('files', 'Images'),
+ icon: svgImage,
+ mime: ['image'],
+ },
+ {
+ id: 'video',
+ label: t('files', 'Videos'),
+ icon: svgMovie,
+ mime: ['video'],
+ },
+] as ITypePreset[]
+
+class TypeFilter extends FileListFilter {
+
+ private currentInstance?: Vue
+ private currentPresets: ITypePreset[]
+ private allPresets?: ITypePreset[]
+
+ constructor() {
+ super('files:type', 10)
+ this.currentPresets = []
+ }
+
+ public async mount(el: HTMLElement) {
+ // We need to defer this as on init script this is not available:
+ if (this.allPresets === undefined) {
+ this.allPresets = await getTypePresets()
+ }
+
+ // Already mounted
+ if (this.currentInstance) {
+ this.currentInstance.$destroy()
+ delete this.currentInstance
+ }
+
+ const View = Vue.extend(FileListFilterType as never)
+ this.currentInstance = new View({
+ propsData: {
+ presets: this.currentPresets,
+ typePresets: this.allPresets!,
+ },
+ el,
+ })
+ .$on('update:presets', this.setPresets.bind(this))
+ .$mount()
+ }
+
+ public filter(nodes: INode[]): INode[] {
+ if (!this.currentPresets || this.currentPresets.length === 0) {
+ return nodes
+ }
+
+ const mimeList = this.currentPresets.reduce((previous: string[], current) => [...previous, ...current.mime], [] as string[])
+ return nodes.filter((node) => {
+ if (!node.mime) {
+ return false
+ }
+ const mime = node.mime.toLowerCase()
+
+ if (mimeList.includes(mime)) {
+ return true
+ } else if (mimeList.includes(window.OC.MimeTypeList.aliases[mime])) {
+ return true
+ } else if (mimeList.includes(mime.split('/')[0])) {
+ return true
+ }
+ return false
+ })
+ }
+
+ public reset(): void {
+ this.setPresets()
+ }
+
+ public setPresets(presets?: ITypePreset[]) {
+ this.currentPresets = presets ?? []
+ if (this.currentInstance !== undefined) {
+ // could be called before the instance was created
+ // (meaning the files list is not mounted yet)
+ this.currentInstance.$props.presets = presets
+ }
+
+ this.filterUpdated()
+
+ const chips: IFileListFilterChip[] = []
+ if (presets && presets.length > 0) {
+ for (const preset of presets) {
+ chips.push({
+ icon: preset.icon,
+ text: preset.label,
+ onclick: () => this.removeFilterPreset(preset.id),
+ })
+ }
+ } else {
+ (this.currentInstance as { resetFilter: () => void } | undefined)?.resetFilter()
+ }
+ this.updateChips(chips)
+ }
+
+ /**
+ * Helper callback that removed a preset from selected.
+ * This is used when clicking on "remove" on a filter-chip.
+ * @param presetId Id of preset to remove
+ */
+ private removeFilterPreset(presetId: string) {
+ const filtered = this.currentPresets.filter(({ id }) => id !== presetId)
+ this.setPresets(filtered)
+ }
+
+}
+
+/**
+ * Register the file list filter by file type
+ */
+export function registerTypeFilter() {
+ registerFileListFilter(new TypeFilter())
+}
diff --git a/apps/files/src/init.ts b/apps/files/src/init.ts
new file mode 100644
index 00000000000..74eca0969b4
--- /dev/null
+++ b/apps/files/src/init.ts
@@ -0,0 +1,83 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { addNewFileMenuEntry, registerDavProperty, registerFileAction } from '@nextcloud/files'
+
+import { action as deleteAction } from './actions/deleteAction'
+import { action as downloadAction } from './actions/downloadAction'
+import { action as editLocallyAction } from './actions/openLocallyAction.ts'
+import { action as favoriteAction } from './actions/favoriteAction'
+import { action as moveOrCopyAction } from './actions/moveOrCopyAction'
+import { action as openFolderAction } from './actions/openFolderAction'
+import { action as openInFilesAction } from './actions/openInFilesAction'
+import { action as renameAction } from './actions/renameAction'
+import { action as sidebarAction } from './actions/sidebarAction'
+import { action as viewInFolderAction } from './actions/viewInFolderAction'
+
+import { registerHiddenFilesFilter } from './filters/HiddenFilesFilter.ts'
+import { registerTypeFilter } from './filters/TypeFilter.ts'
+import { registerModifiedFilter } from './filters/ModifiedFilter.ts'
+
+import { entry as newFolderEntry } from './newMenu/newFolder.ts'
+import { entry as newTemplatesFolder } from './newMenu/newTemplatesFolder.ts'
+import { registerTemplateEntries } from './newMenu/newFromTemplate.ts'
+
+import { registerFavoritesView } from './views/favorites.ts'
+import registerRecentView from './views/recent'
+import { registerPersonalFilesView } from './views/personal-files'
+import { registerFilesView } from './views/files'
+import { registerFolderTreeView } from './views/folderTree.ts'
+import { registerSearchView } from './views/search.ts'
+
+import registerPreviewServiceWorker from './services/ServiceWorker.js'
+
+import { initLivePhotos } from './services/LivePhotos'
+import { isPublicShare } from '@nextcloud/sharing/public'
+import { registerConvertActions } from './actions/convertAction.ts'
+import { registerFilenameFilter } from './filters/FilenameFilter.ts'
+import { registerFilterToSearchToggle } from './filters/SearchFilter.ts'
+
+// Register file actions
+registerConvertActions()
+registerFileAction(deleteAction)
+registerFileAction(downloadAction)
+registerFileAction(editLocallyAction)
+registerFileAction(favoriteAction)
+registerFileAction(moveOrCopyAction)
+registerFileAction(openFolderAction)
+registerFileAction(openInFilesAction)
+registerFileAction(renameAction)
+registerFileAction(sidebarAction)
+registerFileAction(viewInFolderAction)
+
+// Register new menu entry
+addNewFileMenuEntry(newFolderEntry)
+addNewFileMenuEntry(newTemplatesFolder)
+registerTemplateEntries()
+
+// Register files views when not on public share
+if (isPublicShare() === false) {
+ registerFavoritesView()
+ registerFilesView()
+ registerPersonalFilesView()
+ registerRecentView()
+ registerSearchView()
+ registerFolderTreeView()
+}
+
+// Register file list filters
+registerHiddenFilesFilter()
+registerTypeFilter()
+registerModifiedFilter()
+registerFilenameFilter()
+registerFilterToSearchToggle()
+
+// Register preview service worker
+registerPreviewServiceWorker()
+
+registerDavProperty('nc:hidden', { nc: 'http://nextcloud.org/ns' })
+registerDavProperty('nc:is-mount-root', { nc: 'http://nextcloud.org/ns' })
+registerDavProperty('nc:metadata-blurhash', { nc: 'http://nextcloud.org/ns' })
+
+initLivePhotos()
diff --git a/apps/files/src/legacy/filelistSearch.js b/apps/files/src/legacy/filelistSearch.js
deleted file mode 100644
index 9512f47eccc..00000000000
--- a/apps/files/src/legacy/filelistSearch.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * @copyright Copyright (c) 2021 Julius Härtl <jus@bitgrid.net>
- *
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import { subscribe } from '@nextcloud/event-bus'
-
-(function() {
-
- const FilesPlugin = {
- attach(fileList) {
- subscribe('nextcloud:unified-search.search', ({ query }) => {
- fileList.setFilter(query)
- })
- subscribe('nextcloud:unified-search.reset', () => {
- this.query = null
- fileList.setFilter('')
- })
-
- },
- }
-
- window.OC.Plugins.register('OCA.Files.FileList', FilesPlugin)
-
-})()
diff --git a/apps/files/src/logger.js b/apps/files/src/logger.js
deleted file mode 100644
index 0005ee13cb4..00000000000
--- a/apps/files/src/logger.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import { getCurrentUser } from '@nextcloud/auth'
-import { getLoggerBuilder } from '@nextcloud/logger'
-
-const getLogger = user => {
- if (user === null) {
- return getLoggerBuilder()
- .setApp('files')
- .build()
- }
- return getLoggerBuilder()
- .setApp('files')
- .setUid(user.uid)
- .build()
-}
-
-export default getLogger(getCurrentUser())
diff --git a/apps/files/src/logger.ts b/apps/files/src/logger.ts
new file mode 100644
index 00000000000..33f87b424e0
--- /dev/null
+++ b/apps/files/src/logger.ts
@@ -0,0 +1,10 @@
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { getLoggerBuilder } from '@nextcloud/logger'
+
+export default getLoggerBuilder()
+ .setApp('files')
+ .detectUser()
+ .build()
diff --git a/apps/files/src/main-personal-settings.js b/apps/files/src/main-personal-settings.js
index 1d1942e85bb..dce190f0160 100644
--- a/apps/files/src/main-personal-settings.js
+++ b/apps/files/src/main-personal-settings.js
@@ -1,38 +1,17 @@
/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
import Vue from 'vue'
-import { getRequestToken } from '@nextcloud/auth'
+import { getCSPNonce } from '@nextcloud/auth'
-import PersonalSettings from './components/PersonalSettings'
+import PersonalSettings from './components/PersonalSettings.vue'
// eslint-disable-next-line camelcase
-__webpack_nonce__ = btoa(getRequestToken())
+__webpack_nonce__ = getCSPNonce()
Vue.prototype.t = t
-
-if (!window.TESTING) {
- const View = Vue.extend(PersonalSettings)
- new View().$mount('#files-personal-settings')
-}
+const View = Vue.extend(PersonalSettings)
+const instance = new View()
+instance.$mount('#files-personal-settings')
diff --git a/apps/files/src/main.js b/apps/files/src/main.js
deleted file mode 100644
index a979822bdc4..00000000000
--- a/apps/files/src/main.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import './files-app-settings'
-import './templates'
-import './legacy/filelistSearch'
diff --git a/apps/files/src/main.ts b/apps/files/src/main.ts
new file mode 100644
index 00000000000..463ecaf6239
--- /dev/null
+++ b/apps/files/src/main.ts
@@ -0,0 +1,51 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Pinia } from 'pinia'
+import { getCSPNonce } from '@nextcloud/auth'
+import { PiniaVuePlugin } from 'pinia'
+import Vue from 'vue'
+
+import { getPinia } from './store/index.ts'
+import FilesApp from './FilesApp.vue'
+import router from './router/router'
+import RouterService from './services/RouterService'
+import SettingsModel from './models/Setting.js'
+import SettingsService from './services/Settings.js'
+
+__webpack_nonce__ = getCSPNonce()
+
+declare global {
+ interface Window {
+ OC: Nextcloud.v29.OC
+ OCP: Nextcloud.v29.OCP
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ OCA: Record<string, any>
+ _nc_files_pinia: Pinia
+ }
+}
+
+// Init private and public Files namespace
+window.OCA.Files = window.OCA.Files ?? {}
+window.OCP.Files = window.OCP.Files ?? {}
+
+// Expose router
+if (!window.OCP.Files.Router) {
+ const Router = new RouterService(router)
+ Object.assign(window.OCP.Files, { Router })
+}
+
+// Init Pinia store
+Vue.use(PiniaVuePlugin)
+
+// Init Files App Settings Service
+const Settings = new SettingsService()
+Object.assign(window.OCA.Files, { Settings })
+Object.assign(window.OCA.Files.Settings, { Setting: SettingsModel })
+
+const FilesAppVue = Vue.extend(FilesApp)
+new FilesAppVue({
+ router: (window.OCP.Files.Router as RouterService)._router,
+ pinia: getPinia(),
+}).$mount('#content')
diff --git a/apps/files/src/mixins/actionsMixin.ts b/apps/files/src/mixins/actionsMixin.ts
new file mode 100644
index 00000000000..f81b0754431
--- /dev/null
+++ b/apps/files/src/mixins/actionsMixin.ts
@@ -0,0 +1,65 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { FileAction } from '@nextcloud/files'
+import { defineComponent } from 'vue'
+
+export default defineComponent({
+
+ data() {
+ return {
+ openedSubmenu: null as FileAction|null,
+ }
+ },
+
+ computed: {
+ enabledSubmenuActions(): Record<string, FileAction[]> {
+ return (this.enabledFileActions as FileAction[])
+ .reduce((record, action) => {
+ if (action.parent !== undefined) {
+ if (!record[action.parent]) {
+ record[action.parent] = []
+ }
+
+ record[action.parent].push(action)
+ }
+ return record
+ }, {} as Record<string, FileAction[]>)
+ },
+ },
+
+ methods: {
+ /**
+ * Check if a menu is valid, meaning it is
+ * defined and has at least one action
+ *
+ * @param action The action to check
+ */
+ isValidMenu(action: FileAction): boolean {
+ return this.enabledSubmenuActions[action.id]?.length > 0
+ },
+
+ async onBackToMenuClick(action: FileAction|null) {
+ if (!action) {
+ return
+ }
+
+ this.openedSubmenu = null
+ // Wait for first render
+ await this.$nextTick()
+
+ // Focus the previous menu action button
+ this.$nextTick(() => {
+ // Focus the action button, test both batch and single action references
+ // as this mixin is used in both single and batch actions.
+ const menuAction = this.$refs[`action-batch-${action.id}`]?.[0]
+ || this.$refs[`action-${action.id}`]?.[0]
+ if (menuAction) {
+ menuAction.$el.querySelector('button')?.focus()
+ }
+ })
+ },
+ },
+})
diff --git a/apps/files/src/mixins/filesSorting.ts b/apps/files/src/mixins/filesSorting.ts
new file mode 100644
index 00000000000..12515db103f
--- /dev/null
+++ b/apps/files/src/mixins/filesSorting.ts
@@ -0,0 +1,52 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import Vue from 'vue'
+
+import { mapState } from 'pinia'
+import { useViewConfigStore } from '../store/viewConfig'
+import { useNavigation } from '../composables/useNavigation'
+
+export default Vue.extend({
+ setup() {
+ const { currentView } = useNavigation()
+
+ return {
+ currentView,
+ }
+ },
+
+ computed: {
+ ...mapState(useViewConfigStore, ['getConfig', 'setSortingBy', 'toggleSortingDirection']),
+
+ /**
+ * Get the sorting mode for the current view
+ */
+ sortingMode(): string {
+ return this.getConfig(this.currentView.id)?.sorting_mode as string
+ || this.currentView?.defaultSortKey
+ || 'basename'
+ },
+
+ /**
+ * Get the sorting direction for the current view
+ */
+ isAscSorting(): boolean {
+ const sortingDirection = this.getConfig(this.currentView.id)?.sorting_direction
+ return sortingDirection !== 'desc'
+ },
+ },
+
+ methods: {
+ toggleSortBy(key: string) {
+ // If we're already sorting by this key, flip the direction
+ if (this.sortingMode === key) {
+ this.toggleSortingDirection(this.currentView.id)
+ return
+ }
+ // else sort ASC by this new key
+ this.setSortingBy(key, this.currentView.id)
+ },
+ },
+})
diff --git a/apps/files/src/models/Setting.js b/apps/files/src/models/Setting.js
index db276da85af..1db1d818e69 100644
--- a/apps/files/src/models/Setting.js
+++ b/apps/files/src/models/Setting.js
@@ -1,24 +1,6 @@
/**
- * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author Gary Kim <gary@garykim.dev>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
export default class Setting {
@@ -27,6 +9,7 @@ export default class Setting {
_el
_name
_open
+ _order
/**
* Create a new files app setting
@@ -37,12 +20,14 @@ export default class Setting {
* @param {Function} component.el function that returns an unmounted dom element to be added
* @param {Function} [component.open] callback for when setting is added
* @param {Function} [component.close] callback for when setting is closed
+ * @param {number} [component.order] the order of this setting, lower numbers are shown first
*/
- constructor(name, { el, open, close }) {
+ constructor(name, { el, open, close, order }) {
this._name = name
this._el = el
this._open = open
this._close = close
+ this._order = order || 0
if (typeof this._open !== 'function') {
this._open = () => {}
@@ -51,6 +36,18 @@ export default class Setting {
if (typeof this._close !== 'function') {
this._close = () => {}
}
+
+ if (typeof this._el !== 'function') {
+ throw new Error('Setting must have an `el` function that returns a DOM element')
+ }
+
+ if (typeof this._name !== 'string') {
+ throw new Error('Setting must have a `name` string')
+ }
+
+ if (typeof this._order !== 'number') {
+ throw new Error('Setting must have an `order` number')
+ }
}
get name() {
@@ -69,4 +66,8 @@ export default class Setting {
return this._close
}
+ get order() {
+ return this._order
+ }
+
}
diff --git a/apps/files/src/models/Tab.js b/apps/files/src/models/Tab.js
index 4c41ec5a3b1..b67d51f277f 100644
--- a/apps/files/src/models/Tab.js
+++ b/apps/files/src/models/Tab.js
@@ -1,31 +1,17 @@
/**
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import DOMPurify from 'dompurify'
export default class Tab {
_id
_name
_icon
+ _iconSvgSanitized
_mount
+ _setIsActive
_update
_destroy
_enabled
@@ -37,19 +23,21 @@ export default class Tab {
* @param {object} options destructuring object
* @param {string} options.id the unique id of this tab
* @param {string} options.name the translated tab name
- * @param {string} options.icon the vue component
+ * @param {?string} options.icon the icon css class
+ * @param {?string} options.iconSvg the icon in svg format
* @param {Function} options.mount function to mount the tab
+ * @param {Function} [options.setIsActive] function to forward the active state of the tab
* @param {Function} options.update function to update the tab
* @param {Function} options.destroy function to destroy the tab
* @param {Function} [options.enabled] define conditions whether this tab is active. Must returns a boolean
* @param {Function} [options.scrollBottomReached] executed when the tab is scrolled to the bottom
*/
- constructor({ id, name, icon, mount, update, destroy, enabled, scrollBottomReached } = {}) {
+ constructor({ id, name, icon, iconSvg, mount, setIsActive, update, destroy, enabled, scrollBottomReached } = {}) {
if (enabled === undefined) {
enabled = () => true
}
if (scrollBottomReached === undefined) {
- scrollBottomReached = () => {}
+ scrollBottomReached = () => { }
}
// Sanity checks
@@ -59,12 +47,15 @@ export default class Tab {
if (typeof name !== 'string' || name.trim() === '') {
throw new Error('The name argument is not a valid string')
}
- if (typeof icon !== 'string' || icon.trim() === '') {
- throw new Error('The icon argument is not a valid string')
+ if ((typeof icon !== 'string' || icon.trim() === '') && typeof iconSvg !== 'string') {
+ throw new Error('Missing valid string for icon or iconSvg argument')
}
if (typeof mount !== 'function') {
throw new Error('The mount argument should be a function')
}
+ if (setIsActive !== undefined && typeof setIsActive !== 'function') {
+ throw new Error('The setIsActive argument should be a function')
+ }
if (typeof update !== 'function') {
throw new Error('The update argument should be a function')
}
@@ -82,11 +73,16 @@ export default class Tab {
this._name = name
this._icon = icon
this._mount = mount
+ this._setIsActive = setIsActive
this._update = update
this._destroy = destroy
this._enabled = enabled
this._scrollBottomReached = scrollBottomReached
+ if (typeof iconSvg === 'string') {
+ this._iconSvgSanitized = DOMPurify.sanitize(iconSvg)
+ }
+
}
get id() {
@@ -101,10 +97,18 @@ export default class Tab {
return this._icon
}
+ get iconSvg() {
+ return this._iconSvgSanitized
+ }
+
get mount() {
return this._mount
}
+ get setIsActive() {
+ return this._setIsActive || (() => undefined)
+ }
+
get update() {
return this._update
}
diff --git a/apps/files/src/newMenu/newFolder.ts b/apps/files/src/newMenu/newFolder.ts
new file mode 100644
index 00000000000..f0f854d2801
--- /dev/null
+++ b/apps/files/src/newMenu/newFolder.ts
@@ -0,0 +1,91 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Entry, Node } from '@nextcloud/files'
+
+import { basename } from 'path'
+import { emit } from '@nextcloud/event-bus'
+import { getCurrentUser } from '@nextcloud/auth'
+import { Permission, Folder } from '@nextcloud/files'
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { translate as t } from '@nextcloud/l10n'
+import axios from '@nextcloud/axios'
+
+import FolderPlusSvg from '@mdi/svg/svg/folder-plus-outline.svg?raw'
+
+import { newNodeName } from '../utils/newNodeDialog'
+import logger from '../logger'
+
+type createFolderResponse = {
+ fileid: number
+ source: string
+}
+
+const createNewFolder = async (root: Folder, name: string): Promise<createFolderResponse> => {
+ const source = root.source + '/' + name
+ const encodedSource = root.encodedSource + '/' + encodeURIComponent(name)
+
+ const response = await axios({
+ method: 'MKCOL',
+ url: encodedSource,
+ headers: {
+ Overwrite: 'F',
+ },
+ })
+ return {
+ fileid: parseInt(response.headers['oc-fileid']),
+ source,
+ }
+}
+
+export const entry = {
+ id: 'newFolder',
+ displayName: t('files', 'New folder'),
+ enabled: (context: Folder) => Boolean(context.permissions & Permission.CREATE) && Boolean(context.permissions & Permission.READ),
+
+ // Make the svg icon color match the primary element color
+ iconSvgInline: FolderPlusSvg.replace(/viewBox/gi, 'style="color: var(--color-primary-element)" viewBox'),
+ order: 0,
+
+ async handler(context: Folder, content: Node[]) {
+ const name = await newNodeName(t('files', 'New folder'), content)
+ if (name === null) {
+ return
+ }
+ try {
+ const { fileid, source } = await createNewFolder(context, name.trim())
+
+ // Create the folder in the store
+ const folder = new Folder({
+ source,
+ id: fileid,
+ mtime: new Date(),
+ owner: context.owner,
+ permissions: Permission.ALL,
+ root: context?.root || '/files/' + getCurrentUser()?.uid,
+ // Include mount-type from parent folder as this is inherited
+ attributes: {
+ 'mount-type': context.attributes?.['mount-type'],
+ 'owner-id': context.attributes?.['owner-id'],
+ 'owner-display-name': context.attributes?.['owner-display-name'],
+ },
+ })
+
+ // Show success
+ emit('files:node:created', folder)
+ showSuccess(t('files', 'Created new folder "{name}"', { name: basename(source) }))
+ logger.debug('Created new folder', { folder, source })
+
+ // Navigate to the new folder
+ window.OCP.Files.Router.goToRoute(
+ null, // use default route
+ { view: 'files', fileid: String(fileid) },
+ { dir: context.path },
+ )
+ } catch (error) {
+ logger.error('Creating new folder failed', { error })
+ showError('Creating new folder failed')
+ }
+ },
+} as Entry
diff --git a/apps/files/src/newMenu/newFromTemplate.ts b/apps/files/src/newMenu/newFromTemplate.ts
new file mode 100644
index 00000000000..356fc5e1611
--- /dev/null
+++ b/apps/files/src/newMenu/newFromTemplate.ts
@@ -0,0 +1,77 @@
+/**
+ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Entry } from '@nextcloud/files'
+import type { ComponentInstance } from 'vue'
+import type { TemplateFile } from '../types.ts'
+
+import { Folder, Node, Permission, addNewFileMenuEntry } from '@nextcloud/files'
+import { loadState } from '@nextcloud/initial-state'
+import { newNodeName } from '../utils/newNodeDialog'
+import { translate as t } from '@nextcloud/l10n'
+import Vue, { defineAsyncComponent } from 'vue'
+
+// async to reduce bundle size
+const TemplatePickerVue = defineAsyncComponent(() => import('../views/TemplatePicker.vue'))
+let TemplatePicker: ComponentInstance & { open: (n: string, t: TemplateFile) => void } | null = null
+
+const getTemplatePicker = async (context: Folder) => {
+ if (TemplatePicker === null) {
+ // Create document root
+ const mountingPoint = document.createElement('div')
+ mountingPoint.id = 'template-picker'
+ document.body.appendChild(mountingPoint)
+
+ // Init vue app
+ TemplatePicker = new Vue({
+ render: (h) => h(
+ TemplatePickerVue,
+ {
+ ref: 'picker',
+ props: {
+ parent: context,
+ },
+ },
+ ),
+ methods: { open(...args) { this.$refs.picker.open(...args) } },
+ el: mountingPoint,
+ })
+ }
+ return TemplatePicker
+}
+
+/**
+ * Register all new-file-menu entries for all template providers
+ */
+export function registerTemplateEntries() {
+ const templates = loadState<TemplateFile[]>('files', 'templates', [])
+
+ // Init template files menu
+ templates.forEach((provider, index) => {
+ addNewFileMenuEntry({
+ id: `template-new-${provider.app}-${index}`,
+ displayName: provider.label,
+ iconClass: provider.iconClass || 'icon-file',
+ iconSvgInline: provider.iconSvgInline,
+ enabled(context: Folder): boolean {
+ return (context.permissions & Permission.CREATE) !== 0
+ },
+ order: 11,
+ async handler(context: Folder, content: Node[]) {
+ const templatePicker = getTemplatePicker(context)
+ const name = await newNodeName(`${provider.label}${provider.extension}`, content, {
+ label: t('files', 'Filename'),
+ name: provider.label,
+ })
+
+ if (name !== null) {
+ // Create the file
+ const picker = await templatePicker
+ picker.open(name.trim(), provider)
+ }
+ },
+ } as Entry)
+ })
+}
diff --git a/apps/files/src/newMenu/newTemplatesFolder.ts b/apps/files/src/newMenu/newTemplatesFolder.ts
new file mode 100644
index 00000000000..bf6862bda08
--- /dev/null
+++ b/apps/files/src/newMenu/newTemplatesFolder.ts
@@ -0,0 +1,83 @@
+/**
+ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Entry, Folder, Node } from '@nextcloud/files'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { showError } from '@nextcloud/dialogs'
+import { Permission, removeNewFileMenuEntry } from '@nextcloud/files'
+import { loadState } from '@nextcloud/initial-state'
+import { translate as t } from '@nextcloud/l10n'
+import { generateOcsUrl } from '@nextcloud/router'
+import { join } from 'path'
+import { newNodeName } from '../utils/newNodeDialog'
+
+import PlusSvg from '@mdi/svg/svg/plus.svg?raw'
+import axios from '@nextcloud/axios'
+import logger from '../logger.ts'
+
+const templatesEnabled = loadState<boolean>('files', 'templates_enabled', true)
+let templatesPath = loadState<string|false>('files', 'templates_path', false)
+logger.debug('Templates folder enabled', { templatesEnabled })
+logger.debug('Initial templates folder', { templatesPath })
+
+/**
+ * Init template folder
+ * @param directory Folder where to create the templates folder
+ * @param name Name to use or the templates folder
+ */
+const initTemplatesFolder = async function(directory: Folder, name: string) {
+ const templatePath = join(directory.path, name)
+ try {
+ logger.debug('Initializing the templates directory', { templatePath })
+ const { data } = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {
+ templatePath,
+ copySystemTemplates: true,
+ })
+
+ // Go to template directory
+ window.OCP.Files.Router.goToRoute(
+ null, // use default route
+ { view: 'files', fileid: undefined },
+ { dir: templatePath },
+ )
+
+ logger.info('Created new templates folder', {
+ ...data.ocs.data,
+ })
+ templatesPath = data.ocs.data.templates_path as string
+ } catch (error) {
+ logger.error('Unable to initialize the templates directory')
+ showError(t('files', 'Unable to initialize the templates directory'))
+ }
+}
+
+export const entry = {
+ id: 'template-picker',
+ displayName: t('files', 'Create templates folder'),
+ iconSvgInline: PlusSvg,
+ order: 30,
+ enabled(context: Folder): boolean {
+ // Templates disabled or templates folder already initialized
+ if (!templatesEnabled || templatesPath) {
+ return false
+ }
+ // Allow creation on your own folders only
+ if (context.owner !== getCurrentUser()?.uid) {
+ return false
+ }
+ return (context.permissions & Permission.CREATE) !== 0
+ },
+ async handler(context: Folder, content: Node[]) {
+ const name = await newNodeName(t('files', 'Templates'), content, { name: t('files', 'New template folder') })
+
+ if (name !== null) {
+ // Create the template folder
+ initTemplatesFolder(context, name)
+
+ // Remove the menu entry
+ removeNewFileMenuEntry('template-picker')
+ }
+ },
+} as Entry
diff --git a/apps/files/src/plugins/search/folderSearch.ts b/apps/files/src/plugins/search/folderSearch.ts
new file mode 100644
index 00000000000..6aabefbfc9d
--- /dev/null
+++ b/apps/files/src/plugins/search/folderSearch.ts
@@ -0,0 +1,61 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Node } from '@nextcloud/files'
+import { emit } from '@nextcloud/event-bus'
+import { getFilePickerBuilder } from '@nextcloud/dialogs'
+import { imagePath } from '@nextcloud/router'
+import { translate as t } from '@nextcloud/l10n'
+import logger from '../../logger'
+
+/**
+ * Initialize the unified search plugin.
+ */
+function init() {
+ const OCA = window.OCA
+ if (!OCA.UnifiedSearch) {
+ return
+ }
+
+ logger.info('Initializing unified search plugin: folder search from files app')
+ OCA.UnifiedSearch.registerFilterAction({
+ id: 'in-folder',
+ appId: 'files',
+ searchFrom: 'files',
+ label: t('files', 'In folder'),
+ icon: imagePath('files', 'app.svg'),
+ callback: (showFilePicker: boolean = true) => {
+ if (showFilePicker) {
+ const filepicker = getFilePickerBuilder('Pick plain text files')
+ .addMimeTypeFilter('httpd/unix-directory')
+ .allowDirectories(true)
+ .addButton({
+ label: 'Pick',
+ callback: (nodes: Node[]) => {
+ logger.info('Folder picked', { folder: nodes[0] })
+ const folder = nodes[0]
+ const filterUpdateText = (folder.root === '/files/' + folder.basename)
+ ? t('files', 'Search in all files')
+ : t('files', 'Search in folder: {folder}', { folder: folder.basename })
+ emit('nextcloud:unified-search:add-filter', {
+ id: 'in-folder',
+ appId: 'files',
+ searchFrom: 'files',
+ payload: folder,
+ filterUpdateText,
+ filterParams: { path: folder.path },
+ })
+ },
+ })
+ .build()
+ filepicker.pick()
+ } else {
+ logger.debug('Folder search callback was handled without showing the file picker, it might already be open')
+ }
+ },
+ })
+}
+
+document.addEventListener('DOMContentLoaded', init)
diff --git a/apps/files/src/reference-files.ts b/apps/files/src/reference-files.ts
new file mode 100644
index 00000000000..3d089fe93c4
--- /dev/null
+++ b/apps/files/src/reference-files.ts
@@ -0,0 +1,43 @@
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import Vue from 'vue'
+import { t } from '@nextcloud/l10n'
+
+import { registerWidget, registerCustomPickerElement, NcCustomPickerRenderResult } from '@nextcloud/vue/components/NcRichText'
+
+import FileWidget from './views/ReferenceFileWidget.vue'
+import FileReferencePickerElement from './views/FileReferencePickerElement.vue'
+
+Vue.mixin({
+ methods: {
+ t,
+ },
+})
+
+registerWidget('file', (el, { richObjectType, richObject, accessible, interactive }) => {
+ const Widget = Vue.extend(FileWidget)
+ new Widget({
+ propsData: {
+ richObjectType,
+ richObject,
+ accessible,
+ interactive,
+ },
+ }).$mount(el)
+}, () => {}, { hasInteractiveView: true })
+
+registerCustomPickerElement('files', (el, { providerId, accessible }) => {
+ const Element = Vue.extend(FileReferencePickerElement)
+ const vueElement = new Element({
+ propsData: {
+ providerId,
+ accessible,
+ },
+ }).$mount(el)
+ return new NcCustomPickerRenderResult(vueElement.$el, vueElement)
+}, (el, renderResult) => {
+ renderResult.object.$destroy()
+})
diff --git a/apps/files/src/router/router.ts b/apps/files/src/router/router.ts
new file mode 100644
index 00000000000..fccb4a0a2b2
--- /dev/null
+++ b/apps/files/src/router/router.ts
@@ -0,0 +1,145 @@
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { RawLocation, Route } from 'vue-router'
+
+import { generateUrl } from '@nextcloud/router'
+import { relative } from 'path'
+import queryString from 'query-string'
+import Router, { isNavigationFailure, NavigationFailureType } from 'vue-router'
+import Vue from 'vue'
+
+import { useFilesStore } from '../store/files.ts'
+import { usePathsStore } from '../store/paths.ts'
+import { defaultView } from '../utils/filesViews.ts'
+import logger from '../logger.ts'
+
+Vue.use(Router)
+
+// Prevent router from throwing errors when we're already on the page we're trying to go to
+const originalPush = Router.prototype.push
+Router.prototype.push = (function(this: Router, ...args: Parameters<typeof originalPush>) {
+ if (args.length > 1) {
+ return originalPush.call(this, ...args)
+ }
+ return originalPush.call<Router, [RawLocation], Promise<Route>>(this, args[0]).catch(ignoreDuplicateNavigation)
+}) as typeof originalPush
+
+const originalReplace = Router.prototype.replace
+Router.prototype.replace = (function(this: Router, ...args: Parameters<typeof originalReplace>) {
+ if (args.length > 1) {
+ return originalReplace.call(this, ...args)
+ }
+ return originalReplace.call<Router, [RawLocation], Promise<Route>>(this, args[0]).catch(ignoreDuplicateNavigation)
+}) as typeof originalReplace
+
+/**
+ * Ignore duplicated-navigation error but forward real exceptions
+ * @param error The thrown error
+ */
+function ignoreDuplicateNavigation(error: unknown): void {
+ if (isNavigationFailure(error, NavigationFailureType.duplicated)) {
+ logger.debug('Ignoring duplicated navigation from vue-router', { error })
+ } else {
+ throw error
+ }
+}
+
+const router = new Router({
+ mode: 'history',
+
+ // if index.php is in the url AND we got this far, then it's working:
+ // let's keep using index.php in the url
+ base: generateUrl('/apps/files'),
+ linkActiveClass: 'active',
+
+ routes: [
+ {
+ path: '/',
+ // Pretending we're using the default view
+ redirect: { name: 'filelist', params: { view: defaultView() } },
+ },
+ {
+ path: '/:view/:fileid(\\d+)?',
+ name: 'filelist',
+ props: true,
+ },
+ ],
+
+ // Custom stringifyQuery to prevent encoding of slashes in the url
+ stringifyQuery(query) {
+ const result = queryString.stringify(query).replace(/%2F/gmi, '/')
+ return result ? ('?' + result) : ''
+ },
+})
+
+// Handle aborted navigation (NavigationGuards) gracefully
+router.onError((error) => {
+ if (isNavigationFailure(error, NavigationFailureType.aborted)) {
+ logger.debug('Navigation was aboorted', { error })
+ } else {
+ throw error
+ }
+})
+
+// If navigating back from a folder to a parent folder,
+// we need to keep the current dir fileid so it's highlighted
+// and scrolled into view.
+router.beforeResolve((to, from, next) => {
+ if (to.params?.parentIntercept) {
+ delete to.params.parentIntercept
+ return next()
+ }
+
+ if (to.params.view !== from.params.view) {
+ // skip if different views
+ return next()
+ }
+
+ const fromDir = (from.query?.dir || '/') as string
+ const toDir = (to.query?.dir || '/') as string
+
+ // We are going back to a parent directory
+ if (relative(fromDir, toDir) === '..') {
+ const { getNode } = useFilesStore()
+ const { getPath } = usePathsStore()
+
+ if (!from.params.view) {
+ logger.error('No current view id found, cannot navigate to parent directory', { fromDir, toDir })
+ return next()
+ }
+
+ // Get the previous parent's file id
+ const fromSource = getPath(from.params.view, fromDir)
+ if (!fromSource) {
+ logger.error('No source found for the parent directory', { fromDir, toDir })
+ return next()
+ }
+
+ const fileId = getNode(fromSource)?.fileid
+ if (!fileId) {
+ logger.error('No fileid found for the parent directory', { fromDir, toDir, fromSource })
+ return next()
+ }
+
+ logger.debug('Navigating back to parent directory', { fromDir, toDir, fileId })
+ return next({
+ name: 'filelist',
+ query: to.query,
+ params: {
+ ...to.params,
+ fileid: String(fileId),
+ // Prevents the beforeEach from being called again
+ parentIntercept: 'true',
+ },
+ // Replace the current history entry
+ replace: true,
+ })
+ }
+
+ // else, we just continue
+ next()
+})
+
+export default router
diff --git a/apps/files/src/services/DropService.ts b/apps/files/src/services/DropService.ts
new file mode 100644
index 00000000000..1013baeda6c
--- /dev/null
+++ b/apps/files/src/services/DropService.ts
@@ -0,0 +1,198 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Upload } from '@nextcloud/upload'
+import type { RootDirectory } from './DropServiceUtils'
+
+import { Folder, Node, NodeStatus, davRootPath } from '@nextcloud/files'
+import { getUploader, hasConflict } from '@nextcloud/upload'
+import { join } from 'path'
+import { joinPaths } from '@nextcloud/paths'
+import { showError, showInfo, showSuccess, showWarning } from '@nextcloud/dialogs'
+import { translate as t } from '@nextcloud/l10n'
+import Vue from 'vue'
+
+import { Directory, traverseTree, resolveConflict, createDirectoryIfNotExists } from './DropServiceUtils'
+import { handleCopyMoveNodeTo } from '../actions/moveOrCopyAction'
+import { MoveCopyAction } from '../actions/moveOrCopyActionUtils'
+import logger from '../logger.ts'
+
+/**
+ * This function converts a list of DataTransferItems to a file tree.
+ * It uses the Filesystem API if available, otherwise it falls back to the File API.
+ * The File API will NOT be available if the browser is not in a secure context (e.g. HTTP).
+ * ⚠️ When using this method, you need to use it as fast as possible, as the DataTransferItems
+ * will be cleared after the first access to the props of one of the entries.
+ *
+ * @param items the list of DataTransferItems
+ */
+export const dataTransferToFileTree = async (items: DataTransferItem[]): Promise<RootDirectory> => {
+ // Check if the browser supports the Filesystem API
+ // We need to cache the entries to prevent Blink engine bug that clears
+ // the list (`data.items`) after first access props of one of the entries
+ const entries = items
+ .filter((item) => {
+ if (item.kind !== 'file') {
+ logger.debug('Skipping dropped item', { kind: item.kind, type: item.type })
+ return false
+ }
+ return true
+ }).map((item) => {
+ // MDN recommends to try both, as it might be renamed in the future
+ return (item as unknown as { getAsEntry?: () => FileSystemEntry|undefined })?.getAsEntry?.()
+ ?? item?.webkitGetAsEntry?.()
+ ?? item
+ }) as (FileSystemEntry | DataTransferItem)[]
+
+ let warned = false
+ const fileTree = new Directory('root') as RootDirectory
+
+ // Traverse the file tree
+ for (const entry of entries) {
+ // Handle browser issues if Filesystem API is not available. Fallback to File API
+ if (entry instanceof DataTransferItem) {
+ logger.warn('Could not get FilesystemEntry of item, falling back to file')
+
+ const file = entry.getAsFile()
+ if (file === null) {
+ logger.warn('Could not process DataTransferItem', { type: entry.type, kind: entry.kind })
+ showError(t('files', 'One of the dropped files could not be processed'))
+ continue
+ }
+
+ // Warn the user that the browser does not support the Filesystem API
+ // we therefore cannot upload directories recursively.
+ if (file.type === 'httpd/unix-directory' || !file.type) {
+ if (!warned) {
+ logger.warn('Browser does not support Filesystem API. Directories will not be uploaded')
+ showWarning(t('files', 'Your browser does not support the Filesystem API. Directories will not be uploaded'))
+ warned = true
+ }
+ continue
+ }
+
+ fileTree.contents.push(file)
+ continue
+ }
+
+ // Use Filesystem API
+ try {
+ fileTree.contents.push(await traverseTree(entry))
+ } catch (error) {
+ // Do not throw, as we want to continue with the other files
+ logger.error('Error while traversing file tree', { error })
+ }
+ }
+
+ return fileTree
+}
+
+export const onDropExternalFiles = async (root: RootDirectory, destination: Folder, contents: Node[]): Promise<Upload[]> => {
+ const uploader = getUploader()
+
+ // Check for conflicts on root elements
+ if (await hasConflict(root.contents, contents)) {
+ root.contents = await resolveConflict(root.contents, destination, contents)
+ }
+
+ if (root.contents.length === 0) {
+ logger.info('No files to upload', { root })
+ showInfo(t('files', 'No files to upload'))
+ return []
+ }
+
+ // Let's process the files
+ logger.debug(`Uploading files to ${destination.path}`, { root, contents: root.contents })
+ const queue = [] as Promise<Upload>[]
+
+ const uploadDirectoryContents = async (directory: Directory, path: string) => {
+ for (const file of directory.contents) {
+ // This is the relative path to the resource
+ // from the current uploader destination
+ const relativePath = join(path, file.name)
+
+ // If the file is a directory, we need to create it first
+ // then browse its tree and upload its contents.
+ if (file instanceof Directory) {
+ const absolutePath = joinPaths(davRootPath, destination.path, relativePath)
+ try {
+ console.debug('Processing directory', { relativePath })
+ await createDirectoryIfNotExists(absolutePath)
+ await uploadDirectoryContents(file, relativePath)
+ } catch (error) {
+ showError(t('files', 'Unable to create the directory {directory}', { directory: file.name }))
+ logger.error('', { error, absolutePath, directory: file })
+ }
+ continue
+ }
+
+ // If we've reached a file, we can upload it
+ logger.debug('Uploading file to ' + join(destination.path, relativePath), { file })
+
+ // Overriding the root to avoid changing the current uploader context
+ queue.push(uploader.upload(relativePath, file, destination.source))
+ }
+ }
+
+ // Pause the uploader to prevent it from starting
+ // while we compute the queue
+ uploader.pause()
+
+ // Upload the files. Using '/' as the starting point
+ // as we already adjusted the uploader destination
+ await uploadDirectoryContents(root, '/')
+ uploader.start()
+
+ // Wait for all promises to settle
+ const results = await Promise.allSettled(queue)
+
+ // Check for errors
+ const errors = results.filter(result => result.status === 'rejected')
+ if (errors.length > 0) {
+ logger.error('Error while uploading files', { errors })
+ showError(t('files', 'Some files could not be uploaded'))
+ return []
+ }
+
+ logger.debug('Files uploaded successfully')
+ showSuccess(t('files', 'Files uploaded successfully'))
+
+ return Promise.all(queue)
+}
+
+export const onDropInternalFiles = async (nodes: Node[], destination: Folder, contents: Node[], isCopy = false) => {
+ const queue = [] as Promise<void>[]
+
+ // Check for conflicts on root elements
+ if (await hasConflict(nodes, contents)) {
+ nodes = await resolveConflict(nodes, destination, contents)
+ }
+
+ if (nodes.length === 0) {
+ logger.info('No files to process', { nodes })
+ showInfo(t('files', 'No files to process'))
+ return
+ }
+
+ for (const node of nodes) {
+ Vue.set(node, 'status', NodeStatus.LOADING)
+ queue.push(handleCopyMoveNodeTo(node, destination, isCopy ? MoveCopyAction.COPY : MoveCopyAction.MOVE, true))
+ }
+
+ // Wait for all promises to settle
+ const results = await Promise.allSettled(queue)
+ nodes.forEach(node => Vue.set(node, 'status', undefined))
+
+ // Check for errors
+ const errors = results.filter(result => result.status === 'rejected')
+ if (errors.length > 0) {
+ logger.error('Error while copying or moving files', { errors })
+ showError(isCopy ? t('files', 'Some files could not be copied') : t('files', 'Some files could not be moved'))
+ return
+ }
+
+ logger.debug('Files copy/move successful')
+ showSuccess(isCopy ? t('files', 'Files copied successfully') : t('files', 'Files moved successfully'))
+}
diff --git a/apps/files/src/services/DropServiceUtils.spec.ts b/apps/files/src/services/DropServiceUtils.spec.ts
new file mode 100644
index 00000000000..5f4370c7894
--- /dev/null
+++ b/apps/files/src/services/DropServiceUtils.spec.ts
@@ -0,0 +1,143 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { beforeAll, describe, expect, it, vi } from 'vitest'
+
+import { FileSystemDirectoryEntry, FileSystemFileEntry, fileSystemEntryToDataTransferItem, DataTransferItem as DataTransferItemMock } from '../../../../__tests__/FileSystemAPIUtils'
+import { join } from 'node:path'
+import { Directory, traverseTree } from './DropServiceUtils'
+import { dataTransferToFileTree } from './DropService'
+import logger from '../logger'
+
+const dataTree = {
+ 'file0.txt': ['Hello, world!', 1234567890],
+ dir1: {
+ 'file1.txt': ['Hello, world!', 4567891230],
+ 'file2.txt': ['Hello, world!', 7891234560],
+ },
+ dir2: {
+ 'file3.txt': ['Hello, world!', 1234567890],
+ },
+}
+
+// This is mocking a file tree using the FileSystem API
+const buildFileSystemDirectoryEntry = (path: string, tree: any): FileSystemDirectoryEntry => {
+ const entries = Object.entries(tree).map(([name, contents]) => {
+ const fullPath = join(path, name)
+ if (Array.isArray(contents)) {
+ return new FileSystemFileEntry(fullPath, contents[0], contents[1])
+ } else {
+ return buildFileSystemDirectoryEntry(fullPath, contents)
+ }
+ })
+ return new FileSystemDirectoryEntry(path, entries)
+}
+
+const buildDataTransferItemArray = (path: string, tree: any, isFileSystemAPIAvailable = true): DataTransferItemMock[] => {
+ return Object.entries(tree).map(([name, contents]) => {
+ const fullPath = join(path, name)
+ if (Array.isArray(contents)) {
+ const entry = new FileSystemFileEntry(fullPath, contents[0], contents[1])
+ return fileSystemEntryToDataTransferItem(entry, isFileSystemAPIAvailable)
+ }
+
+ const entry = buildFileSystemDirectoryEntry(fullPath, contents)
+ return fileSystemEntryToDataTransferItem(entry, isFileSystemAPIAvailable)
+ })
+}
+
+describe('Filesystem API traverseTree', () => {
+ it('Should traverse a file tree from root', async () => {
+ // Fake a FileSystemEntry tree
+ const root = buildFileSystemDirectoryEntry('root', dataTree)
+ const tree = await traverseTree(root as unknown as FileSystemEntry) as Directory
+
+ expect(tree.name).toBe('root')
+ expect(tree).toBeInstanceOf(Directory)
+ expect(tree.contents).toHaveLength(3)
+ expect(tree.size).toBe(13 * 4) // 13 bytes from 'Hello, world!'
+ })
+
+ it('Should traverse a file tree from a subdirectory', async () => {
+ // Fake a FileSystemEntry tree
+ const dir2 = buildFileSystemDirectoryEntry('dir2', dataTree.dir2)
+ const tree = await traverseTree(dir2 as unknown as FileSystemEntry) as Directory
+
+ expect(tree.name).toBe('dir2')
+ expect(tree).toBeInstanceOf(Directory)
+ expect(tree.contents).toHaveLength(1)
+ expect(tree.contents[0].name).toBe('file3.txt')
+ expect(tree.size).toBe(13) // 13 bytes from 'Hello, world!'
+ })
+
+ it('Should properly compute the last modified', async () => {
+ // Fake a FileSystemEntry tree
+ const root = buildFileSystemDirectoryEntry('root', dataTree)
+ const rootTree = await traverseTree(root as unknown as FileSystemEntry) as Directory
+
+ expect(rootTree.lastModified).toBe(7891234560)
+
+ // Fake a FileSystemEntry tree
+ const dir2 = buildFileSystemDirectoryEntry('root', dataTree.dir2)
+ const dir2Tree = await traverseTree(dir2 as unknown as FileSystemEntry) as Directory
+ expect(dir2Tree.lastModified).toBe(1234567890)
+ })
+})
+
+describe('DropService dataTransferToFileTree', () => {
+
+ beforeAll(() => {
+ // @ts-expect-error jsdom doesn't have DataTransferItem
+ delete window.DataTransferItem
+ // DataTransferItem doesn't exists in jsdom, let's mock
+ // a dumb one so we can check the instanceof
+ // @ts-expect-error jsdom doesn't have DataTransferItem
+ window.DataTransferItem = DataTransferItemMock
+ })
+
+ it('Should return a RootDirectory with Filesystem API', async () => {
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+ vi.spyOn(logger, 'warn').mockImplementation(() => vi.fn())
+
+ const dataTransferItems = buildDataTransferItemArray('root', dataTree)
+ const fileTree = await dataTransferToFileTree(dataTransferItems as unknown as DataTransferItem[])
+
+ expect(fileTree.name).toBe('root')
+ expect(fileTree).toBeInstanceOf(Directory)
+ expect(fileTree.contents).toHaveLength(3)
+
+ // The file tree should be recursive when using the Filesystem API
+ expect(fileTree.contents[1]).toBeInstanceOf(Directory)
+ expect((fileTree.contents[1] as Directory).contents).toHaveLength(2)
+ expect(fileTree.contents[2]).toBeInstanceOf(Directory)
+ expect((fileTree.contents[2] as Directory).contents).toHaveLength(1)
+
+ expect(logger.error).not.toBeCalled()
+ expect(logger.warn).not.toBeCalled()
+ })
+
+ it('Should return a RootDirectory with legacy File API ignoring recursive directories', async () => {
+ vi.spyOn(logger, 'error').mockImplementation(() => vi.fn())
+ vi.spyOn(logger, 'warn').mockImplementation(() => vi.fn())
+
+ const dataTransferItems = buildDataTransferItemArray('root', dataTree, false)
+
+ const fileTree = await dataTransferToFileTree(dataTransferItems as unknown as DataTransferItem[])
+
+ expect(fileTree.name).toBe('root')
+ expect(fileTree).toBeInstanceOf(Directory)
+ expect(fileTree.contents).toHaveLength(1)
+
+ // The file tree should be recursive when using the Filesystem API
+ expect(fileTree.contents[0]).not.toBeInstanceOf(Directory)
+ expect((fileTree.contents[0].name)).toBe('file0.txt')
+
+ expect(logger.error).not.toBeCalled()
+ expect(logger.warn).toHaveBeenNthCalledWith(1, 'Could not get FilesystemEntry of item, falling back to file')
+ expect(logger.warn).toHaveBeenNthCalledWith(2, 'Could not get FilesystemEntry of item, falling back to file')
+ expect(logger.warn).toHaveBeenNthCalledWith(3, 'Browser does not support Filesystem API. Directories will not be uploaded')
+ expect(logger.warn).toHaveBeenNthCalledWith(4, 'Could not get FilesystemEntry of item, falling back to file')
+ expect(logger.warn).toHaveBeenCalledTimes(4)
+ })
+})
diff --git a/apps/files/src/services/DropServiceUtils.ts b/apps/files/src/services/DropServiceUtils.ts
new file mode 100644
index 00000000000..f10a09cfe27
--- /dev/null
+++ b/apps/files/src/services/DropServiceUtils.ts
@@ -0,0 +1,178 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileStat, ResponseDataDetailed } from 'webdav'
+
+import { emit } from '@nextcloud/event-bus'
+import { Folder, Node, davGetClient, davGetDefaultPropfind, davResultToNode } from '@nextcloud/files'
+import { openConflictPicker } from '@nextcloud/upload'
+import { showError, showInfo } from '@nextcloud/dialogs'
+import { translate as t } from '@nextcloud/l10n'
+
+import logger from '../logger.ts'
+
+/**
+ * This represents a Directory in the file tree
+ * We extend the File class to better handling uploading
+ * and stay as close as possible as the Filesystem API.
+ * This also allow us to hijack the size or lastModified
+ * properties to compute them dynamically.
+ */
+export class Directory extends File {
+
+ /* eslint-disable no-use-before-define */
+ _contents: (Directory|File)[]
+
+ constructor(name, contents: (Directory|File)[] = []) {
+ super([], name, { type: 'httpd/unix-directory' })
+ this._contents = contents
+ }
+
+ set contents(contents: (Directory|File)[]) {
+ this._contents = contents
+ }
+
+ get contents(): (Directory|File)[] {
+ return this._contents
+ }
+
+ get size() {
+ return this._computeDirectorySize(this)
+ }
+
+ get lastModified() {
+ if (this._contents.length === 0) {
+ return Date.now()
+ }
+ return this._computeDirectoryMtime(this)
+ }
+
+ /**
+ * Get the last modification time of a file tree
+ * This is not perfect, but will get us a pretty good approximation
+ * @param directory the directory to traverse
+ */
+ _computeDirectoryMtime(directory: Directory): number {
+ return directory.contents.reduce((acc, file) => {
+ return file.lastModified > acc
+ // If the file is a directory, the lastModified will
+ // also return the results of its _computeDirectoryMtime method
+ // Fancy recursion, huh?
+ ? file.lastModified
+ : acc
+ }, 0)
+ }
+
+ /**
+ * Get the size of a file tree
+ * @param directory the directory to traverse
+ */
+ _computeDirectorySize(directory: Directory): number {
+ return directory.contents.reduce((acc: number, entry: Directory|File) => {
+ // If the file is a directory, the size will
+ // also return the results of its _computeDirectorySize method
+ // Fancy recursion, huh?
+ return acc + entry.size
+ }, 0)
+ }
+
+}
+
+export type RootDirectory = Directory & {
+ name: 'root'
+}
+
+/**
+ * Traverse a file tree using the Filesystem API
+ * @param entry the entry to traverse
+ */
+export const traverseTree = async (entry: FileSystemEntry): Promise<Directory|File> => {
+ // Handle file
+ if (entry.isFile) {
+ return new Promise<File>((resolve, reject) => {
+ (entry as FileSystemFileEntry).file(resolve, reject)
+ })
+ }
+
+ // Handle directory
+ logger.debug('Handling recursive file tree', { entry: entry.name })
+ const directory = entry as FileSystemDirectoryEntry
+ const entries = await readDirectory(directory)
+ const contents = (await Promise.all(entries.map(traverseTree))).flat()
+ return new Directory(directory.name, contents)
+}
+
+/**
+ * Read a directory using Filesystem API
+ * @param directory the directory to read
+ */
+const readDirectory = (directory: FileSystemDirectoryEntry): Promise<FileSystemEntry[]> => {
+ const dirReader = directory.createReader()
+
+ return new Promise<FileSystemEntry[]>((resolve, reject) => {
+ const entries = [] as FileSystemEntry[]
+ const getEntries = () => {
+ dirReader.readEntries((results) => {
+ if (results.length) {
+ entries.push(...results)
+ getEntries()
+ } else {
+ resolve(entries)
+ }
+ }, (error) => {
+ reject(error)
+ })
+ }
+
+ getEntries()
+ })
+}
+
+export const createDirectoryIfNotExists = async (absolutePath: string) => {
+ const davClient = davGetClient()
+ const dirExists = await davClient.exists(absolutePath)
+ if (!dirExists) {
+ logger.debug('Directory does not exist, creating it', { absolutePath })
+ await davClient.createDirectory(absolutePath, { recursive: true })
+ const stat = await davClient.stat(absolutePath, { details: true, data: davGetDefaultPropfind() }) as ResponseDataDetailed<FileStat>
+ emit('files:node:created', davResultToNode(stat.data))
+ }
+}
+
+export const resolveConflict = async <T extends ((Directory|File)|Node)>(files: Array<T>, destination: Folder, contents: Node[]): Promise<T[]> => {
+ try {
+ // List all conflicting files
+ const conflicts = files.filter((file: File|Node) => {
+ return contents.find((node: Node) => node.basename === (file instanceof File ? file.name : file.basename))
+ }).filter(Boolean) as (File|Node)[]
+
+ // List of incoming files that are NOT in conflict
+ const uploads = files.filter((file: File|Node) => {
+ return !conflicts.includes(file)
+ })
+
+ // Let the user choose what to do with the conflicting files
+ const { selected, renamed } = await openConflictPicker(destination.path, conflicts, contents)
+
+ logger.debug('Conflict resolution', { uploads, selected, renamed })
+
+ // If the user selected nothing, we cancel the upload
+ if (selected.length === 0 && renamed.length === 0) {
+ // User skipped
+ showInfo(t('files', 'Conflicts resolution skipped'))
+ logger.info('User skipped the conflict resolution')
+ return []
+ }
+
+ // Update the list of files to upload
+ return [...uploads, ...selected, ...renamed] as (typeof files)
+ } catch (error) {
+ console.error(error)
+ // User cancelled
+ showError(t('files', 'Upload cancelled'))
+ logger.error('User cancelled the upload')
+ }
+
+ return []
+}
diff --git a/apps/files/src/services/Favorites.ts b/apps/files/src/services/Favorites.ts
new file mode 100644
index 00000000000..e156c92c511
--- /dev/null
+++ b/apps/files/src/services/Favorites.ts
@@ -0,0 +1,40 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { ContentsWithRoot } from '@nextcloud/files'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { Folder, Permission, davRemoteURL, davRootPath, getFavoriteNodes } from '@nextcloud/files'
+import { CancelablePromise } from 'cancelable-promise'
+import { getContents as filesContents } from './Files.ts'
+import { client } from './WebdavClient.ts'
+
+export const getContents = (path = '/'): CancelablePromise<ContentsWithRoot> => {
+ // We only filter root files for favorites, for subfolders we can simply reuse the files contents
+ if (path !== '/') {
+ return filesContents(path)
+ }
+
+ return new CancelablePromise((resolve, reject, cancel) => {
+ const promise = getFavoriteNodes(client)
+ .catch(reject)
+ .then((contents) => {
+ if (!contents) {
+ reject()
+ return
+ }
+ resolve({
+ contents,
+ folder: new Folder({
+ id: 0,
+ source: `${davRemoteURL}${davRootPath}`,
+ root: davRootPath,
+ owner: getCurrentUser()?.uid || null,
+ permissions: Permission.READ,
+ }),
+ })
+ })
+ cancel(() => promise.cancel())
+ })
+}
diff --git a/apps/files/src/services/FileInfo.js b/apps/files/src/services/FileInfo.js
deleted file mode 100644
index 8b62063e134..00000000000
--- a/apps/files/src/services/FileInfo.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import axios from '@nextcloud/axios'
-
-/**
- * @param {any} url -
- */
-export default async function(url) {
- const response = await axios({
- method: 'PROPFIND',
- url,
- data: `<?xml version="1.0"?>
- <d:propfind xmlns:d="DAV:"
- xmlns:oc="http://owncloud.org/ns"
- xmlns:nc="http://nextcloud.org/ns"
- xmlns:ocs="http://open-collaboration-services.org/ns">
- <d:prop>
- <d:getlastmodified />
- <d:getetag />
- <d:getcontenttype />
- <d:resourcetype />
- <oc:fileid />
- <oc:permissions />
- <oc:size />
- <d:getcontentlength />
- <nc:has-preview />
- <nc:mount-type />
- <nc:is-encrypted />
- <ocs:share-permissions />
- <oc:tags />
- <oc:favorite />
- <oc:comments-unread />
- <oc:owner-id />
- <oc:owner-display-name />
- <oc:share-types />
- </d:prop>
- </d:propfind>`,
- })
-
- // TODO: create new parser or use cdav-lib when available
- const file = OCA.Files.App.fileList.filesClient._client.parseMultiStatus(response.data)
- // TODO: create new parser or use cdav-lib when available
- const fileInfo = OCA.Files.App.fileList.filesClient._parseFileInfo(file[0])
-
- // TODO remove when no more legacy backbone is used
- fileInfo.get = (key) => fileInfo[key]
- fileInfo.isDirectory = () => fileInfo.mimetype === 'httpd/unix-directory'
-
- return fileInfo
-}
diff --git a/apps/files/src/services/FileInfo.ts b/apps/files/src/services/FileInfo.ts
new file mode 100644
index 00000000000..318236f1677
--- /dev/null
+++ b/apps/files/src/services/FileInfo.ts
@@ -0,0 +1,36 @@
+/**
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/* eslint-disable jsdoc/require-jsdoc */
+
+import type { Node } from '@nextcloud/files'
+
+export default function(node: Node) {
+ const fileInfo = new OC.Files.FileInfo({
+ id: node.fileid,
+ path: node.dirname,
+ name: node.basename,
+ mtime: node.mtime?.getTime(),
+ etag: node.attributes.etag,
+ size: node.size,
+ hasPreview: node.attributes.hasPreview,
+ isEncrypted: node.attributes.isEncrypted === 1,
+ isFavourited: node.attributes.favorite === 1,
+ mimetype: node.mime,
+ permissions: node.permissions,
+ mountType: node.attributes['mount-type'],
+ sharePermissions: node.attributes['share-permissions'],
+ shareAttributes: JSON.parse(node.attributes['share-attributes'] || '[]'),
+ type: node.type === 'file' ? 'file' : 'dir',
+ attributes: node.attributes,
+ })
+
+ // TODO remove when no more legacy backbone is used
+ fileInfo.get = (key) => fileInfo[key]
+ fileInfo.isDirectory = () => fileInfo.mimetype === 'httpd/unix-directory'
+ fileInfo.canEdit = () => Boolean(fileInfo.permissions & OC.PERMISSION_UPDATE)
+
+ return fileInfo
+}
diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts
new file mode 100644
index 00000000000..080ce91e538
--- /dev/null
+++ b/apps/files/src/services/Files.ts
@@ -0,0 +1,110 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { ContentsWithRoot, File, Folder, Node } from '@nextcloud/files'
+import type { FileStat, ResponseDataDetailed } from 'webdav'
+
+import { defaultRootPath, getDefaultPropfind, resultToNode as davResultToNode } from '@nextcloud/files/dav'
+import { CancelablePromise } from 'cancelable-promise'
+import { join } from 'path'
+import { client } from './WebdavClient.ts'
+import { searchNodes } from './WebDavSearch.ts'
+import { getPinia } from '../store/index.ts'
+import { useFilesStore } from '../store/files.ts'
+import { useSearchStore } from '../store/search.ts'
+import logger from '../logger.ts'
+/**
+ * Slim wrapper over `@nextcloud/files` `davResultToNode` to allow using the function with `Array.map`
+ * @param stat The result returned by the webdav library
+ */
+export const resultToNode = (stat: FileStat): Node => davResultToNode(stat)
+
+/**
+ * Get contents implementation for the files view.
+ * This also allows to fetch local search results when the user is currently filtering.
+ *
+ * @param path - The path to query
+ */
+export function getContents(path = '/'): CancelablePromise<ContentsWithRoot> {
+ const controller = new AbortController()
+ const searchStore = useSearchStore(getPinia())
+
+ if (searchStore.query.length >= 3) {
+ return new CancelablePromise((resolve, reject, cancel) => {
+ cancel(() => controller.abort())
+ getLocalSearch(path, searchStore.query, controller.signal)
+ .then(resolve)
+ .catch(reject)
+ })
+ } else {
+ return defaultGetContents(path)
+ }
+}
+
+/**
+ * Generic `getContents` implementation for the users files.
+ *
+ * @param path - The path to get the contents
+ */
+export function defaultGetContents(path: string): CancelablePromise<ContentsWithRoot> {
+ path = join(defaultRootPath, path)
+ const controller = new AbortController()
+ const propfindPayload = getDefaultPropfind()
+
+ return new CancelablePromise(async (resolve, reject, onCancel) => {
+ onCancel(() => controller.abort())
+
+ try {
+ const contentsResponse = await client.getDirectoryContents(path, {
+ details: true,
+ data: propfindPayload,
+ includeSelf: true,
+ signal: controller.signal,
+ }) as ResponseDataDetailed<FileStat[]>
+
+ const root = contentsResponse.data[0]
+ const contents = contentsResponse.data.slice(1)
+ if (root.filename !== path && `${root.filename}/` !== path) {
+ logger.debug(`Exepected "${path}" but got filename "${root.filename}" instead.`)
+ throw new Error('Root node does not match requested path')
+ }
+
+ resolve({
+ folder: resultToNode(root) as Folder,
+ contents: contents.map((result) => {
+ try {
+ return resultToNode(result)
+ } catch (error) {
+ logger.error(`Invalid node detected '${result.basename}'`, { error })
+ return null
+ }
+ }).filter(Boolean) as File[],
+ })
+ } catch (error) {
+ reject(error)
+ }
+ })
+}
+
+/**
+ * Get the local search results for the current folder.
+ *
+ * @param path - The path
+ * @param query - The current search query
+ * @param signal - The aboort signal
+ */
+async function getLocalSearch(path: string, query: string, signal: AbortSignal): Promise<ContentsWithRoot> {
+ const filesStore = useFilesStore(getPinia())
+ let folder = filesStore.getDirectoryByPath('files', path)
+ if (!folder) {
+ const rootPath = join(defaultRootPath, path)
+ const stat = await client.stat(rootPath, { details: true }) as ResponseDataDetailed<FileStat>
+ folder = resultToNode(stat.data) as Folder
+ }
+ const contents = await searchNodes(query, { dir: path, signal })
+ return {
+ folder,
+ contents,
+ }
+}
diff --git a/apps/files/src/services/FolderTree.ts b/apps/files/src/services/FolderTree.ts
new file mode 100644
index 00000000000..82f0fb392e5
--- /dev/null
+++ b/apps/files/src/services/FolderTree.ts
@@ -0,0 +1,95 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { ContentsWithRoot } from '@nextcloud/files'
+
+import { CancelablePromise } from 'cancelable-promise'
+import { davRemoteURL } from '@nextcloud/files'
+import axios from '@nextcloud/axios'
+import { generateOcsUrl } from '@nextcloud/router'
+import { getCurrentUser } from '@nextcloud/auth'
+import { dirname, encodePath, joinPaths } from '@nextcloud/paths'
+import { getCanonicalLocale, getLanguage } from '@nextcloud/l10n'
+
+import { getContents as getFiles } from './Files.ts'
+
+// eslint-disable-next-line no-use-before-define
+type Tree = TreeNodeData[]
+
+interface TreeNodeData {
+ id: number,
+ basename: string,
+ displayName?: string,
+ children: Tree,
+}
+
+export interface TreeNode {
+ source: string,
+ encodedSource: string,
+ path: string,
+ fileid: number,
+ basename: string,
+ displayName?: string,
+}
+
+export const folderTreeId = 'folders'
+
+export const sourceRoot = `${davRemoteURL}/files/${getCurrentUser()?.uid}`
+
+const collator = Intl.Collator(
+ [getLanguage(), getCanonicalLocale()],
+ {
+ numeric: true,
+ usage: 'sort',
+ },
+)
+
+const compareNodes = (a: TreeNodeData, b: TreeNodeData) => collator.compare(a.displayName ?? a.basename, b.displayName ?? b.basename)
+
+const getTreeNodes = (tree: Tree, currentPath: string = '/', nodes: TreeNode[] = []): TreeNode[] => {
+ const sortedTree = tree.toSorted(compareNodes)
+ for (const { id, basename, displayName, children } of sortedTree) {
+ const path = joinPaths(currentPath, basename)
+ const source = `${sourceRoot}${path}`
+ const node: TreeNode = {
+ source,
+ encodedSource: encodeSource(source),
+ path,
+ fileid: id,
+ basename,
+ }
+ if (displayName) {
+ node.displayName = displayName
+ }
+ nodes.push(node)
+ if (children.length > 0) {
+ getTreeNodes(children, path, nodes)
+ }
+ }
+ return nodes
+}
+
+export const getFolderTreeNodes = async (path: string = '/', depth: number = 1): Promise<TreeNode[]> => {
+ const { data: tree } = await axios.get<Tree>(generateOcsUrl('/apps/files/api/v1/folder-tree'), {
+ params: new URLSearchParams({ path, depth: String(depth) }),
+ })
+ const nodes = getTreeNodes(tree, path)
+ return nodes
+}
+
+export const getContents = (path: string): CancelablePromise<ContentsWithRoot> => getFiles(path)
+
+export const encodeSource = (source: string): string => {
+ const { origin } = new URL(source)
+ return origin + encodePath(source.slice(origin.length))
+}
+
+export const getSourceParent = (source: string): string => {
+ const parent = dirname(source)
+ if (parent === sourceRoot) {
+ return folderTreeId
+ }
+ return encodeSource(parent)
+}
diff --git a/apps/files/src/services/LivePhotos.ts b/apps/files/src/services/LivePhotos.ts
new file mode 100644
index 00000000000..10be42444e2
--- /dev/null
+++ b/apps/files/src/services/LivePhotos.ts
@@ -0,0 +1,19 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { Node, registerDavProperty } from '@nextcloud/files'
+
+/**
+ *
+ */
+export function initLivePhotos(): void {
+ registerDavProperty('nc:metadata-files-live-photo', { nc: 'http://nextcloud.org/ns' })
+}
+
+/**
+ * @param {Node} node - The node
+ */
+export function isLivePhoto(node: Node): boolean {
+ return node.attributes['metadata-files-live-photo'] !== undefined
+}
diff --git a/apps/files/src/services/PersonalFiles.ts b/apps/files/src/services/PersonalFiles.ts
new file mode 100644
index 00000000000..6d86bd3bae2
--- /dev/null
+++ b/apps/files/src/services/PersonalFiles.ts
@@ -0,0 +1,39 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node, ContentsWithRoot } from '@nextcloud/files'
+import type { CancelablePromise } from 'cancelable-promise'
+import { getCurrentUser } from '@nextcloud/auth'
+
+import { getContents as getFiles } from './Files'
+
+const currentUserId = getCurrentUser()?.uid
+
+/**
+ * Filters each file/folder on its shared status
+ *
+ * A personal file is considered a file that has all of the following properties:
+ * 1. the current user owns
+ * 2. the file is not shared with anyone
+ * 3. the file is not a group folder
+ * @todo Move to `@nextcloud/files`
+ * @param node The node to check
+ */
+export const isPersonalFile = function(node: Node): boolean {
+ // the type of mounts that determine whether the file is shared
+ const sharedMountTypes = ['group', 'shared']
+ const mountType = node.attributes['mount-type']
+
+ return currentUserId === node.owner && !sharedMountTypes.includes(mountType)
+}
+
+export const getContents = (path: string = '/'): CancelablePromise<ContentsWithRoot> => {
+ // get all the files from the current path as a cancellable promise
+ // then filter the files that the user does not own, or has shared / is a group folder
+ return getFiles(path)
+ .then((content) => {
+ content.contents = content.contents.filter(isPersonalFile)
+ return content
+ })
+}
diff --git a/apps/files/src/services/PreviewService.ts b/apps/files/src/services/PreviewService.ts
new file mode 100644
index 00000000000..6dbb67f30b6
--- /dev/null
+++ b/apps/files/src/services/PreviewService.ts
@@ -0,0 +1,21 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+// The preview service worker cache name (see webpack config)
+const SWCacheName = 'previews'
+
+/**
+ * Check if the preview is already cached by the service worker
+ * @param previewUrl URL to check
+ */
+export async function isCachedPreview(previewUrl: string): Promise<boolean> {
+ if (!window?.caches?.open) {
+ return false
+ }
+
+ const cache = await window.caches.open(SWCacheName)
+ const response = await cache.match(previewUrl)
+ return response !== undefined
+}
diff --git a/apps/files/src/services/Recent.ts b/apps/files/src/services/Recent.ts
new file mode 100644
index 00000000000..d0ca285b05c
--- /dev/null
+++ b/apps/files/src/services/Recent.ts
@@ -0,0 +1,74 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { ContentsWithRoot, Node } from '@nextcloud/files'
+import type { FileStat, ResponseDataDetailed, SearchResult } from 'webdav'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { Folder, Permission, davGetRecentSearch, davRootPath, davRemoteURL, davResultToNode } from '@nextcloud/files'
+import { CancelablePromise } from 'cancelable-promise'
+import { useUserConfigStore } from '../store/userconfig.ts'
+import { getPinia } from '../store/index.ts'
+import { client } from './WebdavClient.ts'
+import { getBaseUrl } from '@nextcloud/router'
+
+const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 14))
+
+/**
+ * Helper to map a WebDAV result to a Nextcloud node
+ * The search endpoint already includes the dav remote URL so we must not include it in the source
+ *
+ * @param stat the WebDAV result
+ */
+const resultToNode = (stat: FileStat) => davResultToNode(stat, davRootPath, getBaseUrl())
+
+/**
+ * Get recently changed nodes
+ *
+ * This takes the users preference about hidden files into account.
+ * If hidden files are not shown, then also recently changed files *in* hidden directories are filtered.
+ *
+ * @param path Path to search for recent changes
+ */
+export const getContents = (path = '/'): CancelablePromise<ContentsWithRoot> => {
+ const store = useUserConfigStore(getPinia())
+
+ /**
+ * Filter function that returns only the visible nodes - or hidden if explicitly configured
+ * @param node The node to check
+ */
+ const filterHidden = (node: Node) =>
+ path !== '/' // We need to hide files from hidden directories in the root if not configured to show
+ || store.userConfig.show_hidden // If configured to show hidden files we can early return
+ || !node.dirname.split('/').some((dir) => dir.startsWith('.')) // otherwise only include the file if non of the parent directories is hidden
+
+ const controller = new AbortController()
+ const handler = async () => {
+ const contentsResponse = await client.search('/', {
+ signal: controller.signal,
+ details: true,
+ data: davGetRecentSearch(lastTwoWeeksTimestamp),
+ }) as ResponseDataDetailed<SearchResult>
+
+ const contents = contentsResponse.data.results
+ .map(resultToNode)
+ .filter(filterHidden)
+
+ return {
+ folder: new Folder({
+ id: 0,
+ source: `${davRemoteURL}${davRootPath}`,
+ root: davRootPath,
+ owner: getCurrentUser()?.uid || null,
+ permissions: Permission.READ,
+ }),
+ contents,
+ }
+ }
+
+ return new CancelablePromise(async (resolve, reject, cancel) => {
+ cancel(() => controller.abort())
+ resolve(handler())
+ })
+}
diff --git a/apps/files/src/services/RouterService.ts b/apps/files/src/services/RouterService.ts
new file mode 100644
index 00000000000..4e2999b1d29
--- /dev/null
+++ b/apps/files/src/services/RouterService.ts
@@ -0,0 +1,75 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Route, Location } from 'vue-router'
+import type VueRouter from 'vue-router'
+
+export default class RouterService {
+
+ // typescript compiles this to `#router` to make it private even in JS,
+ // but in TS it needs to be called without the visibility specifier
+ private router: VueRouter
+
+ constructor(router: VueRouter) {
+ this.router = router
+ }
+
+ get name(): string | null | undefined {
+ return this.router.currentRoute.name
+ }
+
+ get query(): Record<string, string | (string | null)[] | null | undefined> {
+ return this.router.currentRoute.query || {}
+ }
+
+ get params(): Record<string, string> {
+ return this.router.currentRoute.params || {}
+ }
+
+ /**
+ * This is a protected getter only for internal use
+ * @private
+ */
+ get _router() {
+ return this.router
+ }
+
+ /**
+ * Trigger a route change on the files app
+ *
+ * @param path the url path, eg: '/trashbin?dir=/Deleted'
+ * @param replace replace the current history
+ * @see https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location
+ */
+ goTo(path: string, replace = false): Promise<Route> {
+ return this.router.push({
+ path,
+ replace,
+ })
+ }
+
+ /**
+ * Trigger a route change on the files App
+ *
+ * @param name the route name
+ * @param params the route parameters
+ * @param query the url query parameters
+ * @param replace replace the current history
+ * @see https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location
+ */
+ goToRoute(
+ name?: string,
+ params?: Record<string, string>,
+ query?: Record<string, string | (string | null)[] | null | undefined>,
+ replace?: boolean,
+ ): Promise<Route> {
+ return this.router.push({
+ name,
+ query,
+ params,
+ replace,
+ } as Location)
+ }
+
+}
diff --git a/apps/files/src/services/Search.spec.ts b/apps/files/src/services/Search.spec.ts
new file mode 100644
index 00000000000..c2840521a15
--- /dev/null
+++ b/apps/files/src/services/Search.spec.ts
@@ -0,0 +1,61 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { createPinia, setActivePinia } from 'pinia'
+import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
+import { getContents } from './Search.ts'
+import { Folder, Permission } from '@nextcloud/files'
+
+const searchNodes = vi.hoisted(() => vi.fn())
+vi.mock('./WebDavSearch.ts', () => ({ searchNodes }))
+vi.mock('@nextcloud/auth')
+
+describe('Search service', () => {
+ const fakeFolder = new Folder({ owner: 'owner', source: 'https://cloud.example.com/remote.php/dav/files/owner/folder', root: '/files/owner' })
+
+ beforeAll(() => {
+ window.OCP ??= {}
+ window.OCP.Files ??= {}
+ window.OCP.Files.Router ??= { params: {}, query: {} }
+ vi.spyOn(window.OCP.Files.Router, 'params', 'get').mockReturnValue({ view: 'files' })
+ })
+
+ beforeEach(() => {
+ vi.restoreAllMocks()
+ setActivePinia(createPinia())
+ })
+
+ it('rejects on error', async () => {
+ searchNodes.mockImplementationOnce(() => { throw new Error('expected error') })
+ expect(getContents).rejects.toThrow('expected error')
+ })
+
+ it('returns the search results and a fake root', async () => {
+ searchNodes.mockImplementationOnce(() => [fakeFolder])
+ const { contents, folder } = await getContents()
+
+ expect(searchNodes).toHaveBeenCalledOnce()
+ expect(contents).toHaveLength(1)
+ expect(contents).toEqual([fakeFolder])
+ // read only root
+ expect(folder.permissions).toBe(Permission.READ)
+ })
+
+ it('can be cancelled', async () => {
+ const { promise, resolve } = Promise.withResolvers<Event>()
+ searchNodes.mockImplementationOnce(async (_, { signal }: { signal: AbortSignal}) => {
+ signal.addEventListener('abort', resolve)
+ await promise
+ return []
+ })
+
+ const content = getContents()
+ content.cancel()
+
+ // its cancelled thus the promise returns the event
+ const event = await promise
+ expect(event.type).toBe('abort')
+ })
+})
diff --git a/apps/files/src/services/Search.ts b/apps/files/src/services/Search.ts
new file mode 100644
index 00000000000..f1d7c30a94e
--- /dev/null
+++ b/apps/files/src/services/Search.ts
@@ -0,0 +1,43 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { ContentsWithRoot } from '@nextcloud/files'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { Folder, Permission } from '@nextcloud/files'
+import { defaultRemoteURL } from '@nextcloud/files/dav'
+import { CancelablePromise } from 'cancelable-promise'
+import { searchNodes } from './WebDavSearch.ts'
+import logger from '../logger.ts'
+import { useSearchStore } from '../store/search.ts'
+import { getPinia } from '../store/index.ts'
+
+/**
+ * Get the contents for a search view
+ */
+export function getContents(): CancelablePromise<ContentsWithRoot> {
+ const controller = new AbortController()
+
+ const searchStore = useSearchStore(getPinia())
+
+ return new CancelablePromise<ContentsWithRoot>(async (resolve, reject, cancel) => {
+ cancel(() => controller.abort())
+ try {
+ const contents = await searchNodes(searchStore.query, { signal: controller.signal })
+ resolve({
+ contents,
+ folder: new Folder({
+ id: 0,
+ source: `${defaultRemoteURL}#search`,
+ owner: getCurrentUser()!.uid,
+ permissions: Permission.READ,
+ }),
+ })
+ } catch (error) {
+ logger.error('Failed to fetch search results', { error })
+ reject(error)
+ }
+ })
+}
diff --git a/apps/files/src/services/ServiceWorker.js b/apps/files/src/services/ServiceWorker.js
new file mode 100644
index 00000000000..cc13db44009
--- /dev/null
+++ b/apps/files/src/services/ServiceWorker.js
@@ -0,0 +1,31 @@
+/**
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { generateUrl, getRootUrl } from '@nextcloud/router'
+import logger from '../logger.ts'
+
+export default () => {
+ if ('serviceWorker' in navigator) {
+ // Use the window load event to keep the page load performant
+ window.addEventListener('load', async () => {
+ try {
+ const url = generateUrl('/apps/files/preview-service-worker.js', {}, { noRewrite: true })
+ let scope = getRootUrl()
+ // If the instance is not in a subfolder an empty string will be returned.
+ // The service worker registration will use the current path if it receives an empty string,
+ // which will result in a service worker registration for every single path the user visits.
+ if (scope === '') {
+ scope = '/'
+ }
+
+ const registration = await navigator.serviceWorker.register(url, { scope })
+ logger.debug('SW registered: ', { registration })
+ } catch (error) {
+ logger.error('SW registration failed: ', { error })
+ }
+ })
+ } else {
+ logger.debug('Service Worker is not enabled on this browser.')
+ }
+}
diff --git a/apps/files/src/services/Settings.js b/apps/files/src/services/Settings.js
index 83c2c850580..7f04aa82fda 100644
--- a/apps/files/src/services/Settings.js
+++ b/apps/files/src/services/Settings.js
@@ -1,23 +1,6 @@
/**
- * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>
- *
- * @author Gary Kim <gary@garykim.dev>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
export default class Settings {
diff --git a/apps/files/src/services/Sidebar.js b/apps/files/src/services/Sidebar.js
index e87ee71a4b1..0f5c275e532 100644
--- a/apps/files/src/services/Sidebar.js
+++ b/apps/files/src/services/Sidebar.js
@@ -1,23 +1,6 @@
/**
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
export default class Sidebar {
diff --git a/apps/files/src/services/Templates.js b/apps/files/src/services/Templates.js
index c242f9ae82d..d7f25846ceb 100644
--- a/apps/files/src/services/Templates.js
+++ b/apps/files/src/services/Templates.js
@@ -1,23 +1,6 @@
/**
- * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { generateOcsUrl } from '@nextcloud/router'
@@ -28,18 +11,25 @@ export const getTemplates = async function() {
return response.data.ocs.data
}
+export const getTemplateFields = async function(fileId) {
+ const response = await axios.get(generateOcsUrl(`apps/files/api/v1/templates/fields/${fileId}`))
+ return response.data.ocs.data
+}
+
/**
* Create a new file from a specified template
*
* @param {string} filePath The new file destination path
* @param {string} templatePath The template source path
* @param {string} templateType The template type e.g 'user'
+ * @param {object} templateFields The template fields to fill in (if any)
*/
-export const createFromTemplate = async function(filePath, templatePath, templateType) {
+export const createFromTemplate = async function(filePath, templatePath, templateType, templateFields) {
const response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {
filePath,
templatePath,
templateType,
+ templateFields,
})
return response.data.ocs.data
}
diff --git a/apps/files/src/services/WebDavSearch.ts b/apps/files/src/services/WebDavSearch.ts
new file mode 100644
index 00000000000..feb7f30b357
--- /dev/null
+++ b/apps/files/src/services/WebDavSearch.ts
@@ -0,0 +1,83 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { INode } from '@nextcloud/files'
+import type { ResponseDataDetailed, SearchResult } from 'webdav'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { defaultRootPath, getDavNameSpaces, getDavProperties, resultToNode } from '@nextcloud/files/dav'
+import { getBaseUrl } from '@nextcloud/router'
+import { client } from './WebdavClient.ts'
+import logger from '../logger.ts'
+
+export interface SearchNodesOptions {
+ dir?: string,
+ signal?: AbortSignal
+}
+
+/**
+ * Search for nodes matching the given query.
+ *
+ * @param query - Search query
+ * @param options - Options
+ * @param options.dir - The base directory to scope the search to
+ * @param options.signal - Abort signal for the request
+ */
+export async function searchNodes(query: string, { dir, signal }: SearchNodesOptions): Promise<INode[]> {
+ const user = getCurrentUser()
+ if (!user) {
+ // the search plugin only works for user roots
+ return []
+ }
+
+ query = query.trim()
+ if (query.length < 3) {
+ // the search plugin only works with queries of at least 3 characters
+ return []
+ }
+
+ if (dir && !dir.startsWith('/')) {
+ dir = `/${dir}`
+ }
+
+ logger.debug('Searching for nodes', { query, dir })
+ const { data } = await client.search('/', {
+ details: true,
+ signal,
+ data: `
+<d:searchrequest ${getDavNameSpaces()}>
+ <d:basicsearch>
+ <d:select>
+ <d:prop>
+ ${getDavProperties()}
+ </d:prop>
+ </d:select>
+ <d:from>
+ <d:scope>
+ <d:href>/files/${user.uid}${dir || ''}</d:href>
+ <d:depth>infinity</d:depth>
+ </d:scope>
+ </d:from>
+ <d:where>
+ <d:like>
+ <d:prop>
+ <d:displayname/>
+ </d:prop>
+ <d:literal>%${query.replace('%', '')}%</d:literal>
+ </d:like>
+ </d:where>
+ <d:orderby/>
+ </d:basicsearch>
+</d:searchrequest>`,
+ }) as ResponseDataDetailed<SearchResult>
+
+ // check if the request was aborted
+ if (signal?.aborted) {
+ return []
+ }
+
+ // otherwise return the result mapped to Nextcloud nodes
+ return data.results.map((result) => resultToNode(result, defaultRootPath, getBaseUrl()))
+}
diff --git a/apps/files/src/services/WebdavClient.ts b/apps/files/src/services/WebdavClient.ts
new file mode 100644
index 00000000000..2b92deba9b4
--- /dev/null
+++ b/apps/files/src/services/WebdavClient.ts
@@ -0,0 +1,19 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileStat, ResponseDataDetailed } from 'webdav'
+import type { Node } from '@nextcloud/files'
+
+import { getClient, getDefaultPropfind, getRootPath, resultToNode } from '@nextcloud/files/dav'
+
+export const client = getClient()
+
+export const fetchNode = async (path: string): Promise<Node> => {
+ const propfindPayload = getDefaultPropfind()
+ const result = await client.stat(`${getRootPath()}${path}`, {
+ details: true,
+ data: propfindPayload,
+ }) as ResponseDataDetailed<FileStat>
+ return resultToNode(result.data)
+}
diff --git a/apps/files/src/sidebar.js b/apps/files/src/sidebar.ts
index 58b798ed0e7..35a379ad649 100644
--- a/apps/files/src/sidebar.js
+++ b/apps/files/src/sidebar.ts
@@ -1,31 +1,14 @@
/**
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
import Vue from 'vue'
import { translate as t } from '@nextcloud/l10n'
import SidebarView from './views/Sidebar.vue'
-import Sidebar from './services/Sidebar'
-import Tab from './models/Tab'
+import Sidebar from './services/Sidebar.js'
+import Tab from './models/Tab.js'
Vue.prototype.t = t
@@ -36,12 +19,12 @@ if (!window.OCA.Files) {
Object.assign(window.OCA.Files, { Sidebar: new Sidebar() })
Object.assign(window.OCA.Files.Sidebar, { Tab })
-console.debug('OCA.Files.Sidebar initialized')
-
window.addEventListener('DOMContentLoaded', function() {
const contentElement = document.querySelector('body > .content')
|| document.querySelector('body > #content')
+ let vueParent
+
// Make sure we have a proper layout
if (contentElement) {
// Make sure we have a mountpoint
@@ -50,15 +33,22 @@ window.addEventListener('DOMContentLoaded', function() {
sidebarElement.id = 'app-sidebar'
contentElement.appendChild(sidebarElement)
}
+
+ // Helps with vue debug, as we mount the sidebar to the
+ // content element which is a vue instance itself
+ vueParent = contentElement.__vue__ as Vue
}
// Init vue app
const View = Vue.extend(SidebarView)
const AppSidebar = new View({
name: 'SidebarRoot',
- })
- AppSidebar.$mount('#app-sidebar')
+ parent: vueParent,
+ }).$mount('#app-sidebar')
+
+ // Expose Sidebar methods
window.OCA.Files.Sidebar.open = AppSidebar.open
window.OCA.Files.Sidebar.close = AppSidebar.close
window.OCA.Files.Sidebar.setFullScreenMode = AppSidebar.setFullScreenMode
+ window.OCA.Files.Sidebar.setShowTagsDefault = AppSidebar.setShowTagsDefault
})
diff --git a/apps/files/src/store/actionsmenu.ts b/apps/files/src/store/actionsmenu.ts
new file mode 100644
index 00000000000..dc5ce8cb8b3
--- /dev/null
+++ b/apps/files/src/store/actionsmenu.ts
@@ -0,0 +1,12 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { defineStore } from 'pinia'
+import type { ActionsMenuStore } from '../types'
+
+export const useActionsMenuStore = defineStore('actionsmenu', {
+ state: () => ({
+ opened: null,
+ } as ActionsMenuStore),
+})
diff --git a/apps/files/src/store/active.ts b/apps/files/src/store/active.ts
new file mode 100644
index 00000000000..1303a157b08
--- /dev/null
+++ b/apps/files/src/store/active.ts
@@ -0,0 +1,86 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { FileAction, View, Node, Folder } from '@nextcloud/files'
+
+import { subscribe } from '@nextcloud/event-bus'
+import { getNavigation } from '@nextcloud/files'
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+import logger from '../logger.ts'
+
+export const useActiveStore = defineStore('active', () => {
+ /**
+ * The currently active action
+ */
+ const activeAction = ref<FileAction>()
+
+ /**
+ * The currently active folder
+ */
+ const activeFolder = ref<Folder>()
+
+ /**
+ * The current active node within the folder
+ */
+ const activeNode = ref<Node>()
+
+ /**
+ * The current active view
+ */
+ const activeView = ref<View>()
+
+ initialize()
+
+ /**
+ * Unset the active node if deleted
+ *
+ * @param node - The node thats deleted
+ * @private
+ */
+ function onDeletedNode(node: Node) {
+ if (activeNode.value && activeNode.value.source === node.source) {
+ activeNode.value = undefined
+ }
+ }
+
+ /**
+ * Callback to update the current active view
+ *
+ * @param view - The new active view
+ * @private
+ */
+ function onChangedView(view: View|null = null) {
+ logger.debug('Setting active view', { view })
+ activeView.value = view ?? undefined
+ activeNode.value = undefined
+ }
+
+ /**
+ * Initalize the store - connect all event listeners.
+ * @private
+ */
+ function initialize() {
+ const navigation = getNavigation()
+
+ // Make sure we only register the listeners once
+ subscribe('files:node:deleted', onDeletedNode)
+
+ onChangedView(navigation.active)
+
+ // Or you can react to changes of the current active view
+ navigation.addEventListener('updateActive', (event) => {
+ onChangedView(event.detail)
+ })
+ }
+
+ return {
+ activeAction,
+ activeFolder,
+ activeNode,
+ activeView,
+ }
+})
diff --git a/apps/files/src/store/dragging.ts b/apps/files/src/store/dragging.ts
new file mode 100644
index 00000000000..810f662149c
--- /dev/null
+++ b/apps/files/src/store/dragging.ts
@@ -0,0 +1,31 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { DragAndDropStore, FileSource } from '../types'
+
+import { defineStore } from 'pinia'
+import Vue from 'vue'
+
+export const useDragAndDropStore = defineStore('dragging', {
+ state: () => ({
+ dragging: [],
+ } as DragAndDropStore),
+
+ actions: {
+ /**
+ * Set the selection of files being dragged currently
+ * @param selection array of node sources
+ */
+ set(selection = [] as FileSource[]) {
+ Vue.set(this, 'dragging', selection)
+ },
+
+ /**
+ * Reset the selection
+ */
+ reset() {
+ Vue.set(this, 'dragging', [])
+ },
+ },
+})
diff --git a/apps/files/src/store/files.ts b/apps/files/src/store/files.ts
new file mode 100644
index 00000000000..0bcf4ce9350
--- /dev/null
+++ b/apps/files/src/store/files.ts
@@ -0,0 +1,198 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { FilesStore, RootsStore, RootOptions, Service, FilesState, FileSource } from '../types'
+import type { Folder, Node } from '@nextcloud/files'
+
+import { defineStore } from 'pinia'
+import { subscribe } from '@nextcloud/event-bus'
+import logger from '../logger'
+import Vue from 'vue'
+
+import { fetchNode } from '../services/WebdavClient.ts'
+import { usePathsStore } from './paths.ts'
+
+export const useFilesStore = function(...args) {
+ const store = defineStore('files', {
+ state: (): FilesState => ({
+ files: {} as FilesStore,
+ roots: {} as RootsStore,
+ }),
+
+ getters: {
+ /**
+ * Get a file or folder by its source
+ * @param state
+ */
+ getNode: (state) => (source: FileSource): Node|undefined => state.files[source],
+
+ /**
+ * Get a list of files or folders by their IDs
+ * Note: does not return undefined values
+ * @param state
+ */
+ getNodes: (state) => (sources: FileSource[]): Node[] => sources
+ .map(source => state.files[source])
+ .filter(Boolean),
+
+ /**
+ * Get files or folders by their file ID
+ * Multiple nodes can have the same file ID but different sources
+ * (e.g. in a shared context)
+ * @param state
+ */
+ getNodesById: (state) => (fileId: number): Node[] => Object.values(state.files).filter(node => node.fileid === fileId),
+
+ /**
+ * Get the root folder of a service
+ * @param state
+ */
+ getRoot: (state) => (service: Service): Folder|undefined => state.roots[service],
+ },
+
+ actions: {
+ /**
+ * Get cached directory matching a given path
+ *
+ * @param service - The service (files view)
+ * @param path - The path relative within the service
+ * @return The folder if found
+ */
+ getDirectoryByPath(service: string, path?: string): Folder | undefined {
+ const pathsStore = usePathsStore()
+ let folder: Folder | undefined
+
+ // Get the containing folder from path store
+ if (!path || path === '/') {
+ folder = this.getRoot(service)
+ } else {
+ const source = pathsStore.getPath(service, path)
+ if (source) {
+ folder = this.getNode(source) as Folder | undefined
+ }
+ }
+
+ return folder
+ },
+
+ /**
+ * Get cached child nodes within a given path
+ *
+ * @param service - The service (files view)
+ * @param path - The path relative within the service
+ * @return Array of cached nodes within the path
+ */
+ getNodesByPath(service: string, path?: string): Node[] {
+ const folder = this.getDirectoryByPath(service, path)
+
+ // If we found a cache entry and the cache entry was already loaded (has children) then use it
+ return (folder?._children ?? [])
+ .map((source: string) => this.getNode(source))
+ .filter(Boolean)
+ },
+
+ updateNodes(nodes: Node[]) {
+ // Update the store all at once
+ const files = nodes.reduce((acc, node) => {
+ if (!node.fileid) {
+ logger.error('Trying to update/set a node without fileid', { node })
+ return acc
+ }
+
+ acc[node.source] = node
+ return acc
+ }, {} as FilesStore)
+
+ Vue.set(this, 'files', { ...this.files, ...files })
+ },
+
+ deleteNodes(nodes: Node[]) {
+ nodes.forEach(node => {
+ if (node.source) {
+ Vue.delete(this.files, node.source)
+ }
+ })
+ },
+
+ setRoot({ service, root }: RootOptions) {
+ Vue.set(this.roots, service, root)
+ },
+
+ onDeletedNode(node: Node) {
+ this.deleteNodes([node])
+ },
+
+ onCreatedNode(node: Node) {
+ this.updateNodes([node])
+ },
+
+ onMovedNode({ node, oldSource }: { node: Node, oldSource: string }) {
+ if (!node.fileid) {
+ logger.error('Trying to update/set a node without fileid', { node })
+ return
+ }
+
+ // Update the path of the node
+ Vue.delete(this.files, oldSource)
+ this.updateNodes([node])
+ },
+
+ async onUpdatedNode(node: Node) {
+ if (!node.fileid) {
+ logger.error('Trying to update/set a node without fileid', { node })
+ return
+ }
+
+ // If we have multiple nodes with the same file ID, we need to update all of them
+ const nodes = this.getNodesById(node.fileid)
+ if (nodes.length > 1) {
+ await Promise.all(nodes.map(node => fetchNode(node.path))).then(this.updateNodes)
+ logger.debug(nodes.length + ' nodes updated in store', { fileid: node.fileid })
+ return
+ }
+
+ // If we have only one node with the file ID, we can update it directly
+ if (nodes.length === 1 && node.source === nodes[0].source) {
+ this.updateNodes([node])
+ return
+ }
+
+ // Otherwise, it means we receive an event for a node that is not in the store
+ fetchNode(node.path).then(n => this.updateNodes([n]))
+ },
+
+ // Handlers for legacy sidebar (no real nodes support)
+ onAddFavorite(node: Node) {
+ const ourNode = this.getNode(node.source)
+ if (ourNode) {
+ Vue.set(ourNode.attributes, 'favorite', 1)
+ }
+ },
+
+ onRemoveFavorite(node: Node) {
+ const ourNode = this.getNode(node.source)
+ if (ourNode) {
+ Vue.set(ourNode.attributes, 'favorite', 0)
+ }
+ },
+ },
+ })
+
+ const fileStore = store(...args)
+ // Make sure we only register the listeners once
+ if (!fileStore._initialized) {
+ subscribe('files:node:created', fileStore.onCreatedNode)
+ subscribe('files:node:deleted', fileStore.onDeletedNode)
+ subscribe('files:node:updated', fileStore.onUpdatedNode)
+ subscribe('files:node:moved', fileStore.onMovedNode)
+ // legacy sidebar
+ subscribe('files:favorites:added', fileStore.onAddFavorite)
+ subscribe('files:favorites:removed', fileStore.onRemoveFavorite)
+
+ fileStore._initialized = true
+ }
+
+ return fileStore
+}
diff --git a/apps/files/src/store/filters.ts b/apps/files/src/store/filters.ts
new file mode 100644
index 00000000000..fd16ec5dc84
--- /dev/null
+++ b/apps/files/src/store/filters.ts
@@ -0,0 +1,133 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FilterUpdateChipsEvent, IFileListFilter, IFileListFilterChip } from '@nextcloud/files'
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { getFileListFilters } from '@nextcloud/files'
+import { defineStore } from 'pinia'
+import { computed, ref } from 'vue'
+import logger from '../logger'
+
+/**
+ * Check if the given value is an instance file list filter with mount function
+ * @param value The filter to check
+ */
+function isFileListFilterWithUi(value: IFileListFilter): value is Required<IFileListFilter> {
+ return 'mount' in value
+}
+
+export const useFiltersStore = defineStore('filters', () => {
+ const chips = ref<Record<string, IFileListFilterChip[]>>({})
+ const filters = ref<IFileListFilter[]>([])
+
+ /**
+ * Currently active filter chips
+ */
+ const activeChips = computed<IFileListFilterChip[]>(
+ () => Object.values(chips.value).flat(),
+ )
+
+ /**
+ * Filters sorted by order
+ */
+ const sortedFilters = computed<IFileListFilter[]>(
+ () => filters.value.sort((a, b) => a.order - b.order),
+ )
+
+ /**
+ * All filters that provide a UI for visual controlling the filter state
+ */
+ const filtersWithUI = computed<Required<IFileListFilter>[]>(
+ () => sortedFilters.value.filter(isFileListFilterWithUi),
+ )
+
+ /**
+ * Register a new filter on the store.
+ * This will subscribe the store to the filters events.
+ *
+ * @param filter The filter to add
+ */
+ function addFilter(filter: IFileListFilter) {
+ filter.addEventListener('update:chips', onFilterUpdateChips)
+ filter.addEventListener('update:filter', onFilterUpdate)
+
+ filters.value.push(filter)
+ logger.debug('New file list filter registered', { id: filter.id })
+ }
+
+ /**
+ * Unregister a filter from the store.
+ * This will remove the filter from the store and unsubscribe the store from the filer events.
+ * @param filterId Id of the filter to remove
+ */
+ function removeFilter(filterId: string) {
+ const index = filters.value.findIndex(({ id }) => id === filterId)
+ if (index > -1) {
+ const [filter] = filters.value.splice(index, 1)
+ filter.removeEventListener('update:chips', onFilterUpdateChips)
+ filter.removeEventListener('update:filter', onFilterUpdate)
+ logger.debug('Files list filter unregistered', { id: filterId })
+ }
+ }
+
+ /**
+ * Event handler for filter update events
+ * @private
+ */
+ function onFilterUpdate() {
+ emit('files:filters:changed')
+ }
+
+ /**
+ * Event handler for filter chips updates
+ * @param event The update event
+ * @private
+ */
+ function onFilterUpdateChips(event: FilterUpdateChipsEvent) {
+ const id = (event.target as IFileListFilter).id
+ chips.value = {
+ ...chips.value,
+ [id]: [...event.detail],
+ }
+
+ logger.debug('File list filter chips updated', { filter: id, chips: event.detail })
+ }
+
+ /**
+ * Event handler that resets all filters if the file list view was changed.
+ * @private
+ */
+ function onViewChanged() {
+ logger.debug('Reset all file list filters - view changed')
+
+ for (const filter of filters.value) {
+ if (filter.reset !== undefined) {
+ filter.reset()
+ }
+ }
+ }
+
+ // Initialize the store
+ subscribe('files:navigation:changed', onViewChanged)
+ subscribe('files:filter:added', addFilter)
+ subscribe('files:filter:removed', removeFilter)
+ for (const filter of getFileListFilters()) {
+ addFilter(filter)
+ }
+
+ return {
+ // state
+ chips,
+ filters,
+ filtersWithUI,
+
+ // getters / computed
+ activeChips,
+ sortedFilters,
+
+ // actions / methods
+ addFilter,
+ removeFilter,
+ }
+})
diff --git a/apps/files/src/store/index.ts b/apps/files/src/store/index.ts
new file mode 100644
index 00000000000..3ba667ffd2f
--- /dev/null
+++ b/apps/files/src/store/index.ts
@@ -0,0 +1,15 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { createPinia } from 'pinia'
+
+export const getPinia = () => {
+ if (window._nc_files_pinia) {
+ return window._nc_files_pinia
+ }
+
+ window._nc_files_pinia = createPinia()
+ return window._nc_files_pinia
+}
diff --git a/apps/files/src/store/keyboard.ts b/apps/files/src/store/keyboard.ts
new file mode 100644
index 00000000000..f2654933895
--- /dev/null
+++ b/apps/files/src/store/keyboard.ts
@@ -0,0 +1,47 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { defineStore } from 'pinia'
+import Vue from 'vue'
+
+/**
+ * Observe various events and save the current
+ * special keys states. Useful for checking the
+ * current status of a key when executing a method.
+ * @param {...any} args
+ */
+export const useKeyboardStore = function(...args) {
+ const store = defineStore('keyboard', {
+ state: () => ({
+ altKey: false,
+ ctrlKey: false,
+ metaKey: false,
+ shiftKey: false,
+ }),
+
+ actions: {
+ onEvent(event: MouseEvent | KeyboardEvent) {
+ if (!event) {
+ event = window.event as MouseEvent | KeyboardEvent
+ }
+ Vue.set(this, 'altKey', !!event.altKey)
+ Vue.set(this, 'ctrlKey', !!event.ctrlKey)
+ Vue.set(this, 'metaKey', !!event.metaKey)
+ Vue.set(this, 'shiftKey', !!event.shiftKey)
+ },
+ },
+ })
+
+ const keyboardStore = store(...args)
+ // Make sure we only register the listeners once
+ if (!keyboardStore._initialized) {
+ window.addEventListener('keydown', keyboardStore.onEvent)
+ window.addEventListener('keyup', keyboardStore.onEvent)
+ window.addEventListener('mousemove', keyboardStore.onEvent)
+
+ keyboardStore._initialized = true
+ }
+
+ return keyboardStore
+}
diff --git a/apps/files/src/store/paths.spec.ts b/apps/files/src/store/paths.spec.ts
new file mode 100644
index 00000000000..932e8b1a6a1
--- /dev/null
+++ b/apps/files/src/store/paths.spec.ts
@@ -0,0 +1,166 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { describe, beforeEach, test, expect } from 'vitest'
+import { setActivePinia, createPinia } from 'pinia'
+import { usePathsStore } from './paths.ts'
+import { emit } from '@nextcloud/event-bus'
+import { File, Folder } from '@nextcloud/files'
+import { useFilesStore } from './files.ts'
+
+describe('Path store', () => {
+
+ let store: ReturnType<typeof usePathsStore>
+ let files: ReturnType<typeof useFilesStore>
+ let root: Folder & { _children?: string[] }
+
+ beforeEach(() => {
+ setActivePinia(createPinia())
+
+ root = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/', id: 1 })
+ files = useFilesStore()
+ files.setRoot({ service: 'files', root })
+
+ store = usePathsStore()
+ })
+
+ test('Folder is created', () => {
+ // no defined paths
+ expect(store.paths).toEqual({})
+
+ // create the folder
+ const node = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/folder', id: 2 })
+ emit('files:node:created', node)
+
+ // see that the path is added
+ expect(store.paths).toEqual({ files: { [node.path]: node.source } })
+
+ // see that the node is added
+ expect(root._children).toEqual([node.source])
+ })
+
+ test('File is created', () => {
+ // no defined paths
+ expect(store.paths).toEqual({})
+
+ // create the file
+ const node = new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', id: 2, mime: 'text/plain' })
+ emit('files:node:created', node)
+
+ // see that there are still no paths
+ expect(store.paths).toEqual({})
+
+ // see that the node is added
+ expect(root._children).toEqual([node.source])
+ })
+
+ test('Existing file is created', () => {
+ // no defined paths
+ expect(store.paths).toEqual({})
+
+ // create the file
+ const node1 = new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', id: 2, mime: 'text/plain' })
+ emit('files:node:created', node1)
+
+ // see that there are still no paths
+ expect(store.paths).toEqual({})
+
+ // see that the node is added
+ expect(root._children).toEqual([node1.source])
+
+ // create the same named file again
+ const node2 = new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', id: 2, mime: 'text/plain' })
+ emit('files:node:created', node2)
+
+ // see that there are still no paths and the children are not duplicated
+ expect(store.paths).toEqual({})
+ expect(root._children).toEqual([node1.source])
+
+ })
+
+ test('Existing folder is created', () => {
+ // no defined paths
+ expect(store.paths).toEqual({})
+
+ // create the file
+ const node1 = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/folder', id: 2 })
+ emit('files:node:created', node1)
+
+ // see the path is added
+ expect(store.paths).toEqual({ files: { [node1.path]: node1.source } })
+
+ // see that the node is added
+ expect(root._children).toEqual([node1.source])
+
+ // create the same named file again
+ const node2 = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/folder', id: 2 })
+ emit('files:node:created', node2)
+
+ // see that there is still only one paths and the children are not duplicated
+ expect(store.paths).toEqual({ files: { [node1.path]: node1.source } })
+ expect(root._children).toEqual([node1.source])
+ })
+
+ test('Folder is deleted', () => {
+ const node = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/folder', id: 2 })
+ emit('files:node:created', node)
+ // see that the path is added and the children are set-up
+ expect(store.paths).toEqual({ files: { [node.path]: node.source } })
+ expect(root._children).toEqual([node.source])
+
+ emit('files:node:deleted', node)
+ // See the path is removed
+ expect(store.paths).toEqual({ files: {} })
+ // See the child is removed
+ expect(root._children).toEqual([])
+ })
+
+ test('File is deleted', () => {
+ const node = new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', id: 2, mime: 'text/plain' })
+ emit('files:node:created', node)
+ // see that the children are set-up
+ expect(root._children).toEqual([node.source])
+
+ emit('files:node:deleted', node)
+ // See the child is removed
+ expect(root._children).toEqual([])
+ })
+
+ test('Folder is moved', () => {
+ const node = new Folder({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/folder', id: 2 })
+ emit('files:node:created', node)
+ // see that the path is added and the children are set-up
+ expect(store.paths).toEqual({ files: { [node.path]: node.source } })
+ expect(root._children).toEqual([node.source])
+
+ const renamedNode = node.clone()
+ renamedNode.rename('new-folder')
+
+ expect(renamedNode.path).toBe('/new-folder')
+ expect(renamedNode.source).toBe('http://example.com/remote.php/dav/files/test/new-folder')
+
+ emit('files:node:moved', { node: renamedNode, oldSource: node.source })
+ // See the path is updated
+ expect(store.paths).toEqual({ files: { [renamedNode.path]: renamedNode.source } })
+ // See the child is updated
+ expect(root._children).toEqual([renamedNode.source])
+ })
+
+ test('File is moved', () => {
+ const node = new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', id: 2, mime: 'text/plain' })
+ emit('files:node:created', node)
+ // see that the children are set-up
+ expect(root._children).toEqual([node.source])
+ expect(store.paths).toEqual({})
+
+ const renamedNode = node.clone()
+ renamedNode.rename('new-file.txt')
+
+ emit('files:node:moved', { node: renamedNode, oldSource: node.source })
+ // See the child is updated
+ expect(root._children).toEqual([renamedNode.source])
+ expect(store.paths).toEqual({})
+ })
+})
diff --git a/apps/files/src/store/paths.ts b/apps/files/src/store/paths.ts
new file mode 100644
index 00000000000..4a83cb51c83
--- /dev/null
+++ b/apps/files/src/store/paths.ts
@@ -0,0 +1,165 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileSource, PathsStore, PathOptions, ServicesState, Service } from '../types'
+import { defineStore } from 'pinia'
+import { dirname } from '@nextcloud/paths'
+import { File, FileType, Folder, Node, getNavigation } from '@nextcloud/files'
+import { subscribe } from '@nextcloud/event-bus'
+import Vue from 'vue'
+import logger from '../logger'
+
+import { useFilesStore } from './files'
+
+export const usePathsStore = function(...args) {
+ const files = useFilesStore(...args)
+
+ const store = defineStore('paths', {
+ state: () => ({
+ paths: {} as ServicesState,
+ } as PathsStore),
+
+ getters: {
+ getPath: (state) => {
+ return (service: string, path: string): FileSource|undefined => {
+ if (!state.paths[service]) {
+ return undefined
+ }
+ return state.paths[service][path]
+ }
+ },
+ },
+
+ actions: {
+ addPath(payload: PathOptions) {
+ // If it doesn't exists, init the service state
+ if (!this.paths[payload.service]) {
+ Vue.set(this.paths, payload.service, {})
+ }
+
+ // Now we can set the provided path
+ Vue.set(this.paths[payload.service], payload.path, payload.source)
+ },
+
+ deletePath(service: Service, path: string) {
+ // skip if service does not exist
+ if (!this.paths[service]) {
+ return
+ }
+
+ Vue.delete(this.paths[service], path)
+ },
+
+ onCreatedNode(node: Node) {
+ const service = getNavigation()?.active?.id || 'files'
+ if (!node.fileid) {
+ logger.error('Node has no fileid', { node })
+ return
+ }
+
+ // Only add path if it's a folder
+ if (node.type === FileType.Folder) {
+ this.addPath({
+ service,
+ path: node.path,
+ source: node.source,
+ })
+ }
+
+ // Update parent folder children if exists
+ // If the folder is the root, get it and update it
+ this.addNodeToParentChildren(node)
+ },
+
+ onDeletedNode(node: Node) {
+ const service = getNavigation()?.active?.id || 'files'
+
+ if (node.type === FileType.Folder) {
+ // Delete the path
+ this.deletePath(
+ service,
+ node.path,
+ )
+ }
+
+ this.deleteNodeFromParentChildren(node)
+ },
+
+ onMovedNode({ node, oldSource }: { node: Node, oldSource: string }) {
+ const service = getNavigation()?.active?.id || 'files'
+
+ // Update the path of the node
+ if (node.type === FileType.Folder) {
+ // Delete the old path if it exists
+ const oldPath = Object.entries(this.paths[service]).find(([, source]) => source === oldSource)
+ if (oldPath?.[0]) {
+ this.deletePath(service, oldPath[0])
+ }
+
+ // Add the new path
+ this.addPath({
+ service,
+ path: node.path,
+ source: node.source,
+ })
+ }
+
+ // Dummy simple clone of the renamed node from a previous state
+ const oldNode = new File({ source: oldSource, owner: node.owner, mime: node.mime })
+
+ this.deleteNodeFromParentChildren(oldNode)
+ this.addNodeToParentChildren(node)
+ },
+
+ deleteNodeFromParentChildren(node: Node) {
+ const service = getNavigation()?.active?.id || 'files'
+
+ // Update children of a root folder
+ const parentSource = dirname(node.source)
+ const folder = (node.dirname === '/' ? files.getRoot(service) : files.getNode(parentSource)) as Folder & { _children?: string[] }
+ if (folder) {
+ // ensure sources are unique
+ const children = new Set(folder._children ?? [])
+ children.delete(node.source)
+ Vue.set(folder, '_children', [...children.values()])
+ logger.debug('Children updated', { parent: folder, node, children: folder._children })
+ return
+ }
+
+ logger.debug('Parent path does not exists, skipping children update', { node })
+ },
+
+ addNodeToParentChildren(node: Node) {
+ const service = getNavigation()?.active?.id || 'files'
+
+ // Update children of a root folder
+ const parentSource = dirname(node.source)
+ const folder = (node.dirname === '/' ? files.getRoot(service) : files.getNode(parentSource)) as Folder & { _children?: string[] }
+ if (folder) {
+ // ensure sources are unique
+ const children = new Set(folder._children ?? [])
+ children.add(node.source)
+ Vue.set(folder, '_children', [...children.values()])
+ logger.debug('Children updated', { parent: folder, node, children: folder._children })
+ return
+ }
+
+ logger.debug('Parent path does not exists, skipping children update', { node })
+ },
+
+ },
+ })
+
+ const pathsStore = store(...args)
+ // Make sure we only register the listeners once
+ if (!pathsStore._initialized) {
+ subscribe('files:node:created', pathsStore.onCreatedNode)
+ subscribe('files:node:deleted', pathsStore.onDeletedNode)
+ subscribe('files:node:moved', pathsStore.onMovedNode)
+
+ pathsStore._initialized = true
+ }
+
+ return pathsStore
+}
diff --git a/apps/files/src/store/renaming.ts b/apps/files/src/store/renaming.ts
new file mode 100644
index 00000000000..fc61be3bd3b
--- /dev/null
+++ b/apps/files/src/store/renaming.ts
@@ -0,0 +1,175 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node } from '@nextcloud/files'
+
+import axios, { isAxiosError } from '@nextcloud/axios'
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { FileType, NodeStatus } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { spawnDialog } from '@nextcloud/vue/functions/dialog'
+import { basename, dirname, extname } from 'path'
+import { defineStore } from 'pinia'
+import logger from '../logger'
+import Vue, { defineAsyncComponent, ref } from 'vue'
+import { useUserConfigStore } from './userconfig'
+import { fetchNode } from '../services/WebdavClient'
+
+export const useRenamingStore = defineStore('renaming', () => {
+ /**
+ * The currently renamed node
+ */
+ const renamingNode = ref<Node>()
+ /**
+ * The new name of the currently renamed node
+ */
+ const newNodeName = ref('')
+
+ /**
+ * Internal flag to only allow calling `rename` once.
+ */
+ const isRenaming = ref(false)
+
+ /**
+ * Execute the renaming.
+ * This will rename the node set as `renamingNode` to the configured new name `newName`.
+ *
+ * @return true if success, false if skipped (e.g. new and old name are the same)
+ * @throws Error if renaming fails, details are set in the error message
+ */
+ async function rename(): Promise<boolean> {
+ if (renamingNode.value === undefined) {
+ throw new Error('No node is currently being renamed')
+ }
+
+ // Only rename once so we use this as some kind of mutex
+ if (isRenaming.value) {
+ return false
+ }
+ isRenaming.value = true
+
+ let node = renamingNode.value
+ Vue.set(node, 'status', NodeStatus.LOADING)
+
+ const userConfig = useUserConfigStore()
+
+ let newName = newNodeName.value.trim()
+ const oldName = node.basename
+ const oldExtension = extname(oldName)
+ const newExtension = extname(newName)
+ // Check for extension change for files
+ if (node.type === FileType.File
+ && oldExtension !== newExtension
+ && userConfig.userConfig.show_dialog_file_extension
+ && !(await showFileExtensionDialog(oldExtension, newExtension))
+ ) {
+ // user selected to use the old extension
+ newName = basename(newName, newExtension) + oldExtension
+ }
+
+ const oldEncodedSource = node.encodedSource
+ try {
+ if (oldName === newName) {
+ return false
+ }
+
+ // rename the node
+ node.rename(newName)
+ logger.debug('Moving file to', { destination: node.encodedSource, oldEncodedSource })
+ // create MOVE request
+ await axios({
+ method: 'MOVE',
+ url: oldEncodedSource,
+ headers: {
+ Destination: node.encodedSource,
+ Overwrite: 'F',
+ },
+ })
+
+ // Update mime type if extension changed
+ // as other related informations might have changed
+ // on the backend but it is really hard to know on the front
+ if (oldExtension !== newExtension) {
+ node = await fetchNode(node.path)
+ }
+
+ // Success 🎉
+ emit('files:node:updated', node)
+ emit('files:node:renamed', node)
+ emit('files:node:moved', {
+ node,
+ oldSource: `${dirname(node.source)}/${oldName}`,
+ })
+
+ // Reset the state not changed
+ if (renamingNode.value === node) {
+ $reset()
+ }
+
+ return true
+ } catch (error) {
+ logger.error('Error while renaming file', { error })
+ // Rename back as it failed
+ node.rename(oldName)
+ if (isAxiosError(error)) {
+ // TODO: 409 means current folder does not exist, redirect ?
+ if (error?.response?.status === 404) {
+ throw new Error(t('files', 'Could not rename "{oldName}", it does not exist any more', { oldName }))
+ } else if (error?.response?.status === 412) {
+ throw new Error(t(
+ 'files',
+ 'The name "{newName}" is already used in the folder "{dir}". Please choose a different name.',
+ {
+ newName,
+ dir: basename(renamingNode.value!.dirname),
+ },
+ ))
+ }
+ }
+ // Unknown error
+ throw new Error(t('files', 'Could not rename "{oldName}"', { oldName }))
+ } finally {
+ Vue.set(node, 'status', undefined)
+ isRenaming.value = false
+ }
+ }
+
+ /**
+ * Reset the store state
+ */
+ function $reset(): void {
+ newNodeName.value = ''
+ renamingNode.value = undefined
+ }
+
+ // Make sure we only register the listeners once
+ subscribe('files:node:rename', (node: Node) => {
+ renamingNode.value = node
+ newNodeName.value = node.basename
+ })
+
+ return {
+ $reset,
+
+ newNodeName,
+ rename,
+ renamingNode,
+ }
+})
+
+/**
+ * Show a dialog asking user for confirmation about changing the file extension.
+ *
+ * @param oldExtension the old file name extension
+ * @param newExtension the new file name extension
+ */
+async function showFileExtensionDialog(oldExtension: string, newExtension: string): Promise<boolean> {
+ const { promise, resolve } = Promise.withResolvers<boolean>()
+ spawnDialog(
+ defineAsyncComponent(() => import('../views/DialogConfirmFileExtension.vue')),
+ { oldExtension, newExtension },
+ (useNewExtension: unknown) => resolve(Boolean(useNewExtension)),
+ )
+ return await promise
+}
diff --git a/apps/files/src/store/search.ts b/apps/files/src/store/search.ts
new file mode 100644
index 00000000000..43e01f35b92
--- /dev/null
+++ b/apps/files/src/store/search.ts
@@ -0,0 +1,153 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { View } from '@nextcloud/files'
+import type RouterService from '../services/RouterService.ts'
+import type { SearchScope } from '../types.ts'
+
+import { emit, subscribe } from '@nextcloud/event-bus'
+import debounce from 'debounce'
+import { defineStore } from 'pinia'
+import { ref, watch } from 'vue'
+import { VIEW_ID } from '../views/search.ts'
+import logger from '../logger.ts'
+
+export const useSearchStore = defineStore('search', () => {
+ /**
+ * The current search query
+ */
+ const query = ref('')
+
+ /**
+ * Scope of the search.
+ * Scopes:
+ * - filter: only filter current file list
+ * - globally: search everywhere
+ */
+ const scope = ref<SearchScope>('filter')
+
+ // reset the base if query is cleared
+ watch(scope, updateSearch)
+
+ watch(query, (old, current) => {
+ // skip if only whitespaces changed
+ if (old.trim() === current.trim()) {
+ return
+ }
+
+ updateSearch()
+ })
+
+ // initialize the search store
+ initialize()
+
+ /**
+ * Debounced update of the current route
+ * @private
+ */
+ const updateRouter = debounce((isSearch: boolean) => {
+ const router = window.OCP.Files.Router as RouterService
+ router.goToRoute(
+ undefined,
+ {
+ view: VIEW_ID,
+ },
+ {
+ query: query.value,
+ },
+ isSearch,
+ )
+ })
+
+ /**
+ * Handle updating the filter if needed.
+ * Also update the search view by updating the current route if needed.
+ *
+ * @private
+ */
+ function updateSearch() {
+ // emit the search event to update the filter
+ emit('files:search:updated', { query: query.value, scope: scope.value })
+ const router = window.OCP.Files.Router as RouterService
+
+ // if we are on the search view and the query was unset or scope was set to 'filter' we need to move back to the files view
+ if (router.params.view === VIEW_ID && (query.value === '' || scope.value === 'filter')) {
+ scope.value = 'filter'
+ return router.goToRoute(
+ undefined,
+ {
+ view: 'files',
+ },
+ {
+ ...router.query,
+ query: undefined,
+ },
+ )
+ }
+
+ // for the filter scope we do not need to adjust the current route anymore
+ // also if the query is empty we do not need to do anything
+ if (scope.value === 'filter' || !query.value) {
+ return
+ }
+
+ const isSearch = router.params.view === VIEW_ID
+
+ logger.debug('Update route for updated search query', { query: query.value, isSearch })
+ updateRouter(isSearch)
+ }
+
+ /**
+ * Event handler that resets the store if the file list view was changed.
+ *
+ * @param view - The new view that is active
+ * @private
+ */
+ function onViewChanged(view: View) {
+ if (view.id !== VIEW_ID) {
+ query.value = ''
+ scope.value = 'filter'
+ }
+ }
+
+ /**
+ * Initialize the store from the router if needed
+ */
+ function initialize() {
+ subscribe('files:navigation:changed', onViewChanged)
+
+ const router = window.OCP.Files.Router as RouterService
+ // if we initially load the search view (e.g. hard page refresh)
+ // then we need to initialize the store from the router
+ if (router.params.view === VIEW_ID) {
+ query.value = [router.query.query].flat()[0] ?? ''
+
+ if (query.value) {
+ scope.value = 'globally'
+ logger.debug('Directly navigated to search view', { query: query.value })
+ } else {
+ // we do not have any query so we need to move to the files list
+ logger.info('Directly navigated to search view without any query, redirect to files view.')
+ router.goToRoute(
+ undefined,
+ {
+ ...router.params,
+ view: 'files',
+ },
+ {
+ ...router.query,
+ query: undefined,
+ },
+ true,
+ )
+ }
+ }
+ }
+
+ return {
+ query,
+ scope,
+ }
+})
diff --git a/apps/files/src/store/selection.ts b/apps/files/src/store/selection.ts
new file mode 100644
index 00000000000..fa35d953406
--- /dev/null
+++ b/apps/files/src/store/selection.ts
@@ -0,0 +1,44 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileSource, SelectionStore } from '../types'
+import { defineStore } from 'pinia'
+import Vue from 'vue'
+
+export const useSelectionStore = defineStore('selection', {
+ state: () => ({
+ selected: [],
+ lastSelection: [],
+ lastSelectedIndex: null,
+ } as SelectionStore),
+
+ actions: {
+ /**
+ * Set the selection of fileIds
+ * @param selection
+ */
+ set(selection = [] as FileSource[]) {
+ Vue.set(this, 'selected', [...new Set(selection)])
+ },
+
+ /**
+ * Set the last selected index
+ * @param lastSelectedIndex
+ */
+ setLastIndex(lastSelectedIndex = null as number | null) {
+ // Update the last selection if we provided a new selection starting point
+ Vue.set(this, 'lastSelection', lastSelectedIndex ? this.selected : [])
+ Vue.set(this, 'lastSelectedIndex', lastSelectedIndex)
+ },
+
+ /**
+ * Reset the selection
+ */
+ reset() {
+ Vue.set(this, 'selected', [])
+ Vue.set(this, 'lastSelection', [])
+ Vue.set(this, 'lastSelectedIndex', null)
+ },
+ },
+})
diff --git a/apps/files/src/store/uploader.ts b/apps/files/src/store/uploader.ts
new file mode 100644
index 00000000000..12c0f77cbf2
--- /dev/null
+++ b/apps/files/src/store/uploader.ts
@@ -0,0 +1,24 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Uploader } from '@nextcloud/upload'
+import type { UploaderStore } from '../types'
+
+import { defineStore } from 'pinia'
+import { getUploader } from '@nextcloud/upload'
+
+let uploader: Uploader
+
+export const useUploaderStore = function(...args) {
+ // Only init on runtime
+ uploader = getUploader()
+
+ const store = defineStore('uploader', {
+ state: () => ({
+ queue: uploader.queue,
+ } as UploaderStore),
+ })
+
+ return store(...args)
+}
diff --git a/apps/files/src/store/userconfig.ts b/apps/files/src/store/userconfig.ts
new file mode 100644
index 00000000000..48fe01d5134
--- /dev/null
+++ b/apps/files/src/store/userconfig.ts
@@ -0,0 +1,62 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { UserConfig } from '../types'
+import { getCurrentUser } from '@nextcloud/auth'
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { loadState } from '@nextcloud/initial-state'
+import { generateUrl } from '@nextcloud/router'
+import { defineStore } from 'pinia'
+import { ref, set } from 'vue'
+import axios from '@nextcloud/axios'
+
+const initialUserConfig = loadState<UserConfig>('files', 'config', {
+ crop_image_previews: true,
+ default_view: 'files',
+ grid_view: false,
+ show_files_extensions: true,
+ show_hidden: false,
+ show_mime_column: true,
+ sort_favorites_first: true,
+ sort_folders_first: true,
+
+ show_dialog_deletion: false,
+ show_dialog_file_extension: true,
+})
+
+export const useUserConfigStore = defineStore('userconfig', () => {
+ const userConfig = ref<UserConfig>({ ...initialUserConfig })
+
+ /**
+ * Update the user config local store
+ * @param key The config key
+ * @param value The new value
+ */
+ function onUpdate(key: string, value: boolean): void {
+ set(userConfig.value, key, value)
+ }
+
+ /**
+ * Update the user config local store AND on server side
+ * @param key The config key
+ * @param value The new value
+ */
+ async function update(key: string, value: boolean): Promise<void> {
+ // only update if a user is logged in (not the case for public shares)
+ if (getCurrentUser() !== null) {
+ await axios.put(generateUrl('/apps/files/api/v1/config/{key}', { key }), {
+ value,
+ })
+ }
+ emit('files:config:updated', { key, value })
+ }
+
+ // Register the event listener
+ subscribe('files:config:updated', ({ key, value }) => onUpdate(key, value))
+
+ return {
+ userConfig,
+ update,
+ }
+})
diff --git a/apps/files/src/store/viewConfig.ts b/apps/files/src/store/viewConfig.ts
new file mode 100644
index 00000000000..a902cedb6fa
--- /dev/null
+++ b/apps/files/src/store/viewConfig.ts
@@ -0,0 +1,96 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { ViewConfigs, ViewId, ViewConfig } from '../types'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { loadState } from '@nextcloud/initial-state'
+import { generateUrl } from '@nextcloud/router'
+import { defineStore } from 'pinia'
+import { ref, set } from 'vue'
+import axios from '@nextcloud/axios'
+
+const initialViewConfig = loadState('files', 'viewConfigs', {}) as ViewConfigs
+
+export const useViewConfigStore = defineStore('viewconfig', () => {
+
+ const viewConfigs = ref({ ...initialViewConfig })
+
+ /**
+ * Get the config for a specific view
+ * @param viewid Id of the view to fet the config for
+ */
+ function getConfig(viewid: ViewId): ViewConfig {
+ return viewConfigs.value[viewid] || {}
+ }
+
+ /**
+ * Update the view config local store
+ * @param viewId The id of the view to update
+ * @param key The config key to update
+ * @param value The new value
+ */
+ function onUpdate(viewId: ViewId, key: string, value: string | number | boolean): void {
+ if (!(viewId in viewConfigs.value)) {
+ set(viewConfigs.value, viewId, {})
+ }
+ set(viewConfigs.value[viewId], key, value)
+ }
+
+ /**
+ * Update the view config local store AND on server side
+ * @param view Id of the view to update
+ * @param key Config key to update
+ * @param value New value
+ */
+ async function update(view: ViewId, key: string, value: string | number | boolean): Promise<void> {
+ if (getCurrentUser() !== null) {
+ await axios.put(generateUrl('/apps/files/api/v1/views'), {
+ value,
+ view,
+ key,
+ })
+ }
+
+ emit('files:view-config:updated', { view, key, value })
+ }
+
+ /**
+ * Set the sorting key AND sort by ASC
+ * The key param must be a valid key of a File object
+ * If not found, will be searched within the File attributes
+ * @param key Key to sort by
+ * @param view View to set the sorting key for
+ */
+ function setSortingBy(key = 'basename', view = 'files'): void {
+ // Save new config
+ update(view, 'sorting_mode', key)
+ update(view, 'sorting_direction', 'asc')
+ }
+
+ /**
+ * Toggle the sorting direction
+ * @param viewId id of the view to set the sorting order for
+ */
+ function toggleSortingDirection(viewId = 'files'): void {
+ const config = viewConfigs.value[viewId] || { sorting_direction: 'asc' }
+ const newDirection = config.sorting_direction === 'asc' ? 'desc' : 'asc'
+
+ // Save new config
+ update(viewId, 'sorting_direction', newDirection)
+ }
+
+ // Initialize event listener
+ subscribe('files:view-config:updated', ({ view, key, value }) => onUpdate(view, key, value))
+
+ return {
+ viewConfigs,
+
+ getConfig,
+ setSortingBy,
+ toggleSortingDirection,
+ update,
+ }
+})
diff --git a/apps/files/src/templates.js b/apps/files/src/templates.js
deleted file mode 100644
index 7f7ebbf2dcc..00000000000
--- a/apps/files/src/templates.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import { getLoggerBuilder } from '@nextcloud/logger'
-import { loadState } from '@nextcloud/initial-state'
-import { translate as t, translatePlural as n } from '@nextcloud/l10n'
-import { generateOcsUrl } from '@nextcloud/router'
-import { getCurrentDirectory } from './utils/davUtils'
-import axios from '@nextcloud/axios'
-import Vue from 'vue'
-
-import TemplatePickerView from './views/TemplatePicker'
-import { showError } from '@nextcloud/dialogs'
-
-// Set up logger
-const logger = getLoggerBuilder()
- .setApp('files')
- .detectUser()
- .build()
-
-// Add translates functions
-Vue.mixin({
- methods: {
- t,
- n,
- },
-})
-
-// Create document root
-const TemplatePickerRoot = document.createElement('div')
-TemplatePickerRoot.id = 'template-picker'
-document.body.appendChild(TemplatePickerRoot)
-
-// Retrieve and init templates
-let templates = loadState('files', 'templates', [])
-let templatesPath = loadState('files', 'templates_path', false)
-logger.debug('Templates providers', templates)
-logger.debug('Templates folder', { templatesPath })
-
-// Init vue app
-const View = Vue.extend(TemplatePickerView)
-const TemplatePicker = new View({
- name: 'TemplatePicker',
- propsData: {
- logger,
- },
-})
-TemplatePicker.$mount('#template-picker')
-
-// Init template engine after load to make sure it's the last injected entry
-window.addEventListener('DOMContentLoaded', function() {
- if (!templatesPath) {
- logger.debug('Templates folder not initialized')
- const initTemplatesPlugin = {
- attach(menu) {
- // register the new menu entry
- menu.addMenuEntry({
- id: 'template-init',
- displayName: t('files', 'Set up templates folder'),
- templateName: t('files', 'Templates'),
- iconClass: 'icon-template-add',
- fileType: 'file',
- actionHandler(name) {
- initTemplatesFolder(name)
- menu.removeMenuEntry('template-init')
- },
- })
- },
- }
- OC.Plugins.register('OCA.Files.NewFileMenu', initTemplatesPlugin)
- }
-})
-
-// Init template files menu
-templates.forEach((provider, index) => {
- const newTemplatePlugin = {
- attach(menu) {
- const fileList = menu.fileList
-
- // only attach to main file list, public view is not supported yet
- if (fileList.id !== 'files' && fileList.id !== 'files.public') {
- return
- }
-
- // register the new menu entry
- menu.addMenuEntry({
- id: `template-new-${provider.app}-${index}`,
- displayName: provider.label,
- templateName: provider.label + provider.extension,
- iconClass: provider.iconClass || 'icon-file',
- fileType: 'file',
- actionHandler(name) {
- TemplatePicker.open(name, provider)
- },
- })
- },
- }
- OC.Plugins.register('OCA.Files.NewFileMenu', newTemplatePlugin)
-})
-
-/**
- * Init the template directory
- *
- * @param {string} name the templates folder name
- */
-const initTemplatesFolder = async function(name) {
- const templatePath = (getCurrentDirectory() + `/${name}`).replace('//', '/')
- try {
- logger.debug('Initializing the templates directory', { templatePath })
- const response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/path'), {
- templatePath,
- copySystemTemplates: true,
- })
-
- // Go to template directory
- OCA.Files.App.currentFileList.changeDirectory(templatePath, true, true)
-
- templates = response.data.ocs.data.templates
- templatesPath = response.data.ocs.data.template_path
- } catch (error) {
- logger.error('Unable to initialize the templates directory')
- showError(t('files', 'Unable to initialize the templates directory'))
- }
-}
diff --git a/apps/files/src/types.ts b/apps/files/src/types.ts
new file mode 100644
index 00000000000..0096ecc0fdb
--- /dev/null
+++ b/apps/files/src/types.ts
@@ -0,0 +1,148 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileAction, Folder, Node, View } from '@nextcloud/files'
+import type { Upload } from '@nextcloud/upload'
+
+// Global definitions
+export type Service = string
+export type FileSource = string
+export type ViewId = string
+
+// Files store
+export type FilesStore = {
+ [source: FileSource]: Node
+}
+
+export type RootsStore = {
+ [service: Service]: Folder
+}
+
+export type FilesState = {
+ files: FilesStore,
+ roots: RootsStore,
+}
+
+export interface RootOptions {
+ root: Folder
+ service: Service
+}
+
+// Paths store
+export type PathConfig = {
+ [path: string]: FileSource
+}
+
+export type ServicesState = {
+ [service: Service]: PathConfig
+}
+
+export type PathsStore = {
+ paths: ServicesState
+}
+
+export interface PathOptions {
+ service: Service
+ path: string
+ source: FileSource
+}
+
+// User config store
+export interface UserConfig {
+ [key: string]: boolean | string | undefined
+
+ crop_image_previews: boolean
+ default_view: 'files' | 'personal'
+ grid_view: boolean
+ show_files_extensions: boolean
+ show_hidden: boolean
+ show_mime_column: boolean
+ sort_favorites_first: boolean
+ sort_folders_first: boolean
+
+ show_dialog_deletion: boolean
+ show_dialog_file_extension: boolean,
+}
+
+export interface UserConfigStore {
+ userConfig: UserConfig
+}
+
+export interface SelectionStore {
+ selected: FileSource[]
+ lastSelection: FileSource[]
+ lastSelectedIndex: number | null
+}
+
+// Actions menu store
+export type GlobalActions = 'global'
+export interface ActionsMenuStore {
+ opened: GlobalActions|string|null
+}
+
+// View config store
+export interface ViewConfig {
+ [key: string]: string|boolean
+}
+export interface ViewConfigs {
+ [viewId: ViewId]: ViewConfig
+}
+export interface ViewConfigStore {
+ viewConfig: ViewConfigs
+}
+
+// Renaming store
+export interface RenamingStore {
+ renamingNode?: Node
+ newName: string
+}
+
+// Uploader store
+export interface UploaderStore {
+ queue: Upload[]
+}
+
+// Drag and drop store
+export interface DragAndDropStore {
+ dragging: FileSource[]
+}
+
+// Active node store
+export interface ActiveStore {
+ activeAction: FileAction|null
+ activeFolder: Folder|null
+ activeNode: Node|null
+ activeView: View|null
+}
+
+/**
+ * Search scope for the in-files-search
+ */
+export type SearchScope = 'filter'|'globally'
+
+export interface TemplateFile {
+ app: string
+ label: string
+ extension: string
+ iconClass?: string
+ iconSvgInline?: string
+ mimetypes: string[]
+ ratio?: number
+ templates?: Record<string, unknown>[]
+}
+
+export type Capabilities = {
+ files: {
+ bigfilechunking: boolean
+ blacklisted_files: string[]
+ forbidden_filename_basenames: string[]
+ forbidden_filename_characters: string[]
+ forbidden_filename_extensions: string[]
+ forbidden_filenames: string[]
+ undelete: boolean
+ version_deletion: boolean
+ version_labeling: boolean
+ versioning: boolean
+ }
+}
diff --git a/apps/files/src/utils/actionUtils.ts b/apps/files/src/utils/actionUtils.ts
new file mode 100644
index 00000000000..adacf621b4c
--- /dev/null
+++ b/apps/files/src/utils/actionUtils.ts
@@ -0,0 +1,74 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { FileAction } from '@nextcloud/files'
+
+import { NodeStatus } from '@nextcloud/files'
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { t } from '@nextcloud/l10n'
+import Vue from 'vue'
+
+import { getPinia } from '../store'
+import { useActiveStore } from '../store/active'
+import logger from '../logger'
+
+/**
+ * Execute an action on the current active node
+ *
+ * @param action The action to execute
+ */
+export const executeAction = async (action: FileAction) => {
+ const activeStore = useActiveStore(getPinia())
+ const currentDir = (window?.OCP?.Files?.Router?.query?.dir || '/') as string
+ const currentNode = activeStore.activeNode
+ const currentView = activeStore.activeView
+
+ if (!currentNode || !currentView) {
+ logger.error('No active node or view', { node: currentNode, view: currentView })
+ return
+ }
+
+ if (currentNode.status === NodeStatus.LOADING) {
+ logger.debug('Node is already loading', { node: currentNode })
+ return
+ }
+
+ if (!action.enabled!([currentNode], currentView)) {
+ logger.debug('Action is not not available for the current context', { action, node: currentNode, view: currentView })
+ return
+ }
+
+ let displayName = action.id
+ try {
+ displayName = action.displayName([currentNode], currentView)
+ } catch (error) {
+ logger.error('Error while getting action display name', { action, error })
+ }
+
+ try {
+ // Set the loading marker
+ Vue.set(currentNode, 'status', NodeStatus.LOADING)
+ activeStore.activeAction = action
+
+ const success = await action.exec(currentNode, currentView, currentDir)
+
+ // If the action returns null, we stay silent
+ if (success === null || success === undefined) {
+ return
+ }
+
+ if (success) {
+ showSuccess(t('files', '{displayName}: done', { displayName }))
+ return
+ }
+ showError(t('files', '{displayName}: failed', { displayName }))
+ } catch (error) {
+ logger.error('Error while executing action', { action, error })
+ showError(t('files', '{displayName}: failed', { displayName }))
+ } finally {
+ // Reset the loading marker
+ Vue.set(currentNode, 'status', undefined)
+ activeStore.activeAction = undefined
+ }
+}
diff --git a/apps/files/src/utils/davUtils.js b/apps/files/src/utils/davUtils.js
deleted file mode 100644
index 1bd63347518..00000000000
--- a/apps/files/src/utils/davUtils.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-import { generateRemoteUrl } from '@nextcloud/router'
-import { getCurrentUser } from '@nextcloud/auth'
-
-export const getRootPath = function() {
- if (getCurrentUser()) {
- return generateRemoteUrl(`dav/files/${getCurrentUser().uid}`)
- } else {
- return generateRemoteUrl('webdav').replace('/remote.php', '/public.php')
- }
-}
-
-export const isPublic = function() {
- return !getCurrentUser()
-}
-
-export const getToken = function() {
- return document.getElementById('sharingToken') && document.getElementById('sharingToken').value
-}
-
-/**
- * Return the current directory, fallback to root
- *
- * @return {string}
- */
-export const getCurrentDirectory = function() {
- const currentDirInfo = OCA?.Files?.App?.currentFileList?.dirInfo
- || { path: '/', name: '' }
-
- // Make sure we don't have double slashes
- return `${currentDirInfo.path}/${currentDirInfo.name}`.replace(/\/\//gi, '/')
-}
diff --git a/apps/files/src/utils/davUtils.ts b/apps/files/src/utils/davUtils.ts
new file mode 100644
index 00000000000..54c1a6ea966
--- /dev/null
+++ b/apps/files/src/utils/davUtils.ts
@@ -0,0 +1,41 @@
+/**
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { t } from '@nextcloud/l10n'
+import type { WebDAVClientError } from 'webdav'
+
+/**
+ * Whether error is a WebDAVClientError
+ * @param error - Any exception
+ * @return {boolean} - Whether error is a WebDAVClientError
+ */
+function isWebDAVClientError(error: unknown): error is WebDAVClientError {
+ return error instanceof Error && 'status' in error && 'response' in error
+}
+
+/**
+ * Get a localized error message from webdav request
+ * @param error - An exception from webdav request
+ * @return {string} Localized error message for end user
+ */
+export function humanizeWebDAVError(error: unknown) {
+ if (error instanceof Error) {
+ if (isWebDAVClientError(error)) {
+ const status = error.status || error.response?.status || 0
+ if ([400, 404, 405].includes(status)) {
+ return t('files', 'Folder not found')
+ } else if (status === 403) {
+ return t('files', 'This operation is forbidden')
+ } else if (status === 500) {
+ return t('files', 'This folder is unavailable, please try again later or contact the administration')
+ } else if (status === 503) {
+ return t('files', 'Storage is temporarily not available')
+ }
+ }
+ return t('files', 'Unexpected error: {error}', { error: error.message })
+ }
+
+ return t('files', 'Unknown error')
+}
diff --git a/apps/files/src/utils/dragUtils.ts b/apps/files/src/utils/dragUtils.ts
new file mode 100644
index 00000000000..0722e313089
--- /dev/null
+++ b/apps/files/src/utils/dragUtils.ts
@@ -0,0 +1,25 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node } from '@nextcloud/files'
+import DragAndDropPreview from '../components/DragAndDropPreview.vue'
+import Vue from 'vue'
+
+const Preview = Vue.extend(DragAndDropPreview)
+let preview: Vue
+
+export const getDragAndDropPreview = async (nodes: Node[]): Promise<Element> => {
+ return new Promise((resolve) => {
+ if (!preview) {
+ preview = new Preview().$mount()
+ document.body.appendChild(preview.$el)
+ }
+
+ preview.update(nodes)
+ preview.$on('loaded', () => {
+ resolve(preview.$el)
+ preview.$off('loaded')
+ })
+ })
+}
diff --git a/apps/files/src/utils/fileUtils.js b/apps/files/src/utils/fileUtils.js
deleted file mode 100644
index 5ab88c6eb63..00000000000
--- a/apps/files/src/utils/fileUtils.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-const encodeFilePath = function(path) {
- const pathSections = (path.startsWith('/') ? path : `/${path}`).split('/')
- let relativePath = ''
- pathSections.forEach((section) => {
- if (section !== '') {
- relativePath += '/' + encodeURIComponent(section)
- }
- })
- return relativePath
-}
-
-/**
- * Extract dir and name from file path
- *
- * @param {string} path the full path
- * @return {string[]} [dirPath, fileName]
- */
-const extractFilePaths = function(path) {
- const pathSections = path.split('/')
- const fileName = pathSections[pathSections.length - 1]
- const dirPath = pathSections.slice(0, pathSections.length - 1).join('/')
- return [dirPath, fileName]
-}
-
-export { encodeFilePath, extractFilePaths }
diff --git a/apps/files/src/utils/fileUtils.ts b/apps/files/src/utils/fileUtils.ts
new file mode 100644
index 00000000000..f0b974be21d
--- /dev/null
+++ b/apps/files/src/utils/fileUtils.ts
@@ -0,0 +1,47 @@
+/**
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { FileType, type Node } from '@nextcloud/files'
+import { n } from '@nextcloud/l10n'
+
+/**
+ * Extract dir and name from file path
+ *
+ * @param path - The full path
+ * @return [dirPath, fileName]
+ */
+export function extractFilePaths(path: string): [string, string] {
+ const pathSections = path.split('/')
+ const fileName = pathSections[pathSections.length - 1]
+ const dirPath = pathSections.slice(0, pathSections.length - 1).join('/')
+ return [dirPath, fileName]
+}
+
+/**
+ * Generate a translated summary of an array of nodes
+ *
+ * @param nodes - The nodes to summarize
+ * @param hidden - The number of hidden nodes
+ */
+export function getSummaryFor(nodes: Node[], hidden = 0): string {
+ const fileCount = nodes.filter(node => node.type === FileType.File).length
+ const folderCount = nodes.filter(node => node.type === FileType.Folder).length
+
+ const summary: string[] = []
+ if (fileCount > 0 || folderCount === 0) {
+ const fileSummary = n('files', '%n file', '%n files', fileCount)
+ summary.push(fileSummary)
+ }
+ if (folderCount > 0) {
+ const folderSummary = n('files', '%n folder', '%n folders', folderCount)
+ summary.push(folderSummary)
+ }
+ if (hidden > 0) {
+ // TRANSLATORS: This is the number of hidden files or folders
+ const hiddenSummary = n('files', '%n hidden', '%n hidden', hidden)
+ summary.push(hiddenSummary)
+ }
+
+ return summary.join(' · ')
+}
diff --git a/apps/files/src/utils/filenameValidity.ts b/apps/files/src/utils/filenameValidity.ts
new file mode 100644
index 00000000000..2666d530052
--- /dev/null
+++ b/apps/files/src/utils/filenameValidity.ts
@@ -0,0 +1,41 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { InvalidFilenameError, InvalidFilenameErrorReason, validateFilename } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+
+/**
+ * Get the validity of a filename (empty if valid).
+ * This can be used for `setCustomValidity` on input elements
+ * @param name The filename
+ * @param escape Escape the matched string in the error (only set when used in HTML)
+ */
+export function getFilenameValidity(name: string, escape = false): string {
+ if (name.trim() === '') {
+ return t('files', 'Filename must not be empty.')
+ }
+
+ try {
+ validateFilename(name)
+ return ''
+ } catch (error) {
+ if (!(error instanceof InvalidFilenameError)) {
+ throw error
+ }
+
+ switch (error.reason) {
+ case InvalidFilenameErrorReason.Character:
+ return t('files', '"{char}" is not allowed inside a filename.', { char: error.segment }, undefined, { escape })
+ case InvalidFilenameErrorReason.ReservedName:
+ return t('files', '"{segment}" is a reserved name and not allowed for filenames.', { segment: error.segment }, undefined, { escape: false })
+ case InvalidFilenameErrorReason.Extension:
+ if (error.segment.match(/\.[a-z]/i)) {
+ return t('files', '"{extension}" is not an allowed filetype.', { extension: error.segment }, undefined, { escape: false })
+ }
+ return t('files', 'Filenames must not end with "{extension}".', { extension: error.segment }, undefined, { escape: false })
+ default:
+ return t('files', 'Invalid filename.')
+ }
+ }
+}
diff --git a/apps/files/src/utils/filesViews.spec.ts b/apps/files/src/utils/filesViews.spec.ts
new file mode 100644
index 00000000000..03b0bb9aeb0
--- /dev/null
+++ b/apps/files/src/utils/filesViews.spec.ts
@@ -0,0 +1,73 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { beforeEach, describe, expect, test } from 'vitest'
+import { defaultView, hasPersonalFilesView } from './filesViews.ts'
+
+describe('hasPersonalFilesView', () => {
+ beforeEach(() => removeInitialState())
+
+ test('enabled if user has unlimited quota', () => {
+ mockInitialState('files', 'storageStats', { quota: -1 })
+ expect(hasPersonalFilesView()).toBe(true)
+ })
+
+ test('enabled if user has limited quota', () => {
+ mockInitialState('files', 'storageStats', { quota: 1234 })
+ expect(hasPersonalFilesView()).toBe(true)
+ })
+
+ test('disabled if user has no quota', () => {
+ mockInitialState('files', 'storageStats', { quota: 0 })
+ expect(hasPersonalFilesView()).toBe(false)
+ })
+})
+
+describe('defaultView', () => {
+ beforeEach(removeInitialState)
+
+ test('Returns files view if set', () => {
+ mockInitialState('files', 'config', { default_view: 'files' })
+ expect(defaultView()).toBe('files')
+ })
+
+ test('Returns personal view if set and enabled', () => {
+ mockInitialState('files', 'config', { default_view: 'personal' })
+ mockInitialState('files', 'storageStats', { quota: -1 })
+ expect(defaultView()).toBe('personal')
+ })
+
+ test('Falls back to files if personal view is disabled', () => {
+ mockInitialState('files', 'config', { default_view: 'personal' })
+ mockInitialState('files', 'storageStats', { quota: 0 })
+ expect(defaultView()).toBe('files')
+ })
+})
+
+/**
+ * Remove the mocked initial state
+ */
+function removeInitialState(): void {
+ document.querySelectorAll('input[type="hidden"]').forEach((el) => {
+ el.remove()
+ })
+ // clear the cache
+ delete globalThis._nc_initial_state
+}
+
+/**
+ * Helper to mock an initial state value
+ * @param app - The app
+ * @param key - The key
+ * @param value - The value
+ */
+function mockInitialState(app: string, key: string, value: unknown): void {
+ const el = document.createElement('input')
+ el.value = btoa(JSON.stringify(value))
+ el.id = `initial-state-${app}-${key}`
+ el.type = 'hidden'
+
+ document.head.appendChild(el)
+}
diff --git a/apps/files/src/utils/filesViews.ts b/apps/files/src/utils/filesViews.ts
new file mode 100644
index 00000000000..9489c35cbde
--- /dev/null
+++ b/apps/files/src/utils/filesViews.ts
@@ -0,0 +1,30 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { UserConfig } from '../types.ts'
+
+import { loadState } from '@nextcloud/initial-state'
+
+/**
+ * Check whether the personal files view can be shown
+ */
+export function hasPersonalFilesView(): boolean {
+ const storageStats = loadState('files', 'storageStats', { quota: -1 })
+ // Don't show this view if the user has no storage quota
+ return storageStats.quota !== 0
+}
+
+/**
+ * Get the default files view
+ */
+export function defaultView() {
+ const { default_view: defaultView } = loadState<Partial<UserConfig>>('files', 'config', { default_view: 'files' })
+
+ // the default view - only use the personal one if it is enabled
+ if (defaultView !== 'personal' || hasPersonalFilesView()) {
+ return defaultView
+ }
+ return 'files'
+}
diff --git a/apps/files/src/utils/hashUtils.ts b/apps/files/src/utils/hashUtils.ts
new file mode 100644
index 00000000000..2e1fadff067
--- /dev/null
+++ b/apps/files/src/utils/hashUtils.ts
@@ -0,0 +1,17 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+/**
+ * Simple non-secure hashing function similar to Java's `hashCode`
+ * @param str The string to hash
+ * @return {number} a non secure hash of the string
+ */
+export const hashCode = function(str: string): number {
+ let hash = 0
+ for (let i = 0; i < str.length; i++) {
+ hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0
+ }
+ return (hash >>> 0)
+}
diff --git a/apps/files/src/utils/newNodeDialog.ts b/apps/files/src/utils/newNodeDialog.ts
new file mode 100644
index 00000000000..a81fa9f4e17
--- /dev/null
+++ b/apps/files/src/utils/newNodeDialog.ts
@@ -0,0 +1,40 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Node } from '@nextcloud/files'
+import { spawnDialog } from '@nextcloud/dialogs'
+import NewNodeDialog from '../components/NewNodeDialog.vue'
+
+interface ILabels {
+ /**
+ * Dialog heading, defaults to "New folder name"
+ */
+ name?: string
+ /**
+ * Label for input box, defaults to "New folder"
+ */
+ label?: string
+}
+
+/**
+ * Ask user for file or folder name
+ * @param defaultName Default name to use
+ * @param folderContent Nodes with in the current folder to check for unique name
+ * @param labels Labels to set on the dialog
+ * @return string if successful otherwise null if aborted
+ */
+export function newNodeName(defaultName: string, folderContent: Node[], labels: ILabels = {}) {
+ const contentNames = folderContent.map((node: Node) => node.basename)
+
+ return new Promise<string|null>((resolve) => {
+ spawnDialog(NewNodeDialog, {
+ ...labels,
+ defaultName,
+ otherNames: contentNames,
+ }, (folderName) => {
+ resolve(folderName as string|null)
+ })
+ })
+}
diff --git a/apps/files/src/utils/permissions.ts b/apps/files/src/utils/permissions.ts
new file mode 100644
index 00000000000..9b4c42bf49c
--- /dev/null
+++ b/apps/files/src/utils/permissions.ts
@@ -0,0 +1,37 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Node } from '@nextcloud/files'
+import type { ShareAttribute } from '../../../files_sharing/src/sharing.ts'
+
+import { Permission } from '@nextcloud/files'
+
+/**
+ * Check permissions on the node if it can be downloaded
+ * @param node The node to check
+ * @return True if downloadable, false otherwise
+ */
+export function isDownloadable(node: Node): boolean {
+ if ((node.permissions & Permission.READ) === 0) {
+ return false
+ }
+
+ // check hide-download property of shares
+ if (node.attributes['hide-download'] === true
+ || node.attributes['hide-download'] === 'true'
+ ) {
+ return false
+ }
+
+ // If the mount type is a share, ensure it got download permissions.
+ if (node.attributes['share-attributes']) {
+ const shareAttributes = JSON.parse(node.attributes['share-attributes'] || '[]') as Array<ShareAttribute>
+ const downloadAttribute = shareAttributes.find(({ scope, key }: ShareAttribute) => scope === 'permissions' && key === 'download')
+ if (downloadAttribute !== undefined) {
+ return downloadAttribute.value === true
+ }
+ }
+
+ return true
+}
diff --git a/apps/files/src/views/DialogConfirmFileExtension.cy.ts b/apps/files/src/views/DialogConfirmFileExtension.cy.ts
new file mode 100644
index 00000000000..460497dd91f
--- /dev/null
+++ b/apps/files/src/views/DialogConfirmFileExtension.cy.ts
@@ -0,0 +1,161 @@
+/*!
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { createTestingPinia } from '@pinia/testing'
+import DialogConfirmFileExtension from './DialogConfirmFileExtension.vue'
+import { useUserConfigStore } from '../store/userconfig'
+
+describe('DialogConfirmFileExtension', () => {
+ it('renders with both extensions', () => {
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ oldExtension: '.old',
+ newExtension: '.new',
+ },
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('heading')
+ .should('contain.text', 'Change file extension')
+ cy.get('@dialog')
+ .findByRole('checkbox', { name: /Do not show this dialog again/i })
+ .should('exist')
+ .and('not.be.checked')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Keep .old' })
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Use .new' })
+ .should('be.visible')
+ })
+
+ it('renders without old extension', () => {
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ newExtension: '.new',
+ },
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Keep without extension' })
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Use .new' })
+ .should('be.visible')
+ })
+
+ it('renders without new extension', () => {
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ oldExtension: '.old',
+ },
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Keep .old' })
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Remove extension' })
+ .should('be.visible')
+ })
+
+ it('emits correct value on keep old', () => {
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ oldExtension: '.old',
+ newExtension: '.new',
+ },
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ }).as('component')
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Keep .old' })
+ .click()
+ cy.get('@component')
+ .its('wrapper')
+ .should((wrapper) => expect(wrapper.emitted('close')).to.eql([[false]]))
+ })
+
+ it('emits correct value on use new', () => {
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ oldExtension: '.old',
+ newExtension: '.new',
+ },
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ }).as('component')
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('button', { name: 'Use .new' })
+ .click()
+ cy.get('@component')
+ .its('wrapper')
+ .should((wrapper) => expect(wrapper.emitted('close')).to.eql([[true]]))
+ })
+
+ it('updates user config when checking the checkbox', () => {
+ const pinia = createTestingPinia({
+ createSpy: cy.spy,
+ })
+
+ cy.mount(DialogConfirmFileExtension, {
+ propsData: {
+ oldExtension: '.old',
+ newExtension: '.new',
+ },
+ global: {
+ plugins: [pinia],
+ },
+ }).as('component')
+
+ cy.findByRole('dialog')
+ .as('dialog')
+ .should('be.visible')
+ cy.get('@dialog')
+ .findByRole('checkbox', { name: /Do not show this dialog again/i })
+ .check({ force: true })
+
+ cy.wrap(useUserConfigStore())
+ .its('update')
+ .should('have.been.calledWith', 'show_dialog_file_extension', false)
+ })
+})
diff --git a/apps/files/src/views/DialogConfirmFileExtension.vue b/apps/files/src/views/DialogConfirmFileExtension.vue
new file mode 100644
index 00000000000..cc1ee363f98
--- /dev/null
+++ b/apps/files/src/views/DialogConfirmFileExtension.vue
@@ -0,0 +1,92 @@
+<!--
+ - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<script setup lang="ts">
+import type { IDialogButton } from '@nextcloud/dialogs'
+import { t } from '@nextcloud/l10n'
+import { computed, ref } from 'vue'
+import { useUserConfigStore } from '../store/userconfig.ts'
+
+import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
+import NcDialog from '@nextcloud/vue/components/NcDialog'
+import svgIconCancel from '@mdi/svg/svg/cancel.svg?raw'
+import svgIconCheck from '@mdi/svg/svg/check.svg?raw'
+
+const props = defineProps<{
+ oldExtension?: string
+ newExtension?: string
+}>()
+
+const emit = defineEmits<{
+ (e: 'close', v: boolean): void
+}>()
+
+const userConfigStore = useUserConfigStore()
+const dontShowAgain = computed({
+ get: () => !userConfigStore.userConfig.show_dialog_file_extension,
+ set: (value: boolean) => userConfigStore.update('show_dialog_file_extension', !value),
+})
+
+const buttons = computed<IDialogButton[]>(() => [
+ {
+ label: props.oldExtension
+ ? t('files', 'Keep {old}', { old: props.oldExtension })
+ : t('files', 'Keep without extension'),
+ icon: svgIconCancel,
+ type: 'secondary',
+ callback: () => closeDialog(false),
+ },
+ {
+ label: props.newExtension
+ ? t('files', 'Use {new}', { new: props.newExtension })
+ : t('files', 'Remove extension'),
+ icon: svgIconCheck,
+ type: 'primary',
+ callback: () => closeDialog(true),
+ },
+])
+
+/** Open state of the dialog */
+const open = ref(true)
+
+/**
+ * Close the dialog and emit the response
+ * @param value User selected response
+ */
+function closeDialog(value: boolean) {
+ emit('close', value)
+ open.value = false
+}
+</script>
+
+<template>
+ <NcDialog :buttons="buttons"
+ :open="open"
+ :can-close="false"
+ :name="t('files', 'Change file extension')"
+ size="small">
+ <p v-if="newExtension && oldExtension">
+ {{ t('files', 'Changing the file extension from "{old}" to "{new}" may render the file unreadable.', { old: oldExtension, new: newExtension }) }}
+ </p>
+ <p v-else-if="oldExtension">
+ {{ t('files', 'Removing the file extension "{old}" may render the file unreadable.', { old: oldExtension }) }}
+ </p>
+ <p v-else-if="newExtension">
+ {{ t('files', 'Adding the file extension "{new}" may render the file unreadable.', { new: newExtension }) }}
+ </p>
+
+ <NcCheckboxRadioSwitch v-model="dontShowAgain"
+ class="dialog-confirm-file-extension__checkbox"
+ type="checkbox">
+ {{ t('files', 'Do not show this dialog again.') }}
+ </NcCheckboxRadioSwitch>
+ </NcDialog>
+</template>
+
+<style scoped>
+.dialog-confirm-file-extension__checkbox {
+ margin-top: 1rem;
+}
+</style>
diff --git a/apps/files/src/views/FileReferencePickerElement.vue b/apps/files/src/views/FileReferencePickerElement.vue
new file mode 100644
index 00000000000..b4d4bc54f14
--- /dev/null
+++ b/apps/files/src/views/FileReferencePickerElement.vue
@@ -0,0 +1,86 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <div :id="containerId">
+ <FilePicker v-bind="filepickerOptions" @close="onClose" />
+ </div>
+</template>
+
+<script lang="ts">
+import type { Node as NcNode } from '@nextcloud/files'
+import type { IFilePickerButton } from '@nextcloud/dialogs'
+
+import { FilePickerVue as FilePicker } from '@nextcloud/dialogs/filepicker.js'
+import { translate as t } from '@nextcloud/l10n'
+import { generateUrl } from '@nextcloud/router'
+import { defineComponent } from 'vue'
+
+export default defineComponent({
+ name: 'FileReferencePickerElement',
+ components: {
+ FilePicker,
+ },
+ props: {
+ providerId: {
+ type: String,
+ required: true,
+ },
+ accessible: {
+ type: Boolean,
+ default: false,
+ },
+ },
+ computed: {
+ containerId() {
+ return `filepicker-${Math.random().toString(36).slice(7)}`
+ },
+ filepickerOptions() {
+ return {
+ allowPickDirectory: true,
+ buttons: this.buttonFactory,
+ container: `#${this.containerId}`,
+ multiselect: false,
+ name: t('files', 'Select file or folder to link to'),
+ }
+ },
+ },
+ methods: {
+ t,
+
+ buttonFactory(selected: NcNode[]): IFilePickerButton[] {
+ const buttons = [] as IFilePickerButton[]
+ if (selected.length === 0) {
+ return []
+ }
+ const node = selected.at(0)
+ if (node.path === '/') {
+ return [] // Do not allow selecting the users root folder
+ }
+ buttons.push({
+ label: t('files', 'Choose {file}', { file: node.displayname }),
+ type: 'primary',
+ callback: this.onClose,
+ })
+ return buttons
+ },
+
+ onClose(nodes?: NcNode[]) {
+ if (nodes === undefined || nodes.length === 0) {
+ this.$emit('cancel')
+ } else {
+ this.onSubmit(nodes[0])
+ }
+ },
+
+ onSubmit(node: NcNode) {
+ const url = new URL(window.location.href)
+ url.pathname = generateUrl('/f/{fileId}', { fileId: node.fileid! })
+ url.search = ''
+ this.$emit('submit', url.href)
+ },
+ },
+})
+</script>
diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue
new file mode 100644
index 00000000000..f9e517e92ee
--- /dev/null
+++ b/apps/files/src/views/FilesList.vue
@@ -0,0 +1,909 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcAppContent :page-heading="pageHeading" data-cy-files-content>
+ <div class="files-list__header" :class="{ 'files-list__header--public': isPublic }">
+ <!-- Current folder breadcrumbs -->
+ <BreadCrumbs :path="directory" @reload="fetchContent">
+ <template #actions>
+ <!-- Sharing button -->
+ <NcButton v-if="canShare && fileListWidth >= 512"
+ :aria-label="shareButtonLabel"
+ :class="{ 'files-list__header-share-button--shared': shareButtonType }"
+ :title="shareButtonLabel"
+ class="files-list__header-share-button"
+ type="tertiary"
+ @click="openSharingSidebar">
+ <template #icon>
+ <LinkIcon v-if="shareButtonType === ShareType.Link" />
+ <AccountPlusIcon v-else :size="20" />
+ </template>
+ </NcButton>
+
+ <!-- Uploader -->
+ <UploadPicker v-if="canUpload && !isQuotaExceeded && currentFolder"
+ allow-folders
+ class="files-list__header-upload-button"
+ :content="getContent"
+ :destination="currentFolder"
+ :forbidden-characters="forbiddenCharacters"
+ multiple
+ @failed="onUploadFail"
+ @uploaded="onUpload" />
+ </template>
+ </BreadCrumbs>
+
+ <!-- Secondary loading indicator -->
+ <NcLoadingIcon v-if="isRefreshing" class="files-list__refresh-icon" />
+
+ <NcActions class="files-list__header-actions"
+ :inline="1"
+ type="tertiary"
+ force-name>
+ <NcActionButton v-for="action in enabledFileListActions"
+ :key="action.id"
+ :disabled="!!loadingAction"
+ :data-cy-files-list-action="action.id"
+ close-after-click
+ @click="execFileListAction(action)">
+ <template #icon>
+ <NcLoadingIcon v-if="loadingAction === action.id" :size="18" />
+ <NcIconSvgWrapper v-else-if="action.iconSvgInline !== undefined && currentView"
+ :svg="action.iconSvgInline(currentView)" />
+ </template>
+ {{ actionDisplayName(action) }}
+ </NcActionButton>
+ </NcActions>
+
+ <NcButton v-if="fileListWidth >= 512 && enableGridView"
+ :aria-label="gridViewButtonLabel"
+ :title="gridViewButtonLabel"
+ class="files-list__header-grid-button"
+ type="tertiary"
+ @click="toggleGridView">
+ <template #icon>
+ <ListViewIcon v-if="userConfig.grid_view" />
+ <ViewGridIcon v-else />
+ </template>
+ </NcButton>
+ </div>
+
+ <!-- Drag and drop notice -->
+ <DragAndDropNotice v-if="!loading && canUpload && currentFolder" :current-folder="currentFolder" />
+
+ <!--
+ Initial current view loading0. This should never happen,
+ views are supposed to be registered far earlier in the lifecycle.
+ In case the URL is bad or a view is missing, we show a loading icon.
+ -->
+ <NcLoadingIcon v-if="!currentView"
+ class="files-list__loading-icon"
+ :size="38"
+ :name="t('files', 'Loading current folder')" />
+
+ <!-- File list - always mounted -->
+ <FilesListVirtual v-else
+ ref="filesListVirtual"
+ :current-folder="currentFolder"
+ :current-view="currentView"
+ :nodes="dirContentsSorted"
+ :summary="summary">
+ <template #empty>
+ <!-- Initial loading -->
+ <NcLoadingIcon v-if="loading && !isRefreshing"
+ class="files-list__loading-icon"
+ :size="38"
+ :name="t('files', 'Loading current folder')" />
+
+ <!-- Empty due to error -->
+ <NcEmptyContent v-else-if="error" :name="error" data-cy-files-content-error>
+ <template #action>
+ <NcButton type="secondary" @click="fetchContent">
+ <template #icon>
+ <IconReload :size="20" />
+ </template>
+ {{ t('files', 'Retry') }}
+ </NcButton>
+ </template>
+ <template #icon>
+ <IconAlertCircleOutline />
+ </template>
+ </NcEmptyContent>
+
+ <!-- Custom empty view -->
+ <div v-else-if="currentView?.emptyView" class="files-list__empty-view-wrapper">
+ <div ref="customEmptyView" />
+ </div>
+
+ <!-- Default empty directory view -->
+ <NcEmptyContent v-else
+ :name="currentView?.emptyTitle || t('files', 'No files in here')"
+ :description="currentView?.emptyCaption || t('files', 'Upload some content or sync with your devices!')"
+ data-cy-files-content-empty>
+ <template v-if="directory !== '/'" #action>
+ <!-- Uploader -->
+ <UploadPicker v-if="canUpload && !isQuotaExceeded"
+ allow-folders
+ class="files-list__header-upload-button"
+ :content="getContent"
+ :destination="currentFolder"
+ :forbidden-characters="forbiddenCharacters"
+ multiple
+ @failed="onUploadFail"
+ @uploaded="onUpload" />
+ <NcButton v-else :to="toPreviousDir" type="primary">
+ {{ t('files', 'Go back') }}
+ </NcButton>
+ </template>
+ <template #icon>
+ <NcIconSvgWrapper :svg="currentView?.icon" />
+ </template>
+ </NcEmptyContent>
+ </template>
+ </FilesListVirtual>
+ </NcAppContent>
+</template>
+
+<script lang="ts">
+import type { ContentsWithRoot, FileListAction, INode } from '@nextcloud/files'
+import type { Upload } from '@nextcloud/upload'
+import type { CancelablePromise } from 'cancelable-promise'
+import type { ComponentPublicInstance } from 'vue'
+import type { Route } from 'vue-router'
+import type { UserConfig } from '../types.ts'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { getCapabilities } from '@nextcloud/capabilities'
+import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
+import { Folder, Node, Permission, sortNodes, getFileListActions } from '@nextcloud/files'
+import { getRemoteURL, getRootPath } from '@nextcloud/files/dav'
+import { translate as t } from '@nextcloud/l10n'
+import { join, dirname, normalize, relative } from 'path'
+import { showError, showSuccess, showWarning } from '@nextcloud/dialogs'
+import { ShareType } from '@nextcloud/sharing'
+import { UploadPicker, UploadStatus } from '@nextcloud/upload'
+import { loadState } from '@nextcloud/initial-state'
+import { useThrottleFn } from '@vueuse/core'
+import { defineComponent } from 'vue'
+
+import NcAppContent from '@nextcloud/vue/components/NcAppContent'
+import NcActions from '@nextcloud/vue/components/NcActions'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
+
+import AccountPlusIcon from 'vue-material-design-icons/AccountPlusOutline.vue'
+import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'
+import IconReload from 'vue-material-design-icons/Reload.vue'
+import LinkIcon from 'vue-material-design-icons/Link.vue'
+import ListViewIcon from 'vue-material-design-icons/FormatListBulletedSquare.vue'
+import ViewGridIcon from 'vue-material-design-icons/ViewGridOutline.vue'
+
+import { action as sidebarAction } from '../actions/sidebarAction.ts'
+import { useFileListWidth } from '../composables/useFileListWidth.ts'
+import { useNavigation } from '../composables/useNavigation.ts'
+import { useRouteParameters } from '../composables/useRouteParameters.ts'
+import { useActiveStore } from '../store/active.ts'
+import { useFilesStore } from '../store/files.ts'
+import { useFiltersStore } from '../store/filters.ts'
+import { usePathsStore } from '../store/paths.ts'
+import { useSelectionStore } from '../store/selection.ts'
+import { useUploaderStore } from '../store/uploader.ts'
+import { useUserConfigStore } from '../store/userconfig.ts'
+import { useViewConfigStore } from '../store/viewConfig.ts'
+import { humanizeWebDAVError } from '../utils/davUtils.ts'
+import { getSummaryFor } from '../utils/fileUtils.ts'
+import { defaultView } from '../utils/filesViews.ts'
+import BreadCrumbs from '../components/BreadCrumbs.vue'
+import DragAndDropNotice from '../components/DragAndDropNotice.vue'
+import FilesListVirtual from '../components/FilesListVirtual.vue'
+import filesSortingMixin from '../mixins/filesSorting.ts'
+import logger from '../logger.ts'
+
+const isSharingEnabled = (getCapabilities() as { files_sharing?: boolean })?.files_sharing !== undefined
+
+export default defineComponent({
+ name: 'FilesList',
+
+ components: {
+ BreadCrumbs,
+ DragAndDropNotice,
+ FilesListVirtual,
+ LinkIcon,
+ ListViewIcon,
+ NcAppContent,
+ NcActions,
+ NcActionButton,
+ NcButton,
+ NcEmptyContent,
+ NcIconSvgWrapper,
+ NcLoadingIcon,
+ AccountPlusIcon,
+ UploadPicker,
+ ViewGridIcon,
+ IconAlertCircleOutline,
+ IconReload,
+ },
+
+ mixins: [
+ filesSortingMixin,
+ ],
+
+ props: {
+ isPublic: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ const { currentView } = useNavigation()
+ const { directory, fileId } = useRouteParameters()
+ const fileListWidth = useFileListWidth()
+
+ const activeStore = useActiveStore()
+ const filesStore = useFilesStore()
+ const filtersStore = useFiltersStore()
+ const pathsStore = usePathsStore()
+ const selectionStore = useSelectionStore()
+ const uploaderStore = useUploaderStore()
+ const userConfigStore = useUserConfigStore()
+ const viewConfigStore = useViewConfigStore()
+
+ const enableGridView = (loadState('core', 'config', [])['enable_non-accessible_features'] ?? true)
+ const forbiddenCharacters = loadState<string[]>('files', 'forbiddenCharacters', [])
+
+ return {
+ currentView,
+ directory,
+ fileId,
+ fileListWidth,
+ t,
+
+ activeStore,
+ filesStore,
+ filtersStore,
+ pathsStore,
+ selectionStore,
+ uploaderStore,
+ userConfigStore,
+ viewConfigStore,
+
+ // non reactive data
+ enableGridView,
+ forbiddenCharacters,
+ ShareType,
+ }
+ },
+
+ data() {
+ return {
+ loading: true,
+ loadingAction: null as string | null,
+ error: null as string | null,
+ promise: null as CancelablePromise<ContentsWithRoot> | Promise<ContentsWithRoot> | null,
+
+ dirContentsFiltered: [] as INode[],
+ }
+ },
+
+ computed: {
+ /**
+ * Get a callback function for the uploader to fetch directory contents for conflict resolution
+ */
+ getContent() {
+ const view = this.currentView!
+ return async (path?: string) => {
+ // as the path is allowed to be undefined we need to normalize the path ('//' to '/')
+ const normalizedPath = normalize(`${this.currentFolder?.path ?? ''}/${path ?? ''}`)
+ // Try cache first
+ const nodes = this.filesStore.getNodesByPath(view.id, normalizedPath)
+ if (nodes.length > 0) {
+ return nodes
+ }
+ // If not found in the files store (cache)
+ // use the current view to fetch the content for the requested path
+ return (await view.getContents(normalizedPath)).contents
+ }
+ },
+
+ userConfig(): UserConfig {
+ return this.userConfigStore.userConfig
+ },
+
+ pageHeading(): string {
+ const title = this.currentView?.name ?? t('files', 'Files')
+
+ if (this.currentFolder === undefined || this.directory === '/') {
+ return title
+ }
+ return `${this.currentFolder.displayname} - ${title}`
+ },
+
+ /**
+ * The current folder.
+ */
+ currentFolder(): Folder {
+ // Temporary fake folder to use until we have the first valid folder
+ // fetched and cached. This allow us to mount the FilesListVirtual
+ // at all time and avoid unmount/mount and undesired rendering issues.
+ const dummyFolder = new Folder({
+ id: 0,
+ source: getRemoteURL() + getRootPath(),
+ root: getRootPath(),
+ owner: getCurrentUser()?.uid || null,
+ permissions: Permission.NONE,
+ })
+
+ if (!this.currentView?.id) {
+ return dummyFolder
+ }
+
+ return this.filesStore.getDirectoryByPath(this.currentView.id, this.directory) || dummyFolder
+ },
+
+ dirContents(): Node[] {
+ return (this.currentFolder?._children || [])
+ .map(this.filesStore.getNode)
+ .filter((node: Node) => !!node)
+ },
+
+ /**
+ * The current directory contents.
+ */
+ dirContentsSorted(): INode[] {
+ if (!this.currentView) {
+ return []
+ }
+
+ const customColumn = (this.currentView?.columns || [])
+ .find(column => column.id === this.sortingMode)
+
+ // Custom column must provide their own sorting methods
+ if (customColumn?.sort && typeof customColumn.sort === 'function') {
+ const results = [...this.dirContentsFiltered].sort(customColumn.sort)
+ return this.isAscSorting ? results : results.reverse()
+ }
+
+ const nodes = sortNodes(this.dirContentsFiltered, {
+ sortFavoritesFirst: this.userConfig.sort_favorites_first,
+ sortFoldersFirst: this.userConfig.sort_folders_first,
+ sortingMode: this.sortingMode,
+ sortingOrder: this.isAscSorting ? 'asc' : 'desc',
+ })
+
+ // TODO upstream this
+ if (this.currentView.id === 'files') {
+ nodes.sort((a, b) => {
+ const aa = relative(a.source, this.currentFolder!.source) === '..'
+ const bb = relative(b.source, this.currentFolder!.source) === '..'
+ if (aa && bb) {
+ return 0
+ } else if (aa) {
+ return -1
+ }
+ return 1
+ })
+ }
+
+ return nodes
+ },
+
+ /**
+ * The current directory is empty.
+ */
+ isEmptyDir(): boolean {
+ return this.dirContents.length === 0
+ },
+
+ /**
+ * We are refreshing the current directory.
+ * But we already have a cached version of it
+ * that is not empty.
+ */
+ isRefreshing(): boolean {
+ return this.currentFolder !== undefined
+ && !this.isEmptyDir
+ && this.loading
+ },
+
+ /**
+ * Route to the previous directory.
+ */
+ toPreviousDir(): Route {
+ const dir = this.directory.split('/').slice(0, -1).join('/') || '/'
+ return { ...this.$route, query: { dir } }
+ },
+
+ shareTypesAttributes(): number[] | undefined {
+ if (!this.currentFolder?.attributes?.['share-types']) {
+ return undefined
+ }
+ return Object.values(this.currentFolder?.attributes?.['share-types'] || {}).flat() as number[]
+ },
+ shareButtonLabel() {
+ if (!this.shareTypesAttributes) {
+ return t('files', 'Share')
+ }
+
+ if (this.shareButtonType === ShareType.Link) {
+ return t('files', 'Shared by link')
+ }
+ return t('files', 'Shared')
+ },
+ shareButtonType(): ShareType | null {
+ if (!this.shareTypesAttributes) {
+ return null
+ }
+
+ // If all types are links, show the link icon
+ if (this.shareTypesAttributes.some(type => type === ShareType.Link)) {
+ return ShareType.Link
+ }
+
+ return ShareType.User
+ },
+
+ gridViewButtonLabel() {
+ return this.userConfig.grid_view
+ ? t('files', 'Switch to list view')
+ : t('files', 'Switch to grid view')
+ },
+
+ /**
+ * Check if the current folder has create permissions
+ */
+ canUpload() {
+ return this.currentFolder && (this.currentFolder.permissions & Permission.CREATE) !== 0
+ },
+ isQuotaExceeded() {
+ return this.currentFolder?.attributes?.['quota-available-bytes'] === 0
+ },
+
+ /**
+ * Check if current folder has share permissions
+ */
+ canShare() {
+ return isSharingEnabled && !this.isPublic
+ && this.currentFolder && (this.currentFolder.permissions & Permission.SHARE) !== 0
+ },
+
+ showCustomEmptyView() {
+ return !this.loading && this.isEmptyDir && this.currentView?.emptyView !== undefined
+ },
+
+ enabledFileListActions() {
+ if (!this.currentView || !this.currentFolder) {
+ return []
+ }
+
+ const actions = getFileListActions()
+ const enabledActions = actions
+ .filter(action => {
+ if (action.enabled === undefined) {
+ return true
+ }
+ return action.enabled(
+ this.currentView!,
+ this.dirContents,
+ this.currentFolder as Folder,
+ )
+ })
+ .toSorted((a, b) => a.order - b.order)
+ return enabledActions
+ },
+
+ /**
+ * Using the filtered content if filters are active
+ */
+ summary() {
+ const hidden = this.dirContents.length - this.dirContentsFiltered.length
+ return getSummaryFor(this.dirContentsFiltered, hidden)
+ },
+
+ debouncedFetchContent() {
+ return useThrottleFn(this.fetchContent, 800, true)
+ },
+ },
+
+ watch: {
+ /**
+ * Handle rendering the custom empty view
+ * @param show The current state if the custom empty view should be rendered
+ */
+ showCustomEmptyView(show: boolean) {
+ if (show) {
+ this.$nextTick(() => {
+ const el = this.$refs.customEmptyView as HTMLDivElement
+ // We can cast here because "showCustomEmptyView" assets that current view is set
+ this.currentView!.emptyView!(el)
+ })
+ }
+ },
+
+ currentFolder() {
+ this.activeStore.activeFolder = this.currentFolder
+ },
+
+ currentView(newView, oldView) {
+ if (newView?.id === oldView?.id) {
+ return
+ }
+
+ logger.debug('View changed', { newView, oldView })
+ this.selectionStore.reset()
+ this.fetchContent()
+ },
+
+ directory(newDir, oldDir) {
+ logger.debug('Directory changed', { newDir, oldDir })
+ // TODO: preserve selection on browsing?
+ this.selectionStore.reset()
+ if (window.OCA.Files.Sidebar?.close) {
+ window.OCA.Files.Sidebar.close()
+ }
+ this.fetchContent()
+
+ // Scroll to top, force virtual scroller to re-render
+ const filesListVirtual = this.$refs?.filesListVirtual as ComponentPublicInstance<typeof FilesListVirtual> | undefined
+ if (filesListVirtual?.$el) {
+ filesListVirtual.$el.scrollTop = 0
+ }
+ },
+
+ dirContents(contents) {
+ logger.debug('Directory contents changed', { view: this.currentView, folder: this.currentFolder, contents })
+ emit('files:list:updated', { view: this.currentView, folder: this.currentFolder, contents })
+ // Also refresh the filtered content
+ this.filterDirContent()
+ },
+ },
+
+ async mounted() {
+ subscribe('files:node:deleted', this.onNodeDeleted)
+ subscribe('files:node:updated', this.onUpdatedNode)
+
+ // reload on settings change
+ subscribe('files:config:updated', this.fetchContent)
+
+ // filter content if filter were changed
+ subscribe('files:filters:changed', this.filterDirContent)
+
+ subscribe('files:search:updated', this.onUpdateSearch)
+
+ // Finally, fetch the current directory contents
+ await this.fetchContent()
+ if (this.fileId) {
+ // If we have a fileId, let's check if the file exists
+ const node = this.dirContents.find(node => node.fileid?.toString() === this.fileId?.toString())
+ // If the file isn't in the current directory nor if
+ // the current directory is the file, we show an error
+ if (!node && this.currentFolder?.fileid?.toString() !== this.fileId.toString()) {
+ showError(t('files', 'The file could not be found'))
+ }
+ }
+ },
+
+ unmounted() {
+ unsubscribe('files:node:deleted', this.onNodeDeleted)
+ unsubscribe('files:node:updated', this.onUpdatedNode)
+ unsubscribe('files:config:updated', this.fetchContent)
+ unsubscribe('files:filters:changed', this.filterDirContent)
+ unsubscribe('files:search:updated', this.onUpdateSearch)
+ },
+
+ methods: {
+ onUpdateSearch({ query, scope }) {
+ if (query && scope !== 'filter') {
+ this.debouncedFetchContent()
+ }
+ },
+
+ async fetchContent() {
+ this.loading = true
+ this.error = null
+ const dir = this.directory
+ const currentView = this.currentView
+
+ if (!currentView) {
+ logger.debug('The current view does not exists or is not ready.', { currentView })
+
+ // If we still haven't a valid view, let's wait for the page to load
+ // then try again. Else redirect to the default view
+ window.addEventListener('DOMContentLoaded', () => {
+ if (!this.currentView) {
+ logger.warn('No current view after DOMContentLoaded, redirecting to the default view')
+ window.OCP.Files.Router.goToRoute(null, { view: defaultView() })
+ }
+ }, { once: true })
+ return
+ }
+
+ logger.debug('Fetching contents for directory', { dir, currentView })
+
+ // If we have a cancellable promise ongoing, cancel it
+ if (this.promise && 'cancel' in this.promise) {
+ this.promise.cancel()
+ logger.debug('Cancelled previous ongoing fetch')
+ }
+
+ // Fetch the current dir contents
+ this.promise = currentView.getContents(dir) as Promise<ContentsWithRoot>
+ try {
+ const { folder, contents } = await this.promise
+ logger.debug('Fetched contents', { dir, folder, contents })
+
+ // Update store
+ this.filesStore.updateNodes(contents)
+
+ // Define current directory children
+ // TODO: make it more official
+ this.$set(folder, '_children', contents.map(node => node.source))
+
+ // If we're in the root dir, define the root
+ if (dir === '/') {
+ this.filesStore.setRoot({ service: currentView.id, root: folder })
+ } else {
+ // Otherwise, add the folder to the store
+ if (folder.fileid) {
+ this.filesStore.updateNodes([folder])
+ this.pathsStore.addPath({ service: currentView.id, source: folder.source, path: dir })
+ } else {
+ // If we're here, the view API messed up
+ logger.fatal('Invalid root folder returned', { dir, folder, currentView })
+ }
+ }
+
+ // Update paths store
+ const folders = contents.filter(node => node.type === 'folder')
+ folders.forEach((node) => {
+ this.pathsStore.addPath({ service: currentView.id, source: node.source, path: join(dir, node.basename) })
+ })
+ } catch (error) {
+ logger.error('Error while fetching content', { error })
+ this.error = humanizeWebDAVError(error)
+ } finally {
+ this.loading = false
+ }
+
+ },
+
+ /**
+ * Handle the node deleted event to reset open file
+ * @param node The deleted node
+ */
+ onNodeDeleted(node: Node) {
+ if (node.fileid && node.fileid === this.fileId) {
+ if (node.fileid === this.currentFolder?.fileid) {
+ // Handle the edge case that the current directory is deleted
+ // in this case we need to keep the current view but move to the parent directory
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { view: this.currentView!.id },
+ { dir: this.currentFolder?.dirname ?? '/' },
+ )
+ } else {
+ // If the currently active file is deleted we need to remove the fileid and possible the `openfile` query
+ window.OCP.Files.Router.goToRoute(
+ null,
+ { ...this.$route.params, fileid: undefined },
+ { ...this.$route.query, openfile: undefined },
+ )
+ }
+ }
+ },
+
+ /**
+ * The upload manager have finished handling the queue
+ * @param {Upload} upload the uploaded data
+ */
+ onUpload(upload: Upload) {
+ // Let's only refresh the current Folder
+ // Navigating to a different folder will refresh it anyway
+ const needsRefresh = dirname(upload.source) === this.currentFolder!.source
+
+ // TODO: fetch uploaded files data only
+ // Use parseInt(upload.response?.headers?.['oc-fileid']) to get the fileid
+ if (needsRefresh) {
+ // fetchContent will cancel the previous ongoing promise
+ this.fetchContent()
+ }
+ },
+
+ async onUploadFail(upload: Upload) {
+ const status = upload.response?.status || 0
+
+ if (upload.status === UploadStatus.CANCELLED) {
+ showWarning(t('files', 'Upload was cancelled by user'))
+ return
+ }
+
+ // Check known status codes
+ if (status === 507) {
+ showError(t('files', 'Not enough free space'))
+ return
+ } else if (status === 404 || status === 409) {
+ showError(t('files', 'Target folder does not exist any more'))
+ return
+ } else if (status === 403) {
+ showError(t('files', 'Operation is blocked by access control'))
+ return
+ }
+
+ // Else we try to parse the response error message
+ if (typeof upload.response?.data === 'string') {
+ try {
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(upload.response.data, 'text/xml')
+ const message = doc.getElementsByTagName('s:message')[0]?.textContent ?? ''
+ if (message.trim() !== '') {
+ // The server message is also translated
+ showError(t('files', 'Error during upload: {message}', { message }))
+ return
+ }
+ } catch (error) {
+ logger.error('Could not parse message', { error })
+ }
+ }
+
+ // Finally, check the status code if we have one
+ if (status !== 0) {
+ showError(t('files', 'Error during upload, status code {status}', { status }))
+ return
+ }
+
+ showError(t('files', 'Unknown error during upload'))
+ },
+
+ /**
+ * Refreshes the current folder on update.
+ *
+ * @param node is the file/folder being updated.
+ */
+ onUpdatedNode(node?: Node) {
+ if (node?.fileid === this.currentFolder?.fileid) {
+ this.fetchContent()
+ }
+ },
+
+ openSharingSidebar() {
+ if (!this.currentFolder) {
+ logger.debug('No current folder found for opening sharing sidebar')
+ return
+ }
+
+ if (window?.OCA?.Files?.Sidebar?.setActiveTab) {
+ window.OCA.Files.Sidebar.setActiveTab('sharing')
+ }
+ sidebarAction.exec(this.currentFolder, this.currentView!, this.currentFolder.path)
+ },
+
+ toggleGridView() {
+ this.userConfigStore.update('grid_view', !this.userConfig.grid_view)
+ },
+
+ filterDirContent() {
+ let nodes: INode[] = this.dirContents
+ for (const filter of this.filtersStore.sortedFilters) {
+ nodes = filter.filter(nodes)
+ }
+ this.dirContentsFiltered = nodes
+ },
+
+ actionDisplayName(action: FileListAction): string {
+ let displayName = action.id
+ try {
+ displayName = action.displayName(this.currentView!)
+ } catch (error) {
+ logger.error('Error while getting action display name', { action, error })
+ }
+ return displayName
+ },
+
+ async execFileListAction(action: FileListAction) {
+ this.loadingAction = action.id
+
+ const displayName = this.actionDisplayName(action)
+ try {
+ const success = await action.exec(this.source, this.dirContents, this.currentDir)
+ // If the action returns null, we stay silent
+ if (success === null || success === undefined) {
+ return
+ }
+
+ if (success) {
+ showSuccess(t('files', '{displayName}: done', { displayName }))
+ return
+ }
+ showError(t('files', '{displayName}: failed', { displayName }))
+ } catch (error) {
+ logger.error('Error while executing action', { action, error })
+ showError(t('files', '{displayName}: failed', { displayName }))
+ } finally {
+ this.loadingAction = null
+ }
+ },
+ },
+})
+</script>
+
+<style scoped lang="scss">
+:global(.toast-loading-icon) {
+ // Reduce start margin (it was made for text but this is an icon)
+ margin-inline-start: -4px;
+ // 16px icon + 5px on both sides
+ min-width: 26px;
+}
+
+.app-content {
+ // Virtual list needs to be full height and is scrollable
+ display: flex;
+ overflow: hidden;
+ flex-direction: column;
+ max-height: 100%;
+ position: relative !important;
+}
+
+.files-list {
+ &__header {
+ display: flex;
+ align-items: center;
+ // Do not grow or shrink (vertically)
+ flex: 0 0;
+ max-width: 100%;
+ // Align with the navigation toggle icon
+ margin-block: var(--app-navigation-padding, 4px);
+ margin-inline: calc(var(--default-clickable-area, 44px) + 2 * var(--app-navigation-padding, 4px)) var(--app-navigation-padding, 4px);
+
+ &--public {
+ // There is no navigation toggle on public shares
+ margin-inline: 0 var(--app-navigation-padding, 4px);
+ }
+
+ >* {
+ // Do not grow or shrink (horizontally)
+ // Only the breadcrumbs shrinks
+ flex: 0 0;
+ }
+
+ &-share-button {
+ color: var(--color-text-maxcontrast) !important;
+
+ &--shared {
+ color: var(--color-main-text) !important;
+ }
+ }
+
+ &-actions {
+ min-width: fit-content !important;
+ margin-inline: calc(var(--default-grid-baseline) * 2);
+ }
+ }
+
+ &__before {
+ display: flex;
+ flex-direction: column;
+ gap: calc(var(--default-grid-baseline) * 2);
+ margin-inline: calc(var(--default-clickable-area) + 2 * var(--app-navigation-padding));
+ }
+
+ &__empty-view-wrapper {
+ display: flex;
+ height: 100%;
+ }
+
+ &__refresh-icon {
+ flex: 0 0 var(--default-clickable-area);
+ width: var(--default-clickable-area);
+ height: var(--default-clickable-area);
+ }
+
+ &__loading-icon {
+ margin: auto;
+ }
+}
+</style>
diff --git a/apps/files/src/views/Navigation.cy.ts b/apps/files/src/views/Navigation.cy.ts
new file mode 100644
index 00000000000..7357943ee28
--- /dev/null
+++ b/apps/files/src/views/Navigation.cy.ts
@@ -0,0 +1,257 @@
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Navigation } from '@nextcloud/files'
+import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
+import { createTestingPinia } from '@pinia/testing'
+
+import NavigationView from './Navigation.vue'
+import { useViewConfigStore } from '../store/viewConfig'
+import { Folder, View, getNavigation } from '@nextcloud/files'
+
+import router from '../router/router.ts'
+import RouterService from '../services/RouterService'
+
+const resetNavigation = () => {
+ const nav = getNavigation()
+ ;[...nav.views].forEach(({ id }) => nav.remove(id))
+ nav.setActive(null)
+}
+
+const createView = (id: string, name: string, parent?: string) => new View({
+ id,
+ name,
+ getContents: async () => ({ folder: {} as Folder, contents: [] }),
+ icon: FolderSvg,
+ order: 1,
+ parent,
+})
+
+function mockWindow() {
+ window.OCP ??= {}
+ window.OCP.Files ??= {}
+ window.OCP.Files.Router = new RouterService(router)
+}
+
+describe('Navigation renders', () => {
+ before(async () => {
+ delete window._nc_navigation
+ mockWindow()
+ getNavigation().register(createView('files', 'Files'))
+ await router.replace({ name: 'filelist', params: { view: 'files' } })
+
+ cy.mockInitialState('files', 'storageStats', {
+ used: 1000 * 1000 * 1000,
+ quota: -1,
+ })
+ })
+
+ after(() => cy.unmockInitialState())
+
+ it('renders', () => {
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation]').should('be.visible')
+ cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible')
+ cy.get('[data-cy-files-navigation-settings-button]').should('be.visible')
+ })
+})
+
+describe('Navigation API', () => {
+ let Navigation: Navigation
+
+ before(async () => {
+ delete window._nc_navigation
+ Navigation = getNavigation()
+ mockWindow()
+
+ await router.replace({ name: 'filelist', params: { view: 'files' } })
+ })
+
+ beforeEach(() => resetNavigation())
+
+ it('Check API entries rendering', () => {
+ Navigation.register(createView('files', 'Files'))
+ console.warn(Navigation.views)
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [
+ createTestingPinia({
+ createSpy: cy.spy,
+ }),
+ ],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item]').should('have.length', 1)
+ cy.get('[data-cy-files-navigation-item="files"]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item="files"]').should('contain.text', 'Files')
+ })
+
+ it('Adds a new entry and render', () => {
+ Navigation.register(createView('files', 'Files'))
+ Navigation.register(createView('sharing', 'Sharing'))
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item]').should('have.length', 2)
+ cy.get('[data-cy-files-navigation-item="sharing"]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item="sharing"]').should('contain.text', 'Sharing')
+ })
+
+ it('Adds a new children, render and open menu', () => {
+ Navigation.register(createView('files', 'Files'))
+ Navigation.register(createView('sharing', 'Sharing'))
+ Navigation.register(createView('sharingin', 'Shared with me', 'sharing'))
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.wrap(useViewConfigStore()).as('viewConfigStore')
+
+ cy.get('[data-cy-files-navigation]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item]').should('have.length', 3)
+
+ // Toggle the sharing entry children
+ cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').should('exist')
+ cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').click({ force: true })
+
+ // Expect store update to be called
+ cy.get('@viewConfigStore').its('update').should('have.been.calledWith', 'sharing', 'expanded', true)
+
+ // Validate children
+ cy.get('[data-cy-files-navigation-item="sharingin"]').should('be.visible')
+ cy.get('[data-cy-files-navigation-item="sharingin"]').should('contain.text', 'Shared with me')
+
+ // Toggle the sharing entry children 🇦again
+ cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').click({ force: true })
+ cy.get('[data-cy-files-navigation-item="sharingin"]').should('not.be.visible')
+
+ // Expect store update to be called
+ cy.get('@viewConfigStore').its('update').should('have.been.calledWith', 'sharing', 'expanded', false)
+ })
+
+ it('Throws when adding a duplicate entry', () => {
+ Navigation.register(createView('files', 'Files'))
+ expect(() => Navigation.register(createView('files', 'Files')))
+ .to.throw('View id files is already registered')
+ })
+})
+
+describe('Quota rendering', () => {
+ before(async () => {
+ delete window._nc_navigation
+ mockWindow()
+ getNavigation().register(createView('files', 'Files'))
+ await router.replace({ name: 'filelist', params: { view: 'files' } })
+ })
+
+ afterEach(() => cy.unmockInitialState())
+
+ it('Unknown quota', () => {
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation-settings-quota]').should('not.exist')
+ })
+
+ it('Unlimited quota', () => {
+ cy.mockInitialState('files', 'storageStats', {
+ used: 1024 * 1024 * 1024,
+ quota: -1,
+ total: 50 * 1024 * 1024 * 1024,
+ })
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible')
+ cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '1 GB used')
+ cy.get('[data-cy-files-navigation-settings-quota] progress').should('not.exist')
+ })
+
+ it('Non-reached quota', () => {
+ cy.mockInitialState('files', 'storageStats', {
+ used: 1024 * 1024 * 1024,
+ quota: 5 * 1024 * 1024 * 1024,
+ total: 5 * 1024 * 1024 * 1024,
+ relative: 20, // percent
+ })
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible')
+ cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '1 GB of 5 GB used')
+ cy.get('[data-cy-files-navigation-settings-quota] progress')
+ .should('exist')
+ .and('have.attr', 'value', '20')
+ })
+
+ it('Reached quota', () => {
+ cy.mockInitialState('files', 'storageStats', {
+ used: 5 * 1024 * 1024 * 1024,
+ quota: 1024 * 1024 * 1024,
+ total: 1024 * 1024 * 1024,
+ relative: 500, // percent
+ })
+
+ cy.mount(NavigationView, {
+ router,
+ global: {
+ plugins: [createTestingPinia({
+ createSpy: cy.spy,
+ })],
+ },
+ })
+
+ cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible')
+ cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '5 GB of 1 GB used')
+ cy.get('[data-cy-files-navigation-settings-quota] progress')
+ .should('exist')
+ .and('have.attr', 'value', '100') // progress max is 100
+ })
+})
diff --git a/apps/files/src/views/Navigation.vue b/apps/files/src/views/Navigation.vue
new file mode 100644
index 00000000000..0f3c3647c6e
--- /dev/null
+++ b/apps/files/src/views/Navigation.vue
@@ -0,0 +1,228 @@
+<!--
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+<template>
+ <NcAppNavigation data-cy-files-navigation
+ class="files-navigation"
+ :aria-label="t('files', 'Files')">
+ <template #search>
+ <FilesNavigationSearch />
+ </template>
+ <template #default>
+ <NcAppNavigationList class="files-navigation__list"
+ :aria-label="t('files', 'Views')">
+ <FilesNavigationItem :views="viewMap" />
+ </NcAppNavigationList>
+
+ <!-- Settings modal-->
+ <SettingsModal :open.sync="settingsOpened"
+ data-cy-files-navigation-settings
+ @close="onSettingsClose" />
+ </template>
+
+ <!-- Non-scrollable navigation bottom elements -->
+ <template #footer>
+ <ul class="app-navigation-entry__settings">
+ <!-- User storage usage statistics -->
+ <NavigationQuota />
+
+ <!-- Files settings modal toggle-->
+ <NcAppNavigationItem :name="t('files', 'Files settings')"
+ data-cy-files-navigation-settings-button
+ @click.prevent.stop="openSettings">
+ <IconCog slot="icon" :size="20" />
+ </NcAppNavigationItem>
+ </ul>
+ </template>
+ </NcAppNavigation>
+</template>
+
+<script lang="ts">
+import type { View } from '@nextcloud/files'
+import type { ViewConfig } from '../types.ts'
+
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { getNavigation } from '@nextcloud/files'
+import { t, getCanonicalLocale, getLanguage } from '@nextcloud/l10n'
+import { defineComponent } from 'vue'
+
+import IconCog from 'vue-material-design-icons/CogOutline.vue'
+import NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation'
+import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
+import NcAppNavigationList from '@nextcloud/vue/components/NcAppNavigationList'
+import NavigationQuota from '../components/NavigationQuota.vue'
+import SettingsModal from './Settings.vue'
+import FilesNavigationItem from '../components/FilesNavigationItem.vue'
+import FilesNavigationSearch from '../components/FilesNavigationSearch.vue'
+
+import { useNavigation } from '../composables/useNavigation'
+import { useFiltersStore } from '../store/filters.ts'
+import { useViewConfigStore } from '../store/viewConfig.ts'
+import logger from '../logger.ts'
+
+const collator = Intl.Collator(
+ [getLanguage(), getCanonicalLocale()],
+ {
+ numeric: true,
+ usage: 'sort',
+ },
+)
+
+export default defineComponent({
+ name: 'Navigation',
+
+ components: {
+ IconCog,
+ FilesNavigationItem,
+ FilesNavigationSearch,
+
+ NavigationQuota,
+ NcAppNavigation,
+ NcAppNavigationItem,
+ NcAppNavigationList,
+ SettingsModal,
+ },
+
+ setup() {
+ const filtersStore = useFiltersStore()
+ const viewConfigStore = useViewConfigStore()
+ const { currentView, views } = useNavigation()
+
+ return {
+ currentView,
+ t,
+ views,
+
+ filtersStore,
+ viewConfigStore,
+ }
+ },
+
+ data() {
+ return {
+ settingsOpened: false,
+ }
+ },
+
+ computed: {
+ /**
+ * The current view ID from the route params
+ */
+ currentViewId() {
+ return this.$route?.params?.view || 'files'
+ },
+
+ /**
+ * Map of parent ids to views
+ */
+ viewMap(): Record<string, View[]> {
+ return this.views
+ .reduce((map, view) => {
+ map[view.parent!] = [...(map[view.parent!] || []), view]
+ map[view.parent!].sort((a, b) => {
+ if (typeof a.order === 'number' || typeof b.order === 'number') {
+ return (a.order ?? 0) - (b.order ?? 0)
+ }
+ return collator.compare(a.name, b.name)
+ })
+ return map
+ }, {} as Record<string, View[]>)
+ },
+ },
+
+ watch: {
+ currentViewId(newView, oldView) {
+ if (this.currentViewId !== this.currentView?.id) {
+ // This is guaranteed to be a view because `currentViewId` falls back to the default 'files' view
+ const view = this.views.find(({ id }) => id === this.currentViewId)!
+ // The new view as active
+ this.showView(view)
+ logger.debug(`Navigation changed from ${oldView} to ${newView}`, { to: view })
+ }
+ },
+ },
+
+ created() {
+ subscribe('files:folder-tree:initialized', this.loadExpandedViews)
+ subscribe('files:folder-tree:expanded', this.loadExpandedViews)
+ },
+
+ beforeMount() {
+ // This is guaranteed to be a view because `currentViewId` falls back to the default 'files' view
+ const view = this.views.find(({ id }) => id === this.currentViewId)!
+ this.showView(view)
+ logger.debug('Navigation mounted. Showing requested view', { view })
+ },
+
+ methods: {
+ async loadExpandedViews() {
+ const viewsToLoad: View[] = (Object.entries(this.viewConfigStore.viewConfigs) as Array<[string, ViewConfig]>)
+ .filter(([, config]) => config.expanded === true)
+ .map(([viewId]) => this.views.find(view => view.id === viewId))
+ // eslint-disable-next-line no-use-before-define
+ .filter(Boolean as unknown as ((u: unknown) => u is View))
+ .filter((view) => view.loadChildViews && !view.loaded)
+ for (const view of viewsToLoad) {
+ await view.loadChildViews(view)
+ }
+ },
+
+ /**
+ * Set the view as active on the navigation and handle internal state
+ * @param view View to set active
+ */
+ showView(view: View) {
+ // Closing any opened sidebar
+ window.OCA?.Files?.Sidebar?.close?.()
+ getNavigation().setActive(view)
+ emit('files:navigation:changed', view)
+ },
+
+ /**
+ * Open the settings modal
+ */
+ openSettings() {
+ this.settingsOpened = true
+ },
+
+ /**
+ * Close the settings modal
+ */
+ onSettingsClose() {
+ this.settingsOpened = false
+ },
+ },
+})
+</script>
+
+<style scoped lang="scss">
+.app-navigation {
+ :deep(.app-navigation-entry.active .button-vue.icon-collapse:not(:hover)) {
+ color: var(--color-primary-element-text);
+ }
+
+ > ul.app-navigation__list {
+ // Use flex gap value for more elegant spacing
+ padding-bottom: var(--default-grid-baseline, 4px);
+ }
+}
+
+.app-navigation-entry__settings {
+ height: auto !important;
+ overflow: hidden !important;
+ padding-top: 0 !important;
+ // Prevent shrinking or growing
+ flex: 0 0 auto;
+}
+
+.files-navigation {
+ &__list {
+ height: 100%; // Fill all available space for sticky views
+ }
+
+ :deep(.app-navigation__content > ul.app-navigation__list) {
+ will-change: scroll-position;
+ }
+}
+</style>
diff --git a/apps/files/src/views/ReferenceFileWidget.vue b/apps/files/src/views/ReferenceFileWidget.vue
new file mode 100644
index 00000000000..9db346ea35d
--- /dev/null
+++ b/apps/files/src/views/ReferenceFileWidget.vue
@@ -0,0 +1,306 @@
+<!--
+ - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<template>
+ <div v-if="!accessible" class="widget-file widget-file--no-access">
+ <span class="widget-file__image widget-file__image--icon">
+ <FolderIcon v-if="isFolder" :size="88" />
+ <FileIcon v-else :size="88" />
+ </span>
+ <span class="widget-file__details">
+ <p class="widget-file__title">
+ {{ t('files', 'File cannot be accessed') }}
+ </p>
+ <p class="widget-file__description">
+ {{ t('files', 'The file could not be found or you do not have permissions to view it. Ask the sender to share it.') }}
+ </p>
+ </span>
+ </div>
+
+ <!-- Live preview if a handler is available -->
+ <component :is="viewerHandler.component"
+ v-else-if="interactive && viewerHandler && !failedViewer"
+ :active="false /* prevent video from autoplaying */"
+ :can-swipe="false"
+ :can-zoom="false"
+ :is-embedded="true"
+ v-bind="viewerFile"
+ :file-list="[viewerFile]"
+ :is-full-screen="false"
+ :is-sidebar-shown="false"
+ class="widget-file widget-file--interactive"
+ @error="failedViewer = true" />
+
+ <!-- The file is accessible -->
+ <a v-else
+ class="widget-file widget-file--link"
+ :href="richObject.link"
+ target="_blank"
+ @click="navigate">
+ <span class="widget-file__image" :class="filePreviewClass" :style="filePreviewStyle">
+ <template v-if="!previewUrl">
+ <FolderIcon v-if="isFolder" :size="88" fill-color="var(--color-primary-element)" />
+ <FileIcon v-else :size="88" />
+ </template>
+ </span>
+ <span class="widget-file__details">
+ <p class="widget-file__title">{{ richObject.name }}</p>
+ <p class="widget-file__description">{{ fileSize }}<br>{{ fileMtime }}</p>
+ <p class="widget-file__link">{{ filePath }}</p>
+ </span>
+ </a>
+</template>
+
+<script lang="ts">
+import { defineComponent, type Component, type PropType } from 'vue'
+import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
+import { getCurrentUser } from '@nextcloud/auth'
+import { getFilePickerBuilder } from '@nextcloud/dialogs'
+import { Node } from '@nextcloud/files'
+import FileIcon from 'vue-material-design-icons/File.vue'
+import FolderIcon from 'vue-material-design-icons/Folder.vue'
+import path from 'path'
+
+// see lib/private/Collaboration/Reference/File/FileReferenceProvider.php
+type Ressource = {
+ id: number
+ name: string
+ size: number
+ path: string
+ link: string
+ mimetype: string
+ mtime: number // as unix timestamp
+ 'preview-available': boolean
+}
+
+type ViewerHandler = {
+ id: string
+ group: string
+ mimes: string[]
+ component: Component
+}
+
+/**
+ * Minimal mock of the legacy Viewer FileInfo
+ * TODO: replace by Node object
+ */
+type ViewerFile = {
+ filename: string // the path to the root folder
+ basename: string // the file name
+ lastmod: Date // the last modification date
+ size: number // the file size in bytes
+ type: string
+ mime: string
+ fileid: number
+ failed: boolean
+ loaded: boolean
+ davPath: string
+ source: string
+}
+
+export default defineComponent({
+ name: 'ReferenceFileWidget',
+ components: {
+ FolderIcon,
+ FileIcon,
+ },
+ props: {
+ richObject: {
+ type: Object as PropType<Ressource>,
+ required: true,
+ },
+ accessible: {
+ type: Boolean,
+ default: true,
+ },
+ interactive: {
+ type: Boolean,
+ default: true,
+ },
+ },
+
+ data() {
+ return {
+ previewUrl: null as string | null,
+ failedViewer: false,
+ }
+ },
+
+ computed: {
+ availableViewerHandlers(): ViewerHandler[] {
+ return (window?.OCA?.Viewer?.availableHandlers || []) as ViewerHandler[]
+ },
+ viewerHandler(): ViewerHandler | undefined {
+ return this.availableViewerHandlers
+ .find(handler => handler.mimes.includes(this.richObject.mimetype))
+ },
+ viewerFile(): ViewerFile {
+ const davSource = generateRemoteUrl(`dav/files/${getCurrentUser()?.uid}/${this.richObject.path}`)
+ .replace(/\/\/$/, '/')
+ return {
+ filename: this.richObject.path,
+ basename: this.richObject.name,
+ lastmod: new Date(this.richObject.mtime * 1000),
+ size: this.richObject.size,
+ type: 'file',
+ mime: this.richObject.mimetype,
+ fileid: this.richObject.id,
+ failed: false,
+ loaded: true,
+ davPath: davSource,
+ source: davSource,
+ }
+ },
+
+ fileSize() {
+ return window.OC.Util.humanFileSize(this.richObject.size)
+ },
+ fileMtime() {
+ return window.OC.Util.relativeModifiedDate(this.richObject.mtime * 1000)
+ },
+ filePath() {
+ return path.dirname(this.richObject.path)
+ },
+ filePreviewStyle() {
+ if (this.previewUrl) {
+ return {
+ backgroundImage: 'url(' + this.previewUrl + ')',
+ }
+ }
+ return {}
+ },
+ filePreviewClass() {
+ if (this.previewUrl) {
+ return 'widget-file__image--preview'
+ }
+ return 'widget-file__image--icon'
+
+ },
+ isFolder() {
+ return this.richObject.mimetype === 'httpd/unix-directory'
+ },
+ },
+
+ mounted() {
+ if (this.richObject['preview-available']) {
+ const previewUrl = generateUrl('/core/preview?fileId={fileId}&x=250&y=250', {
+ fileId: this.richObject.id,
+ })
+ const img = new Image()
+ img.onload = () => {
+ this.previewUrl = previewUrl
+ }
+ img.onerror = err => {
+ console.error('could not load recommendation preview', err)
+ }
+ img.src = previewUrl
+ }
+ },
+ methods: {
+ navigate(event) {
+ if (this.isFolder) {
+ event.stopPropagation()
+ event.preventDefault()
+ this.openFilePicker()
+ } else if (window?.OCA?.Viewer?.mimetypes.indexOf(this.richObject.mimetype) !== -1 && !window?.OCA?.Viewer?.file) {
+ event.stopPropagation()
+ event.preventDefault()
+ window?.OCA?.Viewer?.open({ path: this.richObject.path })
+ }
+ },
+
+ openFilePicker() {
+ const picker = getFilePickerBuilder(t('settings', 'Your files'))
+ .allowDirectories(true)
+ .setMultiSelect(false)
+ .addButton({
+ id: 'open',
+ label: this.t('settings', 'Open in files'),
+ callback(nodes: Node[]) {
+ if (nodes[0]) {
+ window.open(generateUrl('/f/{fileid}', {
+ fileid: nodes[0].fileid,
+ }))
+ }
+ },
+ type: 'primary',
+ })
+ .disableNavigation()
+ .startAt(this.richObject.path)
+ .build()
+ picker.pick()
+ },
+ },
+})
+</script>
+
+<style lang="scss" scoped>
+.widget-file {
+ display: flex;
+ flex-grow: 1;
+ color: var(--color-main-text) !important;
+ text-decoration: none !important;
+ padding: 0 !important;
+
+ &__image {
+ width: 30%;
+ min-width: 160px;
+ max-width: 320px;
+ background-position: center;
+ background-size: cover;
+ background-repeat: no-repeat;
+
+ &--icon {
+ min-width: 88px;
+ max-width: 88px;
+ padding: 12px;
+ padding-inline-end: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ }
+
+ &__title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: bold;
+ }
+
+ &__details {
+ padding: 12px;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+
+ p {
+ margin: 0;
+ padding: 0;
+ }
+ }
+
+ &__description {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ line-clamp: 3;
+ -webkit-box-orient: vertical;
+ }
+
+ // No preview, standard link to ressource
+ &--link {
+ color: var(--color-text-maxcontrast);
+ }
+
+ &--interactive {
+ position: relative;
+ height: 400px;
+ max-height: 50vh;
+ margin: 0;
+ }
+}
+</style>
diff --git a/apps/files/src/views/SearchEmptyView.vue b/apps/files/src/views/SearchEmptyView.vue
new file mode 100644
index 00000000000..904e1b0831d
--- /dev/null
+++ b/apps/files/src/views/SearchEmptyView.vue
@@ -0,0 +1,53 @@
+<!--
+ - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
+
+<script setup lang="ts">
+import { mdiMagnifyClose } from '@mdi/js'
+import { t } from '@nextcloud/l10n'
+import debounce from 'debounce'
+import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import NcInputField from '@nextcloud/vue/components/NcInputField'
+import { getPinia } from '../store/index.ts'
+import { useSearchStore } from '../store/search.ts'
+
+const searchStore = useSearchStore(getPinia())
+const debouncedUpdate = debounce((value: string) => {
+ searchStore.query = value
+}, 500)
+</script>
+
+<template>
+ <NcEmptyContent :name="t('files', 'No search results for “{query}”', { query: searchStore.query })">
+ <template #icon>
+ <NcIconSvgWrapper :path="mdiMagnifyClose" />
+ </template>
+ <template #action>
+ <div class="search-empty-view__wrapper">
+ <NcInputField class="search-empty-view__input"
+ :label="t('files', 'Search for files')"
+ :model-value="searchStore.query"
+ type="search"
+ @update:model-value="debouncedUpdate" />
+ </div>
+ </template>
+ </NcEmptyContent>
+</template>
+
+<style scoped lang="scss">
+.search-empty-view {
+ &__input {
+ flex: 0 1;
+ min-width: min(400px, 50vw);
+ }
+
+ &__wrapper {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ align-items: baseline;
+ }
+}
+</style>
diff --git a/apps/files/src/views/Settings.vue b/apps/files/src/views/Settings.vue
index 5d2aff2f49a..bfac8e0b3d6 100644
--- a/apps/files/src/views/Settings.vue
+++ b/apps/files/src/views/Settings.vue
@@ -1,48 +1,444 @@
<!--
- - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>
- -
- - @author Gary Kim <gary@garykim.dev>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
- <div id="files-app-extra-settings">
- <template v-for="setting in settings">
- <Setting :key="setting.name" :el="setting.el" />
- </template>
- </div>
+ <NcAppSettingsDialog :open="open"
+ :show-navigation="true"
+ :name="t('files', 'Files settings')"
+ @update:open="onClose">
+ <!-- Settings API-->
+ <NcAppSettingsSection id="settings" :name="t('files', 'General')">
+ <fieldset class="files-settings__default-view"
+ data-cy-files-settings-setting="default_view">
+ <legend>
+ {{ t('files', 'Default view') }}
+ </legend>
+ <NcCheckboxRadioSwitch :model-value="userConfig.default_view"
+ name="default_view"
+ type="radio"
+ value="files"
+ @update:model-value="setConfig('default_view', $event)">
+ {{ t('files', 'All files') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch :model-value="userConfig.default_view"
+ name="default_view"
+ type="radio"
+ value="personal"
+ @update:model-value="setConfig('default_view', $event)">
+ {{ t('files', 'Personal files') }}
+ </NcCheckboxRadioSwitch>
+ </fieldset>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="sort_favorites_first"
+ :checked="userConfig.sort_favorites_first"
+ @update:checked="setConfig('sort_favorites_first', $event)">
+ {{ t('files', 'Sort favorites first') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="sort_folders_first"
+ :checked="userConfig.sort_folders_first"
+ @update:checked="setConfig('sort_folders_first', $event)">
+ {{ t('files', 'Sort folders before files') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="folder_tree"
+ :checked="userConfig.folder_tree"
+ @update:checked="setConfig('folder_tree', $event)">
+ {{ t('files', 'Folder tree') }}
+ </NcCheckboxRadioSwitch>
+ </NcAppSettingsSection>
+
+ <!-- Appearance -->
+ <NcAppSettingsSection id="settings" :name="t('files', 'Appearance')">
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="show_hidden"
+ :checked="userConfig.show_hidden"
+ @update:checked="setConfig('show_hidden', $event)">
+ {{ t('files', 'Show hidden files') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="show_mime_column"
+ :checked="userConfig.show_mime_column"
+ @update:checked="setConfig('show_mime_column', $event)">
+ {{ t('files', 'Show file type column') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="show_files_extensions"
+ :checked="userConfig.show_files_extensions"
+ @update:checked="setConfig('show_files_extensions', $event)">
+ {{ t('files', 'Show file extensions') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch data-cy-files-settings-setting="crop_image_previews"
+ :checked="userConfig.crop_image_previews"
+ @update:checked="setConfig('crop_image_previews', $event)">
+ {{ t('files', 'Crop image previews') }}
+ </NcCheckboxRadioSwitch>
+ </NcAppSettingsSection>
+
+ <!-- Settings API-->
+ <NcAppSettingsSection v-if="settings.length !== 0"
+ id="more-settings"
+ :name="t('files', 'Additional settings')">
+ <template v-for="setting in settings">
+ <Setting :key="setting.name" :el="setting.el" />
+ </template>
+ </NcAppSettingsSection>
+
+ <!-- Webdav URL-->
+ <NcAppSettingsSection id="webdav" :name="t('files', 'WebDAV')">
+ <NcInputField id="webdav-url-input"
+ :label="t('files', 'WebDAV URL')"
+ :show-trailing-button="true"
+ :success="webdavUrlCopied"
+ :trailing-button-label="t('files', 'Copy')"
+ :value="webdavUrl"
+ class="webdav-url-input"
+ readonly="readonly"
+ type="url"
+ @focus="$event.target.select()"
+ @trailing-button-click="copyCloudId">
+ <template #trailing-button-icon>
+ <Clipboard :size="20" />
+ </template>
+ </NcInputField>
+ <em>
+ <a class="setting-link"
+ :href="webdavDocs"
+ target="_blank"
+ rel="noreferrer noopener">
+ {{ t('files', 'How to access files using WebDAV') }} ↗
+ </a>
+ </em>
+ <br>
+ <em v-if="isTwoFactorEnabled">
+ <a class="setting-link" :href="appPasswordUrl">
+ {{ t('files', 'Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client.') }} ↗
+ </a>
+ </em>
+ </NcAppSettingsSection>
+
+ <NcAppSettingsSection id="warning" :name="t('files', 'Warnings')">
+ <NcCheckboxRadioSwitch type="switch"
+ :checked="userConfig.show_dialog_file_extension"
+ @update:checked="setConfig('show_dialog_file_extension', $event)">
+ {{ t('files', 'Warn before changing a file extension') }}
+ </NcCheckboxRadioSwitch>
+ <NcCheckboxRadioSwitch type="switch"
+ :checked="userConfig.show_dialog_deletion"
+ @update:checked="setConfig('show_dialog_deletion', $event)">
+ {{ t('files', 'Warn before deleting files') }}
+ </NcCheckboxRadioSwitch>
+ </NcAppSettingsSection>
+
+ <NcAppSettingsSection id="shortcuts"
+ :name="t('files', 'Keyboard shortcuts')">
+
+ <h3>{{ t('files', 'Actions') }}</h3>
+ <dl>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>a</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'File actions') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>F2</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Rename') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>Del</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Delete') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>s</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Add or remove favorite') }}
+ </dd>
+ </div>
+ <div v-if="isSystemtagsEnabled">
+ <dt class="shortcut-key">
+ <kbd>t</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Manage tags') }}
+ </dd>
+ </div>
+ </dl>
+
+ <h3>{{ t('files', 'Selection') }}</h3>
+ <dl>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>Ctrl</kbd> + <kbd>A</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Select all files') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>ESC</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Deselect all') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>Ctrl</kbd> + <kbd>Space</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Select or deselect') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>Ctrl</kbd> + <kbd>Shift</kbd> <span>+ <kbd>Space</kbd></span>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Select a range') }}
+ </dd>
+ </div>
+ </dl>
+
+ <h3>{{ t('files', 'Navigation') }}</h3>
+ <dl>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>Alt</kbd> + <kbd>↑</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Go to parent folder') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>↑</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Go to file above') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>↓</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Go to file below') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>←</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Go left in grid') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>→</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Go right in grid') }}
+ </dd>
+ </div>
+ </dl>
+
+ <h3>{{ t('files', 'View') }}</h3>
+ <dl>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>V</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Toggle grid view') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>D</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Open file sidebar') }}
+ </dd>
+ </div>
+ <div>
+ <dt class="shortcut-key">
+ <kbd>?</kbd>
+ </dt>
+ <dd class="shortcut-description">
+ {{ t('files', 'Show those shortcuts') }}
+ </dd>
+ </div>
+ </dl>
+ </NcAppSettingsSection>
+ </NcAppSettingsDialog>
</template>
<script>
-import Setting from '../components/Setting'
+import { getCurrentUser } from '@nextcloud/auth'
+import { getCapabilities } from '@nextcloud/capabilities'
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { loadState } from '@nextcloud/initial-state'
+import { t } from '@nextcloud/l10n'
+import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
+import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
+
+import Clipboard from 'vue-material-design-icons/ContentCopy.vue'
+import NcAppSettingsDialog from '@nextcloud/vue/components/NcAppSettingsDialog'
+import NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'
+import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
+import NcInputField from '@nextcloud/vue/components/NcInputField'
+
+import { useUserConfigStore } from '../store/userconfig.ts'
+import Setting from '../components/Setting.vue'
export default {
name: 'Settings',
components: {
+ Clipboard,
+ NcAppSettingsDialog,
+ NcAppSettingsSection,
+ NcCheckboxRadioSwitch,
+ NcInputField,
Setting,
},
+
+ props: {
+ open: {
+ type: Boolean,
+ default: false,
+ },
+ },
+
+ setup() {
+ const userConfigStore = useUserConfigStore()
+ const isSystemtagsEnabled = getCapabilities()?.systemtags?.enabled === true
+ return {
+ isSystemtagsEnabled,
+ userConfigStore,
+ t,
+ }
+ },
+
data() {
return {
- settings: OCA.Files.Settings.settings,
+ // Settings API
+ settings: window.OCA?.Files?.Settings?.settings || [],
+
+ // Webdav infos
+ webdavUrl: generateRemoteUrl('dav/files/' + encodeURIComponent(getCurrentUser()?.uid)),
+ webdavDocs: 'https://docs.nextcloud.com/server/stable/go.php?to=user-webdav',
+ appPasswordUrl: generateUrl('/settings/user/security#generate-app-token-section'),
+ webdavUrlCopied: false,
+ enableGridView: (loadState('core', 'config', [])['enable_non-accessible_features'] ?? true),
+ isTwoFactorEnabled: (loadState('files', 'isTwoFactorEnabled', false)),
}
},
+
+ computed: {
+ userConfig() {
+ return this.userConfigStore.userConfig
+ },
+
+ sortedSettings() {
+ // Sort settings by name
+ return [...this.settings].sort((a, b) => {
+ if (a.order && b.order) {
+ return a.order - b.order
+ }
+ return a.name.localeCompare(b.name)
+ })
+ },
+ },
+
+ created() {
+ // ? opens the settings dialog on the keyboard shortcuts section
+ useHotKey('?', this.showKeyboardShortcuts, {
+ stop: true,
+ prevent: true,
+ })
+ },
+
+ beforeMount() {
+ // Update the settings API entries state
+ this.settings.forEach(setting => setting.open())
+ },
+
+ beforeDestroy() {
+ // Update the settings API entries state
+ this.settings.forEach(setting => setting.close())
+ },
+
+ methods: {
+ onClose() {
+ this.$emit('close')
+ },
+
+ setConfig(key, value) {
+ this.userConfigStore.update(key, value)
+ },
+
+ async copyCloudId() {
+ document.querySelector('input#webdav-url-input').select()
+
+ if (!navigator.clipboard) {
+ // Clipboard API not available
+ showError(t('files', 'Clipboard is not available'))
+ return
+ }
+
+ await navigator.clipboard.writeText(this.webdavUrl)
+ this.webdavUrlCopied = true
+ showSuccess(t('files', 'WebDAV URL copied'))
+ setTimeout(() => {
+ this.webdavUrlCopied = false
+ }, 5000)
+ },
+
+ async showKeyboardShortcuts() {
+ this.$emit('update:open', true)
+
+ await this.$nextTick()
+ document.getElementById('settings-section_shortcuts').scrollIntoView({
+ behavior: 'smooth',
+ inline: 'nearest',
+ })
+ },
+ },
}
</script>
<style lang="scss" scoped>
+.files-settings {
+ &__default-view {
+ margin-bottom: 0.5rem;
+ }
+}
+.setting-link:hover {
+ text-decoration: underline;
+}
+
+.shortcut-key {
+ width: 160px;
+ // some shortcuts are too long to fit in one line
+ white-space: normal;
+ span {
+ // force portion of a shortcut on a new line for nicer display
+ white-space: nowrap;
+ }
+}
+
+.webdav-url-input {
+ margin-block-end: 0.5rem;
+}
</style>
diff --git a/apps/files/src/views/Sidebar.vue b/apps/files/src/views/Sidebar.vue
index 8fbf7a917f7..40a16d42b42 100644
--- a/apps/files/src/views/Sidebar.vue
+++ b/apps/files/src/views/Sidebar.vue
@@ -1,62 +1,74 @@
<!--
- - @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @author John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
- <AppSidebar v-if="file"
+ <NcAppSidebar v-if="file"
ref="sidebar"
+ data-cy-sidebar
v-bind="appSidebar"
:force-menu="true"
@close="close"
@update:active="setActiveTab"
- @update:starred="toggleStarred"
@[defaultActionListener].stop.prevent="onDefaultAction"
@opening="handleOpening"
@opened="handleOpened"
@closing="handleClosing"
@closed="handleClosed">
+ <template v-if="fileInfo" #subname>
+ <div class="sidebar__subname">
+ <NcIconSvgWrapper v-if="fileInfo.isFavourited"
+ :path="mdiStar"
+ :name="t('files', 'Favorite')"
+ inline />
+ <span>{{ size }}</span>
+ <span class="sidebar__subname-separator">•</span>
+ <NcDateTime :timestamp="fileInfo.mtime" />
+ <span class="sidebar__subname-separator">•</span>
+ <span>{{ t('files', 'Owner') }}</span>
+ <NcUserBubble :user="ownerId"
+ :display-name="nodeOwnerLabel" />
+ </div>
+ </template>
+
<!-- TODO: create a standard to allow multiple elements here? -->
<template v-if="fileInfo" #description>
- <LegacyView v-for="view in views"
- :key="view.cid"
- :component="view"
- :file-info="fileInfo" />
+ <div class="sidebar__description">
+ <SystemTags v-if="isSystemTagsEnabled && showTagsDefault"
+ v-show="showTags"
+ :disabled="!fileInfo?.canEdit()"
+ :file-id="fileInfo.id" />
+ <LegacyView v-for="view in views"
+ :key="view.cid"
+ :component="view"
+ :file-info="fileInfo" />
+ </div>
</template>
<!-- Actions menu -->
<template v-if="fileInfo" #secondary-actions>
+ <NcActionButton :close-after-click="true"
+ @click="toggleStarred(!fileInfo.isFavourited)">
+ <template #icon>
+ <NcIconSvgWrapper :path="fileInfo.isFavourited ? mdiStarOutline : mdiStar" />
+ </template>
+ {{ fileInfo.isFavourited ? t('files', 'Remove from favorites') : t('files', 'Add to favorites') }}
+ </NcActionButton>
<!-- TODO: create proper api for apps to register actions
And inject themselves here. -->
- <ActionButton v-if="isSystemTagsEnabled"
+ <NcActionButton v-if="isSystemTagsEnabled"
:close-after-click="true"
icon="icon-tag"
@click="toggleTags">
{{ t('files', 'Tags') }}
- </ActionButton>
+ </NcActionButton>
</template>
<!-- Error display -->
- <EmptyContent v-if="error" icon="icon-error">
+ <NcEmptyContent v-if="error" icon="icon-error">
{{ error }}
- </EmptyContent>
+ </NcEmptyContent>
<!-- If fileInfo fetch is complete, render tabs -->
<template v-for="tab in tabs" v-else-if="fileInfo">
@@ -71,46 +83,82 @@
:on-update="tab.update"
:on-destroy="tab.destroy"
:on-scroll-bottom-reached="tab.scrollBottomReached"
- :file-info="fileInfo" />
+ :file-info="fileInfo">
+ <template v-if="tab.iconSvg !== undefined" #icon>
+ <!-- eslint-disable-next-line vue/no-v-html -->
+ <span class="svg-icon" v-html="tab.iconSvg" />
+ </template>
+ </SidebarTab>
</template>
- </AppSidebar>
+ </NcAppSidebar>
</template>
-<script>
+<script lang="ts">
+import { davRemoteURL, davRootPath, File, Folder, formatFileSize } from '@nextcloud/files'
+import { defineComponent } from 'vue'
+import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
import { encodePath } from '@nextcloud/paths'
+import { fetchNode } from '../services/WebdavClient.ts'
+import { generateUrl } from '@nextcloud/router'
+import { getCapabilities } from '@nextcloud/capabilities'
+import { getCurrentUser } from '@nextcloud/auth'
+import { mdiStar, mdiStarOutline } from '@mdi/js'
+import { ShareType } from '@nextcloud/sharing'
+import { showError } from '@nextcloud/dialogs'
import $ from 'jquery'
import axios from '@nextcloud/axios'
-import { emit } from '@nextcloud/event-bus'
-import moment from '@nextcloud/moment'
-import { Type as ShareTypes } from '@nextcloud/sharing'
-import AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'
-import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
-import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
+import NcAppSidebar from '@nextcloud/vue/components/NcAppSidebar'
+import NcActionButton from '@nextcloud/vue/components/NcActionButton'
+import NcDateTime from '@nextcloud/vue/components/NcDateTime'
+import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
+import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
+import NcUserBubble from '@nextcloud/vue/components/NcUserBubble'
-import FileInfo from '../services/FileInfo'
-import SidebarTab from '../components/SidebarTab'
-import LegacyView from '../components/LegacyView'
+import FileInfo from '../services/FileInfo.js'
+import LegacyView from '../components/LegacyView.vue'
+import SidebarTab from '../components/SidebarTab.vue'
+import SystemTags from '../../../systemtags/src/components/SystemTags.vue'
+import logger from '../logger.ts'
-export default {
+export default defineComponent({
name: 'Sidebar',
components: {
- ActionButton,
- AppSidebar,
- EmptyContent,
LegacyView,
+ NcActionButton,
+ NcAppSidebar,
+ NcDateTime,
+ NcEmptyContent,
+ NcIconSvgWrapper,
SidebarTab,
+ SystemTags,
+ NcUserBubble,
+ },
+
+ setup() {
+ const currentUser = getCurrentUser()
+
+ // Non reactive properties
+ return {
+ currentUser,
+
+ mdiStar,
+ mdiStarOutline,
+ }
},
data() {
return {
// reactive state
Sidebar: OCA.Files.Sidebar.state,
+ showTags: false,
+ showTagsDefault: true,
error: null,
loading: true,
fileInfo: null,
- starLoading: false,
+ node: null,
isFullScreen: false,
+ hasLowHeight: false,
}
},
@@ -150,14 +198,12 @@ export default {
* @return {string}
*/
davPath() {
- const user = OC.getCurrentUser().uid
- return OC.linkToRemote(`dav/files/${user}${encodePath(this.file)}`)
+ return `${davRemoteURL}${davRootPath}${encodePath(this.file)}`
},
/**
* Current active tab handler
*
- * @param {string} id the tab id to set as active
* @return {string} the current active tab
*/
activeTab() {
@@ -165,39 +211,12 @@ export default {
},
/**
- * Sidebar subtitle
- *
- * @return {string}
- */
- subtitle() {
- return `${this.size}, ${this.time}`
- },
-
- /**
- * File last modified formatted string
- *
- * @return {string}
- */
- time() {
- return OC.Util.relativeModifiedDate(this.fileInfo.mtime)
- },
-
- /**
- * File last modified full string
- *
- * @return {string}
- */
- fullTime() {
- return moment(this.fileInfo.mtime).format('LLL')
- },
-
- /**
* File size formatted string
*
* @return {string}
*/
size() {
- return OC.Util.humanFileSize(this.fileInfo.size)
+ return formatFileSize(this.fileInfo?.size)
},
/**
@@ -218,33 +237,35 @@ export default {
if (this.fileInfo) {
return {
'data-mimetype': this.fileInfo.mimetype,
- 'star-loading': this.starLoading,
active: this.activeTab,
background: this.background,
class: {
'app-sidebar--has-preview': this.fileInfo.hasPreview && !this.isFullScreen,
'app-sidebar--full': this.isFullScreen,
},
- compact: !this.fileInfo.hasPreview || this.isFullScreen,
+ compact: this.hasLowHeight || !this.fileInfo.hasPreview || this.isFullScreen,
loading: this.loading,
- starred: this.fileInfo.isFavourited,
- subtitle: this.subtitle,
- subtitleTooltip: this.fullTime,
- title: this.fileInfo.name,
- titleTooltip: this.fileInfo.name,
+ name: this.node?.displayname ?? this.fileInfo.name,
+ title: this.node?.displayname ?? this.fileInfo.name,
}
} else if (this.error) {
return {
key: 'error', // force key to re-render
- subtitle: '',
- title: '',
+ subname: '',
+ name: '',
+ class: {
+ 'app-sidebar--full': this.isFullScreen,
+ },
}
}
// no fileInfo yet, showing empty data
return {
loading: this.loading,
- subtitle: '',
- title: '',
+ subname: '',
+ name: '',
+ class: {
+ 'app-sidebar--full': this.isFullScreen,
+ },
}
},
@@ -275,8 +296,37 @@ export default {
},
isSystemTagsEnabled() {
- return OCA && 'SystemTags' in OCA
+ return getCapabilities()?.systemtags?.enabled === true
+ },
+ ownerId() {
+ return this.node?.attributes?.['owner-id'] ?? this.currentUser.uid
+ },
+ currentUserIsOwner() {
+ return this.ownerId === this.currentUser.uid
+ },
+ nodeOwnerLabel() {
+ let ownerDisplayName = this.node?.attributes?.['owner-display-name']
+ if (this.currentUserIsOwner) {
+ ownerDisplayName = `${ownerDisplayName} (${t('files', 'You')})`
+ }
+ return ownerDisplayName
},
+ sharedMultipleTimes() {
+ if (Array.isArray(node.attributes?.['share-types']) && node.attributes?.['share-types'].length > 1) {
+ return t('files', 'Shared multiple times with different people')
+ }
+ return null
+ },
+ },
+ created() {
+ subscribe('files:node:deleted', this.onNodeDeleted)
+
+ window.addEventListener('resize', this.handleWindowResize)
+ this.handleWindowResize()
+ },
+ beforeDestroy() {
+ unsubscribe('file:node:deleted', this.onNodeDeleted)
+ window.removeEventListener('resize', this.handleWindowResize)
},
methods: {
@@ -300,8 +350,9 @@ export default {
},
getPreviewIfAny(fileInfo) {
- if (fileInfo.hasPreview && !this.isFullScreen) {
- return OC.generateUrl(`/core/preview?fileId=${fileInfo.id}&x=${screen.width}&y=${screen.height}&a=true`)
+ if (fileInfo?.hasPreview && !this.isFullScreen) {
+ const etag = fileInfo?.etag || ''
+ return generateUrl(`/core/preview?fileId=${fileInfo.id}&x=${screen.width}&y=${screen.height}&a=true&v=${etag.slice(0, 6)}`)
}
return this.getIconUrl(fileInfo)
},
@@ -314,7 +365,7 @@ export default {
* @return {string} Url to the icon for mimeType
*/
getIconUrl(fileInfo) {
- const mimeType = fileInfo.mimetype || 'application/octet-stream'
+ const mimeType = fileInfo?.mimetype || 'application/octet-stream'
if (mimeType === 'httpd/unix-directory') {
// use default folder icon
if (fileInfo.mountType === 'shared' || fileInfo.mountType === 'shared-root') {
@@ -324,8 +375,8 @@ export default {
} else if (fileInfo.mountType !== undefined && fileInfo.mountType !== '') {
return OC.MimeType.getIconUrl('dir-' + fileInfo.mountType)
} else if (fileInfo.shareTypes && (
- fileInfo.shareTypes.indexOf(ShareTypes.SHARE_TYPE_LINK) > -1
- || fileInfo.shareTypes.indexOf(ShareTypes.SHARE_TYPE_EMAIL) > -1)
+ fileInfo.shareTypes.indexOf(ShareType.Link) > -1
+ || fileInfo.shareTypes.indexOf(ShareType.Email) > -1)
) {
return OC.MimeType.getIconUrl('dir-public')
} else if (fileInfo.shareTypes && fileInfo.shareTypes.length > 0) {
@@ -343,17 +394,23 @@ export default {
*/
setActiveTab(id) {
OCA.Files.Sidebar.setActiveTab(id)
+ this.tabs.forEach(tab => {
+ try {
+ tab.setIsActive(id === tab.id)
+ } catch (error) {
+ logger.error('Error while setting tab active state', { error, id: tab.id, tab })
+ }
+ })
},
/**
- * Toggle favourite state
+ * Toggle favorite state
* TODO: better implementation
*
- * @param {boolean} state favourited or not
+ * @param {boolean} state is favorite or not
*/
async toggleStarred(state) {
try {
- this.starLoading = true
await axios({
method: 'PROPPATCH',
url: this.davPath,
@@ -367,17 +424,28 @@ export default {
</d:propertyupdate>`,
})
- // TODO: Obliterate as soon as possible and use events with new files app
- // Terrible fallback for legacy files: toggle filelist as well
- if (OCA.Files && OCA.Files.App && OCA.Files.App.fileList && OCA.Files.App.fileList.fileActions) {
- OCA.Files.App.fileList.fileActions.triggerAction('Favorite', OCA.Files.App.fileList.getModelForFile(this.fileInfo.name), OCA.Files.App.fileList)
- }
+ /**
+ * TODO: adjust this when the Sidebar is finally using File/Folder classes
+ * @see https://github.com/nextcloud/server/blob/8a75cb6e72acd42712ab9fea22296aa1af863ef5/apps/files/src/views/favorites.ts#L83-L115
+ */
+ const isDir = this.fileInfo.type === 'dir'
+ const Node = isDir ? Folder : File
+ const node = new Node({
+ fileid: this.fileInfo.id,
+ source: `${davRemoteURL}${davRootPath}${this.file}`,
+ root: davRootPath,
+ mime: isDir ? undefined : this.fileInfo.mimetype,
+ attributes: {
+ favorite: 1,
+ },
+ })
+ emit(state ? 'files:favorites:added' : 'files:favorites:removed', node)
+ this.fileInfo.isFavourited = state
} catch (error) {
- OC.Notification.showTemporary(t('files', 'Unable to change the favourite state of the file'))
- console.error('Unable to change favourite state', error)
+ showError(t('files', 'Unable to change the favorite state of the file'))
+ logger.error('Unable to change favorite state', { error })
}
- this.starLoading = false
},
onDefaultAction() {
@@ -396,9 +464,10 @@ export default {
* Toggle the tags selector
*/
toggleTags() {
- if (OCA.SystemTags && OCA.SystemTags.View) {
- OCA.SystemTags.View.toggle()
- }
+ // toggle
+ this.showTags = !this.showTags
+ // save the new state
+ this.setShowTagsDefault(this.showTags)
},
/**
@@ -409,38 +478,50 @@ export default {
* @throws {Error} loading failure
*/
async open(path) {
+ if (!path || path.trim() === '') {
+ throw new Error(`Invalid path '${path}'`)
+ }
+
+ // Only focus the tab when the selected file/tab is changed in already opened sidebar
+ // Focusing the sidebar on first file open is handled by NcAppSidebar
+ const focusTabAfterLoad = !!this.Sidebar.file
+
// update current opened file
this.Sidebar.file = path
- if (path && path.trim() !== '') {
- // reset data, keep old fileInfo to not reload all tabs and just hide them
- this.error = null
- this.loading = true
+ // reset data, keep old fileInfo to not reload all tabs and just hide them
+ this.error = null
+ this.loading = true
- try {
- this.fileInfo = await FileInfo(this.davPath)
- // adding this as fallback because other apps expect it
- this.fileInfo.dir = this.file.split('/').slice(0, -1).join('/')
-
- // DEPRECATED legacy views
- // TODO: remove
- this.views.forEach(view => {
- view.setFileInfo(this.fileInfo)
- })
-
- this.$nextTick(() => {
- if (this.$refs.tabs) {
- this.$refs.tabs.updateTabs()
- }
- })
- } catch (error) {
- this.error = t('files', 'Error while loading the file data')
- console.error('Error while loading the file data', error)
+ try {
+ this.node = await fetchNode(this.file)
+ this.fileInfo = FileInfo(this.node)
+ // adding this as fallback because other apps expect it
+ this.fileInfo.dir = this.file.split('/').slice(0, -1).join('/')
+
+ // DEPRECATED legacy views
+ // TODO: remove
+ this.views.forEach(view => {
+ view.setFileInfo(this.fileInfo)
+ })
- throw new Error(error)
- } finally {
- this.loading = false
+ await this.$nextTick()
+
+ this.setActiveTab(this.Sidebar.activeTab || this.tabs[0].id)
+
+ this.loading = false
+
+ await this.$nextTick()
+
+ if (focusTabAfterLoad && this.$refs.sidebar) {
+ this.$refs.sidebar.focusActiveTabContent()
}
+ } catch (error) {
+ this.loading = false
+ this.error = t('files', 'Error while loading the file data')
+ console.error('Error while loading the file data', error)
+
+ throw new Error(error)
}
},
@@ -449,16 +530,43 @@ export default {
*/
close() {
this.Sidebar.file = ''
+ this.showTags = false
this.resetData()
},
/**
+ * Handle if the current node was deleted
+ * @param {import('@nextcloud/files').Node} node The deleted node
+ */
+ onNodeDeleted(node) {
+ if (this.fileInfo && node && this.fileInfo.id === node.fileid) {
+ this.close()
+ }
+ },
+
+ /**
* Allow to set the Sidebar as fullscreen from OCA.Files.Sidebar
*
- * @param {boolean} isFullScreen - Wether or not to render the Sidebar in fullscreen.
+ * @param {boolean} isFullScreen - Whether or not to render the Sidebar in fullscreen.
*/
setFullScreenMode(isFullScreen) {
this.isFullScreen = isFullScreen
+ if (isFullScreen) {
+ document.querySelector('#content')?.classList.add('with-sidebar--full')
+ || document.querySelector('#content-vue')?.classList.add('with-sidebar--full')
+ } else {
+ document.querySelector('#content')?.classList.remove('with-sidebar--full')
+ || document.querySelector('#content-vue')?.classList.remove('with-sidebar--full')
+ }
+ },
+
+ /**
+ * Allow to set whether tags should be shown by default from OCA.Files.Sidebar
+ *
+ * @param {boolean} showTagsDefault - Whether or not to show the tags by default.
+ */
+ setShowTagsDefault(showTagsDefault) {
+ this.showTagsDefault = showTagsDefault
},
/**
@@ -476,12 +584,15 @@ export default {
handleClosed() {
emit('files:sidebar:closed')
},
+ handleWindowResize() {
+ this.hasLowHeight = document.documentElement.clientHeight < 1024
+ },
},
-}
+})
</script>
<style lang="scss" scoped>
.app-sidebar {
- &--has-preview::v-deep {
+ &--has-preview:deep {
.app-sidebar-header__figure {
background-size: cover;
}
@@ -500,5 +611,41 @@ export default {
top: 0 !important;
height: 100% !important;
}
+
+ :deep {
+ .app-sidebar-header__description {
+ margin: 0 16px 4px 16px !important;
+ }
+ }
+
+ .svg-icon {
+ :deep(svg) {
+ width: 20px;
+ height: 20px;
+ fill: currentColor;
+ }
+ }
+}
+
+.sidebar__subname {
+ display: flex;
+ align-items: center;
+ gap: 0 8px;
+
+ &-separator {
+ display: inline-block;
+ font-weight: bold !important;
+ }
+
+ .user-bubble__wrapper {
+ display: inline-flex;
+ }
}
+
+.sidebar__description {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ gap: 8px 0;
+ }
</style>
diff --git a/apps/files/src/views/TemplatePicker.vue b/apps/files/src/views/TemplatePicker.vue
index 6ba98b39800..cddacc863e1 100644
--- a/apps/files/src/views/TemplatePicker.vue
+++ b/apps/files/src/views/TemplatePicker.vue
@@ -1,30 +1,13 @@
<!--
- - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @author John Molakvoæ <skjnldsv@protonmail.com>
- -
- - @license GNU AGPL version 3 or any later version
- -
- - This program is free software: you can redistribute it and/or modify
- - it under the terms of the GNU Affero General Public License as
- - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- -
- - You should have received a copy of the GNU Affero General Public License
- - along with this program. If not, see <http://www.gnu.org/licenses/>.
- -
- -->
+ - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ - SPDX-License-Identifier: AGPL-3.0-or-later
+-->
<template>
- <Modal v-if="opened"
+ <NcModal v-if="opened"
:clear-view-delay="-1"
class="templates-picker"
- size="normal"
+ size="large"
@close="close">
<form class="templates-picker__form"
:style="style"
@@ -34,7 +17,9 @@
<!-- Templates list -->
<ul class="templates-picker__list">
<TemplatePreview v-bind="emptyTemplate"
+ ref="emptyTemplatePreview"
:checked="checked === emptyTemplate.fileid"
+ @confirm-click="onConfirmClick"
@check="onCheck" />
<TemplatePreview v-for="template in provider.templates"
@@ -42,14 +27,12 @@
v-bind="template"
:checked="checked === template.fileid"
:ratio="provider.ratio"
+ @confirm-click="onConfirmClick"
@check="onCheck" />
</ul>
<!-- Cancel and submit -->
<div class="templates-picker__buttons">
- <button @click="close">
- {{ t('files', 'Cancel') }}
- </button>
<input type="submit"
class="primary"
:value="t('files', 'Create')"
@@ -57,39 +40,50 @@
</div>
</form>
- <EmptyContent v-if="loading" class="templates-picker__loading" icon="icon-loading">
+ <NcEmptyContent v-if="loading" class="templates-picker__loading" icon="icon-loading">
{{ t('files', 'Creating file') }}
- </EmptyContent>
- </Modal>
+ </NcEmptyContent>
+ </NcModal>
</template>
-<script>
-import { normalize } from 'path'
-import { showError } from '@nextcloud/dialogs'
-import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
-import Modal from '@nextcloud/vue/dist/Components/Modal'
-
-import { getCurrentDirectory } from '../utils/davUtils'
-import { createFromTemplate, getTemplates } from '../services/Templates'
-import TemplatePreview from '../components/TemplatePreview'
+<script lang="ts">
+import type { TemplateFile } from '../types.ts'
+
+import { getCurrentUser } from '@nextcloud/auth'
+import { showError, spawnDialog } from '@nextcloud/dialogs'
+import { emit } from '@nextcloud/event-bus'
+import { File } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { generateRemoteUrl } from '@nextcloud/router'
+import { normalize, extname, join } from 'path'
+import { defineComponent } from 'vue'
+import { createFromTemplate, getTemplates, getTemplateFields } from '../services/Templates.js'
+
+import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
+import NcModal from '@nextcloud/vue/components/NcModal'
+import TemplatePreview from '../components/TemplatePreview.vue'
+import TemplateFiller from '../components/TemplateFiller.vue'
+import logger from '../logger.ts'
const border = 2
const margin = 8
-const width = margin * 20
-export default {
+export default defineComponent({
name: 'TemplatePicker',
components: {
- EmptyContent,
- Modal,
+ NcEmptyContent,
+ NcModal,
TemplatePreview,
},
props: {
- logger: {
+ /**
+ * The parent folder where to create the node
+ */
+ parent: {
type: Object,
- required: true,
+ default: () => null,
},
},
@@ -98,44 +92,57 @@ export default {
// Check empty template by default
checked: -1,
loading: false,
- name: null,
+ name: null as string|null,
opened: false,
- provider: null,
+ provider: null as TemplateFile|null,
}
},
computed: {
- /**
- * Strip away extension from name
- *
- * @return {string}
- */
+ extension() {
+ return extname(this.name ?? '')
+ },
+
nameWithoutExt() {
- return this.name.indexOf('.') > -1
- ? this.name.split('.').slice(0, -1).join('.')
- : this.name
+ // Strip extension from name if defined
+ return !this.extension
+ ? this.name!
+ : this.name!.slice(0, 0 - this.extension.length)
},
emptyTemplate() {
return {
basename: t('files', 'Blank'),
fileid: -1,
- filename: this.t('files', 'Blank'),
+ filename: t('files', 'Blank'),
hasPreview: false,
mime: this.provider?.mimetypes[0] || this.provider?.mimetypes,
}
},
selectedTemplate() {
- return this.provider.templates.find(template => template.fileid === this.checked)
+ if (!this.provider) {
+ return null
+ }
+
+ return this.provider.templates!.find((template) => template.fileid === this.checked)
},
/**
- * Style css vars bin,d
+ * Style css vars bind
*
* @return {object}
*/
style() {
+ if (!this.provider) {
+ return {}
+ }
+
+ // Fallback to 16:9 landscape ratio
+ const ratio = this.provider.ratio ? this.provider.ratio : 1.77
+ // Landscape templates should be wider than tall ones
+ // We fit 3 templates per row at max for landscape and 4 for portrait
+ const width = ratio > 1 ? margin * 30 : margin * 20
return {
'--margin': margin + 'px',
'--width': width + 'px',
@@ -147,14 +154,15 @@ export default {
},
methods: {
+ t,
+
/**
* Open the picker
*
* @param {string} name the file name to create
* @param {object} provider the template provider picked
*/
- async open(name, provider) {
-
+ async open(name: string, provider) {
this.checked = this.emptyTemplate.fileid
this.name = name
this.provider = provider
@@ -174,6 +182,11 @@ export default {
// Else, open the picker
this.opened = true
+
+ // Set initial focus to the empty template preview
+ this.$nextTick(() => {
+ this.$refs.emptyTemplatePreview?.focus()
+ })
},
/**
@@ -190,57 +203,98 @@ export default {
/**
* Manages the radio template picker change
*
- * @param {number} fileid the selected template file id
+ * @param fileid the selected template file id
*/
- onCheck(fileid) {
+ onCheck(fileid: number) {
this.checked = fileid
},
- async onSubmit() {
- this.loading = true
- const currentDirectory = getCurrentDirectory()
- const fileList = OCA?.Files?.App?.currentFileList
+ onConfirmClick(fileid: number) {
+ if (fileid === this.checked) {
+ this.onSubmit()
+ }
+ },
+
+ async createFile(templateFields = []) {
+ const currentDirectory = new URL(window.location.href).searchParams.get('dir') || '/'
// If the file doesn't have an extension, add the default one
if (this.nameWithoutExt === this.name) {
- this.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })
- this.name = this.name + this.provider?.extension
+ logger.warn('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })
+ this.name = `${this.name}${this.provider?.extension ?? ''}`
}
try {
const fileInfo = await createFromTemplate(
normalize(`${currentDirectory}/${this.name}`),
- this.selectedTemplate?.filename,
- this.selectedTemplate?.templateType,
+ this.selectedTemplate?.filename as string ?? '',
+ this.selectedTemplate?.templateType as string ?? '',
+ templateFields,
)
- this.logger.debug('Created new file', fileInfo)
+ logger.debug('Created new file', fileInfo)
+
+ const owner = getCurrentUser()?.uid || null
+ const node = new File({
+ id: fileInfo.fileid,
+ source: generateRemoteUrl(join(`dav/files/${owner}`, fileInfo.filename)),
+ root: `/files/${owner}`,
+ mime: fileInfo.mime,
+ mtime: new Date(fileInfo.lastmod * 1000),
+ owner,
+ size: fileInfo.size,
+ permissions: fileInfo.permissions,
+ attributes: {
+ // Inherit some attributes from parent folder like the mount type and real owner
+ 'mount-type': this.parent?.attributes?.['mount-type'],
+ 'owner-id': this.parent?.attributes?.['owner-id'],
+ 'owner-display-name': this.parent?.attributes?.['owner-display-name'],
+ ...fileInfo,
+ 'has-preview': fileInfo.hasPreview,
+ },
+ })
- const data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)
+ // Update files list
+ emit('files:node:created', node)
- const model = new OCA.Files.FileInfoModel(data, {
- filesClient: fileList?.filesClient,
- })
- // Run default action
- const fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)
- fileAction.action(fileInfo.basename, {
- $file: fileList?.findFileEl(this.name),
- dir: currentDirectory,
- fileList,
- fileActions: fileList?.fileActions,
- fileInfoModel: model,
- })
+ // Open the new file
+ window.OCP.Files.Router.goToRoute(
+ null, // use default route
+ { view: 'files', fileid: node.fileid },
+ { dir: node.dirname, openfile: 'true' },
+ )
+ // Close the picker
this.close()
} catch (error) {
- this.logger.error('Error while creating the new file from template')
- console.error(error)
- showError(this.t('files', 'Unable to create new file from template'))
+ logger.error('Error while creating the new file from template', { error })
+ showError(t('files', 'Unable to create new file from template'))
} finally {
this.loading = false
}
},
+
+ async onSubmit() {
+ const fileId = this.selectedTemplate?.fileid
+
+ // Only request field extraction if there is a valid template
+ // selected and it's not the blank template
+ let fields = []
+ if (fileId && fileId !== this.emptyTemplate.fileid) {
+ fields = await getTemplateFields(fileId)
+ }
+
+ if (fields.length > 0) {
+ spawnDialog(TemplateFiller, {
+ fields,
+ onSubmit: this.createFile,
+ })
+ } else {
+ this.loading = true
+ await this.createFile()
+ }
+ },
},
-}
+})
</script>
<style lang="scss" scoped>
@@ -272,11 +326,11 @@ export default {
&__buttons {
display: flex;
- justify-content: space-between;
+ justify-content: end;
padding: calc(var(--margin) * 2) var(--margin);
position: sticky;
bottom: 0;
- background-image: linear-gradient(0, var(--gradient-main-background));
+ background-image: linear-gradient(0deg, var(--gradient-main-background));
button, input[type='submit'] {
height: 44px;
@@ -284,14 +338,14 @@ export default {
}
// Make sure we're relative for the loading emptycontent on top
- ::v-deep .modal-container {
+ :deep(.modal-container) {
position: relative;
}
&__loading {
position: absolute;
top: 0;
- left: 0;
+ inset-inline-start: 0;
justify-content: center;
width: 100%;
height: 100%;
diff --git a/apps/files/src/views/favorites.spec.ts b/apps/files/src/views/favorites.spec.ts
new file mode 100644
index 00000000000..f793eb9f54c
--- /dev/null
+++ b/apps/files/src/views/favorites.spec.ts
@@ -0,0 +1,261 @@
+/* eslint-disable import/no-named-as-default-member */
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { Folder as CFolder, Navigation } from '@nextcloud/files'
+
+import * as filesUtils from '@nextcloud/files'
+import * as filesDavUtils from '@nextcloud/files/dav'
+import { CancelablePromise } from 'cancelable-promise'
+import { basename } from 'path'
+import { beforeEach, describe, expect, test, vi } from 'vitest'
+import * as eventBus from '@nextcloud/event-bus'
+
+import { action } from '../actions/favoriteAction'
+import * as favoritesService from '../services/Favorites'
+import { registerFavoritesView } from './favorites'
+
+// eslint-disable-next-line import/namespace
+const { Folder, getNavigation } = filesUtils
+
+vi.mock('@nextcloud/axios')
+
+window.OC = {
+ ...window.OC,
+ TAG_FAVORITE: '_$!<Favorite>!$_',
+}
+
+declare global {
+ interface Window {
+ _nc_navigation?: Navigation
+ }
+}
+
+describe('Favorites view definition', () => {
+ let Navigation
+ beforeEach(() => {
+ vi.resetAllMocks()
+
+ delete window._nc_navigation
+ Navigation = getNavigation()
+ expect(window._nc_navigation).toBeDefined()
+ })
+
+ test('Default empty favorite view', async () => {
+ vi.spyOn(eventBus, 'subscribe')
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
+
+ await registerFavoritesView()
+ const favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ expect(eventBus.subscribe).toHaveBeenCalledTimes(3)
+ expect(eventBus.subscribe).toHaveBeenNthCalledWith(1, 'files:favorites:added', expect.anything())
+ expect(eventBus.subscribe).toHaveBeenNthCalledWith(2, 'files:favorites:removed', expect.anything())
+ expect(eventBus.subscribe).toHaveBeenNthCalledWith(3, 'files:node:renamed', expect.anything())
+
+ // one main view and no children
+ expect(Navigation.views.length).toBe(1)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(0)
+
+ expect(favoritesView?.id).toBe('favorites')
+ expect(favoritesView?.name).toBe('Favorites')
+ expect(favoritesView?.caption).toBeDefined()
+ expect(favoritesView?.icon).toMatch(/<svg.+<\/svg>/)
+ expect(favoritesView?.order).toBe(15)
+ expect(favoritesView?.columns).toStrictEqual([])
+ expect(favoritesView?.getContents).toBeDefined()
+ })
+
+ test('Default with favorites', async () => {
+ const favoriteFolders = [
+ new Folder({
+ id: 1,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foo',
+ owner: 'admin',
+ }),
+ new Folder({
+ id: 2,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/bar',
+ owner: 'admin',
+ }),
+ new Folder({
+ id: 3,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foo/bar',
+ owner: 'admin',
+ }),
+ new Folder({
+ id: 4,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/foo/bar/yabadaba',
+ owner: 'admin',
+ }),
+ ]
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve(favoriteFolders))
+ vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
+
+ await registerFavoritesView()
+ const favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ // one main view and 3 children
+ expect(Navigation.views.length).toBe(5)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(4)
+
+ // Sorted by basename: bar, bar, foo
+ const expectedOrder = [2, 0, 1, 3]
+
+ favoriteFolders.forEach((folder, index) => {
+ const favoriteView = favoriteFoldersViews[index]
+ expect(favoriteView).toBeDefined()
+ expect(favoriteView?.id).toBeDefined()
+ expect(favoriteView?.name).toBe(basename(folder.path))
+ expect(favoriteView?.icon).toMatch(/<svg.+<\/svg>/)
+ expect(favoriteView?.order).toBe(expectedOrder[index])
+ expect(favoriteView?.params).toStrictEqual({
+ dir: folder.path,
+ fileid: String(folder.fileid),
+ view: 'favorites',
+ })
+ expect(favoriteView?.parent).toBe('favorites')
+ expect(favoriteView?.columns).toStrictEqual([])
+ expect(favoriteView?.getContents).toBeDefined()
+ })
+ })
+})
+
+describe('Dynamic update of favorite folders', () => {
+ let Navigation
+ beforeEach(() => {
+ vi.restoreAllMocks()
+
+ delete window._nc_navigation
+ Navigation = getNavigation()
+ })
+
+ test('Add a favorite folder creates a new entry in the navigation', async () => {
+ vi.spyOn(eventBus, 'emit')
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
+
+ await registerFavoritesView()
+ const favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ // one main view and no children
+ expect(Navigation.views.length).toBe(1)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(0)
+
+ // Create new folder to favorite
+ const folder = new Folder({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/Foo/Bar',
+ owner: 'admin',
+ })
+
+ // Exec the action
+ await action.exec(folder, favoritesView, '/')
+
+ expect(eventBus.emit).toHaveBeenCalledTimes(1)
+ expect(eventBus.emit).toHaveBeenCalledWith('files:favorites:added', folder)
+ })
+
+ test('Remove a favorite folder remove the entry from the navigation column', async () => {
+ vi.spyOn(eventBus, 'emit')
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([
+ new Folder({
+ id: 42,
+ root: '/files/admin',
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/Foo/Bar',
+ owner: 'admin',
+ }),
+ ]))
+ vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
+
+ await registerFavoritesView()
+ let favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ let favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ // one main view and no children
+ expect(Navigation.views.length).toBe(2)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(1)
+
+ // Create new folder to favorite
+ const folder = new Folder({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/Foo/Bar',
+ owner: 'admin',
+ root: '/files/admin',
+ attributes: {
+ favorite: 1,
+ },
+ })
+
+ const fo = vi.fn()
+ eventBus.subscribe('files:favorites:removed', fo)
+
+ // Exec the action
+ await action.exec(folder, favoritesView, '/')
+
+ expect(eventBus.emit).toHaveBeenCalledTimes(1)
+ expect(eventBus.emit).toHaveBeenCalledWith('files:favorites:removed', folder)
+ expect(fo).toHaveBeenCalled()
+
+ favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ // one main view and no children
+ expect(Navigation.views.length).toBe(1)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(0)
+ })
+
+ test('Renaming a favorite folder updates the navigation', async () => {
+ vi.spyOn(eventBus, 'emit')
+ vi.spyOn(filesDavUtils, 'getFavoriteNodes').mockReturnValue(CancelablePromise.resolve([]))
+ vi.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as CFolder, contents: [] }))
+
+ await registerFavoritesView()
+ const favoritesView = Navigation.views.find(view => view.id === 'favorites')
+ const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
+
+ // one main view and no children
+ expect(Navigation.views.length).toBe(1)
+ expect(favoritesView).toBeDefined()
+ expect(favoriteFoldersViews.length).toBe(0)
+
+ // expect(eventBus.emit).toHaveBeenCalledTimes(2)
+
+ // Create new folder to favorite
+ const folder = new Folder({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/Foo/Bar',
+ owner: 'admin',
+ })
+
+ // Exec the action
+ await action.exec(folder, favoritesView, '/')
+ expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:favorites:added', folder)
+
+ // Create a folder with the same id but renamed
+ const renamedFolder = new Folder({
+ id: 1,
+ source: 'http://nextcloud.local/remote.php/dav/files/admin/Foo/Bar.renamed',
+ owner: 'admin',
+ })
+
+ // Exec the rename action
+ eventBus.emit('files:node:renamed', renamedFolder)
+ expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:renamed', renamedFolder)
+ })
+})
diff --git a/apps/files/src/views/favorites.ts b/apps/files/src/views/favorites.ts
new file mode 100644
index 00000000000..cac776507ef
--- /dev/null
+++ b/apps/files/src/views/favorites.ts
@@ -0,0 +1,183 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { Folder, Node } from '@nextcloud/files'
+
+import { FileType, View, getNavigation } from '@nextcloud/files'
+import { getCanonicalLocale, getLanguage, t } from '@nextcloud/l10n'
+import { getFavoriteNodes } from '@nextcloud/files/dav'
+import { subscribe } from '@nextcloud/event-bus'
+
+import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
+import StarSvg from '@mdi/svg/svg/star-outline.svg?raw'
+
+import { client } from '../services/WebdavClient.ts'
+import { getContents } from '../services/Favorites'
+import { hashCode } from '../utils/hashUtils'
+import logger from '../logger'
+
+const generateFavoriteFolderView = function(folder: Folder, index = 0): View {
+ return new View({
+ id: generateIdFromPath(folder.path),
+ name: folder.displayname,
+
+ icon: FolderSvg,
+ order: index,
+
+ params: {
+ dir: folder.path,
+ fileid: String(folder.fileid),
+ view: 'favorites',
+ },
+
+ parent: 'favorites',
+
+ columns: [],
+
+ getContents,
+ })
+}
+
+const generateIdFromPath = function(path: string): string {
+ return `favorite-${hashCode(path)}`
+}
+
+export const registerFavoritesView = async () => {
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: 'favorites',
+ name: t('files', 'Favorites'),
+ caption: t('files', 'List of favorite files and folders.'),
+
+ emptyTitle: t('files', 'No favorites yet'),
+ emptyCaption: t('files', 'Files and folders you mark as favorite will show up here'),
+
+ icon: StarSvg,
+ order: 15,
+
+ columns: [],
+
+ getContents,
+ }))
+
+ const favoriteFolders = (await getFavoriteNodes(client)).filter(node => node.type === FileType.Folder) as Folder[]
+ const favoriteFoldersViews = favoriteFolders.map((folder, index) => generateFavoriteFolderView(folder, index)) as View[]
+ logger.debug('Generating favorites view', { favoriteFolders })
+ favoriteFoldersViews.forEach(view => Navigation.register(view))
+
+ /**
+ * Update favorites navigation when a new folder is added
+ */
+ subscribe('files:favorites:added', (node: Node) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+
+ // Sanity check
+ if (node.path === null || !node.root?.startsWith('/files')) {
+ logger.error('Favorite folder is not within user files root', { node })
+ return
+ }
+
+ addToFavorites(node as Folder)
+ })
+
+ /**
+ * Remove favorites navigation when a folder is removed
+ */
+ subscribe('files:favorites:removed', (node: Node) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+
+ // Sanity check
+ if (node.path === null || !node.root?.startsWith('/files')) {
+ logger.error('Favorite folder is not within user files root', { node })
+ return
+ }
+
+ removePathFromFavorites(node.path)
+ })
+
+ /**
+ * Update favorites navigation when a folder is renamed
+ */
+ subscribe('files:node:renamed', (node: Node) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+
+ if (node.attributes.favorite !== 1) {
+ return
+ }
+
+ updateNodeFromFavorites(node as Folder)
+ })
+
+ /**
+ * Sort the favorites paths array and
+ * update the order property of the existing views
+ */
+ const updateAndSortViews = function() {
+ favoriteFolders.sort((a, b) => a.basename.localeCompare(b.basename, [getLanguage(), getCanonicalLocale()], { ignorePunctuation: true, numeric: true, usage: 'sort' }))
+ favoriteFolders.forEach((folder, index) => {
+ const view = favoriteFoldersViews.find((view) => view.id === generateIdFromPath(folder.path))
+ if (view) {
+ view.order = index
+ }
+ })
+ }
+
+ // Add a folder to the favorites paths array and update the views
+ const addToFavorites = function(node: Folder) {
+ const view = generateFavoriteFolderView(node)
+
+ // Skip if already exists
+ if (favoriteFolders.find((folder) => folder.path === node.path)) {
+ return
+ }
+
+ // Update arrays
+ favoriteFolders.push(node)
+ favoriteFoldersViews.push(view)
+
+ // Update and sort views
+ updateAndSortViews()
+ Navigation.register(view)
+ }
+
+ // Remove a folder from the favorites paths array and update the views
+ const removePathFromFavorites = function(path: string) {
+ const id = generateIdFromPath(path)
+ const index = favoriteFolders.findIndex((folder) => folder.path === path)
+
+ // Skip if not exists
+ if (index === -1) {
+ return
+ }
+
+ // Update arrays
+ favoriteFolders.splice(index, 1)
+ favoriteFoldersViews.splice(index, 1)
+
+ // Update and sort views
+ Navigation.remove(id)
+ updateAndSortViews()
+ }
+
+ // Update a folder from the favorites paths array and update the views
+ const updateNodeFromFavorites = function(node: Folder) {
+ const favoriteFolder = favoriteFolders.find((folder) => folder.fileid === node.fileid)
+
+ // Skip if it does not exists
+ if (favoriteFolder === undefined) {
+ return
+ }
+
+ removePathFromFavorites(favoriteFolder.path)
+ addToFavorites(node)
+ }
+
+ updateAndSortViews()
+}
diff --git a/apps/files/src/views/files.ts b/apps/files/src/views/files.ts
new file mode 100644
index 00000000000..a94aab0f14b
--- /dev/null
+++ b/apps/files/src/views/files.ts
@@ -0,0 +1,65 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { View, getNavigation } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { getContents } from '../services/Files.ts'
+import { useActiveStore } from '../store/active.ts'
+import { defaultView } from '../utils/filesViews.ts'
+
+import FolderSvg from '@mdi/svg/svg/folder-outline.svg?raw'
+
+export const VIEW_ID = 'files'
+
+/**
+ * Register the files view to the navigation
+ */
+export function registerFilesView() {
+ // we cache the query to allow more performant search (see below in event listener)
+ let oldQuery = ''
+
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: VIEW_ID,
+ name: t('files', 'All files'),
+ caption: t('files', 'List of your files and folders.'),
+
+ icon: FolderSvg,
+ // if this is the default view we set it at the top of the list - otherwise below it
+ order: defaultView() === VIEW_ID ? 0 : 5,
+
+ getContents,
+ }))
+
+ // when the search is updated
+ // and we are in the files view
+ // and there is already a folder fetched
+ // then we "update" it to trigger a new `getContents` call to search for the query while the filelist is filtered
+ subscribe('files:search:updated', ({ scope, query }) => {
+ if (scope === 'globally') {
+ return
+ }
+
+ if (Navigation.active?.id !== VIEW_ID) {
+ return
+ }
+
+ // If neither the old query nor the new query is longer than the search minimum
+ // then we do not need to trigger a new PROPFIND / SEARCH
+ // so we skip unneccessary requests here
+ if (oldQuery.length < 3 && query.length < 3) {
+ return
+ }
+
+ const store = useActiveStore()
+ if (!store.activeFolder) {
+ return
+ }
+
+ oldQuery = query
+ emit('files:node:updated', store.activeFolder)
+ })
+}
diff --git a/apps/files/src/views/folderTree.ts b/apps/files/src/views/folderTree.ts
new file mode 100644
index 00000000000..2ce4e501e6f
--- /dev/null
+++ b/apps/files/src/views/folderTree.ts
@@ -0,0 +1,176 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { TreeNode } from '../services/FolderTree.ts'
+
+import PQueue from 'p-queue'
+import { FileType, Folder, Node, View, getNavigation } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import { emit, subscribe } from '@nextcloud/event-bus'
+import { isSamePath } from '@nextcloud/paths'
+import { loadState } from '@nextcloud/initial-state'
+
+import FolderSvg from '@mdi/svg/svg/folder.svg?raw'
+import FolderMultipleSvg from '@mdi/svg/svg/folder-multiple-outline.svg?raw'
+
+import {
+ folderTreeId,
+ getContents,
+ getFolderTreeNodes,
+ getSourceParent,
+ sourceRoot,
+} from '../services/FolderTree.ts'
+
+const isFolderTreeEnabled = loadState('files', 'config', { folder_tree: true }).folder_tree
+
+let showHiddenFiles = loadState('files', 'config', { show_hidden: false }).show_hidden
+
+const Navigation = getNavigation()
+
+const queue = new PQueue({ concurrency: 5, intervalCap: 5, interval: 200 })
+
+const registerQueue = new PQueue({ concurrency: 5, intervalCap: 5, interval: 200 })
+
+const registerTreeChildren = async (path: string = '/') => {
+ await queue.add(async () => {
+ const nodes = await getFolderTreeNodes(path)
+ const promises = nodes.map(node => registerQueue.add(() => registerNodeView(node)))
+ await Promise.allSettled(promises)
+ })
+}
+
+const getLoadChildViews = (node: TreeNode | Folder) => {
+ return async (view: View): Promise<void> => {
+ // @ts-expect-error Custom property on View instance
+ if (view.loading || view.loaded) {
+ return
+ }
+ // @ts-expect-error Custom property
+ view.loading = true
+ await registerTreeChildren(node.path)
+ // @ts-expect-error Custom property
+ view.loading = false
+ // @ts-expect-error Custom property
+ view.loaded = true
+ // @ts-expect-error No payload
+ emit('files:navigation:updated')
+ // @ts-expect-error No payload
+ emit('files:folder-tree:expanded')
+ }
+}
+
+const registerNodeView = (node: TreeNode | Folder) => {
+ const registeredView = Navigation.views.find(view => view.id === node.encodedSource)
+ if (registeredView) {
+ Navigation.remove(registeredView.id)
+ }
+ if (!showHiddenFiles && node.basename.startsWith('.')) {
+ return
+ }
+ Navigation.register(new View({
+ id: node.encodedSource,
+ parent: getSourceParent(node.source),
+
+ // @ts-expect-error Casing differences
+ name: node.displayName ?? node.displayname ?? node.basename,
+
+ icon: FolderSvg,
+
+ getContents,
+ loadChildViews: getLoadChildViews(node),
+
+ params: {
+ view: folderTreeId,
+ fileid: String(node.fileid), // Needed for matching exact routes
+ dir: node.path,
+ },
+ }))
+}
+
+const removeFolderView = (folder: Folder) => {
+ const viewId = folder.encodedSource
+ Navigation.remove(viewId)
+}
+
+const removeFolderViewSource = (source: string) => {
+ Navigation.remove(source)
+}
+
+const onCreateNode = (node: Node) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+ registerNodeView(node)
+}
+
+const onDeleteNode = (node: Node) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+ removeFolderView(node)
+}
+
+const onMoveNode = ({ node, oldSource }) => {
+ if (node.type !== FileType.Folder) {
+ return
+ }
+ removeFolderViewSource(oldSource)
+ registerNodeView(node)
+
+ const newPath = node.source.replace(sourceRoot, '')
+ const oldPath = oldSource.replace(sourceRoot, '')
+ const childViews = Navigation.views.filter(view => {
+ if (!view.params?.dir) {
+ return false
+ }
+ if (isSamePath(view.params.dir, oldPath)) {
+ return false
+ }
+ return view.params.dir.startsWith(oldPath)
+ })
+ for (const view of childViews) {
+ // @ts-expect-error FIXME Allow setting parent
+ view.parent = getSourceParent(node.source)
+ // @ts-expect-error dir param is defined
+ view.params.dir = view.params.dir.replace(oldPath, newPath)
+ }
+}
+
+const onUserConfigUpdated = async ({ key, value }) => {
+ if (key === 'show_hidden') {
+ showHiddenFiles = value
+ await registerTreeChildren()
+ // @ts-expect-error No payload
+ emit('files:folder-tree:initialized')
+ }
+}
+
+const registerTreeRoot = () => {
+ Navigation.register(new View({
+ id: folderTreeId,
+
+ name: t('files', 'Folder tree'),
+ caption: t('files', 'List of your files and folders.'),
+
+ icon: FolderMultipleSvg,
+ order: 50, // Below all other views
+
+ getContents,
+ }))
+}
+
+export const registerFolderTreeView = async () => {
+ if (!isFolderTreeEnabled) {
+ return
+ }
+ registerTreeRoot()
+ await registerTreeChildren()
+ subscribe('files:node:created', onCreateNode)
+ subscribe('files:node:deleted', onDeleteNode)
+ subscribe('files:node:moved', onMoveNode)
+ subscribe('files:config:updated', onUserConfigUpdated)
+ // @ts-expect-error No payload
+ emit('files:folder-tree:initialized')
+}
diff --git a/apps/files/src/views/personal-files.ts b/apps/files/src/views/personal-files.ts
new file mode 100644
index 00000000000..241582057d1
--- /dev/null
+++ b/apps/files/src/views/personal-files.ts
@@ -0,0 +1,38 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { t } from '@nextcloud/l10n'
+import { View, getNavigation } from '@nextcloud/files'
+import { getContents } from '../services/PersonalFiles.ts'
+import { defaultView, hasPersonalFilesView } from '../utils/filesViews.ts'
+
+import AccountIcon from '@mdi/svg/svg/account-outline.svg?raw'
+
+export const VIEW_ID = 'personal'
+
+/**
+ * Register the personal files view if allowed
+ */
+export function registerPersonalFilesView(): void {
+ if (!hasPersonalFilesView()) {
+ return
+ }
+
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: VIEW_ID,
+ name: t('files', 'Personal files'),
+ caption: t('files', 'List of your files and folders that are not shared.'),
+
+ emptyTitle: t('files', 'No personal files found'),
+ emptyCaption: t('files', 'Files that are not shared will show up here.'),
+
+ icon: AccountIcon,
+ // if this is the default view we set it at the top of the list - otherwise default position of fifth
+ order: defaultView() === VIEW_ID ? 0 : 5,
+
+ getContents,
+ }))
+}
diff --git a/apps/files/src/views/recent.ts b/apps/files/src/views/recent.ts
new file mode 100644
index 00000000000..fda1d99e13d
--- /dev/null
+++ b/apps/files/src/views/recent.ts
@@ -0,0 +1,28 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { View, getNavigation } from '@nextcloud/files'
+import { translate as t } from '@nextcloud/l10n'
+import HistorySvg from '@mdi/svg/svg/history.svg?raw'
+
+import { getContents } from '../services/Recent'
+
+export default () => {
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: 'recent',
+ name: t('files', 'Recent'),
+ caption: t('files', 'List of recently modified files and folders.'),
+
+ emptyTitle: t('files', 'No recently modified files'),
+ emptyCaption: t('files', 'Files and folders you recently modified will show up here.'),
+
+ icon: HistorySvg,
+ order: 10,
+
+ defaultSortKey: 'mtime',
+
+ getContents,
+ }))
+}
diff --git a/apps/files/src/views/search.ts b/apps/files/src/views/search.ts
new file mode 100644
index 00000000000..a30f732163c
--- /dev/null
+++ b/apps/files/src/views/search.ts
@@ -0,0 +1,51 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import type { ComponentPublicInstanceConstructor } from 'vue/types/v3-component-public-instance'
+
+import { View, getNavigation } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { getContents } from '../services/Search.ts'
+import { VIEW_ID as FILES_VIEW_ID } from './files.ts'
+import MagnifySvg from '@mdi/svg/svg/magnify.svg?raw'
+import Vue from 'vue'
+
+export const VIEW_ID = 'search'
+
+/**
+ * Register the search-in-files view
+ */
+export function registerSearchView() {
+ let instance: Vue
+ let view: ComponentPublicInstanceConstructor
+
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: VIEW_ID,
+ name: t('files', 'Search'),
+ caption: t('files', 'Search results within your files.'),
+
+ async emptyView(el) {
+ if (!view) {
+ view = (await import('./SearchEmptyView.vue')).default
+ } else {
+ instance.$destroy()
+ }
+ instance = new Vue(view)
+ instance.$mount(el)
+ },
+
+ icon: MagnifySvg,
+ order: 10,
+
+ parent: FILES_VIEW_ID,
+ // it should be shown expanded
+ expanded: true,
+ // this view is hidden by default and only shown when active
+ hidden: true,
+
+ getContents,
+ }))
+}
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
deleted file mode 100644
index 0bfdc6f0b54..00000000000
--- a/apps/files/templates/appnavigation.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<div id="app-navigation">
- <ul class="with-icon">
-
- <?php
-
- $pinned = 0;
- foreach ($_['navigationItems'] as $item) {
- $pinned = NavigationListElements($item, $l, $pinned);
- }
- ?>
-
- <?php if ($_['quota'] === \OCP\Files\FileInfo::SPACE_UNLIMITED): ?>
- <li id="quota" class="pinned <?php p($pinned === 0 ? 'first-pinned ' : '') ?>">
- <a href="#" class="icon-quota svg">
- <p><?php p($l->t('%s used', [$_['usage']])); ?></p>
- </a>
- </li>
- <?php else: ?>
- <li id="quota" class="has-tooltip pinned <?php p($pinned === 0 ? 'first-pinned ' : '') ?>"
- title="<?php p($l->t('%s%% of %s used', [$_['usage_relative'], $_['total_space']])); ?>">
- <a href="#" class="icon-quota svg">
- <p id="quotatext"><?php p($l->t('%1$s of %2$s used', [$_['usage'], $_['total_space']])); ?></p>
- <div class="quota-container">
- <progress value="<?php p($_['usage_relative']); ?>" max="100" class="<?= ($_['usage_relative'] > 80) ? 'warn' : '' ?>"></progress>
- </div>
- </a>
- </li>
- <?php endif; ?>
- </ul>
- <div id="app-settings">
- <div id="app-settings-header">
- <button class="settings-button"
- data-apps-slide-toggle="#app-settings-content">
- <?php p($l->t('Settings')); ?>
- </button>
- </div>
- <div id="app-settings-content">
- <div id="files-app-settings"></div>
- <div id="files-setting-showhidden">
- <input class="checkbox" id="showhiddenfilesToggle"
- checked="checked" type="checkbox">
- <label for="showhiddenfilesToggle"><?php p($l->t('Show hidden files')); ?></label>
- </div>
- <div id="files-setting-cropimagepreviews">
- <input class="checkbox" id="cropimagepreviewsToggle"
- checked="checked" type="checkbox">
- <label for="cropimagepreviewsToggle"><?php p($l->t('Crop image previews')); ?></label>
- </div>
- <label for="webdavurl"><?php p($l->t('WebDAV')); ?></label>
- <input id="webdavurl" type="text" readonly="readonly"
- value="<?php p($_['webdav_url']); ?>"/>
- <em><a href="<?php echo link_to_docs('user-webdav') ?>" target="_blank" rel="noreferrer noopener"><?php p($l->t('Use this address to access your Files via WebDAV')) ?> ↗</a></em>
- </div>
- </div>
-
-</div>
-
-
-<?php
-
-/**
- * Prints the HTML for a single Entry.
- *
- * @param $item The item to be added
- * @param $l Translator
- * @param $pinned IntegerValue to count the pinned entries at the bottom
- *
- * @return int Returns the pinned value
- */
-function NavigationListElements($item, $l, $pinned) {
- strpos($item['classes'] ?? '', 'pinned') !== false ? $pinned++ : ''; ?>
- <li
- data-id="<?php p($item['id']) ?>"
- <?php if (isset($item['dir'])) { ?> data-dir="<?php p($item['dir']); ?>" <?php } ?>
- <?php if (isset($item['view'])) { ?> data-view="<?php p($item['view']); ?>" <?php } ?>
- <?php if (isset($item['expandedState'])) { ?> data-expandedstate="<?php p($item['expandedState']); ?>" <?php } ?>
- class="nav-<?php p($item['id']) ?>
- <?php if (isset($item['classes'])) {
- p($item['classes']);
- } ?>
- <?php p($pinned === 1 ? 'first-pinned' : '') ?>
- <?php if (isset($item['defaultExpandedState']) && $item['defaultExpandedState']) { ?> open<?php } ?>"
- <?php if (isset($item['folderPosition'])) { ?> folderposition="<?php p($item['folderPosition']); ?>" <?php } ?>>
-
- <a href="<?php p(isset($item['href']) ? $item['href'] : '#') ?>"
- class="nav-icon-<?php p(isset($item['icon']) && $item['icon'] !== '' ? $item['icon'] : $item['id']) ?> svg"><?php p($item['name']); ?></a>
-
-
- <?php
- NavigationElementMenu($item);
- if (isset($item['sublist'])) {
- ?>
- <button class="collapse app-navigation-noclose"
- aria-label="<?php p($l->t('Toggle %1$s sublist', $item['name'])) ?>"
- <?php if (sizeof($item['sublist']) == 0) { ?> style="display: none" <?php } ?>>
- </button>
- <ul id="sublist-<?php p($item['id']); ?>">
- <?php
- foreach ($item['sublist'] as $item) {
- $pinned = NavigationListElements($item, $l, $pinned);
- } ?>
- </ul>
- <?php
- } ?>
- </li>
-
-
- <?php
- return $pinned;
-}
-
-/**
- * Prints the HTML for a dotmenu.
- *
- * @param $item The item to be added
- *
- * @return void
- */
-function NavigationElementMenu($item) {
- if (isset($item['menubuttons']) && $item['menubuttons'] === 'true') {
- ?>
- <div id="dotmenu-<?php p($item['id']); ?>"
- class="app-navigation-entry-utils" <?php if (isset($item['enableMenuButton']) && $item['enableMenuButton'] === 0) { ?> style="display: none"<?php } ?>>
- <ul>
- <li class="app-navigation-entry-utils-menu-button svg">
- <button id="dotmenu-button-<?php p($item['id']) ?>"></button>
- </li>
- </ul>
- </div>
- <div id="dotmenu-content-<?php p($item['id']) ?>"
- class="app-navigation-entry-menu">
- <ul>
-
- </ul>
- </div>
- <?php
- }
-}
diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html
deleted file mode 100644
index e3513237d2b..00000000000
--- a/apps/files/templates/fileexists.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<div id="{dialog_name}" title="{title}" class="fileexists">
- <span class="why">{why}<!-- Which files do you want to keep --></span><br/>
- <span class="what">{what}<!-- If you select both versions, the copied file will have a number added to its name. --></span><br/>
- <br/>
- <table>
- <th><input id="checkbox-allnewfiles" class="allnewfiles checkbox" type="checkbox" /><label for="checkbox-allnewfiles">{allnewfiles}<span class="count"></span></label></th>
- <th><input id="checkbox-allexistingfiles" class="allexistingfiles checkbox" type="checkbox" /><label for="checkbox-allexistingfiles">{allexistingfiles}<span class="count"></span></label></th>
- </table>
- <div class="conflicts">
- <div class="template">
- <div class="filename"></div>
- <div class="replacement">
- <input type="checkbox" class="checkbox u-left"/>
- <label>
- <span class="svg icon"></span>
- <div class="mtime"></div>
- <div class="size"></div>
- </label>
- </div>
- <div class="original">
- <input type="checkbox" class="checkbox u-left" />
- <label>
- <span class="svg icon"></span>
- <div class="mtime"></div>
- <div class="size"></div>
- <div class="message"></div>
- </label>
- </div>
- </div>
- </div>
-</div>
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 4a1cf808f2a..5281220282a 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -1,35 +1,7 @@
-<?php /** @var \OCP\IL10N $l */ ?>
-<?php $_['appNavigation']->printPage(); ?>
-<div id="app-content">
+<?php
- <input type="checkbox" class="hidden-visually" id="showgridview"
- aria-label="<?php p($l->t('Toggle grid view'))?>"
- <?php if ($_['showgridview']) { ?>checked="checked" <?php } ?>/>
- <label id="view-toggle" for="showgridview" class="button <?php p($_['showgridview'] ? 'icon-toggle-filelist' : 'icon-toggle-pictures') ?>"
- title="<?php p($l->t('Toggle grid view'))?>"></label>
-
- <?php foreach ($_['appContents'] as $content) { ?>
- <div id="app-content-<?php p($content['id']) ?>" class="hidden viewcontainer">
- <?php print_unescaped($content['content']) ?>
- </div>
- <?php } ?>
- <div id="searchresults" class="hidden"></div>
-</div><!-- closing app-content -->
-
-<!-- config hints for javascript -->
-<input type="hidden" name="filesApp" id="filesApp" value="1" />
-<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
-<input type="hidden" name="owner" id="owner" value="<?php p($_['owner']); ?>" />
-<input type="hidden" name="ownerDisplayName" id="ownerDisplayName" value="<?php p($_['ownerDisplayName']); ?>" />
-<input type="hidden" name="fileNotFound" id="fileNotFound" value="<?php p($_['fileNotFound']); ?>" />
-<?php if (!$_['isPublic']) :?>
-<input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" />
-<input type="hidden" name="defaultFileSorting" id="defaultFileSorting" value="<?php p($_['defaultFileSorting']) ?>" />
-<input type="hidden" name="defaultFileSortingDirection" id="defaultFileSortingDirection" value="<?php p($_['defaultFileSortingDirection']) ?>" />
-<input type="hidden" name="showHiddenFiles" id="showHiddenFiles" value="<?php p($_['showHiddenFiles']); ?>" />
-<input type="hidden" name="cropImagePreviews" id="cropImagePreviews" value="<?php p($_['cropImagePreviews']); ?>" />
-<?php endif;
-
-foreach ($_['hiddenFields'] as $name => $value) {?>
-<input type="hidden" name="<?php p($name) ?>" id="<?php p($name) ?>" value="<?php p($value) ?>" />
-<?php }
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+// Empty template
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index a88a9550beb..85e3b24043f 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -1,17 +1,24 @@
-<div id="controls">
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+?>
+<div class="files-controls">
<div class="actions creatable hidden">
<div id="uploadprogresswrapper">
</div>
</div>
- <div id="file_action_panel"></div>
<div class="notCreatable notPublic hidden">
<div class="icon-alert-outline"></div>
- <?php p($l->t('You don’t have permission to upload or create files here'))?>
+ <?php p($l->t('You do not have permission to upload or create files here.'))?>
</div>
<?php /* Note: the template attributes are here only for the public page. These are normally loaded
through ajax instead (updateStorageStatistics).
*/ ?>
- <input type="hidden" name="permissions" value="" id="permissions">
+ <input type="hidden" id="permissions" value="">
<input type="hidden" id="free_space" value="<?php isset($_['freeSpace']) ? p($_['freeSpace']) : '' ?>">
<?php if (isset($_['dirToken'])):?>
<input type="hidden" id="publicUploadRequestToken" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
@@ -20,9 +27,9 @@
<input type="hidden" class="max_human_file_size"
value="(max <?php isset($_['uploadMaxHumanFilesize']) ? p($_['uploadMaxHumanFilesize']) : ''; ?>)">
</div>
-<div id="filelist-header"></div>
+<div class="filelist-header"></div>
-<div id="emptycontent" class="hidden">
+<div class="emptyfilelist emptycontent hidden">
<div class="icon-folder"></div>
<h2><?php p($l->t('No files in here')); ?></h2>
<p class="uploadmessage hidden"><?php p($l->t('Upload some content or sync with your devices!')); ?></p>
@@ -33,49 +40,47 @@
<h2><?php p($l->t('No entries found in this folder')); ?></h2>
<p></p>
</div>
-<table id="filestable" class="list-container <?php p($_['showgridview'] ? 'view-grid' : '') ?>" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="250" data-preview-y="250">
+<table class="files-filestable list-container <?php p($_['showgridview'] ? 'view-grid' : '') ?>" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="250" data-preview-y="250">
<thead>
<tr>
- <th id="headerSelection" class="hidden column-selection">
+ <th class="hidden column-selection">
<input type="checkbox" id="select_all_files" class="select-all checkbox"/>
<label for="select_all_files">
<span class="hidden-visually"><?php p($l->t('Select all'))?></span>
</label>
</th>
- <th id='headerName' class="hidden column-name">
- <div id="headerName-container">
- <a class="name sort columntitle" data-sort="name">
+ <th class="hidden column-name">
+ <div class="column-name-container">
+ <a class="name sort columntitle" onclick="event.preventDefault()" href="#" data-sort="name">
<span><?php p($l->t('Name')); ?></span>
<span class="sort-indicator"></span>
</a>
- <span id="selectedActionsList" class="selectedActions">
- <a href="" class="actions-selected">
+ <span class="selectedActions">
+ <a href="#" onclick="event.preventDefault()" class="actions-selected">
<span class="icon icon-more"></span>
<span><?php p($l->t('Actions'))?></span>
</a>
</span>
</div>
</th>
- <th id="headerSize" class="hidden column-size">
- <a class="size sort columntitle" data-sort="size"><span><?php p($l->t('Size')); ?></span><span class="sort-indicator"></span></a>
+ <th class="hidden column-size">
+ <a class="size sort columntitle" href="#" onclick="event.preventDefault()" data-sort="size"><span><?php p($l->t('Size')); ?></span><span class="sort-indicator"></span></a>
</th>
- <th id="headerDate" class="hidden column-mtime">
- <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t('Modified')); ?></span><span class="sort-indicator"></span></a>
+ <th class="hidden column-mtime">
+ <a class="columntitle" href="#" onclick="event.preventDefault()" data-sort="mtime"><span><?php p($l->t('Modified')); ?></span><span class="sort-indicator"></span></a>
</th>
</tr>
</thead>
- <tbody id="fileList">
+ <tbody class="files-fileList">
</tbody>
<tfoot>
</tfoot>
</table>
-<div id="filelist-footer"></div>
-<input type="hidden" name="dir" id="dir" value="" />
+<div class="filelist-footer"></div>
<div class="hiddenuploadfield">
<input type="file" id="file_upload_start" class="hiddenuploadfield" name="files[]" />
</div>
-<div id="editor"></div><!-- FIXME Do not use this div in your app! It is deprecated and will be removed in the future! -->
<div id="uploadsize-message" title="<?php p($l->t('Upload too large'))?>">
<p>
<?php p($l->t('The files you are trying to upload exceed the maximum size for file uploads on this server.'));?>
diff --git a/apps/files/templates/recentlist.php b/apps/files/templates/recentlist.php
deleted file mode 100644
index 8a556a6dc1d..00000000000
--- a/apps/files/templates/recentlist.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php /** @var \OCP\IL10N $l */ ?>
-<div id='notification'></div>
-
-<div id="emptycontent" class="hidden"></div>
-
-<input type="hidden" name="dir" value="" id="dir">
-
-<div class="nofilterresults emptycontent hidden">
- <div class="icon-search"></div>
- <h2><?php p($l->t('No entries found in this folder')); ?></h2>
- <p></p>
-</div>
-
-<table id="filestable" class="list-container <?php p($_['showgridview'] ? 'view-grid' : '') ?>">
- <thead>
- <tr>
- <th id='headerName' class="hidden column-name">
- <div id="headerName-container">
- <a class="name sort columntitle"
- data-sort="name"><span><?php p($l->t('Name')); ?></span></a>
- </div>
- </th>
- <th id="headerSize" class="hidden column-size">
- <a class="size sort columntitle"
- data-sort="size"><span><?php p($l->t('Size')); ?></span></a>
- </th>
- <th id="headerDate" class="hidden column-mtime">
- <a id="modified" class="columntitle"
- data-sort="mtime"><span><?php p($l->t('Modified')); ?></span><span
- class="sort-indicator"></span></a>
- <span class="selectedActions">
- <a href="" class="delete-selected">
- <span class="icon icon-delete"></span>
- <span><?php p($l->t('Delete')) ?></span>
- </a>
- </span>
- </th>
- </tr>
- </thead>
- <tbody id="fileList">
- </tbody>
- <tfoot>
- </tfoot>
-</table>
diff --git a/apps/files/templates/settings-personal.php b/apps/files/templates/settings-personal.php
index 7aefb470cd6..0ca3846d699 100644
--- a/apps/files/templates/settings-personal.php
+++ b/apps/files/templates/settings-personal.php
@@ -1,29 +1,9 @@
<?php
/**
- * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
-
-script(\OCA\Files\AppInfo\Application::APP_ID, 'personal-settings');
-
?>
<div id="files-personal-settings" class="section">
</div>
diff --git a/apps/files/templates/simplelist.php b/apps/files/templates/simplelist.php
deleted file mode 100644
index 24bd1c8ca2a..00000000000
--- a/apps/files/templates/simplelist.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<div id='notification'></div>
-
-<div id="emptycontent" class="hidden">
- <div class="icon-starred"></div>
- <h2><?php p($l->t('No favorites yet')); ?></h2>
- <p><?php p($l->t('Files and folders you mark as favorite will show up here')); ?></p>
-</div>
-
-<input type="hidden" name="dir" value="" id="dir">
-
-<div class="nofilterresults emptycontent hidden">
- <div class="icon-search"></div>
- <h2><?php p($l->t('No entries found in this folder')); ?></h2>
- <p></p>
-</div>
-<table id="filestable" class="list-container <?php p($_['showgridview'] ? 'view-grid' : '') ?>">
- <thead>
- <tr>
- <th id='headerName' class="hidden column-name">
- <div id="headerName-container">
- <a class="name sort columntitle" data-sort="name"><span><?php p($l->t('Name')); ?></span><span class="sort-indicator"></span></a>
- </div>
- </th>
- <th id="headerSize" class="hidden column-size">
- <a class="size sort columntitle" data-sort="size"><span><?php p($l->t('Size')); ?></span><span class="sort-indicator"></span></a>
- </th>
- <th id="headerDate" class="hidden column-mtime">
- <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t('Modified')); ?></span><span class="sort-indicator"></span></a>
- <span class="selectedActions">
- <a href="" class="delete-selected">
- <img class="svg" alt=""
- src="<?php print_unescaped(OCP\Template::image_path("core", "actions/delete.svg")); ?>" />
- <?php p($l->t('Delete'))?>
- </a>
- </span>
- </th>
- </tr>
- </thead>
- <tbody id="fileList">
- </tbody>
- <tfoot>
- </tfoot>
-</table>
diff --git a/apps/files/tests/Activity/Filter/GenericTest.php b/apps/files/tests/Activity/Filter/GenericTest.php
index f7c7cafaec4..40e2f9848b5 100644
--- a/apps/files/tests/Activity/Filter/GenericTest.php
+++ b/apps/files/tests/Activity/Filter/GenericTest.php
@@ -1,31 +1,16 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Tests\Activity\Filter;
use OCA\Files\Activity\Filter\Favorites;
use OCA\Files\Activity\Filter\FileChanges;
use OCP\Activity\IFilter;
+use OCP\Server;
use Test\TestCase;
/**
@@ -35,83 +20,62 @@ use Test\TestCase;
* @group DB
*/
class GenericTest extends TestCase {
- public function dataFilters() {
+ public static function dataFilters(): array {
return [
[Favorites::class],
[FileChanges::class],
];
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testImplementsInterface($filterClass) {
- $filter = \OC::$server->query($filterClass);
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testImplementsInterface(string $filterClass): void {
+ $filter = Server::get($filterClass);
$this->assertInstanceOf(IFilter::class, $filter);
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testGetIdentifier($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testGetIdentifier(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$this->assertIsString($filter->getIdentifier());
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testGetName($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testGetName(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$this->assertIsString($filter->getName());
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testGetPriority($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testGetPriority(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$priority = $filter->getPriority();
$this->assertIsInt($filter->getPriority());
$this->assertGreaterThanOrEqual(0, $priority);
$this->assertLessThanOrEqual(100, $priority);
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testGetIcon($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testGetIcon(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$this->assertIsString($filter->getIcon());
$this->assertStringStartsWith('http', $filter->getIcon());
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testFilterTypes($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testFilterTypes(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$this->assertIsArray($filter->filterTypes([]));
}
- /**
- * @dataProvider dataFilters
- * @param string $filterClass
- */
- public function testAllowedApps($filterClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataFilters')]
+ public function testAllowedApps(string $filterClass): void {
/** @var IFilter $filter */
- $filter = \OC::$server->query($filterClass);
+ $filter = Server::get($filterClass);
$this->assertIsArray($filter->allowedApps());
}
}
diff --git a/apps/files/tests/Activity/ProviderTest.php b/apps/files/tests/Activity/ProviderTest.php
index 7c5bdf27ba1..b6ba095ecfe 100644
--- a/apps/files/tests/Activity/ProviderTest.php
+++ b/apps/files/tests/Activity/ProviderTest.php
@@ -1,29 +1,14 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Tests\Activity;
use OCA\Files\Activity\Provider;
+use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
@@ -32,7 +17,6 @@ use OCP\Federation\ICloudId;
use OCP\Federation\ICloudIdManager;
use OCP\Files\IRootFolder;
use OCP\IURLGenerator;
-use OCP\IUser;
use OCP\IUserManager;
use OCP\L10N\IFactory;
use PHPUnit\Framework\MockObject\MockObject;
@@ -44,23 +28,14 @@ use Test\TestCase;
* @package OCA\Files\Tests\Activity
*/
class ProviderTest extends TestCase {
-
- /** @var IFactory|MockObject */
- protected $l10nFactory;
- /** @var IURLGenerator|MockObject */
- protected $url;
- /** @var IManager|MockObject */
- protected $activityManager;
- /** @var IUserManager|MockObject */
- protected $userManager;
- /** @var IRootFolder|MockObject */
- protected $rootFolder;
- /** @var ICloudIdManager|MockObject */
- protected $cloudIdManager;
- /** @var IContactsManager|MockObject */
- protected $contactsManager;
- /** @var IEventMerger|MockObject */
- protected $eventMerger;
+ protected IFactory&MockObject $l10nFactory;
+ protected IURLGenerator&MockObject $url;
+ protected IManager&MockObject $activityManager;
+ protected IUserManager&MockObject $userManager;
+ protected IRootFolder&MockObject $rootFolder;
+ protected ICloudIdManager&MockObject $cloudIdManager;
+ protected IContactsManager&MockObject $contactsManager;
+ protected IEventMerger&MockObject $eventMerger;
protected function setUp(): void {
parent::setUp();
@@ -92,7 +67,7 @@ class ProviderTest extends TestCase {
$this->contactsManager,
$this->eventMerger,
])
- ->setMethods($methods)
+ ->onlyMethods($methods)
->getMock();
}
return new Provider(
@@ -107,23 +82,16 @@ class ProviderTest extends TestCase {
);
}
- public function dataGetFile() {
+ public static function dataGetFile(): array {
return [
[[42 => '/FortyTwo.txt'], null, '42', 'FortyTwo.txt', 'FortyTwo.txt'],
[['23' => '/Twenty/Three.txt'], null, '23', 'Three.txt', 'Twenty/Three.txt'],
- ['/Foo/Bar.txt', 128, 128, 'Bar.txt', 'Foo/Bar.txt'], // Legacy from ownCloud 8.2 and before
+ ['/Foo/Bar.txt', 128, '128', 'Bar.txt', 'Foo/Bar.txt'], // Legacy from ownCloud 8.2 and before
];
}
- /**
- * @dataProvider dataGetFile
- * @param mixed $parameter
- * @param mixed $eventId
- * @param int $id
- * @param string $name
- * @param string $path
- */
- public function testGetFile($parameter, $eventId, $id, $name, $path) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataGetFile')]
+ public function testGetFile(array|string $parameter, ?int $eventId, string $id, string $name, string $path): void {
$provider = $this->getProvider();
if ($eventId !== null) {
@@ -150,14 +118,14 @@ class ProviderTest extends TestCase {
}
- public function testGetFileThrows() {
- $this->expectException(\InvalidArgumentException::class);
+ public function testGetFileThrows(): void {
+ $this->expectException(UnknownActivityException::class);
$provider = $this->getProvider();
self::invokePrivate($provider, 'getFile', ['/Foo/Bar.txt', null]);
}
- public function dataGetUser() {
+ public static function dataGetUser(): array {
return [
['test', 'Test user', null, ['type' => 'user', 'id' => 'test', 'name' => 'Test user']],
['test@http://localhost', null, ['user' => 'test', 'displayId' => 'test@localhost', 'remote' => 'localhost', 'name' => null], ['type' => 'user', 'id' => 'test', 'name' => 'test@localhost', 'server' => 'localhost']],
@@ -166,28 +134,15 @@ class ProviderTest extends TestCase {
];
}
- /**
- * @dataProvider dataGetUser
- * @param string $uid
- * @param string|null $userDisplayName
- * @param array|null $cloudIdData
- * @param array $expected
- */
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataGetUser')]
public function testGetUser(string $uid, ?string $userDisplayName, ?array $cloudIdData, array $expected): void {
$provider = $this->getProvider();
if ($userDisplayName !== null) {
- $user = $this->createMock(IUser::class);
- $user->expects($this->once())
- ->method('getUID')
- ->willReturn($uid);
- $user->expects($this->once())
- ->method('getDisplayName')
- ->willReturn($userDisplayName);
$this->userManager->expects($this->once())
- ->method('get')
+ ->method('getDisplayName')
->with($uid)
- ->willReturn($user);
+ ->willReturn($userDisplayName);
}
if ($cloudIdData !== null) {
$this->cloudIdManager->expects($this->once())
diff --git a/apps/files/tests/Activity/Setting/GenericTest.php b/apps/files/tests/Activity/Setting/GenericTest.php
index b0d42aa27ac..df6b1e0f6d4 100644
--- a/apps/files/tests/Activity/Setting/GenericTest.php
+++ b/apps/files/tests/Activity/Setting/GenericTest.php
@@ -1,36 +1,20 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
- *
- * @author Joas Schilling <coding@schilljs.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Tests\Activity\Setting;
use OCA\Files\Activity\Settings\FavoriteAction;
use OCA\Files\Activity\Settings\FileChanged;
use OCP\Activity\ISetting;
+use OCP\Server;
use Test\TestCase;
class GenericTest extends TestCase {
- public function dataSettings() {
+ public static function dataSettings(): array {
return [
[FavoriteAction::class],
[FileChanged::class],
@@ -38,85 +22,61 @@ class GenericTest extends TestCase {
];
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testImplementsInterface($settingClass) {
- $setting = \OC::$server->query($settingClass);
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testImplementsInterface(string $settingClass): void {
+ $setting = Server::get($settingClass);
$this->assertInstanceOf(ISetting::class, $setting);
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testGetIdentifier($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testGetIdentifier(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsString($setting->getIdentifier());
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testGetName($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testGetName(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsString($setting->getName());
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testGetPriority($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testGetPriority(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$priority = $setting->getPriority();
$this->assertIsInt($setting->getPriority());
$this->assertGreaterThanOrEqual(0, $priority);
$this->assertLessThanOrEqual(100, $priority);
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testCanChangeStream($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testCanChangeStream(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsBool($setting->canChangeStream());
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testIsDefaultEnabledStream($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testIsDefaultEnabledStream(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsBool($setting->isDefaultEnabledStream());
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testCanChangeMail($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testCanChangeMail(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsBool($setting->canChangeMail());
}
- /**
- * @dataProvider dataSettings
- * @param string $settingClass
- */
- public function testIsDefaultEnabledMail($settingClass) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataSettings')]
+ public function testIsDefaultEnabledMail(string $settingClass): void {
/** @var ISetting $setting */
- $setting = \OC::$server->query($settingClass);
+ $setting = Server::get($settingClass);
$this->assertIsBool($setting->isDefaultEnabledMail());
}
}
diff --git a/apps/files/tests/AdvancedCapabilitiesTest.php b/apps/files/tests/AdvancedCapabilitiesTest.php
new file mode 100644
index 00000000000..f39ac1c873f
--- /dev/null
+++ b/apps/files/tests/AdvancedCapabilitiesTest.php
@@ -0,0 +1,46 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Files;
+
+use OCA\Files\Service\SettingsService;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class AdvancedCapabilitiesTest extends TestCase {
+
+ protected SettingsService&MockObject $service;
+ protected AdvancedCapabilities $capabilities;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $this->service = $this->createMock(SettingsService::class);
+ $this->capabilities = new AdvancedCapabilities($this->service);
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataGetCapabilities')]
+ public function testGetCapabilities(bool $wcf): void {
+ $this->service
+ ->expects(self::once())
+ ->method('hasFilesWindowsSupport')
+ ->willReturn($wcf);
+
+ self::assertEqualsCanonicalizing(['files' => [ 'windows_compatible_filenames' => $wcf ]], $this->capabilities->getCapabilities());
+ }
+
+ public static function dataGetCapabilities(): array {
+ return [
+ 'WCF enabled' => [
+ true,
+ ],
+ 'WCF disabled' => [
+ false,
+ ],
+ ];
+ }
+}
diff --git a/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php b/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php
index 75318b1802f..3f811fca407 100644
--- a/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php
+++ b/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php
@@ -1,30 +1,19 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\BackgroundJob;
use OCA\Files\BackgroundJob\DeleteOrphanedItems;
+use OCP\AppFramework\Utility\ITimeFactory;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use OCP\Server;
+use Psr\Log\LoggerInterface;
/**
* Class DeleteOrphanedItemsJobTest
@@ -34,25 +23,27 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
* @package Test\BackgroundJob
*/
class DeleteOrphanedItemsJobTest extends \Test\TestCase {
-
- /** @var \OCP\IDBConnection */
- protected $connection;
+ protected IDBConnection $connection;
+ protected LoggerInterface $logger;
+ protected ITimeFactory $timeFactory;
protected function setUp(): void {
parent::setUp();
- $this->connection = \OC::$server->getDatabaseConnection();
+ $this->connection = Server::get(IDBConnection::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
+ $this->logger = Server::get(LoggerInterface::class);
}
- protected function cleanMapping($table) {
+ protected function cleanMapping(string $table): void {
$query = $this->connection->getQueryBuilder();
- $query->delete($table)->execute();
+ $query->delete($table)->executeStatement();
}
- protected function getMappings($table) {
+ protected function getMappings(string $table): array {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from($table);
- $result = $query->execute();
+ $result = $query->executeQuery();
$mapping = $result->fetchAll();
$result->closeCursor();
@@ -62,7 +53,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
/**
* Test clearing orphaned system tag mappings
*/
- public function testClearSystemTagMappings() {
+ public function testClearSystemTagMappings(): void {
$this->cleanMapping('systemtag_object_mapping');
$query = $this->connection->getQueryBuilder();
@@ -71,7 +62,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
- ])->execute();
+ ])->executeStatement();
$fileId = $query->getLastInsertId();
// Existing file
@@ -81,7 +72,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'objectid' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
'objecttype' => $query->createNamedParameter('files'),
'systemtagid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
// Non-existing file
$query = $this->connection->getQueryBuilder();
@@ -90,13 +81,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'objectid' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT),
'objecttype' => $query->createNamedParameter('files'),
'systemtagid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
$mapping = $this->getMappings('systemtag_object_mapping');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedItems();
- $this->invokePrivate($job, 'cleanSystemTags');
+ $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger);
+ self::invokePrivate($job, 'cleanSystemTags');
$mapping = $this->getMappings('systemtag_object_mapping');
$this->assertCount(1, $mapping);
@@ -104,14 +95,14 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
$query = $this->connection->getQueryBuilder();
$query->delete('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
- ->execute();
+ ->executeStatement();
$this->cleanMapping('systemtag_object_mapping');
}
/**
* Test clearing orphaned system tag mappings
*/
- public function testClearUserTagMappings() {
+ public function testClearUserTagMappings(): void {
$this->cleanMapping('vcategory_to_object');
$query = $this->connection->getQueryBuilder();
@@ -120,7 +111,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
- ])->execute();
+ ])->executeStatement();
$fileId = $query->getLastInsertId();
// Existing file
@@ -130,7 +121,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'objid' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
'type' => $query->createNamedParameter('files'),
'categoryid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
// Non-existing file
$query = $this->connection->getQueryBuilder();
@@ -139,13 +130,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'objid' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT),
'type' => $query->createNamedParameter('files'),
'categoryid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
$mapping = $this->getMappings('vcategory_to_object');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedItems();
- $this->invokePrivate($job, 'cleanUserTags');
+ $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger);
+ self::invokePrivate($job, 'cleanUserTags');
$mapping = $this->getMappings('vcategory_to_object');
$this->assertCount(1, $mapping);
@@ -153,14 +144,14 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
$query = $this->connection->getQueryBuilder();
$query->delete('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
- ->execute();
+ ->executeStatement();
$this->cleanMapping('vcategory_to_object');
}
/**
* Test clearing orphaned system tag mappings
*/
- public function testClearComments() {
+ public function testClearComments(): void {
$this->cleanMapping('comments');
$query = $this->connection->getQueryBuilder();
@@ -169,7 +160,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
- ])->execute();
+ ])->executeStatement();
$fileId = $query->getLastInsertId();
// Existing file
@@ -180,7 +171,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'object_type' => $query->createNamedParameter('files'),
'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
'actor_type' => $query->createNamedParameter('users'),
- ])->execute();
+ ])->executeStatement();
// Non-existing file
$query = $this->connection->getQueryBuilder();
@@ -190,13 +181,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'object_type' => $query->createNamedParameter('files'),
'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
'actor_type' => $query->createNamedParameter('users'),
- ])->execute();
+ ])->executeStatement();
$mapping = $this->getMappings('comments');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedItems();
- $this->invokePrivate($job, 'cleanComments');
+ $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger);
+ self::invokePrivate($job, 'cleanComments');
$mapping = $this->getMappings('comments');
$this->assertCount(1, $mapping);
@@ -204,14 +195,14 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
$query = $this->connection->getQueryBuilder();
$query->delete('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
- ->execute();
+ ->executeStatement();
$this->cleanMapping('comments');
}
/**
* Test clearing orphaned system tag mappings
*/
- public function testClearCommentReadMarks() {
+ public function testClearCommentReadMarks(): void {
$this->cleanMapping('comments_read_markers');
$query = $this->connection->getQueryBuilder();
@@ -220,7 +211,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
- ])->execute();
+ ])->executeStatement();
$fileId = $query->getLastInsertId();
// Existing file
@@ -230,7 +221,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'object_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
'object_type' => $query->createNamedParameter('files'),
'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
// Non-existing file
$query = $this->connection->getQueryBuilder();
@@ -239,13 +230,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
'object_id' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT),
'object_type' => $query->createNamedParameter('files'),
'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
- ])->execute();
+ ])->executeStatement();
$mapping = $this->getMappings('comments_read_markers');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedItems();
- $this->invokePrivate($job, 'cleanCommentMarkers');
+ $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger);
+ self::invokePrivate($job, 'cleanCommentMarkers');
$mapping = $this->getMappings('comments_read_markers');
$this->assertCount(1, $mapping);
@@ -253,7 +244,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase {
$query = $this->connection->getQueryBuilder();
$query->delete('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
- ->execute();
+ ->executeStatement();
$this->cleanMapping('comments_read_markers');
}
}
diff --git a/apps/files/tests/BackgroundJob/ScanFilesTest.php b/apps/files/tests/BackgroundJob/ScanFilesTest.php
index 5b2d52b48d3..00d9ed823f9 100644
--- a/apps/files/tests/BackgroundJob/ScanFilesTest.php
+++ b/apps/files/tests/BackgroundJob/ScanFilesTest.php
@@ -1,34 +1,23 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\BackgroundJob;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Temporary;
use OCA\Files\BackgroundJob\ScanFiles;
+use OCP\AppFramework\Utility\ITimeFactory;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Files\Config\IUserMountCache;
use OCP\IConfig;
+use OCP\IDBConnection;
use OCP\IUser;
+use OCP\Server;
use Psr\Log\LoggerInterface;
use Test\TestCase;
use Test\Traits\MountProviderTrait;
@@ -44,10 +33,8 @@ class ScanFilesTest extends TestCase {
use UserTrait;
use MountProviderTrait;
- /** @var ScanFiles */
- private $scanFiles;
- /** @var \OCP\Files\Config\IUserMountCache */
- private $mountCache;
+ private ScanFiles $scanFiles;
+ private IUserMountCache $mountCache;
protected function setUp(): void {
parent::setUp();
@@ -55,22 +42,23 @@ class ScanFilesTest extends TestCase {
$config = $this->createMock(IConfig::class);
$dispatcher = $this->createMock(IEventDispatcher::class);
$logger = $this->createMock(LoggerInterface::class);
- $connection = \OC::$server->getDatabaseConnection();
- $this->mountCache = \OC::$server->getUserMountCache();
+ $connection = Server::get(IDBConnection::class);
+ $this->mountCache = Server::get(IUserMountCache::class);
- $this->scanFiles = $this->getMockBuilder('\OCA\Files\BackgroundJob\ScanFiles')
+ $this->scanFiles = $this->getMockBuilder(ScanFiles::class)
->setConstructorArgs([
$config,
$dispatcher,
$logger,
$connection,
+ $this->createMock(ITimeFactory::class)
])
- ->setMethods(['runScanner'])
+ ->onlyMethods(['runScanner'])
->getMock();
}
- private function runJob() {
- $this->invokePrivate($this->scanFiles, 'run', [[]]);
+ private function runJob(): void {
+ self::invokePrivate($this->scanFiles, 'run', [[]]);
}
private function getUser(string $userId): IUser {
@@ -93,7 +81,7 @@ class ScanFilesTest extends TestCase {
return $storage;
}
- public function testAllScanned() {
+ public function testAllScanned(): void {
$this->setupStorage('foouser', '/foousers/files/foo');
$this->scanFiles->expects($this->never())
@@ -101,7 +89,7 @@ class ScanFilesTest extends TestCase {
$this->runJob();
}
- public function testUnscanned() {
+ public function testUnscanned(): void {
$storage = $this->setupStorage('foouser', '/foousers/files/foo');
$storage->getCache()->put('foo', ['size' => -1]);
diff --git a/apps/files/tests/Command/DeleteOrphanedFilesTest.php b/apps/files/tests/Command/DeleteOrphanedFilesTest.php
index bf266bc8229..a488915e0cb 100644
--- a/apps/files/tests/Command/DeleteOrphanedFilesTest.php
+++ b/apps/files/tests/Command/DeleteOrphanedFilesTest.php
@@ -1,34 +1,20 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\Command;
use OC\Files\View;
use OCA\Files\Command\DeleteOrphanedFiles;
+use OCP\Files\IRootFolder;
use OCP\Files\StorageNotAvailableException;
+use OCP\IDBConnection;
+use OCP\IUserManager;
+use OCP\Server;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
@@ -42,36 +28,25 @@ use Test\TestCase;
*/
class DeleteOrphanedFilesTest extends TestCase {
- /**
- * @var DeleteOrphanedFiles
- */
- private $command;
-
- /**
- * @var \OCP\IDBConnection
- */
- private $connection;
-
- /**
- * @var string
- */
- private $user1;
+ private DeleteOrphanedFiles $command;
+ private IDBConnection $connection;
+ private string $user1;
protected function setUp(): void {
parent::setUp();
- $this->connection = \OC::$server->getDatabaseConnection();
+ $this->connection = Server::get(IDBConnection::class);
$this->user1 = $this->getUniqueID('user1_');
- $userManager = \OC::$server->getUserManager();
+ $userManager = Server::get(IUserManager::class);
$userManager->createUser($this->user1, 'pass');
$this->command = new DeleteOrphanedFiles($this->connection);
}
protected function tearDown(): void {
- $userManager = \OC::$server->getUserManager();
+ $userManager = Server::get(IUserManager::class);
$user1 = $userManager->get($this->user1);
if ($user1) {
$user1->delete();
@@ -82,33 +57,36 @@ class DeleteOrphanedFilesTest extends TestCase {
parent::tearDown();
}
- protected function getFile($fileId) {
- $stmt = $this->connection->executeQuery('SELECT * FROM `*PREFIX*filecache` WHERE `fileid` = ?', [$fileId]);
- return $stmt->fetchAll();
+ protected function getFile(int $fileId): array {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('*')
+ ->from('filecache')
+ ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId)));
+ return $query->executeQuery()->fetchAll();
}
- protected function getMounts($storageId) {
- $stmt = $this->connection->executeQuery('SELECT * FROM `*PREFIX*mounts` WHERE `storage_id` = ?', [$storageId]);
- return $stmt->fetchAll();
+ protected function getMounts(int $storageId): array {
+ $query = $this->connection->getQueryBuilder();
+ $query->select('*')
+ ->from('mounts')
+ ->where($query->expr()->eq('storage_id', $query->createNamedParameter($storageId)));
+ return $query->executeQuery()->fetchAll();
}
/**
* Test clearing orphaned files
*/
- public function testClearFiles() {
- $input = $this->getMockBuilder(InputInterface::class)
- ->disableOriginalConstructor()
- ->getMock();
- $output = $this->getMockBuilder(OutputInterface::class)
- ->disableOriginalConstructor()
- ->getMock();
+ public function testClearFiles(): void {
+ $input = $this->createMock(InputInterface::class);
+ $output = $this->createMock(OutputInterface::class);
+
+ $rootFolder = Server::get(IRootFolder::class);
// scan home storage so that mounts are properly setup
- \OC::$server->getRootFolder()->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');
+ $rootFolder->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');
$this->loginAsUser($this->user1);
-
$view = new View('/' . $this->user1 . '/');
$view->mkdir('files/test');
@@ -131,21 +109,26 @@ class DeleteOrphanedFilesTest extends TestCase {
$this->assertSame(1, $deletedRows, 'Asserts that storage got deleted');
// parent folder, `files`, ´test` and `welcome.txt` => 4 elements
+ $calls = [
+ '3 orphaned file cache entries deleted',
+ '0 orphaned file cache extended entries deleted',
+ '1 orphaned mount entries deleted',
+ ];
$output
- ->expects($this->at(0))
- ->method('writeln')
- ->with('3 orphaned file cache entries deleted');
-
- $output
- ->expects($this->at(1))
+ ->expects($this->exactly(3))
->method('writeln')
- ->with('1 orphaned mount entries deleted');
+ ->willReturnCallback(function (string $message) use (&$calls): void {
+ $expected = array_shift($calls);
+ $this->assertSame($expected, $message);
+ });
$this->command->execute($input, $output);
$this->assertCount(0, $this->getFile($fileInfo->getId()), 'Asserts that file gets cleaned up');
$this->assertCount(0, $this->getMounts($numericStorageId), 'Asserts that mount gets cleaned up');
+ // Rescan folder to add back to cache before deleting
+ $rootFolder->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');
// since we deleted the storage it might throw a (valid) StorageNotAvailableException
try {
$view->unlink('files/test');
diff --git a/apps/files/tests/Controller/ApiControllerTest.php b/apps/files/tests/Controller/ApiControllerTest.php
index 73728bd6a4a..e74989eb2f5 100644
--- a/apps/files/tests/Controller/ApiControllerTest.php
+++ b/apps/files/tests/Controller/ApiControllerTest.php
@@ -1,46 +1,38 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Controller;
use OCA\Files\Service\TagService;
+use OCA\Files\Service\UserConfig;
+use OCA\Files\Service\ViewConfig;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\FileDisplayResponse;
+use OCP\AppFramework\Http\Response;
use OCP\Files\File;
use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
+use OCP\Files\Storage\ISharedStorage;
+use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
+use OCP\IL10N;
use OCP\IPreview;
use OCP\IRequest;
use OCP\IUser;
use OCP\IUserSession;
use OCP\Share\IManager;
+use OCP\Share\IShare;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
/**
@@ -49,31 +41,25 @@ use Test\TestCase;
* @package OCA\Files\Controller
*/
class ApiControllerTest extends TestCase {
- /** @var string */
- private $appName = 'files';
- /** @var \OCP\IUser */
- private $user;
- /** @var IRequest */
- private $request;
- /** @var TagService */
- private $tagService;
- /** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */
- private $preview;
- /** @var ApiController */
- private $apiController;
- /** @var \OCP\Share\IManager */
- private $shareManager;
- /** @var \OCP\IConfig */
- private $config;
- /** @var Folder|\PHPUnit\Framework\MockObject\MockObject */
- private $userFolder;
+ private string $appName = 'files';
+ private IUser $user;
+ private IRequest $request;
+ private TagService $tagService;
+ private IPreview&MockObject $preview;
+ private ApiController $apiController;
+ private IManager $shareManager;
+ private IConfig $config;
+ private Folder&MockObject $userFolder;
+ private UserConfig&MockObject $userConfig;
+ private ViewConfig&MockObject $viewConfig;
+ private IL10N&MockObject $l10n;
+ private IRootFolder&MockObject $rootFolder;
+ private LoggerInterface&MockObject $logger;
protected function setUp(): void {
parent::setUp();
- $this->request = $this->getMockBuilder(IRequest::class)
- ->disableOriginalConstructor()
- ->getMock();
+ $this->request = $this->createMock(IRequest::class);
$this->user = $this->createMock(IUser::class);
$this->user->expects($this->any())
->method('getUID')
@@ -82,19 +68,16 @@ class ApiControllerTest extends TestCase {
$userSession->expects($this->any())
->method('getUser')
->willReturn($this->user);
- $this->tagService = $this->getMockBuilder(TagService::class)
- ->disableOriginalConstructor()
- ->getMock();
- $this->shareManager = $this->getMockBuilder(IManager::class)
- ->disableOriginalConstructor()
- ->getMock();
- $this->preview = $this->getMockBuilder(IPreview::class)
- ->disableOriginalConstructor()
- ->getMock();
+ $this->tagService = $this->createMock(TagService::class);
+ $this->shareManager = $this->createMock(IManager::class);
+ $this->preview = $this->createMock(IPreview::class);
$this->config = $this->createMock(IConfig::class);
- $this->userFolder = $this->getMockBuilder(Folder::class)
- ->disableOriginalConstructor()
- ->getMock();
+ $this->userFolder = $this->createMock(Folder::class);
+ $this->userConfig = $this->createMock(UserConfig::class);
+ $this->viewConfig = $this->createMock(ViewConfig::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
$this->apiController = new ApiController(
$this->appName,
@@ -104,16 +87,21 @@ class ApiControllerTest extends TestCase {
$this->preview,
$this->shareManager,
$this->config,
- $this->userFolder
+ $this->userFolder,
+ $this->userConfig,
+ $this->viewConfig,
+ $this->l10n,
+ $this->rootFolder,
+ $this->logger,
);
}
- public function testUpdateFileTagsEmpty() {
+ public function testUpdateFileTagsEmpty(): void {
$expected = new DataResponse([]);
$this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt'));
}
- public function testUpdateFileTagsWorking() {
+ public function testUpdateFileTagsWorking(): void {
$this->tagService->expects($this->once())
->method('updateFileTags')
->with('/path.txt', ['Tag1', 'Tag2']);
@@ -127,37 +115,37 @@ class ApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt', ['Tag1', 'Tag2']));
}
- public function testUpdateFileTagsNotFoundException() {
+ public function testUpdateFileTagsNotFoundException(): void {
$this->tagService->expects($this->once())
->method('updateFileTags')
->with('/path.txt', ['Tag1', 'Tag2'])
- ->will($this->throwException(new NotFoundException('My error message')));
+ ->willThrowException(new NotFoundException('My error message'));
$expected = new DataResponse(['message' => 'My error message'], Http::STATUS_NOT_FOUND);
$this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt', ['Tag1', 'Tag2']));
}
- public function testUpdateFileTagsStorageNotAvailableException() {
+ public function testUpdateFileTagsStorageNotAvailableException(): void {
$this->tagService->expects($this->once())
->method('updateFileTags')
->with('/path.txt', ['Tag1', 'Tag2'])
- ->will($this->throwException(new StorageNotAvailableException('My error message')));
+ ->willThrowException(new StorageNotAvailableException('My error message'));
$expected = new DataResponse(['message' => 'My error message'], Http::STATUS_SERVICE_UNAVAILABLE);
$this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt', ['Tag1', 'Tag2']));
}
- public function testUpdateFileTagsStorageGenericException() {
+ public function testUpdateFileTagsStorageGenericException(): void {
$this->tagService->expects($this->once())
->method('updateFileTags')
->with('/path.txt', ['Tag1', 'Tag2'])
- ->will($this->throwException(new \Exception('My error message')));
+ ->willThrowException(new \Exception('My error message'));
$expected = new DataResponse(['message' => 'My error message'], Http::STATUS_NOT_FOUND);
$this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt', ['Tag1', 'Tag2']));
}
- public function testGetThumbnailInvalidSize() {
+ public function testGetThumbnailInvalidSize(): void {
$this->userFolder->method('get')
->with($this->equalTo(''))
->willThrowException(new NotFoundException());
@@ -165,8 +153,13 @@ class ApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->apiController->getThumbnail(0, 0, ''));
}
- public function testGetThumbnailInvalidImage() {
+ public function testGetThumbnailInvalidImage(): void {
+ $storage = $this->createMock(IStorage::class);
+ $storage->method('instanceOfStorage')->with(ISharedStorage::class)->willReturn(false);
+
$file = $this->createMock(File::class);
+ $file->method('getId')->willReturn(123);
+ $file->method('getStorage')->willReturn($storage);
$this->userFolder->method('get')
->with($this->equalTo('unknown.jpg'))
->willReturn($file);
@@ -178,8 +171,65 @@ class ApiControllerTest extends TestCase {
$this->assertEquals($expected, $this->apiController->getThumbnail(10, 10, 'unknown.jpg'));
}
- public function testGetThumbnail() {
+ public function testGetThumbnailInvalidPartFile(): void {
+ $file = $this->createMock(File::class);
+ $file->method('getId')->willReturn(0);
+ $this->userFolder->method('get')
+ ->with($this->equalTo('unknown.jpg'))
+ ->willReturn($file);
+ $expected = new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
+ $this->assertEquals($expected, $this->apiController->getThumbnail(10, 10, 'unknown.jpg'));
+ }
+
+ public function testGetThumbnailSharedNoDownload(): void {
+ $share = $this->createMock(IShare::class);
+ $share->expects(self::once())
+ ->method('canSeeContent')
+ ->willReturn(false);
+
+ $storage = $this->createMock(ISharedStorage::class);
+ $storage->expects(self::once())
+ ->method('instanceOfStorage')
+ ->with(ISharedStorage::class)
+ ->willReturn(true);
+ $storage->expects(self::once())
+ ->method('getShare')
+ ->willReturn($share);
+
+ $file = $this->createMock(File::class);
+ $file->method('getId')->willReturn(123);
+ $file->method('getStorage')->willReturn($storage);
+
+ $this->userFolder->method('get')
+ ->with('unknown.jpg')
+ ->willReturn($file);
+
+ $this->preview->expects($this->never())
+ ->method('getPreview');
+
+ $expected = new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
+ $this->assertEquals($expected, $this->apiController->getThumbnail(10, 10, 'unknown.jpg'));
+ }
+
+ public function testGetThumbnailShared(): void {
+ $share = $this->createMock(IShare::class);
+ $share->expects(self::once())
+ ->method('canSeeContent')
+ ->willReturn(true);
+
+ $storage = $this->createMock(ISharedStorage::class);
+ $storage->expects(self::once())
+ ->method('instanceOfStorage')
+ ->with(ISharedStorage::class)
+ ->willReturn(true);
+ $storage->expects(self::once())
+ ->method('getShare')
+ ->willReturn($share);
+
$file = $this->createMock(File::class);
+ $file->method('getId')->willReturn(123);
+ $file->method('getStorage')->willReturn($storage);
+
$this->userFolder->method('get')
->with($this->equalTo('known.jpg'))
->willReturn($file);
@@ -194,69 +244,55 @@ class ApiControllerTest extends TestCase {
$ret = $this->apiController->getThumbnail(10, 10, 'known.jpg');
$this->assertEquals(Http::STATUS_OK, $ret->getStatus());
- $this->assertInstanceOf(Http\FileDisplayResponse::class, $ret);
+ $this->assertInstanceOf(FileDisplayResponse::class, $ret);
}
- public function testUpdateFileSorting() {
- $mode = 'mtime';
- $direction = 'desc';
-
- $this->config->expects($this->at(0))
- ->method('setUserValue')
- ->with($this->user->getUID(), 'files', 'file_sorting', $mode);
- $this->config->expects($this->at(1))
- ->method('setUserValue')
- ->with($this->user->getUID(), 'files', 'file_sorting_direction', $direction);
+ public function testGetThumbnail(): void {
+ $storage = $this->createMock(IStorage::class);
+ $storage->method('instanceOfStorage')->with(ISharedStorage::class)->willReturn(false);
- $expected = new HTTP\Response();
- $actual = $this->apiController->updateFileSorting($mode, $direction);
- $this->assertEquals($expected, $actual);
- }
-
- public function invalidSortingModeData() {
- return [
- ['color', 'asc'],
- ['name', 'size'],
- ['foo', 'bar']
- ];
- }
-
- /**
- * @dataProvider invalidSortingModeData
- */
- public function testUpdateInvalidFileSorting($mode, $direction) {
- $this->config->expects($this->never())
- ->method('setUserValue');
+ $file = $this->createMock(File::class);
+ $file->method('getId')->willReturn(123);
+ $file->method('getStorage')->willReturn($storage);
- $expected = new Http\Response(null);
- $expected->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
+ $this->userFolder->method('get')
+ ->with($this->equalTo('known.jpg'))
+ ->willReturn($file);
+ $preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('my name');
+ $preview->method('getMTime')->willReturn(42);
+ $this->preview->expects($this->once())
+ ->method('getPreview')
+ ->with($this->equalTo($file), 10, 10, true)
+ ->willReturn($preview);
- $result = $this->apiController->updateFileSorting($mode, $direction);
+ $ret = $this->apiController->getThumbnail(10, 10, 'known.jpg');
- $this->assertEquals($expected, $result);
+ $this->assertEquals(Http::STATUS_OK, $ret->getStatus());
+ $this->assertInstanceOf(FileDisplayResponse::class, $ret);
}
- public function testShowHiddenFiles() {
+ public function testShowHiddenFiles(): void {
$show = false;
$this->config->expects($this->once())
->method('setUserValue')
->with($this->user->getUID(), 'files', 'show_hidden', '0');
- $expected = new Http\Response();
+ $expected = new Response();
$actual = $this->apiController->showHiddenFiles($show);
$this->assertEquals($expected, $actual);
}
- public function testCropImagePreviews() {
+ public function testCropImagePreviews(): void {
$crop = true;
$this->config->expects($this->once())
->method('setUserValue')
->with($this->user->getUID(), 'files', 'crop_image_previews', '1');
- $expected = new Http\Response();
+ $expected = new Response();
$actual = $this->apiController->cropImagePreviews($crop);
$this->assertEquals($expected, $actual);
diff --git a/apps/files/tests/Controller/ConversionApiControllerTest.php b/apps/files/tests/Controller/ConversionApiControllerTest.php
new file mode 100644
index 00000000000..659fbe1a956
--- /dev/null
+++ b/apps/files/tests/Controller/ConversionApiControllerTest.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files\Controller;
+
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCS\OCSException;
+use OCP\AppFramework\OCS\OCSNotFoundException;
+use OCP\Files\Conversion\IConversionManager;
+use OCP\Files\File;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\IL10N;
+use OCP\IRequest;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+/**
+ * Class ConversionApiController
+ *
+ * @package OCA\Files\Controller
+ */
+class ConversionApiControllerTest extends TestCase {
+ private string $appName = 'files';
+ private ConversionApiController $conversionApiController;
+ private IRequest&MockObject $request;
+ private IConversionManager&MockObject $fileConversionManager;
+ private IRootFolder&MockObject $rootFolder;
+ private File&MockObject $file;
+ private Folder&MockObject $userFolder;
+ private IL10N&MockObject $l10n;
+ private string $user;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->request = $this->createMock(IRequest::class);
+ $this->fileConversionManager = $this->createMock(IConversionManager::class);
+ $this->file = $this->createMock(File::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->user = 'userid';
+
+ $this->userFolder = $this->createMock(Folder::class);
+
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->rootFolder->method('getUserFolder')->with($this->user)->willReturn($this->userFolder);
+
+ $this->conversionApiController = new ConversionApiController(
+ $this->appName,
+ $this->request,
+ $this->fileConversionManager,
+ $this->rootFolder,
+ $this->l10n,
+ $this->user,
+ );
+ }
+
+ public function testThrowsNotFoundException(): void {
+ $this->expectException(OCSNotFoundException::class);
+ $this->conversionApiController->convert(42, 'image/png');
+ }
+
+ public function testThrowsOcsException(): void {
+ $this->userFolder->method('getFirstNodeById')->with(42)->willReturn($this->file);
+ $this->fileConversionManager->method('convert')->willThrowException(new \Exception());
+
+ $this->expectException(OCSException::class);
+ $this->conversionApiController->convert(42, 'image/png');
+ }
+
+ public function testConvert(): void {
+ $convertedFileAbsolutePath = $this->user . '/files/test.png';
+
+ $this->userFolder->method('getFirstNodeById')->with(42)->willReturn($this->file);
+ $this->userFolder->method('getRelativePath')->with($convertedFileAbsolutePath)->willReturn('/test.png');
+ $this->userFolder->method('get')->with('/test.png')->willReturn($this->file);
+
+ $this->file->method('getId')->willReturn(42);
+
+ $this->fileConversionManager->method('convert')->with($this->file, 'image/png', null)->willReturn($convertedFileAbsolutePath);
+
+ $actual = $this->conversionApiController->convert(42, 'image/png', null);
+ $expected = new DataResponse([
+ 'path' => '/test.png',
+ 'fileId' => 42,
+ ], Http::STATUS_CREATED);
+
+ $this->assertEquals($expected, $actual);
+ }
+}
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index cebb50860d3..01aa955a13e 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -1,102 +1,88 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Michael Weimann <mail@michael-weimann.eu>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\Controller;
-use OCA\Files\Activity\Helper;
+use OC\Files\FilenameValidator;
+use OC\Route\Router;
+use OC\URLGenerator;
use OCA\Files\Controller\ViewController;
+use OCA\Files\Service\UserConfig;
+use OCA\Files\Service\ViewConfig;
use OCP\App\IAppManager;
-use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\ContentSecurityPolicy;
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
+use OCP\Authentication\TwoFactorAuth\IRegistry;
+use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Template\ITemplateManager;
+use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserSession;
-use OCP\Share\IManager;
-use OCP\Template;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
use Test\TestCase;
/**
* Class ViewControllerTest
*
+ * @group RoutingWeirdness
+ *
* @package OCA\Files\Tests\Controller
*/
class ViewControllerTest extends TestCase {
- /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */
- private $request;
- /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */
- private $urlGenerator;
- /** @var IL10N */
- private $l10n;
- /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
- private $config;
- /** @var EventDispatcherInterface */
- private $eventDispatcher;
- /** @var ViewController|\PHPUnit\Framework\MockObject\MockObject */
- private $viewController;
- /** @var IUser */
- private $user;
- /** @var IUserSession */
- private $userSession;
- /** @var IAppManager|\PHPUnit\Framework\MockObject\MockObject */
- private $appManager;
- /** @var IRootFolder|\PHPUnit\Framework\MockObject\MockObject */
- private $rootFolder;
- /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */
- private $activityHelper;
- /** @var IInitialState|\PHPUnit\Framework\MockObject\MockObject */
- private $initialState;
- /** @var ITemplateManager|\PHPUnit\Framework\MockObject\MockObject */
- private $templateManager;
- /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */
- private $shareManager;
+ private ContainerInterface&MockObject $container;
+ private IAppManager&MockObject $appManager;
+ private ICacheFactory&MockObject $cacheFactory;
+ private IConfig&MockObject $config;
+ private IEventDispatcher $eventDispatcher;
+ private IEventLogger&MockObject $eventLogger;
+ private IInitialState&MockObject $initialState;
+ private IL10N&MockObject $l10n;
+ private IRequest&MockObject $request;
+ private IRootFolder&MockObject $rootFolder;
+ private ITemplateManager&MockObject $templateManager;
+ private IURLGenerator $urlGenerator;
+ private IUser&MockObject $user;
+ private IUserSession&MockObject $userSession;
+ private LoggerInterface&MockObject $logger;
+ private UserConfig&MockObject $userConfig;
+ private ViewConfig&MockObject $viewConfig;
+ private Router $router;
+ private IRegistry&MockObject $twoFactorRegistry;
+
+ private ViewController&MockObject $viewController;
protected function setUp(): void {
parent::setUp();
- $this->request = $this->getMockBuilder(IRequest::class)->getMock();
- $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class)->getMock();
- $this->l10n = $this->getMockBuilder(IL10N::class)->getMock();
- $this->config = $this->getMockBuilder(IConfig::class)->getMock();
+ $this->appManager = $this->createMock(IAppManager::class);
+ $this->config = $this->createMock(IConfig::class);
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
- $this->userSession = $this->getMockBuilder(IUserSession::class)->getMock();
- $this->appManager = $this->getMockBuilder('\OCP\App\IAppManager')->getMock();
+ $this->initialState = $this->createMock(IInitialState::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->request = $this->createMock(IRequest::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->templateManager = $this->createMock(ITemplateManager::class);
+ $this->userConfig = $this->createMock(UserConfig::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->viewConfig = $this->createMock(ViewConfig::class);
+ $this->twoFactorRegistry = $this->createMock(IRegistry::class);
+
$this->user = $this->getMockBuilder(IUser::class)->getMock();
$this->user->expects($this->any())
->method('getUID')
@@ -104,12 +90,42 @@ class ViewControllerTest extends TestCase {
$this->userSession->expects($this->any())
->method('getUser')
->willReturn($this->user);
- $this->rootFolder = $this->getMockBuilder('\OCP\Files\IRootFolder')->getMock();
- $this->activityHelper = $this->createMock(Helper::class);
- $this->initialState = $this->createMock(IInitialState::class);
- $this->templateManager = $this->createMock(ITemplateManager::class);
- $this->shareManager = $this->createMock(IManager::class);
- $this->viewController = $this->getMockBuilder('\OCA\Files\Controller\ViewController')
+
+ // Make sure we know the app is enabled
+ $this->appManager->expects($this->any())
+ ->method('cleanAppId')
+ ->willReturnArgument(0);
+ $this->appManager->expects($this->any())
+ ->method('getAppPath')
+ ->willReturnCallback(fn (string $appid): string => \OC::$SERVERROOT . '/apps/' . $appid);
+ $this->appManager->expects($this->any())
+ ->method('isAppLoaded')
+ ->willReturn(true);
+
+ $this->cacheFactory = $this->createMock(ICacheFactory::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->eventLogger = $this->createMock(IEventLogger::class);
+ $this->container = $this->createMock(ContainerInterface::class);
+ $this->router = new Router(
+ $this->logger,
+ $this->request,
+ $this->config,
+ $this->eventLogger,
+ $this->container,
+ $this->appManager,
+ );
+
+ // Create a real URLGenerator instance to generate URLs
+ $this->urlGenerator = new URLGenerator(
+ $this->config,
+ $this->userSession,
+ $this->cacheFactory,
+ $this->request,
+ $this->router
+ );
+
+ $filenameValidator = $this->createMock(FilenameValidator::class);
+ $this->viewController = $this->getMockBuilder(ViewController::class)
->setConstructorArgs([
'files',
$this->request,
@@ -120,21 +136,22 @@ class ViewControllerTest extends TestCase {
$this->userSession,
$this->appManager,
$this->rootFolder,
- $this->activityHelper,
$this->initialState,
$this->templateManager,
- $this->shareManager,
+ $this->userConfig,
+ $this->viewConfig,
+ $filenameValidator,
+ $this->twoFactorRegistry,
])
- ->setMethods([
- 'getStorageInfo',
- 'renderScript'
- ])
- ->getMock();
+ ->onlyMethods([
+ 'getStorageInfo',
+ ])
+ ->getMock();
}
- public function testIndexWithRegularBrowser() {
+ public function testIndexWithRegularBrowser(): void {
$this->viewController
- ->expects($this->once())
+ ->expects($this->any())
->method('getStorageInfo')
->willReturn([
'used' => 123,
@@ -144,437 +161,153 @@ class ViewControllerTest extends TestCase {
'owner' => 'MyName',
'ownerDisplayName' => 'MyDisplayName',
]);
+
$this->config
->method('getUserValue')
->willReturnMap([
[$this->user->getUID(), 'files', 'file_sorting', 'name', 'name'],
[$this->user->getUID(), 'files', 'file_sorting_direction', 'asc', 'asc'],
+ [$this->user->getUID(), 'files', 'files_sorting_configs', '{}', '{}'],
[$this->user->getUID(), 'files', 'show_hidden', false, false],
[$this->user->getUID(), 'files', 'crop_image_previews', true, true],
[$this->user->getUID(), 'files', 'show_grid', true],
]);
+ $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock();
+
+ $this->rootFolder->expects($this->any())
+ ->method('getUserFolder')
+ ->with('testuser1')
+ ->willReturn($baseFolderFiles);
+
$this->config
- ->expects($this->any())
- ->method('getAppValue')
- ->willReturnArgument(2);
- $this->shareManager->method('shareApiAllowLinks')
- ->willReturn(true);
+ ->expects($this->any())
+ ->method('getAppValue')
+ ->willReturnArgument(2);
- $nav = new Template('files', 'appnavigation');
- $nav->assign('usage_relative', 123);
- $nav->assign('usage', '123 B');
- $nav->assign('quota', 100);
- $nav->assign('total_space', '100 B');
- $nav->assign('webdav_url', 'http://localhost/remote.php/dav/files/testuser1/');
- $nav->assign('navigationItems', [
- 'files' => [
- 'id' => 'files',
- 'appname' => 'files',
- 'script' => 'list.php',
- 'order' => 0,
- 'name' => \OC::$server->getL10N('files')->t('All files'),
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'classes' => '',
- 'unread' => 0,
- ],
- 'recent' => [
- 'id' => 'recent',
- 'appname' => 'files',
- 'script' => 'recentlist.php',
- 'order' => 2,
- 'name' => \OC::$server->getL10N('files')->t('Recent'),
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'classes' => '',
- 'unread' => 0,
- ],
- 'favorites' => [
- 'id' => 'favorites',
- 'appname' => 'files',
- 'script' => 'simplelist.php',
- 'order' => 5,
- 'name' => \OC::$server->getL10N('files')->t('Favorites'),
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'classes' => 'collapsible',
- 'sublist' => [
- [
- 'id' => '-test1',
- 'view' => 'files',
- 'href' => '',
- 'dir' => '/test1',
- 'order' => 6,
- 'folderPosition' => 1,
- 'name' => 'test1',
- 'icon' => 'files',
- 'quickaccesselement' => 'true',
- ],
- [
- 'name' => 'test2',
- 'id' => '-test2-',
- 'view' => 'files',
- 'href' => '',
- 'dir' => '/test2/',
- 'order' => 7,
- 'folderPosition' => 2,
- 'icon' => 'files',
- 'quickaccesselement' => 'true',
- ],
- [
- 'name' => 'sub4',
- 'id' => '-test3-sub4',
- 'view' => 'files',
- 'href' => '',
- 'dir' => '/test3/sub4',
- 'order' => 8,
- 'folderPosition' => 3,
- 'icon' => 'files',
- 'quickaccesselement' => 'true',
- ],
- [
- 'name' => 'sub6',
- 'id' => '-test5-sub6-',
- 'view' => 'files',
- 'href' => '',
- 'dir' => '/test5/sub6/',
- 'order' => 9,
- 'folderPosition' => 4,
- 'icon' => 'files',
- 'quickaccesselement' => 'true',
- ],
- ],
- 'defaultExpandedState' => false,
- 'expandedState' => 'show_Quick_Access',
- 'unread' => 0,
- ],
- 'systemtagsfilter' => [
- 'id' => 'systemtagsfilter',
- 'appname' => 'systemtags',
- 'script' => 'list.php',
- 'order' => 25,
- 'name' => \OC::$server->getL10N('systemtags')->t('Tags'),
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'classes' => '',
- 'unread' => 0,
- ],
- 'trashbin' => [
- 'id' => 'trashbin',
- 'appname' => 'files_trashbin',
- 'script' => 'list.php',
- 'order' => 50,
- 'name' => \OC::$server->getL10N('files_trashbin')->t('Deleted files'),
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'classes' => 'pinned',
- 'unread' => 0,
- ],
- 'shareoverview' => [
- 'id' => 'shareoverview',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 18,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Shares'),
- 'classes' => 'collapsible',
- 'sublist' => [
- [
- 'id' => 'sharingout',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 16,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Shared with others'),
- ],
- [
- 'id' => 'sharingin',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 15,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Shared with you'),
- ],
- [
- 'id' => 'sharinglinks',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 17,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Shared by link', []),
- ],
- [
- 'id' => 'deletedshares',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 19,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Deleted shares'),
- ],
- [
- 'id' => 'pendingshares',
- 'appname' => 'files_sharing',
- 'script' => 'list.php',
- 'order' => 19,
- 'name' => \OC::$server->getL10N('files_sharing')->t('Pending shares'),
- ],
- ],
- 'active' => false,
- 'icon' => '',
- 'type' => 'link',
- 'expandedState' => 'show_sharing_menu',
- 'defaultExpandedState' => false,
- 'unread' => 0,
- ]
- ]);
-
- $expected = new Http\TemplateResponse(
+ $expected = new TemplateResponse(
'files',
'index',
- [
- 'usedSpacePercent' => 123,
- 'owner' => 'MyName',
- 'ownerDisplayName' => 'MyDisplayName',
- 'isPublic' => false,
- 'defaultFileSorting' => 'name',
- 'defaultFileSortingDirection' => 'asc',
- 'showHiddenFiles' => 0,
- 'cropImagePreviews' => 1,
- 'fileNotFound' => 0,
- 'allowShareWithLink' => 'yes',
- 'appNavigation' => $nav,
- 'appContents' => [
- 'files' => [
- 'id' => 'files',
- 'content' => null,
- ],
- 'recent' => [
- 'id' => 'recent',
- 'content' => null,
- ],
- 'favorites' => [
- 'id' => 'favorites',
- 'content' => null,
- ],
- 'systemtagsfilter' => [
- 'id' => 'systemtagsfilter',
- 'content' => null,
- ],
- 'trashbin' => [
- 'id' => 'trashbin',
- 'content' => null,
- ],
- 'sharingout' => [
- 'id' => 'sharingout',
- 'content' => null,
- ],
- 'sharingin' => [
- 'id' => 'sharingin',
- 'content' => null,
- ],
- 'sharinglinks' => [
- 'id' => 'sharinglinks',
- 'content' => null,
- ],
- 'deletedshares' => [
- 'id' => 'deletedshares',
- 'content' => null,
- ],
- 'pendingshares' => [
- 'id' => 'pendingshares',
- 'content' => null
- ],
- 'shareoverview' => [
- 'id' => 'shareoverview',
- 'content' => null,
- ],
- '-test1' => [
- 'id' => '-test1',
- 'content' => '',
- ],
- '-test2-' => [
- 'id' => '-test2-',
- 'content' => '',
- ],
- '-test3-sub4' => [
- 'id' => '-test3-sub4',
- 'content' => '',
- ],
- '-test5-sub6-' => [
- 'id' => '-test5-sub6-',
- 'content' => '',
- ],
- ],
- 'hiddenFields' => [],
- 'showgridview' => false
- ]
);
- $policy = new Http\ContentSecurityPolicy();
+ $policy = new ContentSecurityPolicy();
+ $policy->addAllowedWorkerSrcDomain('\'self\'');
$policy->addAllowedFrameDomain('\'self\'');
$expected->setContentSecurityPolicy($policy);
- $this->activityHelper->method('getFavoriteFilePaths')
- ->with($this->user->getUID())
- ->willReturn([
- 'item' => [],
- 'folders' => [
- '/test1',
- '/test2/',
- '/test3/sub4',
- '/test5/sub6/',
- ],
- ]);
-
$this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView'));
}
- public function testShowFileRouteWithFolder() {
- $node = $this->getMockBuilder(Folder::class)->getMock();
- $node->expects($this->once())
- ->method('getPath')
- ->willReturn('/testuser1/files/test/sub');
+ public static function dataTestShortRedirect(): array {
+ // openfile is true by default
+ // opendetails is undefined by default
+ // both will be evaluated as truthy
+ return [
+ [null, null, '/index.php/apps/files/files/123456?openfile=true'],
+ ['', null, '/index.php/apps/files/files/123456?openfile=true'],
+ [null, '', '/index.php/apps/files/files/123456?openfile=true&opendetails=true'],
+ ['', '', '/index.php/apps/files/files/123456?openfile=true&opendetails=true'],
+ ['false', '', '/index.php/apps/files/files/123456?openfile=false'],
+ [null, 'false', '/index.php/apps/files/files/123456?openfile=true&opendetails=false'],
+ ['true', 'false', '/index.php/apps/files/files/123456?openfile=true&opendetails=false'],
+ ['false', 'true', '/index.php/apps/files/files/123456?openfile=false&opendetails=true'],
+ ['false', 'false', '/index.php/apps/files/files/123456?openfile=false&opendetails=false'],
+ ];
+ }
- $baseFolder = $this->getMockBuilder(Folder::class)->getMock();
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataTestShortRedirect')]
+ public function testShortRedirect(?string $openfile, ?string $opendetails, string $result): void {
+ $this->appManager->expects($this->any())
+ ->method('isEnabledForUser')
+ ->with('files')
+ ->willReturn(true);
- $this->rootFolder->expects($this->once())
+ $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock();
+ $this->rootFolder->expects($this->any())
->method('getUserFolder')
->with('testuser1')
- ->willReturn($baseFolder);
-
- $baseFolder->expects($this->at(0))
- ->method('getById')
- ->with(123)
- ->willReturn([$node]);
- $baseFolder->expects($this->at(1))
- ->method('getRelativePath')
- ->with('/testuser1/files/test/sub')
- ->willReturn('/test/sub');
-
- $this->urlGenerator
- ->expects($this->once())
- ->method('linkToRoute')
- ->with('files.view.index', ['dir' => '/test/sub'])
- ->willReturn('/apps/files/?dir=/test/sub');
-
- $expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub');
- $this->assertEquals($expected, $this->viewController->index('', '', '123'));
- }
+ ->willReturn($baseFolderFiles);
- public function testShowFileRouteWithFile() {
$parentNode = $this->getMockBuilder(Folder::class)->getMock();
$parentNode->expects($this->once())
->method('getPath')
- ->willReturn('testuser1/files/test');
-
- $baseFolder = $this->getMockBuilder(Folder::class)->getMock();
-
- $this->rootFolder->expects($this->once())
- ->method('getUserFolder')
- ->with('testuser1')
- ->willReturn($baseFolder);
+ ->willReturn('testuser1/files/Folder');
$node = $this->getMockBuilder(File::class)->getMock();
$node->expects($this->once())
->method('getParent')
->willReturn($parentNode);
- $node->expects($this->once())
- ->method('getName')
- ->willReturn('somefile.txt');
- $baseFolder->expects($this->at(0))
- ->method('getById')
- ->with(123)
- ->willReturn([$node]);
- $baseFolder->expects($this->at(1))
- ->method('getRelativePath')
- ->with('testuser1/files/test')
- ->willReturn('/test');
-
- $this->urlGenerator
- ->expects($this->once())
- ->method('linkToRoute')
- ->with('files.view.index', ['dir' => '/test', 'scrollto' => 'somefile.txt'])
- ->willReturn('/apps/files/?dir=/test/sub&scrollto=somefile.txt');
+ $baseFolderFiles->expects($this->any())
+ ->method('getFirstNodeById')
+ ->with(123456)
+ ->willReturn($node);
- $expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub&scrollto=somefile.txt');
- $this->assertEquals($expected, $this->viewController->index('', '', '123'));
+ $response = $this->viewController->showFile('123456', $opendetails, $openfile);
+ $this->assertStringContainsString($result, $response->getHeaders()['Location']);
}
- public function testShowFileRouteWithInvalidFileId() {
- $baseFolder = $this->getMockBuilder(Folder::class)->getMock();
- $this->rootFolder->expects($this->once())
- ->method('getUserFolder')
- ->with('testuser1')
- ->willReturn($baseFolder);
-
- $baseFolder->expects($this->at(0))
- ->method('getById')
- ->with(123)
- ->willReturn([]);
-
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files.view.index', ['fileNotFound' => true])
- ->willReturn('redirect.url');
-
- $response = $this->viewController->index('', 'MyView', '123');
- $this->assertInstanceOf('OCP\AppFramework\Http\RedirectResponse', $response);
- $this->assertEquals('redirect.url', $response->getRedirectURL());
- }
-
- public function testShowFileRouteWithTrashedFile() {
- $this->appManager->expects($this->once())
+ public function testShowFileRouteWithTrashedFile(): void {
+ $this->appManager->expects($this->exactly(2))
->method('isEnabledForUser')
- ->with('files_trashbin')
->willReturn(true);
- $parentNode = $this->getMockBuilder(Folder::class)->getMock();
+ $parentNode = $this->createMock(Folder::class);
$parentNode->expects($this->once())
->method('getPath')
->willReturn('testuser1/files_trashbin/files/test.d1462861890/sub');
- $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock();
- $baseFolderTrash = $this->getMockBuilder(Folder::class)->getMock();
+ $baseFolderFiles = $this->createMock(Folder::class);
+ $baseFolderTrash = $this->createMock(Folder::class);
- $this->rootFolder->expects($this->at(0))
+ $this->rootFolder->expects($this->any())
->method('getUserFolder')
->with('testuser1')
->willReturn($baseFolderFiles);
- $this->rootFolder->expects($this->at(1))
+ $this->rootFolder->expects($this->once())
->method('get')
->with('testuser1/files_trashbin/files/')
->willReturn($baseFolderTrash);
- $baseFolderFiles->expects($this->once())
- ->method('getById')
+ $baseFolderFiles->expects($this->any())
+ ->method('getFirstNodeById')
->with(123)
- ->willReturn([]);
+ ->willReturn(null);
- $node = $this->getMockBuilder(File::class)->getMock();
+ $node = $this->createMock(File::class);
$node->expects($this->once())
->method('getParent')
->willReturn($parentNode);
- $node->expects($this->once())
- ->method('getName')
- ->willReturn('somefile.txt');
- $baseFolderTrash->expects($this->at(0))
- ->method('getById')
+ $baseFolderTrash->expects($this->once())
+ ->method('getFirstNodeById')
->with(123)
- ->willReturn([$node]);
- $baseFolderTrash->expects($this->at(1))
+ ->willReturn($node);
+ $baseFolderTrash->expects($this->once())
->method('getRelativePath')
->with('testuser1/files_trashbin/files/test.d1462861890/sub')
->willReturn('/test.d1462861890/sub');
- $this->urlGenerator
- ->expects($this->once())
- ->method('linkToRoute')
- ->with('files.view.index', ['view' => 'trashbin', 'dir' => '/test.d1462861890/sub', 'scrollto' => 'somefile.txt'])
- ->willReturn('/apps/files/?view=trashbin&dir=/test.d1462861890/sub&scrollto=somefile.txt');
-
- $expected = new Http\RedirectResponse('/apps/files/?view=trashbin&dir=/test.d1462861890/sub&scrollto=somefile.txt');
+ $expected = new RedirectResponse('/index.php/apps/files/trashbin/123?dir=/test.d1462861890/sub');
$this->assertEquals($expected, $this->viewController->index('', '', '123'));
}
+
+ public function testTwoFactorAuthEnabled(): void {
+ $this->twoFactorRegistry->method('getProviderStates')
+ ->willReturn([
+ 'totp' => true,
+ 'backup_codes' => true,
+ ]);
+
+ $invokedCountProvideInitialState = $this->exactly(9);
+ $this->initialState->expects($invokedCountProvideInitialState)
+ ->method('provideInitialState')
+ ->willReturnCallback(function ($key, $data) use ($invokedCountProvideInitialState) {
+ if ($invokedCountProvideInitialState->numberOfInvocations() === 9) {
+ $this->assertEquals('isTwoFactorEnabled', $key);
+ $this->assertTrue($data);
+ }
+ });
+
+ $this->viewController->index('', '', null);
+ }
}
diff --git a/apps/files/tests/HelperTest.php b/apps/files/tests/HelperTest.php
index 230e2c6cea2..ba93fa0efdf 100644
--- a/apps/files/tests/HelperTest.php
+++ b/apps/files/tests/HelperTest.php
@@ -1,32 +1,18 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author brumsel <brumsel@losecatcher.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
+
+use OC\Files\FileInfo;
+use OCA\Files\Helper;
+
class HelperTest extends \Test\TestCase {
- private function makeFileInfo($name, $size, $mtime, $isDir = false) {
- return new \OC\Files\FileInfo(
+ private static function makeFileInfo($name, $size, $mtime, $isDir = false): FileInfo {
+ return new FileInfo(
'/' . $name,
null,
'/',
@@ -44,7 +30,7 @@ class HelperTest extends \Test\TestCase {
/**
* Returns a file list for testing
*/
- private function getTestFileList() {
+ private static function getTestFileList(): array {
return [
self::makeFileInfo('a.txt', 4, 2.3 * pow(10, 9)),
self::makeFileInfo('q.txt', 5, 150),
@@ -55,7 +41,7 @@ class HelperTest extends \Test\TestCase {
];
}
- public function sortDataProvider() {
+ public static function sortDataProvider(): array {
return [
[
'name',
@@ -90,12 +76,13 @@ class HelperTest extends \Test\TestCase {
];
}
- /**
- * @dataProvider sortDataProvider
- */
- public function testSortByName($sort, $sortDescending, $expectedOrder) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('sortDataProvider')]
+ public function testSortByName(string $sort, bool $sortDescending, array $expectedOrder): void {
+ if (($sort === 'mtime') && (PHP_INT_SIZE < 8)) {
+ $this->markTestSkipped('Skip mtime sorting on 32bit');
+ }
$files = self::getTestFileList();
- $files = \OCA\Files\Helper::sortFiles($files, $sort, $sortDescending);
+ $files = Helper::sortFiles($files, $sort, $sortDescending);
$fileNames = [];
foreach ($files as $fileInfo) {
$fileNames[] = $fileInfo->getName();
@@ -105,36 +92,4 @@ class HelperTest extends \Test\TestCase {
$fileNames
);
}
-
- public function testPopulateTags() {
- $tagManager = $this->createMock(\OCP\ITagManager::class);
- $tagger = $this->createMock(\OCP\ITags::class);
-
- $tagManager->method('load')
- ->with('files')
- ->willReturn($tagger);
-
- $data = [
- ['id' => 10],
- ['id' => 22, 'foo' => 'bar'],
- ['id' => 42, 'x' => 'y'],
- ];
-
- $tags = [
- 10 => ['tag3'],
- 42 => ['tag1', 'tag2'],
- ];
-
- $tagger->method('getTagsForObjects')
- ->with([10, 22, 42])
- ->willReturn($tags);
-
- $result = \OCA\Files\Helper::populateTags($data, 'id', $tagManager);
-
- $this->assertSame([
- ['id' => 10, 'tags' => ['tag3']],
- ['id' => 22, 'foo' => 'bar', 'tags' => []],
- ['id' => 42, 'x' => 'y', 'tags' => ['tag1', 'tag2']],
- ], $result);
- }
}
diff --git a/apps/files/tests/Service/TagServiceTest.php b/apps/files/tests/Service/TagServiceTest.php
index dce01e7170f..424e483102c 100644
--- a/apps/files/tests/Service/TagServiceTest.php
+++ b/apps/files/tests/Service/TagServiceTest.php
@@ -1,38 +1,25 @@
<?php
+
+declare(strict_types=1);
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Kesselberg <mail@danielkesselberg.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\Service;
use OCA\Files\Service\TagService;
use OCP\Activity\IManager;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
+use OCP\ITagManager;
use OCP\ITags;
use OCP\IUser;
+use OCP\IUserManager;
use OCP\IUserSession;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use OCP\Server;
+use PHPUnit\Framework\MockObject\MockObject;
/**
* Class TagServiceTest
@@ -42,46 +29,23 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
* @package OCA\Files
*/
class TagServiceTest extends \Test\TestCase {
-
- /**
- * @var string
- */
- private $user;
-
- /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */
- private $userSession;
-
- /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */
- private $activityManager;
-
- /**
- * @var \OCP\Files\Folder
- */
- private $root;
-
- /** @var EventDispatcherInterface|\PHPUnit\Framework\MockObject\MockObject */
- private $dispatcher;
-
- /**
- * @var \OCA\Files\Service\TagService|\PHPUnit\Framework\MockObject\MockObject
- */
- private $tagService;
-
- /**
- * @var \OCP\ITags
- */
- private $tagger;
+ private string $user;
+ private IUserSession&MockObject $userSession;
+ private IManager&MockObject $activityManager;
+ private Folder $root;
+ private TagService&MockObject $tagService;
+ private ITags $tagger;
protected function setUp(): void {
parent::setUp();
$this->user = static::getUniqueID('user');
$this->activityManager = $this->createMock(IManager::class);
- \OC::$server->getUserManager()->createUser($this->user, 'test');
+ Server::get(IUserManager::class)->createUser($this->user, 'test');
\OC_User::setUserId($this->user);
\OC_Util::setupFS($this->user);
$user = $this->createMock(IUser::class);
/**
- * @var \OCP\IUserSession
+ * @var IUserSession
*/
$this->userSession = $this->createMock(IUserSession::class);
$this->userSession->expects($this->any())
@@ -89,45 +53,38 @@ class TagServiceTest extends \Test\TestCase {
->withAnyParameters()
->willReturn($user);
- $this->root = \OC::$server->getUserFolder();
- $this->dispatcher = $this->createMock(EventDispatcherInterface::class);
+ $this->root = Server::get(IRootFolder::class)->getUserFolder($this->user);
- $this->tagger = \OC::$server->getTagManager()->load('files');
- $this->tagService = $this->getTagService(['addActivity']);
+ $this->tagger = Server::get(ITagManager::class)->load('files');
+ $this->tagService = $this->getTagService();
}
- /**
- * @param array $methods
- * @return TagService|\PHPUnit\Framework\MockObject\MockObject
- */
- protected function getTagService(array $methods = []) {
+ protected function getTagService(array $methods = []): TagService&MockObject {
return $this->getMockBuilder(TagService::class)
->setConstructorArgs([
$this->userSession,
$this->activityManager,
$this->tagger,
$this->root,
- $this->dispatcher,
])
- ->setMethods($methods)
+ ->onlyMethods($methods)
->getMock();
}
protected function tearDown(): void {
\OC_User::setUserId('');
- $user = \OC::$server->getUserManager()->get($this->user);
+ $user = Server::get(IUserManager::class)->get($this->user);
if ($user !== null) {
$user->delete();
}
+
+ parent::tearDown();
}
- public function testUpdateFileTags() {
+ public function testUpdateFileTags(): void {
$tag1 = 'tag1';
$tag2 = 'tag2';
- $this->tagService->expects($this->never())
- ->method('addActivity');
-
$subdir = $this->root->newFolder('subdir');
$testFile = $subdir->newFile('test.txt');
$testFile->putContent('test contents');
@@ -154,32 +111,11 @@ class TagServiceTest extends \Test\TestCase {
$caught = false;
try {
$this->tagService->updateFileTags('subdir/unexist.txt', [$tag1]);
- } catch (\OCP\Files\NotFoundException $e) {
+ } catch (NotFoundException $e) {
$caught = true;
}
$this->assertTrue($caught);
$subdir->delete();
}
-
- public function testFavoriteActivity() {
- $subdir = $this->root->newFolder('subdir');
- $file = $subdir->newFile('test.txt');
-
- $this->tagService->expects($this->exactly(2))
- ->method('addActivity')
- ->withConsecutive(
- [true, $file->getId(), 'subdir/test.txt'],
- [false, $file->getId(), 'subdir/test.txt']
- );
-
- // set tags
- $this->tagService->updateFileTags('subdir/test.txt', [ITags::TAG_FAVORITE]);
-
- // remove tag
- $this->tagService->updateFileTags('subdir/test.txt', []);
-
-
- $subdir->delete();
- }
}
diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js
deleted file mode 100644
index d5c793c4d24..00000000000
--- a/apps/files/tests/js/appSpec.js
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.App tests', function() {
- var App = OCA.Files.App;
- var pushStateStub;
- var replaceStateStub;
- var parseUrlQueryStub;
-
- beforeEach(function() {
- $('#testArea').append(
- '<div id="content" class="app-files">' +
- '<div id="app-navigation">' +
- '<ul><li data-id="files"><a>Files</a></li>' +
- '<li data-id="other"><a>Other</a></li>' +
- '</div>' +
- '<div id="app-content">' +
- '<div id="app-content-files" class="hidden">' +
- '</div>' +
- '<div id="app-content-other" class="hidden">' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>'
- );
-
- OCA.Files.fileActions = new OCA.Files.FileActions();
-
- pushStateStub = sinon.stub(OC.Util.History, 'pushState');
- replaceStateStub = sinon.stub(OC.Util.History, 'replaceState');
- parseUrlQueryStub = sinon.stub(OC.Util.History, 'parseUrlQuery');
- parseUrlQueryStub.returns({});
-
- App.initialize();
- });
- afterEach(function() {
- App.destroy();
-
- pushStateStub.restore();
- replaceStateStub.restore();
- parseUrlQueryStub.restore();
- });
-
- describe('initialization', function() {
- it('initializes the default file list with the default file actions', function() {
- expect(App.fileList).toBeDefined();
- expect(App.fileList.fileActions.actions.all).toBeDefined();
- expect(App.fileList.$el.is('#app-content-files')).toEqual(true);
- });
- });
-
- describe('URL handling', function() {
- it('pushes the state to the URL when current app changed directory', function() {
- $('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
-
- $('li[data-id=other]>a').click();
- pushStateStub.reset();
-
- $('#app-content-other').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).toEqual('other');
- });
- it('replaces the state to the URL when fileid is known', function() {
- $('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
- expect(replaceStateStub.notCalled).toEqual(true);
-
- parseUrlQueryStub.returns({dir: 'sub dir'});
-
- $('#app-content-files').trigger(new $.Event('afterChangeDirectory', {dir: 'sub dir', fileId: 123}));
-
- expect(pushStateStub.calledOnce).toEqual(true);
- expect(replaceStateStub.calledOnce).toEqual(true);
- params = OC.parseQueryString(replaceStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
- expect(params.fileid).toEqual('123');
- });
- describe('onpopstate', function() {
- it('sends "urlChanged" event to current app', function() {
- var handler = sinon.stub();
- $('#app-content-files').on('urlChanged', handler);
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/somedir');
- });
- it('sends "show" event to current app and sets navigation', function() {
- var showHandlerFiles = sinon.stub();
- var showHandlerOther = sinon.stub();
- var hideHandlerFiles = sinon.stub();
- var hideHandlerOther = sinon.stub();
- $('#app-content-files').on('show', showHandlerFiles);
- $('#app-content-files').on('hide', hideHandlerFiles);
- $('#app-content-other').on('show', showHandlerOther);
- $('#app-content-other').on('hide', hideHandlerOther);
- App._onPopState({view: 'other', dir: '/somedir'});
- expect(showHandlerFiles.notCalled).toEqual(true);
- expect(hideHandlerFiles.calledOnce).toEqual(true);
- expect(showHandlerOther.calledOnce).toEqual(true);
- expect(hideHandlerOther.notCalled).toEqual(true);
-
- showHandlerFiles.reset();
- showHandlerOther.reset();
- hideHandlerFiles.reset();
- hideHandlerOther.reset();
-
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(showHandlerFiles.calledOnce).toEqual(true);
- expect(hideHandlerFiles.notCalled).toEqual(true);
- expect(showHandlerOther.notCalled).toEqual(true);
- expect(hideHandlerOther.calledOnce).toEqual(true);
-
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- });
- it('does not send "show" or "hide" event to current app when already visible', function() {
- var showHandler = sinon.stub();
- var hideHandler = sinon.stub();
- $('#app-content-files').on('show', showHandler);
- $('#app-content-files').on('hide', hideHandler);
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(showHandler.notCalled).toEqual(true);
- expect(hideHandler.notCalled).toEqual(true);
- });
- it('state defaults to files app with root dir', function() {
- var handler = sinon.stub();
- parseUrlQueryStub.returns({});
- $('#app-content-files').on('urlChanged', handler);
- App._onPopState();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- });
- it('activates files app if invalid view is passed', function() {
- App._onPopState({view: 'invalid', dir: '/somedir'});
-
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- });
- });
- describe('navigation', function() {
- it('switches the navigation item and panel visibility when onpopstate', function() {
- App._onPopState({view: 'other', dir: '/somedir'});
- expect(App.navigation.getActiveItem()).toEqual('other');
- expect($('#app-content-files').hasClass('hidden')).toEqual(true);
- expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(false);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(true);
-
- App._onPopState({view: 'files', dir: '/somedir'});
-
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(true);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(false);
- });
- it('clicking on navigation switches the panel visibility', function() {
- $('li[data-id=other] > a').click();
- expect(App.navigation.getActiveItem()).toEqual('other');
- expect($('#app-content-files').hasClass('hidden')).toEqual(true);
- expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(false);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(true);
-
- $('li[data-id=files] > a').click();
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(true);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(false);
- });
- it('clicking on navigation sends "show" and "urlChanged" event', function() {
- var handler = sinon.stub();
- var showHandler = sinon.stub();
- $('#app-content-other').on('urlChanged', handler);
- $('#app-content-other').on('show', showHandler);
- $('li[data-id=other] > a').click();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('other');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- expect(showHandler.calledOnce).toEqual(true);
- });
- it('clicking on activate navigation only sends "urlChanged" event', function() {
- var handler = sinon.stub();
- var showHandler = sinon.stub();
- $('#app-content-files').on('urlChanged', handler);
- $('#app-content-files').on('show', showHandler);
- $('li[data-id=files] > a').click();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- expect(showHandler.notCalled).toEqual(true);
- });
- });
- describe('viewer mode', function() {
- it('toggles the sidebar when viewer mode is enabled', function() {
- $('#app-content-files').trigger(
- new $.Event('changeViewerMode', {viewerModeEnabled: true}
- ));
- expect($('#app-navigation').hasClass('hidden')).toEqual(true);
- expect($('.app-files').hasClass('viewer-mode no-sidebar')).toEqual(true);
-
- $('#app-content-files').trigger(
- new $.Event('changeViewerMode', {viewerModeEnabled: false}
- ));
-
- expect($('#app-navigation').hasClass('hidden')).toEqual(false);
- expect($('.app-files').hasClass('viewer-mode no-sidebar')).toEqual(false);
- });
- });
- });
-});
diff --git a/apps/files/tests/js/breadcrumbSpec.js b/apps/files/tests/js/breadcrumbSpec.js
deleted file mode 100644
index b83ec78be7b..00000000000
--- a/apps/files/tests/js/breadcrumbSpec.js
+++ /dev/null
@@ -1,669 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.BreadCrumb tests', function() {
- var BreadCrumb = OCA.Files.BreadCrumb;
-
- describe('Rendering', function() {
- var bc;
- beforeEach(function() {
- bc = new BreadCrumb({
- getCrumbUrl: function(part, index) {
- // for testing purposes
- return part.dir + '#' + index;
- }
- });
- });
- afterEach(function() {
- bc = null;
- });
- it('Renders its own container', function() {
- bc.render();
- expect(bc.$el.hasClass('breadcrumb')).toEqual(true);
- });
- it('Renders root by default', function() {
- var $crumbs;
- bc.render();
- $crumbs = bc.$el.find('.crumb');
- // menu and home
- expect($crumbs.length).toEqual(2);
- expect($crumbs.eq(0).find('a').hasClass('icon-more')).toEqual(true);
- expect($crumbs.eq(0).find('div.popovermenu').length).toEqual(1);
- expect($crumbs.eq(0).data('dir')).not.toBeDefined();
- expect($crumbs.eq(1).find('a').attr('href')).toEqual('/#1');
- expect($crumbs.eq(1).find('a').hasClass('icon-home')).toEqual(true);
- expect($crumbs.eq(1).data('dir')).toEqual('/');
- });
- it('Renders complete directory when switching to root', function() {
- var $crumbs;
- bc.setDirectory('/somedir');
- bc.setDirectory('/');
- $crumbs = bc.$el.find('.crumb');
- expect($crumbs.length).toEqual(3);
- expect($crumbs.eq(1).data('dir')).toEqual('/');
- expect($crumbs.eq(2).data('dir')).toEqual('/somedir');
- expect($crumbs.eq(2).attr('class').includes("active")).toEqual(false);
- });
- it('Renders single path section', function() {
- var $crumbs;
- bc.setDirectory('/somedir');
- $crumbs = bc.$el.find('.crumb');
- expect($crumbs.length).toEqual(3);
- expect($crumbs.eq(0).find('a').hasClass('icon-more')).toEqual(true);
- expect($crumbs.eq(0).find('div.popovermenu').length).toEqual(1);
- expect($crumbs.eq(0).data('dir')).not.toBeDefined();
-
- expect($crumbs.eq(1).find('a').attr('href')).toEqual('/#1');
- expect($crumbs.eq(1).find('a').hasClass('icon-home')).toEqual(true);
- expect($crumbs.eq(1).data('dir')).toEqual('/');
-
- expect($crumbs.eq(2).find('a').attr('href')).toEqual('/somedir#2');
- expect($crumbs.eq(2).find('img').length).toEqual(0);
- expect($crumbs.eq(2).data('dir')).toEqual('/somedir');
- });
- it('Renders multiple path sections and special chars', function() {
- var $crumbs;
- bc.setDirectory('/somedir/with space/abc');
- $crumbs = bc.$el.find('.crumb');
- expect($crumbs.length).toEqual(5);
- expect($crumbs.eq(0).find('a').hasClass('icon-more')).toEqual(true);
- expect($crumbs.eq(0).find('div.popovermenu').length).toEqual(1);
- expect($crumbs.eq(0).data('dir')).not.toBeDefined();
-
- expect($crumbs.eq(1).find('a').attr('href')).toEqual('/#1');
- expect($crumbs.eq(1).find('a').hasClass('icon-home')).toEqual(true);
- expect($crumbs.eq(1).data('dir')).toEqual('/');
-
- expect($crumbs.eq(2).find('a').attr('href')).toEqual('/somedir#2');
- expect($crumbs.eq(2).find('img').length).toEqual(0);
- expect($crumbs.eq(2).data('dir')).toEqual('/somedir');
-
- expect($crumbs.eq(3).find('a').attr('href')).toEqual('/somedir/with space#3');
- expect($crumbs.eq(3).find('img').length).toEqual(0);
- expect($crumbs.eq(3).data('dir')).toEqual('/somedir/with space');
-
- expect($crumbs.eq(4).find('a').attr('href')).toEqual('/somedir/with space/abc#4');
- expect($crumbs.eq(4).find('img').length).toEqual(0);
- expect($crumbs.eq(4).data('dir')).toEqual('/somedir/with space/abc');
- });
- it('Renders backslashes as regular directory separator', function() {
- var $crumbs;
- bc.setDirectory('/somedir\\with/mixed\\separators');
- $crumbs = bc.$el.find('.crumb');
- expect($crumbs.length).toEqual(6);
- expect($crumbs.eq(0).find('a').hasClass('icon-more')).toEqual(true);
- expect($crumbs.eq(0).find('div.popovermenu').length).toEqual(1);
- expect($crumbs.eq(0).data('dir')).not.toBeDefined();
-
- expect($crumbs.eq(1).find('a').attr('href')).toEqual('/#1');
- expect($crumbs.eq(1).find('a').hasClass('icon-home')).toEqual(true);
- expect($crumbs.eq(1).data('dir')).toEqual('/');
-
- expect($crumbs.eq(2).find('a').attr('href')).toEqual('/somedir#2');
- expect($crumbs.eq(2).find('img').length).toEqual(0);
- expect($crumbs.eq(2).data('dir')).toEqual('/somedir');
-
- expect($crumbs.eq(3).find('a').attr('href')).toEqual('/somedir/with#3');
- expect($crumbs.eq(3).find('img').length).toEqual(0);
- expect($crumbs.eq(3).data('dir')).toEqual('/somedir/with');
-
- expect($crumbs.eq(4).find('a').attr('href')).toEqual('/somedir/with/mixed#4');
- expect($crumbs.eq(4).find('img').length).toEqual(0);
- expect($crumbs.eq(4).data('dir')).toEqual('/somedir/with/mixed');
-
- expect($crumbs.eq(5).find('a').attr('href')).toEqual('/somedir/with/mixed/separators#5');
- expect($crumbs.eq(5).find('img').length).toEqual(0);
- expect($crumbs.eq(5).data('dir')).toEqual('/somedir/with/mixed/separators');
- });
- });
- describe('Events', function() {
- it('Calls onClick handler when clicking on a crumb', function() {
- var handler = sinon.stub();
- var bc = new BreadCrumb({
- onClick: handler
- });
- bc.setDirectory('/one/two/three/four');
- // Click on crumb does not work, only link
- bc.$el.find('.crumb:eq(4)').click();
- expect(handler.calledOnce).toEqual(false);
-
- handler.reset();
- // Click on crumb link works
- bc.$el.find('.crumb:eq(1) a').click();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).thisValue).toEqual(bc.$el.find('.crumb > a').get(1));
- });
- it('Calls onDrop handler when dropping on a crumb', function() {
- var droppableStub = sinon.stub($.fn, 'droppable');
- var handler = sinon.stub();
- var bc = new BreadCrumb({
- onDrop: handler
- });
- bc.setDirectory('/one/two/three/four');
- expect(droppableStub.calledOnce).toEqual(true);
-
- expect(droppableStub.getCall(0).args[0].drop).toBeDefined();
- // simulate drop
- droppableStub.getCall(0).args[0].drop({dummy: true});
-
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0]).toEqual({dummy: true});
-
- droppableStub.restore();
- });
- });
-
- describe('Menu tests', function() {
- var bc, dummyDir, $crumbmenuLink, $popovermenu;
-
- beforeEach(function() {
- dummyDir = '/one/two/three/four/five'
-
- bc = new BreadCrumb();
- // append dummy navigation and controls
- // as they are currently used for measurements
- $('#testArea').append(
- '<div id="controls"></div>'
- );
- $('#controls').append(bc.$el);
-
- bc.setDirectory(dummyDir);
-
- $('div.crumb').each(function(index){
- $(this).css('width', 50);
- $(this).css('padding', 0);
- $(this).css('margin', 0);
- });
- $('div.crumbhome').css('width', 51);
- $('div.crumbmenu').css('width', 51);
-
- $('#controls').width(1000);
- bc._resize();
-
- // Shrink to show popovermenu
- $('#controls').width(300);
- bc._resize();
-
- $crumbmenuLink = bc.$el.find('.crumbmenu > a');
- $popovermenu = $crumbmenuLink.next('.popovermenu');
- });
- afterEach(function() {
- bc = null;
- });
-
- it('Shows only items not in the breadcrumb', function() {
- var hiddenCrumbs = bc.$el.find('.crumb:not(.crumbmenu).hidden');
- expect($popovermenu.find('li:not(.in-breadcrumb)').length).toEqual(hiddenCrumbs.length);
- });
- });
-
- describe('Resizing', function() {
- var bc, dummyDir, widths, paddings, margins;
-
- // cit() will skip tests if running on PhantomJS because it does not
- // have proper support for flexboxes.
- var cit = window.isPhantom?xit:it;
-
- beforeEach(function() {
- dummyDir = '/short name/longer name/looooooooooooonger/' +
- 'even longer long long long longer long/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/last one';
-
- bc = new BreadCrumb();
- // append dummy navigation and controls
- // as they are currently used for measurements
- $('#testArea').append(
- '<div id="controls"></div>'
- );
- $('#controls').append(bc.$el);
-
- // triggers resize implicitly
- bc.setDirectory(dummyDir);
-
- // using hard-coded widths (pre-measured) to avoid getting different
- // results on different browsers due to font engine differences
- // 51px is default size for menu and home
- widths = [51, 51, 106, 112, 160, 257, 251, 91];
- // using hard-coded paddings and margins to avoid depending on the
- // current CSS values used in the server
- paddings = [0, 0, 0, 0, 0, 0, 0, 0];
- margins = [0, 0, 0, 0, 0, 0, 0, 0];
-
- $('div.crumb').each(function(index){
- $(this).css('width', widths[index]);
- $(this).css('padding', paddings[index]);
- $(this).css('margin', margins[index]);
- });
- });
- afterEach(function() {
- bc = null;
- });
- it('Hides breadcrumbs to fit available width', function() {
- var $crumbs;
-
- $('#controls').width(500);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Second, third, fourth and fifth crumb are hidden and everything
- // else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Hides breadcrumbs to fit available width', function() {
- var $crumbs;
-
- $('#controls').width(700);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Hides breadcrumbs to fit available width taking paddings into account', function() {
- var $crumbs;
-
- // Each element is 20px wider
- paddings = [10, 10, 10, 10, 10, 10, 10, 10];
-
- $('div.crumb').each(function(index){
- $(this).css('padding', paddings[index]);
- });
-
- $('#controls').width(700);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Second, third and fourth crumb are hidden and everything else is
- // visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Hides breadcrumbs to fit available width taking margins into account', function() {
- var $crumbs;
-
- // Each element is 20px wider
- margins = [10, 10, 10, 10, 10, 10, 10, 10];
-
- $('div.crumb').each(function(index){
- $(this).css('margin', margins[index]);
- });
-
- $('#controls').width(700);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Second, third and fourth crumb are hidden and everything else is
- // visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Hides breadcrumbs to fit available width left by siblings', function() {
- var $crumbs;
-
- $('#controls').width(700);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // Visible sibling widths add up to 200px
- var $previousSibling = $('<div class="otherSibling"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $previousSibling.css('width', '50px');
- $previousSibling.css('min-width', '50px');
- $('#controls').prepend($previousSibling);
-
- var $creatableActions = $('<div class="actions creatable"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $creatableActions.css('width', '100px');
- $creatableActions.css('min-width', '100px');
- $('#controls').append($creatableActions);
-
- var $nextHiddenSibling = $('<div class="otherSibling hidden"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $nextHiddenSibling.css('width', '200px');
- $nextHiddenSibling.css('min-width', '200px');
- $('#controls').append($nextHiddenSibling);
-
- var $nextSibling = $('<div class="otherSibling"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $nextSibling.css('width', '50px');
- $nextSibling.css('min-width', '50px');
- $('#controls').append($nextSibling);
-
- bc._resize();
-
- // Second, third, fourth and fifth crumb are hidden and everything
- // else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Hides breadcrumbs to fit available width left by siblings with paddings and margins', function() {
- var $crumbs;
-
- $('#controls').width(700);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // Visible sibling widths add up to 200px
- var $previousSibling = $('<div class="otherSibling"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $previousSibling.css('width', '10px');
- $previousSibling.css('min-width', '10px');
- $previousSibling.css('margin', '20px');
- $('#controls').prepend($previousSibling);
-
- var $creatableActions = $('<div class="actions creatable"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $creatableActions.css('width', '20px');
- $creatableActions.css('min-width', '20px');
- $creatableActions.css('margin-left', '40px');
- $creatableActions.css('padding-right', '40px');
- $('#controls').append($creatableActions);
-
- var $nextHiddenSibling = $('<div class="otherSibling hidden"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $nextHiddenSibling.css('width', '200px');
- $nextHiddenSibling.css('min-width', '200px');
- $('#controls').append($nextHiddenSibling);
-
- var $nextSibling = $('<div class="otherSibling"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $nextSibling.css('width', '10px');
- $nextSibling.css('min-width', '10px');
- $nextSibling.css('padding', '20px');
- $('#controls').append($nextSibling);
-
- bc._resize();
-
- // Second, third, fourth and fifth crumb are hidden and everything
- // else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Updates the breadcrumbs when reducing available width', function() {
- var $crumbs;
-
- // enough space
- $('#controls').width(1800);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Menu is hidden
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(true);
-
- // simulate decrease
- $('#controls').width(950);
- bc._resize();
-
- // Third crumb is hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Updates the breadcrumbs when reducing available width taking into account the menu width', function() {
- var $crumbs;
-
- // enough space
- $('#controls').width(1800);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Menu is hidden
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // simulate decrease
- // 650 is enough for all the crumbs except the third and fourth
- // ones, but not enough for the menu and all the crumbs except the
- // third and fourth ones; the second one has to be hidden too.
- $('#controls').width(650);
- bc._resize();
-
- // Second, third and fourth crumb are hidden and everything else is
- // visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Updates the breadcrumbs when increasing available width', function() {
- var $crumbs;
-
- // limited space
- $('#controls').width(850);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // simulate increase
- $('#controls').width(1000);
- bc._resize();
-
- // Third crumb is hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- it('Updates the breadcrumbs when increasing available width taking into account the menu width', function() {
- var $crumbs;
-
- // limited space
- $('#controls').width(850);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // simulate increase
- // 1030 is enough for all the crumbs if the menu is hidden.
- $('#controls').width(1030);
- bc._resize();
-
- // Menu is hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- cit('Updates the breadcrumbs when increasing available width with an expanding sibling', function() {
- var $crumbs;
-
- // The sibling expands to fill all the width left by the breadcrumbs
- var $nextSibling = $('<div class="sibling"></div>');
- // Set both the width and the min-width to even differences in width
- // handling in the browsers used to run the tests.
- $nextSibling.css('width', '10px');
- $nextSibling.css('min-width', '10px');
- $nextSibling.css('display', 'flex');
- $nextSibling.css('flex', '1 1');
- var $nextSiblingChild = $('<div class="siblingChild"></div>');
- $nextSiblingChild.css('margin-left', 'auto');
- $nextSibling.append($nextSiblingChild);
- $('#controls').append($nextSibling);
-
- // limited space
- $('#controls').width(850);
- bc._resize();
-
- $crumbs = bc.$el.find('.crumb');
-
- // Third and fourth crumb are hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
-
- // simulate increase
- $('#controls').width(1000);
- bc._resize();
-
- // Third crumb is hidden and everything else is visible
- expect($crumbs.eq(0).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(1).hasClass('hidden')).toEqual(false);
-
- expect($crumbs.eq(2).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(3).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(4).hasClass('hidden')).toEqual(true);
- expect($crumbs.eq(5).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(6).hasClass('hidden')).toEqual(false);
- expect($crumbs.eq(7).hasClass('hidden')).toEqual(false);
- });
- });
-});
diff --git a/apps/files/tests/js/detailsviewSpec.js b/apps/files/tests/js/detailsviewSpec.js
deleted file mode 100644
index d375c4c9282..00000000000
--- a/apps/files/tests/js/detailsviewSpec.js
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
-* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.DetailsView tests', function() {
- var detailsView;
-
- beforeEach(function() {
- detailsView = new OCA.Files.DetailsView();
- });
- afterEach(function() {
- detailsView.remove();
- detailsView = undefined;
- });
- it('renders itself empty when nothing registered', function() {
- detailsView.render();
- expect(detailsView.$el.find('.detailFileInfoContainer').length).toEqual(1);
- expect(detailsView.$el.find('.tabsContainer').length).toEqual(1);
- });
- describe('file info detail view', function() {
- it('returns registered view', function() {
- var testView = new OCA.Files.DetailFileInfoView();
- var testView2 = new OCA.Files.DetailFileInfoView();
- detailsView.addDetailView(testView);
- detailsView.addDetailView(testView2);
-
- detailViews = detailsView.getDetailViews();
-
- expect(detailViews).toContain(testView);
- expect(detailViews).toContain(testView2);
-
- // Modify array and check that registered detail views are not
- // modified
- detailViews.pop();
- detailViews.pop();
-
- detailViews = detailsView.getDetailViews();
-
- expect(detailViews).toContain(testView);
- expect(detailViews).toContain(testView2);
- });
- it('renders registered view', function() {
- var testView = new OCA.Files.DetailFileInfoView();
- var testView2 = new OCA.Files.DetailFileInfoView();
- detailsView.addDetailView(testView);
- detailsView.addDetailView(testView2);
- detailsView.render();
-
- expect(detailsView.$el.find('.detailFileInfoContainer .detailFileInfoView').length).toEqual(2);
- });
- it('updates registered tabs when fileinfo is updated', function() {
- var viewRenderStub = sinon.stub(OCA.Files.DetailFileInfoView.prototype, 'render');
- var testView = new OCA.Files.DetailFileInfoView();
- var testView2 = new OCA.Files.DetailFileInfoView();
- detailsView.addDetailView(testView);
- detailsView.addDetailView(testView2);
- detailsView.render();
-
- var fileInfo = {id: 5, name: 'test.txt'};
- viewRenderStub.reset();
- detailsView.setFileInfo(fileInfo);
-
- expect(testView.getFileInfo()).toEqual(fileInfo);
- expect(testView2.getFileInfo()).toEqual(fileInfo);
-
- expect(viewRenderStub.callCount).toEqual(2);
- viewRenderStub.restore();
- });
- });
- describe('tabs', function() {
- var testView, testView2;
-
- beforeEach(function() {
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- testView2 = new OCA.Files.DetailTabView({id: 'test2'});
- detailsView.addTabView(testView);
- detailsView.addTabView(testView2);
- detailsView.render();
- });
- it('initially renders only the selected tab', function() {
- expect(detailsView.$el.find('.tab').length).toEqual(1);
- expect(detailsView.$el.find('.tab').attr('id')).toEqual('test1');
- });
- it('updates tab model and rerenders on-demand as soon as it gets selected', function() {
- var tab1RenderStub = sinon.stub(testView, 'render');
- var tab2RenderStub = sinon.stub(testView2, 'render');
- var fileInfo1 = new OCA.Files.FileInfoModel({id: 5, name: 'test.txt'});
- var fileInfo2 = new OCA.Files.FileInfoModel({id: 8, name: 'test2.txt'});
-
- detailsView.setFileInfo(fileInfo1);
-
- // first tab renders, not the second one
- expect(tab1RenderStub.calledOnce).toEqual(true);
- expect(tab2RenderStub.notCalled).toEqual(true);
-
- // info got set only to the first visible tab
- expect(testView.getFileInfo()).toEqual(fileInfo1);
- expect(testView2.getFileInfo()).toBeUndefined();
-
- // select second tab for first render
- detailsView.$el.find('.tabHeader').eq(1).click();
-
- // second tab got rendered
- expect(tab2RenderStub.calledOnce).toEqual(true);
- expect(testView2.getFileInfo()).toEqual(fileInfo1);
-
- // select the first tab again
- detailsView.$el.find('.tabHeader').eq(0).click();
-
- // no re-render
- expect(tab1RenderStub.calledOnce).toEqual(true);
- expect(tab2RenderStub.calledOnce).toEqual(true);
-
- tab1RenderStub.reset();
- tab2RenderStub.reset();
-
- // switch to another file
- detailsView.setFileInfo(fileInfo2);
-
- // only the visible tab was updated and rerendered
- expect(tab1RenderStub.calledOnce).toEqual(true);
- expect(testView.getFileInfo()).toEqual(fileInfo2);
-
- // second/invisible tab still has old info, not rerendered
- expect(tab2RenderStub.notCalled).toEqual(true);
- expect(testView2.getFileInfo()).toEqual(fileInfo1);
-
- // reselect the second one
- detailsView.$el.find('.tabHeader').eq(1).click();
-
- // second tab becomes visible, updated and rendered
- expect(testView2.getFileInfo()).toEqual(fileInfo2);
- expect(tab2RenderStub.calledOnce).toEqual(true);
-
- tab1RenderStub.restore();
- tab2RenderStub.restore();
- });
- it('selects the first tab by default', function() {
- expect(detailsView.$el.find('.tabHeader').eq(0).hasClass('selected')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader').eq(1).hasClass('selected')).toEqual(false);
- expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(false);
- expect(detailsView.$el.find('.tab').eq(1).length).toEqual(0);
- });
- it('switches the current tab when clicking on tab header', function() {
- detailsView.$el.find('.tabHeader').eq(1).click();
- expect(detailsView.$el.find('.tabHeader').eq(0).hasClass('selected')).toEqual(false);
- expect(detailsView.$el.find('.tabHeader').eq(1).hasClass('selected')).toEqual(true);
- expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(true);
- expect(detailsView.$el.find('.tab').eq(1).hasClass('hidden')).toEqual(false);
- });
- describe('tab visibility', function() {
- beforeEach(function() {
- detailsView.remove();
- detailsView = new OCA.Files.DetailsView();
- });
- it('does not display tab headers when only one tab exists', function() {
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- detailsView.addTabView(testView);
- detailsView.render();
-
- expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader').length).toEqual(1);
- });
- it('does not display tab that do not pass visibility check', function() {
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- testView.canDisplay = sinon.stub().returns(false);
- testView2 = new OCA.Files.DetailTabView({id: 'test2'});
- var testView3 = new OCA.Files.DetailTabView({id: 'test3'});
- detailsView.addTabView(testView);
- detailsView.addTabView(testView2);
- detailsView.addTabView(testView3);
-
- var fileInfo = {id: 5, name: 'test.txt'};
- detailsView.setFileInfo(fileInfo);
-
- expect(testView.canDisplay.calledOnce).toEqual(true);
- expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true);
-
- expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(false);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test3]').hasClass('hidden')).toEqual(false);
- });
- it('does not show tab headers if only one header is visible due to visibility check', function() {
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- testView.canDisplay = sinon.stub().returns(false);
- testView2 = new OCA.Files.DetailTabView({id: 'test2'});
- detailsView.addTabView(testView);
- detailsView.addTabView(testView2);
-
- var fileInfo = {id: 5, name: 'test.txt'};
- detailsView.setFileInfo(fileInfo);
-
- expect(testView.canDisplay.calledOnce).toEqual(true);
- expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true);
-
- expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false);
- });
- it('deselects the current tab if a model update does not pass the visibility check', function() {
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- testView.canDisplay = function(fileInfo) {
- return fileInfo.mimetype !== 'httpd/unix-directory';
- };
- testView2 = new OCA.Files.DetailTabView({id: 'test2'});
- detailsView.addTabView(testView);
- detailsView.addTabView(testView2);
-
- var fileInfo = {id: 5, name: 'test.txt', mimetype: 'text/plain'};
- detailsView.setFileInfo(fileInfo);
-
- expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(true);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(false);
-
- detailsView.setFileInfo({id: 10, name: 'folder', mimetype: 'httpd/unix-directory'});
-
- expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(false);
- expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(true);
- });
- });
- it('sorts by order and then label', function() {
- detailsView.remove();
- detailsView = new OCA.Files.DetailsView();
- detailsView.addTabView(new OCA.Files.DetailTabView({id: 'abc', order: 20}));
- detailsView.addTabView(new OCA.Files.DetailTabView({id: 'def', order: 10}));
- detailsView.addTabView(new OCA.Files.DetailTabView({id: 'jkl'}));
- detailsView.addTabView(new OCA.Files.DetailTabView({id: 'ghi'}));
- detailsView.render();
-
- var tabs = detailsView.$el.find('.tabHeader').map(function() {
- return $(this).attr('data-tabid');
- }).toArray();
-
- expect(tabs).toEqual(['ghi', 'jkl', 'def', 'abc']);
- });
- });
-});
diff --git a/apps/files/tests/js/favoritesfilelistspec.js b/apps/files/tests/js/favoritesfilelistspec.js
deleted file mode 100644
index 8602288cdde..00000000000
--- a/apps/files/tests/js/favoritesfilelistspec.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FavoritesFileList tests', function() {
- var fileList;
-
- beforeEach(function() {
- // init parameters and test table elements
- $('#testArea').append(
- '<div id="app-content-container">' +
- // init horrible parameters
- '<input type="hidden" id="dir" value="/"></input>' +
- '<input type="hidden" id="permissions" value="31"></input>' +
- // dummy controls
- '<div id="controls">' +
- ' <div class="actions creatable"></div>' +
- ' <div class="notCreatable"></div>' +
- '</div>' +
- // dummy table
- // TODO: at some point this will be rendered by the fileList class itself!
- '<table id="filestable" class="list-container view-grid">' +
- '<thead><tr>' +
- '<th id="headerName" class="hidden column-name">' +
- '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
- '</th>' +
- '<th class="hidden column-mtime">' +
- '<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' +
- '</th>' +
- '</tr></thead>' +
- '<tbody id="fileList"></tbody>' +
- '<tfoot></tfoot>' +
- '</table>' +
- '<div id="emptycontent">Empty content message</div>' +
- '</div>'
- );
- });
-
- describe('loading file list', function() {
- var fetchStub;
-
- beforeEach(function() {
- fileList = new OCA.Files.FavoritesFileList(
- $('#app-content-container')
- );
- OCA.Files.FavoritesPlugin.attach(fileList);
-
- fetchStub = sinon.stub(fileList.filesClient, 'getFilteredFiles');
- });
- afterEach(function() {
- fetchStub.restore();
- fileList.destroy();
- fileList = undefined;
- });
- it('render files', function(done) {
- var deferred = $.Deferred();
- fetchStub.returns(deferred.promise());
-
- fileList.reload();
-
- expect(fetchStub.calledOnce).toEqual(true);
-
- deferred.resolve(207, [{
- id: 7,
- name: 'test.txt',
- path: '/somedir',
- size: 123,
- mtime: 11111000,
- tags: [OC.TAG_FAVORITE],
- permissions: OC.PERMISSION_ALL,
- mimetype: 'text/plain'
- }]);
-
- setTimeout(function() {
- var $rows = fileList.$el.find('tbody tr');
- var $tr = $rows.eq(0);
- expect($rows.length).toEqual(1);
- expect($tr.attr('data-id')).toEqual('7');
- expect($tr.attr('data-type')).toEqual('file');
- expect($tr.attr('data-file')).toEqual('test.txt');
- expect($tr.attr('data-path')).toEqual('/somedir');
- expect($tr.attr('data-size')).toEqual('123');
- expect(parseInt($tr.attr('data-permissions'), 10))
- .toEqual(OC.PERMISSION_ALL);
- expect($tr.attr('data-mime')).toEqual('text/plain');
- expect($tr.attr('data-mtime')).toEqual('11111000');
- expect($tr.find('a.name').attr('href')).toEqual(
- OC.getRootPath() +
- '/remote.php/webdav/somedir/test.txt'
- );
- expect($tr.find('.nametext').text().trim()).toEqual('test.txt');
-
- done();
- }, 0);
- });
- });
-});
diff --git a/apps/files/tests/js/favoritespluginspec.js b/apps/files/tests/js/favoritespluginspec.js
deleted file mode 100644
index 94359e0e706..00000000000
--- a/apps/files/tests/js/favoritespluginspec.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FavoritesPlugin tests', function() {
- var Plugin = OCA.Files.FavoritesPlugin;
- var fileList;
-
- beforeEach(function() {
- $('#testArea').append(
- '<div id="content">' +
- '<div id="app-navigation">' +
- '<ul><li data-id="files"><a>Files</a></li>' +
- '<li data-id="sharingin"><a></a></li>' +
- '<li data-id="sharingout"><a></a></li>' +
- '</ul></div>' +
- '<div id="app-content">' +
- '<div id="app-content-files" class="hidden">' +
- '</div>' +
- '<div id="app-content-favorites" class="hidden">' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>'
- );
- OC.Plugins.attach('OCA.Files.App', Plugin);
- fileList = Plugin.showFileList($('#app-content-favorites'));
- });
- afterEach(function() {
- OC.Plugins.detach('OCA.Files.App', Plugin);
- });
-
- describe('initialization', function() {
- it('inits favorites list on show', function() {
- expect(fileList).toBeDefined();
- });
- });
- describe('file actions', function() {
- it('provides default file actions', function() {
- var fileActions = fileList.fileActions;
-
- expect(fileActions.actions.all).toBeDefined();
- expect(fileActions.actions.all.Delete).toBeDefined();
- expect(fileActions.actions.all.Rename).toBeDefined();
- expect(fileActions.actions.all.Download).toBeDefined();
-
- expect(fileActions.defaults.dir).toEqual('Open');
- });
- it('provides custom file actions', function() {
- var actionStub = sinon.stub();
- // regular file action
- OCA.Files.fileActions.register(
- 'all',
- 'RegularTest',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/shared'),
- actionStub
- );
-
- Plugin.favoritesFileList = null;
- fileList = Plugin.showFileList($('#app-content-favorites'));
-
- expect(fileList.fileActions.actions.all.RegularTest).toBeDefined();
- });
- it('redirects to files app when opening a directory', function() {
- var oldList = OCA.Files.App.fileList;
- // dummy new list to make sure it exists
- OCA.Files.App.fileList = new OCA.Files.FileList($('<table><thead></thead><tbody></tbody></table>'));
-
- var setActiveViewStub = sinon.stub(OCA.Files.App, 'setActiveView');
- // create dummy table so we can click the dom
- var $table = '<table><thead></thead><tbody id="fileList"></tbody></table>';
- $('#app-content-favorites').append($table);
-
- Plugin.favoritesFileList = null;
- fileList = Plugin.showFileList($('#app-content-favorites'));
-
- fileList.setFiles([{
- name: 'testdir',
- type: 'dir',
- path: '/somewhere/inside/subdir',
- counterParts: ['user2'],
- shareOwner: 'user2'
- }]);
-
- fileList.findFileEl('testdir').find('td .nametext').click();
-
- expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir');
-
- expect(setActiveViewStub.calledOnce).toEqual(true);
- expect(setActiveViewStub.calledWith('files')).toEqual(true);
-
- setActiveViewStub.restore();
-
- // restore old list
- OCA.Files.App.fileList = oldList;
- });
- });
-});
-
diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js
deleted file mode 100644
index d8bca4a8ca4..00000000000
--- a/apps/files/tests/js/fileUploadSpec.js
+++ /dev/null
@@ -1,303 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Tomasz Grobelny <tomasz@grobelny.net>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OC.Upload tests', function() {
- var $dummyUploader;
- var testFile;
- var uploader;
- var failStub;
- var progressBarStub;
-
- beforeEach(function() {
- testFile = {
- name: 'test.txt',
- size: 5000, // 5 KB
- type: 'text/plain',
- lastModifiedDate: new Date()
- };
- // need a dummy button because file-upload checks on it
- $('#testArea').append(
- '<input type="file" id="file_upload_start" name="files[]" multiple="multiple">' +
- '<input type="hidden" id="free_space" name="free_space" value="50000000">' + // 50 MB
- // TODO: handlebars!
- '<div id="new">' +
- '<a>New</a>' +
- '<ul>' +
- '<li data-type="file" data-newname="New text file.txt"><p>Text file</p></li>' +
- '</ul>' +
- '</div>'
- );
- $dummyUploader = $('#file_upload_start');
- progressBarStub = {on: function(){}};
- uploader = new OC.Uploader($dummyUploader, {progressBar: progressBarStub});
- failStub = sinon.stub();
- uploader.on('fail', failStub);
- });
- afterEach(function() {
- $dummyUploader = undefined;
- failStub = undefined;
- });
-
- /**
- * Add file for upload
- * @param {Array.<File>} files array of file data to simulate upload
- * @return {Array.<Object>} array of uploadinfo or null if add() returned false
- */
- function addFiles(uploader, files) {
- return _.map(files, function(file) {
- var jqXHR = {status: 200};
- var uploadInfo = {
- originalFiles: files,
- files: [file],
- jqXHR: jqXHR,
- response: sinon.stub().returns(jqXHR),
- targetDir: "/",
- submit: sinon.stub(),
- abort: sinon.stub()
- };
- if (uploader.fileUploadParam.add.call(
- $dummyUploader[0],
- {},
- uploadInfo
- )) {
- return uploadInfo;
- }
- return null;
- });
- }
-
- describe('Adding files for upload', function() {
- it('adds file when size is below limits', function(done) {
- var result = addFiles(uploader, [testFile]);
- expect(result[0]).not.toEqual(null);
- result[0].submit.callsFake(function(){
- expect(result[0].submit.calledOnce).toEqual(true);
- done();
- });
- });
- it('adds file when free space is unknown', function(done) {
- var result;
- $('#free_space').val(-2);
-
- result = addFiles(uploader, [testFile]);
- expect(result[0]).not.toEqual(null);
- result[0].submit.callsFake(function(){
- expect(result[0].submit.calledOnce).toEqual(true);
- expect(failStub.notCalled).toEqual(true);
- done();
- });
- });
- it('does not add file if it exceeds free space', function(done) {
- var result;
- $('#free_space').val(1000);
-
- failStub.callsFake(function(){
- expect(failStub.calledOnce).toEqual(true);
- expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace');
- expect(failStub.getCall(0).args[1].errorThrown).toEqual(
- 'Not enough free space, you are uploading 5 KB but only 1000 B is left'
- );
- setTimeout(done, 0);
- });
- result = addFiles(uploader, [testFile]);
-
- expect(result[0]).toEqual(null);
- });
- });
- describe('Upload conflicts', function() {
- var conflictDialogStub;
- var clock;
- var fileList;
-
- beforeEach(function() {
- $('#testArea').append(
- '<div id="tableContainer">' +
- '<table id="filestable" class="list-container view-grid">' +
- '<thead><tr>' +
- '<th id="headerName" class="hidden column-name">' +
- '<input type="checkbox" id="select_all_files" class="select-all">' +
- '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
- '<span id="selectedActionsList" class="selectedActions hidden">' +
- '<a href class="download"><img src="actions/download.svg">Download</a>' +
- '<a href class="delete-selected">Delete</a></span>' +
- '</th>' +
- '<th class="hidden column-size"><a class="columntitle" data-sort="size"><span class="sort-indicator"></span></a></th>' +
- '<th class="hidden column-mtime"><a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a></th>' +
- '</tr></thead>' +
- '<tbody id="fileList"></tbody>' +
- '<tfoot></tfoot>' +
- '</table>' +
- '</div>'
- );
- fileList = new OCA.Files.FileList($('#tableContainer'));
-
- fileList.add({name: 'conflict.txt', mimetype: 'text/plain'});
- fileList.add({name: 'conflict2.txt', mimetype: 'text/plain'});
-
- conflictDialogStub = sinon.stub(OC.dialogs, 'fileexists');
-
- uploader = new OC.Uploader($dummyUploader, {
- progressBar: progressBarStub,
- fileList: fileList
- });
-
- var deferred = $.Deferred();
- conflictDialogStub.returns(deferred.promise());
- deferred.resolve();
- });
- afterEach(function() {
- if (clock) {
- clock.restore();
- clock = undefined
- }
-
- conflictDialogStub.restore();
-
- fileList.destroy();
- });
- it('does not show conflict dialog when no client side conflict', function(done) {
- $('#free_space').val(200000);
- var counter = 0;
- var fun = function() {
- counter++;
- if(counter != 2) {
- return;
- }
- expect(result[0].submit.calledOnce).toEqual(true);
- expect(result[1].submit.calledOnce).toEqual(true);
- setTimeout(done, 0);
- };
- var result = addFiles(uploader, [{name: 'noconflict.txt'}, {name: 'noconflict2.txt'}]);
- result[0].submit.callsFake(fun);
- result[1].submit.callsFake(fun);
-
- expect(conflictDialogStub.notCalled).toEqual(true);
-
- });
- it('shows conflict dialog when no client side conflict', function(done) {
- var counter = 0;
- conflictDialogStub.callsFake(function(){
- counter++;
- if(counter != 3) {
- return $.Deferred().resolve().promise();
- }
- setTimeout(function() {
- expect(conflictDialogStub.callCount).toEqual(3);
- expect(conflictDialogStub.getCall(1).args[0].getFileName())
- .toEqual('conflict.txt');
- expect(conflictDialogStub.getCall(1).args[1])
- .toEqual({ name: 'conflict.txt', mimetype: 'text/plain', directory: '/' });
- expect(conflictDialogStub.getCall(1).args[2]).toEqual({ name: 'conflict.txt' });
-
- // yes, the dialog must be called several times...
- expect(conflictDialogStub.getCall(2).args[0].getFileName()).toEqual('conflict2.txt');
- expect(conflictDialogStub.getCall(2).args[1])
- .toEqual({ name: 'conflict2.txt', mimetype: 'text/plain', directory: '/' });
- expect(conflictDialogStub.getCall(2).args[2]).toEqual({ name: 'conflict2.txt' });
-
- expect(result[0].submit.calledOnce).toEqual(false);
- expect(result[1].submit.calledOnce).toEqual(false);
- expect(result[2].submit.calledOnce).toEqual(true);
- done();
- }, 10);
- });
- var result = addFiles(uploader, [
- {name: 'conflict.txt'},
- {name: 'conflict2.txt'},
- {name: 'noconflict.txt'}
- ]);
-
- });
- it('cancels upload when skipping file in conflict mode', function(done) {
- var fileData = {name: 'conflict.txt'};
- var uploadData = addFiles(uploader, [
- fileData
- ]);
-
- var upload = new OC.FileUpload(uploader, uploadData[0]);
- var deleteStub = sinon.stub(upload, 'deleteUpload');
- deleteStub.callsFake(function(){
- expect(deleteStub.calledOnce).toEqual(true);
- done();
- });
-
- uploader.onSkip(upload);
- });
- it('overwrites file when choosing replace in conflict mode', function(done) {
- var fileData = {name: 'conflict.txt'};
- var uploadData = addFiles(uploader, [
- fileData
- ]);
-
- expect(uploadData[0].submit.notCalled).toEqual(true);
-
- var upload = new OC.FileUpload(uploader, uploadData[0]);
- uploadData[0].submit.callsFake(function(){
- expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_OVERWRITE);
- expect(uploadData[0].submit.callCount).toEqual(1);
- done();
- });
- uploader.onReplace(upload);
- });
- it('autorenames file when choosing replace in conflict mode', function(done) {
- var fileData = {name: 'conflict.txt'};
- var uploadData = addFiles(uploader, [
- fileData
- ]);
-
- expect(uploadData[0].submit.notCalled).toEqual(true);
-
- var upload = new OC.FileUpload(uploader, uploadData[0]);
- var getResponseStatusStub = sinon.stub(upload, 'getResponseStatus');
- var counter = 0;
- uploadData[0].submit.callsFake(function(){
- counter++;
- if(counter===1)
- {
- expect(upload.getConflictMode()).toEqual(OC.FileUpload.CONFLICT_MODE_AUTORENAME);
- expect(upload.getFileName()).toEqual('conflict (2).txt');
- expect(uploadData[0].submit.calledOnce).toEqual(true);
- getResponseStatusStub.returns(412);
- uploader.fileUploadParam.fail.call($dummyUploader[0], {}, uploadData[0]);
- }
- if(counter===2)
- {
- _.defer(function() {
- expect(upload.getFileName()).toEqual('conflict (3).txt');
- expect(uploadData[0].submit.calledTwice).toEqual(true);
-
- done();
- })
- }
- });
-
- uploader.onAutorename(upload);
-
- // in case of server-side conflict, tries to rename again
- });
- });
-});
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
deleted file mode 100644
index cc12bfc7642..00000000000
--- a/apps/files/tests/js/fileactionsSpec.js
+++ /dev/null
@@ -1,759 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Chan <plus.vincchan@gmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FileActions tests', function() {
- var fileList, fileActions, clock;
-
- beforeEach(function() {
- clock = sinon.useFakeTimers();
- // init horrible parameters
- var $body = $('#testArea');
- $body.append('<input type="hidden" id="dir" value="/subdir"></input>');
- $body.append('<input type="hidden" id="permissions" value="31"></input>');
- $body.append('<table id="filestable" class="list-container view-grid"><tbody id="fileList"></tbody></table>');
- // dummy files table
- fileActions = new OCA.Files.FileActions();
- fileActions.registerAction({
- name: 'Testdropdown',
- displayName: 'Testdropdowndisplay',
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- icon: function () {
- return OC.imagePath('core', 'actions/download');
- }
- });
-
- fileActions.registerAction({
- name: 'Testinline',
- displayName: 'Testinlinedisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.registerAction({
- name: 'Testdefault',
- displayName: 'Testdefaultdisplay',
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
- fileActions.setDefault('all', 'Testdefault');
- fileList = new OCA.Files.FileList($body, {
- fileActions: fileActions
- });
- });
- afterEach(function() {
- fileActions = null;
- fileList.destroy();
- fileList = undefined;
- clock.restore();
- $('#dir, #permissions, #filestable').remove();
- });
- it('calling clear() clears file actions', function() {
- fileActions.clear();
- expect(fileActions.actions).toEqual({});
- expect(fileActions.defaults).toEqual({});
- expect(fileActions.icons).toEqual({});
- expect(fileActions.currentFile).toBe(null);
- });
- describe('displaying actions', function() {
- var $tr;
-
- beforeEach(function() {
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456',
- permissions: OC.PERMISSION_READ | OC.PERMISSION_UPDATE
- };
-
- // note: FileActions.display() is called implicitly
- $tr = fileList.add(fileData);
- });
- it('renders inline file actions', function() {
- // actions defined after call
- expect($tr.find('.action.action-testinline').length).toEqual(1);
- expect($tr.find('.action.action-testinline').attr('data-action')).toEqual('Testinline');
- });
- it('does not render dropdown actions', function() {
- expect($tr.find('.action.action-testdropdown').length).toEqual(0);
- });
- it('does not render default action', function() {
- expect($tr.find('.action.action-testdefault').length).toEqual(0);
- });
- it('replaces file actions when displayed twice', function() {
- fileActions.display($tr.find('td.filename'), true, fileList);
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action.action-testinline').length).toEqual(1);
- });
- it('renders actions menu trigger', function() {
- expect($tr.find('.action.action-menu').length).toEqual(1);
- expect($tr.find('.action.action-menu').attr('data-action')).toEqual('menu');
- });
- it('only renders actions relevant to the mime type', function() {
- fileActions.registerAction({
- name: 'Match',
- displayName: 'MatchDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'text/plain',
- permissions: OC.PERMISSION_READ
- });
- fileActions.registerAction({
- name: 'Nomatch',
- displayName: 'NoMatchDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'application/octet-stream',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
- expect($tr.find('.action.action-match').length).toEqual(1);
- expect($tr.find('.action.action-nomatch').length).toEqual(0);
- });
- it('only renders actions relevant to the permissions', function() {
- fileActions.registerAction({
- name: 'Match',
- displayName: 'MatchDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'text/plain',
- permissions: OC.PERMISSION_UPDATE
- });
- fileActions.registerAction({
- name: 'Nomatch',
- displayName: 'NoMatchDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'text/plain',
- permissions: OC.PERMISSION_DELETE
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
- expect($tr.find('.action.action-match').length).toEqual(1);
- expect($tr.find('.action.action-nomatch').length).toEqual(0);
- });
- it('display inline icon with image path', function() {
- fileActions.registerAction({
- name: 'Icon',
- displayName: 'IconDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- icon: OC.imagePath('core', 'actions/icon'),
- permissions: OC.PERMISSION_READ
- });
- fileActions.registerAction({
- name: 'NoIcon',
- displayName: 'NoIconDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action.action-icon').length).toEqual(1);
- expect($tr.find('.action.action-icon').find('img').length).toEqual(1);
- expect($tr.find('.action.action-icon').find('img').eq(0).attr('src')).toEqual(OC.imagePath('core', 'actions/icon'));
-
- expect($tr.find('.action.action-noicon').length).toEqual(1);
- expect($tr.find('.action.action-noicon').find('img').length).toEqual(0);
- });
- it('display alt text on inline icon with image path', function() {
- fileActions.registerAction({
- name: 'IconAltText',
- displayName: 'IconAltTextDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- icon: OC.imagePath('core', 'actions/iconAltText'),
- altText: 'alt icon text',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.registerAction({
- name: 'IconNoAltText',
- displayName: 'IconNoAltTextDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- icon: OC.imagePath('core', 'actions/iconNoAltText'),
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action.action-iconalttext').length).toEqual(1);
- expect($tr.find('.action.action-iconalttext').find('img').length).toEqual(1);
- expect($tr.find('.action.action-iconalttext').find('img').eq(0).attr('alt')).toEqual('alt icon text');
-
- expect($tr.find('.action.action-iconnoalttext').length).toEqual(1);
- expect($tr.find('.action.action-iconnoalttext').find('img').length).toEqual(1);
- expect($tr.find('.action.action-iconnoalttext').find('img').eq(0).attr('alt')).toEqual('');
- });
- it('display inline icon with iconClass', function() {
- fileActions.registerAction({
- name: 'Icon',
- displayName: 'IconDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- iconClass: 'icon-test',
- permissions: OC.PERMISSION_READ
- });
- fileActions.registerAction({
- name: 'NoIcon',
- displayName: 'NoIconDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action.action-icon').length).toEqual(1);
- expect($tr.find('.action.action-icon').find('.icon').length).toEqual(1);
- expect($tr.find('.action.action-icon').find('.icon').hasClass('icon-test')).toEqual(true);
-
- expect($tr.find('.action.action-noicon').length).toEqual(1);
- expect($tr.find('.action.action-noicon').find('.icon').length).toEqual(0);
- });
- it('display alt text on inline icon with iconClass when no display name exists', function() {
- fileActions.registerAction({
- name: 'IconAltText',
- displayName: '',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- iconClass: 'icon-alttext',
- altText: 'alt icon text',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.registerAction({
- name: 'IconNoAltText',
- displayName: 'IconNoAltTextDisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- altText: 'useless alt text',
- iconClass: 'icon-noalttext',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action.action-iconalttext').length).toEqual(1);
- expect($tr.find('.action.action-iconalttext').find('.icon').length).toEqual(1);
- expect($tr.find('.action.action-iconalttext').find('.hidden-visually').text()).toEqual('alt icon text');
-
- expect($tr.find('.action.action-iconnoalttext').length).toEqual(1);
- expect($tr.find('.action.action-iconnoalttext').find('.icon').length).toEqual(1);
- expect($tr.find('.action.action-iconnoalttext').find('.hidden-visually').length).toEqual(0);
- });
- });
- describe('action handler', function() {
- var actionStub, $tr, clock;
-
- beforeEach(function() {
- clock = sinon.useFakeTimers();
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- actionStub = sinon.stub();
- fileActions.registerAction({
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- icon: OC.imagePath('core', 'actions/test'),
- permissions: OC.PERMISSION_READ,
- actionHandler: actionStub
- });
- $tr = fileList.add(fileData);
- });
- afterEach(function() {
- OC.hideMenus();
- // jump past animations
- clock.tick(1000);
- clock.restore();
- });
- it('passes context to action handler', function() {
- var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners');
- $tr.find('.action-test').click();
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
- var context = actionStub.getCall(0).args[1];
- expect(context.$file.is($tr)).toEqual(true);
- expect(context.fileList).toBeDefined();
- expect(context.fileActions).toBeDefined();
- expect(context.dir).toEqual('/subdir');
- expect(context.fileInfoModel.get('name')).toEqual('testName.txt');
-
- expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
- expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'testName.txt',
- context: context
- });
- expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'testName.txt',
- context: context
- });
-
- // when data-path is defined
- actionStub.reset();
- $tr.attr('data-path', '/somepath');
- $tr.find('.action-test').click();
- context = actionStub.getCall(0).args[1];
- expect(context.dir).toEqual('/somepath');
- });
- it('also triggers action handler when calling triggerAction()', function() {
- var notifyUpdateListenersSpy = sinon.spy(fileList.fileActions, '_notifyUpdateListeners');
- var model = new OCA.Files.FileInfoModel({
- id: 1,
- name: 'Test.txt',
- path: '/subdir',
- mime: 'text/plain',
- permissions: 31
- });
- fileActions.triggerAction('Test', model, fileList);
-
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('Test.txt');
- expect(actionStub.getCall(0).args[1].fileList).toEqual(fileList);
- expect(actionStub.getCall(0).args[1].fileActions).toEqual(fileActions);
- expect(actionStub.getCall(0).args[1].fileInfoModel).toEqual(model);
-
- expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
- expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'Test.txt',
- context: {
- fileActions: fileActions,
- fileInfoModel: model,
- dir: '/subdir',
- fileList: fileList,
- $file: fileList.findFileEl('Test.txt')
- }
- });
- expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'Test.txt',
- context: {
- fileActions: fileActions,
- fileInfoModel: model,
- dir: '/subdir',
- fileList: fileList,
- $file: fileList.findFileEl('Test.txt')
- }
- });
- });
- it('triggers listener events when invoked directly', function() {
- var context = {fileActions: new OCA.Files.FileActions()}
- var notifyUpdateListenersSpy = sinon.spy(context.fileActions, '_notifyUpdateListeners');
- var testAction = fileActions.get('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'];
-
- testAction('Test.txt', context);
-
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('Test.txt');
- expect(actionStub.getCall(0).args[1]).toBe(context);
-
- expect(notifyUpdateListenersSpy.calledTwice).toEqual(true);
- expect(notifyUpdateListenersSpy.calledBefore(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.calledAfter(actionStub)).toEqual(true);
- expect(notifyUpdateListenersSpy.getCall(0).args[0]).toEqual('beforeTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(0).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'Test.txt',
- context: context
- });
- expect(notifyUpdateListenersSpy.getCall(1).args[0]).toEqual('afterTriggerAction');
- expect(notifyUpdateListenersSpy.getCall(1).args[1]).toEqual({
- action: fileActions.getActions('all', OCA.Files.FileActions.TYPE_INLINE, OC.PERMISSION_READ)['Test'],
- fileName: 'Test.txt',
- context: context
- });
- }),
- describe('actions menu', function() {
- it('shows actions menu inside row when clicking the menu trigger', function() {
- expect($tr.find('td.filename .fileActionsMenu').length).toEqual(0);
- $tr.find('.action-menu').click();
- expect($tr.find('td.filename .fileActionsMenu').length).toEqual(1);
- });
- it('shows highlight on current row', function() {
- $tr.find('.action-menu').click();
- expect($tr.hasClass('mouseOver')).toEqual(true);
- });
- it('cleans up after hiding', function() {
- var slideUpStub = sinon.stub($.fn, 'slideUp');
- $tr.find('.action-menu').click();
- expect($tr.find('.fileActionsMenu').length).toEqual(1);
- OC.hideMenus();
- // sliding animation
- expect(slideUpStub.calledOnce).toEqual(true);
- slideUpStub.getCall(0).args[1]();
- expect($tr.hasClass('mouseOver')).toEqual(false);
- expect($tr.find('.fileActionsMenu').length).toEqual(0);
- });
- });
- });
- describe('custom rendering', function() {
- var $tr;
- beforeEach(function() {
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- $tr = fileList.add(fileData);
- });
- it('regular function', function() {
- var actionStub = sinon.stub();
- fileActions.registerAction({
- name: 'Test',
- displayName: '',
- mime: 'all',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- render: function(actionSpec, isDefault, context) {
- expect(actionSpec.name).toEqual('Test');
- expect(actionSpec.displayName).toEqual('');
- expect(actionSpec.permissions).toEqual(OC.PERMISSION_READ);
- expect(actionSpec.mime).toEqual('all');
- expect(isDefault).toEqual(false);
-
- expect(context.fileList).toEqual(fileList);
- expect(context.$file[0]).toEqual($tr[0]);
-
- var $customEl = $('<a class="action action-test" href="#"><span>blabli</span><span>blabla</span></a>');
- $tr.find('td:first').append($customEl);
- return $customEl;
- },
- actionHandler: actionStub
- });
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- var $actionEl = $tr.find('td:first .action-test');
- expect($actionEl.length).toEqual(1);
- expect($actionEl.hasClass('action')).toEqual(true);
-
- $actionEl.click();
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
- });
- });
- describe('merging', function() {
- var $tr;
- beforeEach(function() {
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/anotherpath/there',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- $tr = fileList.add(fileData);
- });
- afterEach(function() {
- $tr = null;
- });
- it('copies all actions to target file actions', function() {
- var actions1 = new OCA.Files.FileActions();
- var actions2 = new OCA.Files.FileActions();
- var actionStub1 = sinon.stub();
- var actionStub2 = sinon.stub();
- actions1.registerAction({
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub1
- });
- actions2.registerAction({
- name: 'Test2',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub2
- });
- actions2.merge(actions1);
-
- actions2.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action-test').length).toEqual(1);
- expect($tr.find('.action-test2').length).toEqual(1);
-
- $tr.find('.action-test').click();
- expect(actionStub1.calledOnce).toEqual(true);
- expect(actionStub2.notCalled).toEqual(true);
-
- actionStub1.reset();
-
- $tr.find('.action-test2').click();
- expect(actionStub1.notCalled).toEqual(true);
- expect(actionStub2.calledOnce).toEqual(true);
- });
- it('overrides existing actions on merge', function() {
- var actions1 = new OCA.Files.FileActions();
- var actions2 = new OCA.Files.FileActions();
- var actionStub1 = sinon.stub();
- var actionStub2 = sinon.stub();
- actions1.registerAction({
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub1
- });
- actions2.registerAction({
- name: 'Test', // override
- mime: 'all',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub2
- });
- actions1.merge(actions2);
-
- actions1.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action-test').length).toEqual(1);
-
- $tr.find('.action-test').click();
- expect(actionStub1.notCalled).toEqual(true);
- expect(actionStub2.calledOnce).toEqual(true);
- });
- it('overrides existing action when calling register after merge', function() {
- var actions1 = new OCA.Files.FileActions();
- var actions2 = new OCA.Files.FileActions();
- var actionStub1 = sinon.stub();
- var actionStub2 = sinon.stub();
- actions1.registerAction({
- mime: 'all',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub1
- });
-
- actions1.merge(actions2);
-
- // late override
- actions1.registerAction({
- mime: 'all',
- name: 'Test', // override
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub2
- });
-
- actions1.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action-test').length).toEqual(1);
-
- $tr.find('.action-test').click();
- expect(actionStub1.notCalled).toEqual(true);
- expect(actionStub2.calledOnce).toEqual(true);
- });
- it('leaves original file actions untouched (clean copy)', function() {
- var actions1 = new OCA.Files.FileActions();
- var actions2 = new OCA.Files.FileActions();
- var actionStub1 = sinon.stub();
- var actionStub2 = sinon.stub();
- actions1.registerAction({
- mime: 'all',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub1
- });
-
- // copy the Test action to actions2
- actions2.merge(actions1);
-
- // late override
- actions2.registerAction({
- mime: 'all',
- name: 'Test', // override
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub2
- });
-
- // check if original actions still call the correct handler
- actions1.display($tr.find('td.filename'), true, fileList);
-
- expect($tr.find('.action-test').length).toEqual(1);
-
- $tr.find('.action-test').click();
- expect(actionStub1.calledOnce).toEqual(true);
- expect(actionStub2.notCalled).toEqual(true);
- });
- });
- describe('events', function() {
- var clock;
- beforeEach(function() {
- clock = sinon.useFakeTimers();
- });
- afterEach(function() {
- clock.restore();
- });
- it('notifies update event handlers once after multiple changes', function() {
- var actionStub = sinon.stub();
- var handler = sinon.stub();
- fileActions.on('registerAction', handler);
- fileActions.registerAction({
- mime: 'all',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub
- });
- fileActions.registerAction({
- mime: 'all',
- name: 'Test2',
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub
- });
- expect(handler.calledTwice).toEqual(true);
- });
- it('does not notifies update event handlers after unregistering', function() {
- var actionStub = sinon.stub();
- var handler = sinon.stub();
- fileActions.on('registerAction', handler);
- fileActions.off('registerAction', handler);
- fileActions.registerAction({
- mime: 'all',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub
- });
- fileActions.registerAction({
- mime: 'all',
- name: 'Test2',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_READ,
- icon: OC.imagePath('core', 'actions/test'),
- actionHandler: actionStub
- });
- expect(handler.notCalled).toEqual(true);
- });
- });
- describe('default actions', function() {
- describe('download', function() {
- it('redirects to URL and sets busy state to list', function() {
- var handleDownloadStub = sinon.stub(OCA.Files.Files, 'handleDownload');
- var busyStub = sinon.stub(fileList, 'showFileBusyState');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456',
- permissions: OC.PERMISSION_READ | OC.PERMISSION_UPDATE
- };
-
- // note: FileActions.display() is called implicitly
- fileList.add(fileData);
-
- var model = fileList.getModelForFile('testName.txt');
-
- fileActions.registerDefaultActions();
- fileActions.triggerAction('Download', model, fileList);
-
- expect(busyStub.calledOnce).toEqual(true);
- expect(busyStub.calledWith('testName.txt', true)).toEqual(true);
- expect(handleDownloadStub.calledOnce).toEqual(true);
- expect(handleDownloadStub.getCall(0).args[0]).toEqual(
- OC.getRootPath() + '/remote.php/webdav/subdir/testName.txt'
- );
- busyStub.reset();
- handleDownloadStub.yield();
-
- expect(busyStub.calledOnce).toEqual(true);
- expect(busyStub.calledWith('testName.txt', false)).toEqual(true);
-
- busyStub.restore();
- handleDownloadStub.restore();
- });
- });
- });
- describe('download spinner', function() {
- var FileActions = OCA.Files.FileActions;
- var $el;
-
- beforeEach(function() {
- $el = $('<a href="#"><span class="icon icon-download"></span><span>Download</span></a>');
- });
-
- it('replaces download icon with spinner', function() {
- FileActions.updateFileActionSpinner($el, true);
- expect($el.find('.icon.icon-loading-small').length).toEqual(1);
- expect($el.find('.icon.icon-download').hasClass('hidden')).toEqual(true);
- });
- it('replaces spinner back with download icon with spinner', function() {
- FileActions.updateFileActionSpinner($el, true);
- FileActions.updateFileActionSpinner($el, false);
- expect($el.find('.icon.icon-loading-small').length).toEqual(0);
- expect($el.find('.icon.icon-download').hasClass('hidden')).toEqual(false);
- });
- });
-});
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
deleted file mode 100644
index 7549bd9dc85..00000000000
--- a/apps/files/tests/js/fileactionsmenuSpec.js
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
-* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Roland Tapken <roland@bitarbeiter.net>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FileActionsMenu tests', function() {
- var fileList, fileActions, menu, actionStub, menuContext, $tr;
-
- beforeEach(function() {
- // init horrible parameters
- var $body = $('#testArea');
- $body.append('<input type="hidden" id="dir" value="/subdir"></input>');
- $body.append('<input type="hidden" id="permissions" value="31"></input>');
- // dummy files table
- actionStub = sinon.stub();
- fileActions = new OCA.Files.FileActions();
- fileList = new OCA.Files.FileList($body, {
- fileActions: fileActions
- });
-
- fileActions.registerAction({
- name: 'Testdropdown',
- displayName: 'Testdropdowndisplay',
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- icon: function () {
- return OC.imagePath('core', 'actions/download');
- },
- actionHandler: actionStub
- });
-
- fileActions.registerAction({
- name: 'Testdropdownnoicon',
- displayName: 'Testdropdowndisplaynoicon',
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- actionHandler: actionStub
- });
-
- fileActions.registerAction({
- name: 'Testinline',
- displayName: 'Testinlinedisplay',
- type: OCA.Files.FileActions.TYPE_INLINE,
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
-
- fileActions.registerAction({
- name: 'Testdefault',
- displayName: 'Testdefaultdisplay',
- mime: 'all',
- permissions: OC.PERMISSION_READ
- });
- fileActions.setDefault('all', 'Testdefault');
-
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- $tr = fileList.add(fileData);
-
- menuContext = {
- $file: $tr,
- fileList: fileList,
- fileActions: fileActions,
- dir: fileList.getCurrentDirectory()
- };
- menu = new OCA.Files.FileActionsMenu();
- menu.show(menuContext);
- });
- afterEach(function() {
- fileActions = null;
- fileList.destroy();
- fileList = undefined;
- menu.remove();
- $('#dir, #permissions, #filestable').remove();
- });
-
- describe('rendering', function() {
- it('renders dropdown actions in menu', function() {
- var $action = menu.$el.find('a[data-action=Testdropdown]');
- expect($action.length).toEqual(1);
- expect($action.find('img').attr('src'))
- .toEqual(OC.imagePath('core', 'actions/download'));
- expect($action.find('.no-icon').length).toEqual(0);
-
- $action = menu.$el.find('a[data-action=Testdropdownnoicon]');
- expect($action.length).toEqual(1);
- expect($action.find('img').length).toEqual(0);
- expect($action.find('.no-icon').length).toEqual(1);
- });
- it('does not render default actions', function() {
- expect(menu.$el.find('a[data-action=Testdefault]').length).toEqual(0);
- });
- it('render inline actions', function() {
- expect(menu.$el.find('a[data-action=Testinline]').length).toEqual(1);
- });
- it('render inline actions but it is hidden', function() {
- expect(menu.$el.find('a[data-action=Testinline]').parent().hasClass('hidden')).toEqual(true);
- });
- it('only renders actions relevant to the mime type', function() {
- fileActions.registerAction({
- name: 'Match',
- displayName: 'MatchDisplay',
- mime: 'text/plain',
- permissions: OC.PERMISSION_READ
- });
- fileActions.registerAction({
- name: 'Nomatch',
- displayName: 'NoMatchDisplay',
- mime: 'application/octet-stream',
- permissions: OC.PERMISSION_READ
- });
-
- menu.render();
- expect(menu.$el.find('a[data-action=Match]').length).toEqual(1);
- expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0);
- });
- it('only renders actions relevant to the permissions', function() {
- fileActions.registerAction({
- name: 'Match',
- displayName: 'MatchDisplay',
- mime: 'text/plain',
- permissions: OC.PERMISSION_UPDATE
- });
- fileActions.registerAction({
- name: 'Nomatch',
- displayName: 'NoMatchDisplay',
- mime: 'text/plain',
- permissions: OC.PERMISSION_DELETE
- });
-
- menu.render();
- expect(menu.$el.find('a[data-action=Match]').length).toEqual(1);
- expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0);
- });
- it('sorts by order attribute, then name', function() {
- fileActions.registerAction({
- name: 'Baction',
- displayName: 'Baction',
- order: 2,
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL
- });
- fileActions.registerAction({
- name: 'Zaction',
- displayName: 'Zaction',
- order: 1,
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL
- });
- fileActions.registerAction({
- name: 'Yaction',
- displayName: 'Yaction',
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL
- });
- fileActions.registerAction({
- name: 'Waction',
- displayName: 'Waction',
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL
- });
-
- menu.render();
- var zactionIndex = menu.$el.find('a[data-action=Zaction]').closest('li').index();
- var bactionIndex = menu.$el.find('a[data-action=Baction]').closest('li').index();
- expect(zactionIndex).toBeLessThan(bactionIndex);
-
- var wactionIndex = menu.$el.find('a[data-action=Waction]').closest('li').index();
- var yactionIndex = menu.$el.find('a[data-action=Yaction]').closest('li').index();
- expect(wactionIndex).toBeLessThan(yactionIndex);
- });
- it('calls displayName function', function() {
- var displayNameStub = sinon.stub().returns('Test');
-
- fileActions.registerAction({
- name: 'Something',
- displayName: displayNameStub,
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL
- });
-
- menu.render();
-
- expect(displayNameStub.calledOnce).toEqual(true);
- expect(displayNameStub.calledWith(menuContext)).toEqual(true);
- expect(menu.$el.find('a[data-action=Something] span:not(.icon)').text()).toEqual('Test');
- });
- it('uses plain iconClass', function() {
- fileActions.registerAction({
- name: 'Something',
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL,
- iconClass: 'test'
- });
-
- menu.render();
-
- expect(menu.$el.find('a[data-action=Something]').children('span.icon').hasClass('test')).toEqual(true);
- });
- it('calls iconClass function', function() {
- var iconClassStub = sinon.stub().returns('test');
-
- fileActions.registerAction({
- name: 'Something',
- mime: 'text/plain',
- permissions: OC.PERMISSION_ALL,
- iconClass: iconClassStub
- });
-
- menu.render();
-
- expect(iconClassStub.calledOnce).toEqual(true);
- expect(iconClassStub.calledWith(menuContext.$file.attr('data-file'), menuContext)).toEqual(true);
- expect(menu.$el.find('a[data-action=Something]').children('span.icon').hasClass('test')).toEqual(true);
- });
- });
-
- describe('action handler', function() {
- it('calls action handler when clicking menu item', function() {
- var $action = menu.$el.find('a[data-action=Testdropdown]');
- $action.click();
-
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('testName.txt');
- expect(actionStub.getCall(0).args[1].$file[0]).toEqual($tr[0]);
- expect(actionStub.getCall(0).args[1].fileList).toEqual(fileList);
- expect(actionStub.getCall(0).args[1].fileActions).toEqual(fileActions);
- expect(actionStub.getCall(0).args[1].dir).toEqual('/subdir');
- });
- });
- describe('default actions from registerDefaultActions', function() {
- beforeEach(function() {
- fileActions.clear();
- fileActions.registerDefaultActions();
- });
- it('redirects to download URL when clicking download', function() {
- var redirectStub = sinon.stub(OC, 'redirect');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- var menuContext = {
- $file: $tr,
- fileList: fileList,
- fileActions: fileActions,
- fileInfoModel: new OCA.Files.FileInfoModel(fileData),
- dir: fileList.getCurrentDirectory()
- };
- menu = new OCA.Files.FileActionsMenu();
- menu.show(menuContext);
-
- menu.$el.find('.action-download').click();
-
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(
- OC.getRootPath() +
- '/remote.php/webdav/subdir/testName.txt'
- );
- redirectStub.restore();
- });
- it('takes the file\'s path into account when clicking download', function() {
- var redirectStub = sinon.stub(OC, 'redirect');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/anotherpath/there',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- var menuContext = {
- $file: $tr,
- fileList: fileList,
- fileActions: fileActions,
- fileInfoModel: new OCA.Files.FileInfoModel(fileData),
- dir: '/anotherpath/there'
- };
- menu = new OCA.Files.FileActionsMenu();
- menu.show(menuContext);
-
- menu.$el.find('.action-download').click();
-
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(
- OC.getRootPath() + '/remote.php/webdav/anotherpath/there/testName.txt'
- );
- redirectStub.restore();
- });
- it('deletes file when clicking delete', function() {
- var deleteStub = sinon.stub(fileList, 'do_delete');
- var fileData = {
- id: 18,
- type: 'file',
- name: 'testName.txt',
- path: '/somepath/dir',
- mimetype: 'text/plain',
- size: '1234',
- etag: 'a01234c',
- mtime: '123456'
- };
- var $tr = fileList.add(fileData);
- fileActions.display($tr.find('td.filename'), true, fileList);
-
- var menuContext = {
- $file: $tr,
- fileList: fileList,
- fileActions: fileActions,
- fileInfoModel: new OCA.Files.FileInfoModel(fileData),
- dir: '/somepath/dir'
- };
- menu = new OCA.Files.FileActionsMenu();
- menu.show(menuContext);
-
- menu.$el.find('.action-delete').click();
-
- expect(deleteStub.calledOnce).toEqual(true);
- expect(deleteStub.getCall(0).args[0]).toEqual('testName.txt');
- expect(deleteStub.getCall(0).args[1]).toEqual('/somepath/dir');
- deleteStub.restore();
- });
- });
-});
-
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
deleted file mode 100644
index d35b3a19b9c..00000000000
--- a/apps/files/tests/js/filelistSpec.js
+++ /dev/null
@@ -1,3459 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Abijeet <abijeetpatro@gmail.com>
- * @author Azul <azul@riseup.net>
- * @author Bernd Stellwag <burned@zerties.org>
- * @author Bjoern Schiessle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Clark Tomlinson <fallen013@gmail.com>
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author Hasso Tepper <hasso@zone.ee>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Michael Weimann <mail@michael-weimann.eu>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Nazar Mokrynskyi <nazar@mokrynskyi.com>
- * @author noveens <noveen.sachdeva@research.iiit.ac.in>
- * @author Remco Brenninkmeijer <requist1@starmail.nl>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Roland Tapken <roland@bitarbeiter.net>
- * @author Thomas Citharel <nextcloud@tcit.fr>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Tomasz Grobelny <tomasz@grobelny.net>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FileList tests', function() {
- var FileInfo = OC.Files.FileInfo;
- var testFiles, testRoot, notificationStub, fileList, pageSizeStub;
- var bcResizeStub;
- var filesClient;
- var filesConfig;
- var redirectStub;
-
- /**
- * Generate test file data
- */
- function generateFiles(startIndex, endIndex) {
- var files = [];
- var name;
- for (var i = startIndex; i <= endIndex; i++) {
- name = 'File with index ';
- if (i < 10) {
- // do not rely on localeCompare here
- // and make the sorting predictable
- // cross-browser
- name += '0';
- }
- name += i + '.txt';
- files.push(new FileInfo({
- id: i,
- type: 'file',
- name: name,
- mimetype: 'text/plain',
- size: i * 2,
- etag: 'abc'
- }));
- }
- return files;
- }
-
- beforeEach(function() {
- filesConfig = new OC.Backbone.Model({
- showhidden: true
- });
-
- filesClient = new OC.Files.Client({
- host: 'localhost',
- port: 80,
- // FIXME: uncomment after fixing the test OC.getRootPath()
- //root: OC.getRootPath() + '/remote.php/webdav',
- root: '/remote.php/webdav',
- useHTTPS: false
- });
- redirectStub = sinon.stub(OC, 'redirect');
- notificationStub = sinon.stub(OC.Notification, 'show');
- // prevent resize algo to mess up breadcrumb order while
- // testing
- bcResizeStub = sinon.stub(OCA.Files.BreadCrumb.prototype, '_resize');
-
- // init parameters and test table elements
- $('#testArea').append(
- '<div id="app-content-files">' +
- // init horrible parameters
- '<input type="hidden" id="dir" value="/subdir"/>' +
- '<input type="hidden" id="permissions" value="31"/>' +
- // dummy controls
- '<div id="controls">' +
- ' <div class="actions creatable"></div>' +
- ' <div class="notCreatable"></div>' +
- '</div>' +
- // uploader
- '<input type="file" id="file_upload_start" name="files[]" multiple="multiple">' +
- // dummy table
- // TODO: at some point this will be rendered by the fileList class itself!
- '<table id="filestable" class="list-container view-grid">' +
- '<thead><tr>' +
- '<th id="headerName" class="hidden column-name">' +
- '<input type="checkbox" id="select_all_files" class="select-all checkbox">' +
- '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
- '<span id="selectedActionsList" class="selectedActions hidden">' +
- '<a href class="actions-selected"><span class="icon icon-more"></span><span>Actions</span></a>' +
- '</th>' +
- '<th class="hidden column-size"><a class="columntitle" data-sort="size"><span class="sort-indicator"></span></a></th>' +
- '<th class="hidden column-mtime"><a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a></th>' +
- '</tr></thead>' +
- '<tbody id="fileList"></tbody>' +
- '<tfoot></tfoot>' +
- '</table>' +
- // TODO: move to handlebars template
- '<div id="emptycontent"><h2>Empty content message</h2><p class="uploadmessage">Upload message</p></div>' +
- '<div class="nofilterresults hidden"></div>' +
- '</div>'
- );
-
- testRoot = new FileInfo({
- // root entry
- id: 99,
- type: 'dir',
- name: '/subdir',
- mimetype: 'httpd/unix-directory',
- size: 1200000,
- etag: 'a0b0c0d0',
- permissions: OC.PERMISSION_ALL
- });
- testFiles = [new FileInfo({
- id: 1,
- type: 'file',
- name: 'One.txt',
- mimetype: 'text/plain',
- mtime: 123456789,
- size: 12,
- etag: 'abc',
- permissions: OC.PERMISSION_ALL
- }), new FileInfo({
- id: 2,
- type: 'file',
- name: 'Two.jpg',
- mimetype: 'image/jpeg',
- mtime: 234567890,
- size: 12049,
- etag: 'def',
- permissions: OC.PERMISSION_ALL
- }), new FileInfo({
- id: 3,
- type: 'file',
- name: 'Three.pdf',
- mimetype: 'application/pdf',
- mtime: 234560000,
- size: 58009,
- etag: '123',
- permissions: OC.PERMISSION_ALL
- }), new FileInfo({
- id: 4,
- type: 'dir',
- name: 'somedir',
- mimetype: 'httpd/unix-directory',
- mtime: 134560000,
- size: 250,
- etag: '456',
- permissions: OC.PERMISSION_ALL
- })];
- pageSizeStub = sinon.stub(OCA.Files.FileList.prototype, 'pageSize').returns(20);
- fileList = new OCA.Files.FileList($('#app-content-files'), {
- filesClient: filesClient,
- config: filesConfig,
- enableUpload: true,
- multiSelectMenu: [{
- name: 'copyMove',
- displayName: t('files', 'Move or copy'),
- iconClass: 'icon-external',
- },
- {
- name: 'download',
- displayName: t('files', 'Download'),
- iconClass: 'icon-download',
- },
- {
- name: 'delete',
- displayName: t('files', 'Delete'),
- iconClass: 'icon-delete',
- }]
- });
- });
- afterEach(function() {
- testFiles = undefined;
- if (fileList) {
- fileList.destroy();
- }
- fileList = undefined;
-
- notificationStub.restore();
- bcResizeStub.restore();
- pageSizeStub.restore();
- redirectStub.restore();
- });
- describe('Getters', function() {
- it('Returns the current directory', function() {
- $('#dir').val('/one/two/three');
- expect(fileList.getCurrentDirectory()).toEqual('/one/two/three');
- });
- it('Returns the directory permissions as int', function() {
- $('#permissions').val('23');
- expect(fileList.getDirectoryPermissions()).toEqual(23);
- });
- });
- describe('Adding files', function() {
- it('generates file element with correct attributes when calling add() with file data', function() {
- var fileData = new FileInfo({
- id: 18,
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: 1234,
- etag: 'a01234c',
- mtime: 123456
- });
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr[0].tagName.toLowerCase()).toEqual('tr');
- expect($tr.attr('data-id')).toEqual('18');
- expect($tr.attr('data-type')).toEqual('file');
- expect($tr.attr('data-file')).toEqual('testName.txt');
- expect($tr.attr('data-size')).toEqual('1234');
- expect($tr.attr('data-etag')).toEqual('a01234c');
- expect($tr.attr('data-permissions')).toEqual('31');
- expect($tr.attr('data-mime')).toEqual('text/plain');
- expect($tr.attr('data-mtime')).toEqual('123456');
- expect($tr.attr('data-e2eencrypted')).toEqual('false');
- expect($tr.find('a.name').attr('href'))
- .toEqual(OC.getRootPath() + '/remote.php/webdav/subdir/testName.txt');
- expect($tr.find('.nametext').text().trim()).toEqual('testName.txt');
-
- expect($tr.find('.filesize').text()).toEqual('1 KB');
- expect($tr.find('.date').text()).not.toEqual('?');
- expect(fileList.findFileEl('testName.txt')[0]).toEqual($tr[0]);
- });
- it('generates file element with url for default action when one is defined', function() {
- var actionStub = sinon.stub();
- fileList.setFiles(testFiles);
- fileList.fileActions.registerAction({
- mime: 'text/plain',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_ALL,
- icon: function() {
- // Specify icon for hitory button
- return OC.imagePath('core','actions/history');
- },
- actionHandler: actionStub
- });
- fileList.fileActions.setDefault('text/plain', 'Test');
- var fileData = new FileInfo({
- id: 18,
- name: 'testName.txt',
- mimetype: 'text/plain',
- size: 1234,
- etag: 'a01234c',
- mtime: 123456
- });
- var $tr = fileList.add(fileData);
- expect($tr.find('a.name').attr('href'))
- .toEqual(OC.getRootPath() + '/index.php/apps/files?dir=&openfile=18');
- });
- it('generates dir element with correct attributes when calling add() with dir data', function() {
- var fileData = new FileInfo({
- id: 19,
- name: 'testFolder',
- mimetype: 'httpd/unix-directory',
- size: 1234,
- etag: 'a01234c',
- mtime: 123456
- });
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr[0].tagName.toLowerCase()).toEqual('tr');
- expect($tr.attr('data-id')).toEqual('19');
- expect($tr.attr('data-type')).toEqual('dir');
- expect($tr.attr('data-file')).toEqual('testFolder');
- expect($tr.attr('data-size')).toEqual('1234');
- expect($tr.attr('data-etag')).toEqual('a01234c');
- expect($tr.attr('data-permissions')).toEqual('31');
- expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
- expect($tr.attr('data-mtime')).toEqual('123456');
- expect($tr.attr('data-e2eencrypted')).toEqual('false');
-
- expect($tr.find('.filesize').text()).toEqual('1 KB');
- expect($tr.find('.date').text()).not.toEqual('?');
-
- expect(fileList.findFileEl('testFolder')[0]).toEqual($tr[0]);
- });
- it('generates file element with default attributes when calling add() with minimal data', function() {
- var fileData = {
- type: 'file',
- name: 'testFile.txt'
- };
-
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr[0].tagName.toLowerCase()).toEqual('tr');
- expect($tr.attr('data-id')).toBeUndefined();
- expect($tr.attr('data-type')).toEqual('file');
- expect($tr.attr('data-file')).toEqual('testFile.txt');
- expect($tr.attr('data-size')).toBeUndefined();
- expect($tr.attr('data-etag')).toBeUndefined();
- expect($tr.attr('data-permissions')).toEqual('31');
- expect($tr.attr('data-mime')).toBeUndefined();
- expect($tr.attr('data-e2eencrypted')).toEqual('false');
-
- expect($tr.find('.filesize').text()).toEqual('Pending');
- expect($tr.find('.date').text()).not.toEqual('?');
- });
- it('generates dir element with default attributes when calling add() with minimal data', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder'
- };
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr[0].tagName.toLowerCase()).toEqual('tr');
- expect($tr.attr('data-id')).toBeUndefined();
- expect($tr.attr('data-type')).toEqual('dir');
- expect($tr.attr('data-file')).toEqual('testFolder');
- expect($tr.attr('data-size')).toBeUndefined();
- expect($tr.attr('data-etag')).toBeUndefined();
- expect($tr.attr('data-permissions')).toEqual('31');
- expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
- expect($tr.attr('data-e2eencrypted')).toEqual('false');
-
- expect($tr.find('.filesize').text()).toEqual('Pending');
- expect($tr.find('.date').text()).not.toEqual('?');
- });
- it('generates dir element with true e2eencrypted attribute when calling add() with minimal data including isEncrypted', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder',
- isEncrypted: true
- };
- var $tr = fileList.add(fileData);
- expect($tr.attr('data-e2eencrypted')).toEqual('true');
- });
- it('generates file element with no permissions when permissions are explicitly none', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder',
- permissions: OC.PERMISSION_NONE
- };
- var $tr = fileList.add(fileData);
- expect($tr.attr('data-permissions')).toEqual('0');
- });
- it('generates file element with zero size when size is explicitly zero', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder',
- size: '0'
- };
- var $tr = fileList.add(fileData);
- expect($tr.find('.filesize').text()).toEqual('0 KB');
- });
- it('generates file element with unknown date when mtime invalid', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder',
- mtime: -1
- };
- var $tr = fileList.add(fileData);
- expect($tr.find('.date .modified').text()).toEqual('?');
- });
- it('adds new file to the end of the list', function() {
- var $tr;
- var fileData = {
- type: 'file',
- name: 'ZZZ.txt'
- };
- fileList.setFiles(testFiles);
- $tr = fileList.add(fileData);
- expect($tr.index()).toEqual(4);
- });
- it('inserts files in a sorted manner when insert option is enabled', function() {
- for (var i = 0; i < testFiles.length; i++) {
- fileList.add(testFiles[i]);
- }
- expect(fileList.files[0].name).toEqual('somedir');
- expect(fileList.files[1].name).toEqual('One.txt');
- expect(fileList.files[2].name).toEqual('Three.pdf');
- expect(fileList.files[3].name).toEqual('Two.jpg');
- });
- it('inserts new file at correct position', function() {
- var $tr;
- var fileData = {
- type: 'file',
- name: 'P comes after O.txt'
- };
- for (var i = 0; i < testFiles.length; i++) {
- fileList.add(testFiles[i]);
- }
- $tr = fileList.add(fileData);
- // after "One.txt"
- expect($tr.index()).toEqual(2);
- expect(fileList.files[2]).toEqual(fileData);
- });
- it('inserts new folder at correct position in insert mode', function() {
- var $tr;
- var fileData = {
- type: 'dir',
- name: 'somedir2 comes after somedir'
- };
- for (var i = 0; i < testFiles.length; i++) {
- fileList.add(testFiles[i]);
- }
- $tr = fileList.add(fileData);
- expect($tr.index()).toEqual(1);
- expect(fileList.files[1]).toEqual(fileData);
- });
- it('inserts new file at the end correctly', function() {
- var $tr;
- var fileData = {
- type: 'file',
- name: 'zzz.txt'
- };
- for (var i = 0; i < testFiles.length; i++) {
- fileList.add(testFiles[i]);
- }
- $tr = fileList.add(fileData);
- expect($tr.index()).toEqual(4);
- expect(fileList.files[4]).toEqual(fileData);
- });
- it('removes empty content message and shows summary when adding first file', function() {
- var $summary;
- var fileData = {
- type: 'file',
- name: 'first file.txt',
- size: 12
- };
- fileList.setFiles([]);
- expect(fileList.isEmpty).toEqual(true);
- fileList.add(fileData);
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(false);
- // yes, ugly...
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.connector').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').hasClass('hidden')).toEqual(false);
- expect($summary.find('.filesize').text()).toEqual('12 B');
- expect($('#filestable thead th').hasClass('hidden')).toEqual(false);
- expect($('#emptycontent').hasClass('hidden')).toEqual(true);
- expect(fileList.isEmpty).toEqual(false);
- });
- it('correctly adds the extension markup and show hidden files completely in gray', function() {
- var $tr;
- var testDataAndExpectedResult = [
- {file: {type: 'file', name: 'ZZZ.txt'}, extension: '.txt'},
- {file: {type: 'file', name: 'ZZZ.tar.gz'}, extension: '.gz'},
- {file: {type: 'file', name: 'test.with.some.dots.in.it.txt'}, extension: '.txt'},
- // we render hidden files completely in gray
- {file: {type: 'file', name: '.test.with.some.dots.in.it.txt'}, extension: '.test.with.some.dots.in.it.txt'},
- {file: {type: 'file', name: '.hidden'}, extension: '.hidden'},
- ];
- fileList.setFiles(testFiles);
-
- for(var i = 0; i < testDataAndExpectedResult.length; i++) {
- var testSet = testDataAndExpectedResult[i];
- var fileData = testSet['file'];
- $tr = fileList.add(fileData);
- expect($tr.find('.nametext .extension').text()).toEqual(testSet['extension']);
- }
- });
- });
- describe('Hidden files', function() {
- it('sets the class hidden-file for hidden files', function() {
- var fileData = {
- type: 'dir',
- name: '.testFolder'
- };
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr.hasClass('hidden-file')).toEqual(true);
- });
- it('does not set the class hidden-file for visible files', function() {
- var fileData = {
- type: 'dir',
- name: 'testFolder'
- };
- var $tr = fileList.add(fileData);
-
- expect($tr).toBeDefined();
- expect($tr.hasClass('hidden-file')).toEqual(false);
- });
- it('toggles the list\'s class when toggling hidden files', function() {
- expect(fileList.$el.hasClass('hide-hidden-files')).toEqual(false);
- filesConfig.set('showhidden', false);
- expect(fileList.$el.hasClass('hide-hidden-files')).toEqual(true);
- filesConfig.set('showhidden', true);
- expect(fileList.$el.hasClass('hide-hidden-files')).toEqual(false);
- });
- });
- describe('Removing files from the list', function() {
- it('Removes file from list when calling remove() and updates summary', function() {
- var $summary;
- var $removedEl;
- fileList.setFiles(testFiles);
- $removedEl = fileList.remove('One.txt');
- expect($removedEl).toBeDefined();
- expect($removedEl.attr('data-file')).toEqual('One.txt');
- expect($('#fileList tr').length).toEqual(3);
- expect(fileList.files.length).toEqual(3);
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
-
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('2 files');
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(false);
- expect($summary.find('.fileinfo').hasClass('hidden')).toEqual(false);
- expect($summary.find('.filesize').text()).toEqual('69 KB');
- expect(fileList.isEmpty).toEqual(false);
- });
- it('Shows empty content when removing last file', function() {
- var $summary;
- fileList.setFiles([testFiles[0]]);
- fileList.remove('One.txt');
- expect($('#fileList tr').length).toEqual(0);
- expect(fileList.files.length).toEqual(0);
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
-
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(true);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(true);
- expect($('#emptycontent').hasClass('hidden')).toEqual(false);
- expect(fileList.isEmpty).toEqual(true);
- });
- });
- describe('Deleting files', function() {
- var deferredDelete;
- var deleteStub;
-
- beforeEach(function() {
- deferredDelete = $.Deferred();
- deleteStub = sinon.stub(filesClient, 'remove');
- });
- afterEach(function() {
- deleteStub.restore();
- });
-
- function doDelete() {
- // note: normally called from FileActions
- return fileList.do_delete(['One.txt', 'Two.jpg']).then(function(){
-
- expect(deleteStub.calledTwice).toEqual(true);
- expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
- expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Two.jpg');
- });
- }
- it('calls delete.php, removes the deleted entries and updates summary', function(done) {
- var $summary;
- fileList.setFiles(testFiles);
- deferredDelete1 = $.Deferred();
- deferredDelete2 = $.Deferred();
- deleteStub.onCall(0).callsFake(function(src){
- expect(deleteStub.calledOnce).toEqual(true);
- expect(src).toEqual('/subdir/One.txt');
- return deferredDelete1.promise();
- });
- deleteStub.onCall(1).callsFake(function(src){
- expect(deleteStub.calledTwice).toEqual(true);
- expect(src).toEqual('/subdir/Two.jpg');
- return deferredDelete2.promise();
- });
-
- var promise = fileList.do_delete(['One.txt', 'Two.jpg']);
- deferredDelete1.resolve(200);
- deferredDelete2.resolve(200);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
- expect(fileList.findFileEl('Three.pdf').length).toEqual(1);
- expect(fileList.$fileList.find('tr').length).toEqual(2);
-
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(false);
- expect($summary.find('.fileinfo').hasClass('hidden')).toEqual(false);
- expect($summary.find('.filesize').text()).toEqual('57 KB');
- expect(fileList.isEmpty).toEqual(false);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(false);
- expect($('#emptycontent').hasClass('hidden')).toEqual(true);
-
- expect(notificationStub.notCalled).toEqual(true);
- }).then(done, done);
- });
- it('shows busy state on files to be deleted', function(done) {
- fileList.setFiles(testFiles);
- deferredDelete1 = $.Deferred();
- deferredDelete2 = $.Deferred();
- deleteStub.onCall(0).callsFake(function(src){
- expect(fileList.findFileEl('One.txt').hasClass('busy')).toEqual(true);
- expect(fileList.findFileEl('Three.pdf').hasClass('busy')).toEqual(false);
-
- expect(deleteStub.calledOnce).toEqual(true);
- expect(src).toEqual('/subdir/One.txt');
- return deferredDelete1.promise();
- });
- deleteStub.onCall(1).callsFake(function(src){
- expect(fileList.findFileEl('Two.jpg').hasClass('busy')).toEqual(true);
- expect(fileList.findFileEl('Three.pdf').hasClass('busy')).toEqual(false);
-
- expect(deleteStub.calledTwice).toEqual(true);
- expect(src).toEqual('/subdir/Two.jpg');
- return deferredDelete2.promise();
- });
- var promise = fileList.do_delete(['One.txt', 'Two.jpg']).then(function(){
- expect(deleteStub.calledTwice).toEqual(true);
- });
- deferredDelete1.resolve(200);
- deferredDelete2.resolve(200);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').hasClass('busy')).toEqual(false);
- expect(fileList.findFileEl('Two.jpg').hasClass('busy')).toEqual(false);
- }).then(done, done);
- });
- it('shows busy state on all files when deleting all', function(done) {
- fileList.setFiles(testFiles);
- var deferredDeleteArray = [];
- var count = 0;
- for (var i = 0; i < 4; i++) {
- (function(i, fn){
- deferredDeleteArray.push($.Deferred());
- deleteStub.onCall(i).callsFake(function(src){
- expect(fileList.findFileEl(fn).hasClass('busy')).toEqual(true);
- count++;
- return deferredDeleteArray[i].promise();
- });
- })(i, testFiles[i].name);
- }
- var promise = fileList.do_delete();
- for (var i = 0; i < 4; i++) {
- deferredDeleteArray[i].resolve(200);
- }
- return promise.then(function(){
- expect(count).toEqual(4);
- }).then(done, done);
- });
- it('updates summary when deleting last file', function(done) {
- var $summary;
- fileList.setFiles([testFiles[0], testFiles[1]]);
- deleteStub.returns(deferredDelete.promise());
- deferredDelete.resolve(200);
-
- return doDelete().then(function(){
- expect(fileList.$fileList.find('tr').length).toEqual(0);
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(true);
- expect(fileList.isEmpty).toEqual(true);
- expect(fileList.files.length).toEqual(0);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(true);
- expect($('#emptycontent').hasClass('hidden')).toEqual(false);
- }).then(done, done);
- });
- it('bring back deleted item when delete call failed', function(done) {
- fileList.setFiles(testFiles);
- deleteStub.returns(deferredDelete.promise());
- var promise = doDelete();
- deferredDelete.reject(403);
- return promise.then(function(){
- // files are still in the list
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
- expect(fileList.$fileList.find('tr').length).toEqual(4);
-
- expect(notificationStub.calledTwice).toEqual(true);
- }).then(done, done);
- });
- it('remove file from list if delete call returned 404 not found', function(done) {
- fileList.setFiles(testFiles);
- deleteStub.returns(deferredDelete.promise());
- var promise = doDelete();
- deferredDelete.reject(404);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
- expect(fileList.$fileList.find('tr').length).toEqual(2);
-
- expect(notificationStub.notCalled).toEqual(true);
- }).then(done, done);
- });
- });
- describe('Renaming files', function() {
- var deferredRename;
- var renameStub;
-
- beforeEach(function() {
- deferredRename = $.Deferred();
- renameStub = sinon.stub(filesClient, 'move').returns(deferredRename.promise());
-
- for (var i = 0; i < testFiles.length; i++) {
- var file = testFiles[i];
- file.path = '/some/subdir';
- fileList.add(file, {silent: true});
- }
- });
- afterEach(function() {
- renameStub.restore();
- });
-
- function doCancelRename() {
- var $input;
-
- // trigger rename prompt
- fileList.rename('One.txt');
- $input = fileList.$fileList.find('input.filename');
- // keep same name
- $input.val('One.txt');
- // trigger submit because triggering blur doesn't work in all browsers
- $input.closest('form').trigger('submit');
-
- expect(renameStub.notCalled).toEqual(true);
- }
- function doRename() {
- var $input;
-
- // trigger rename prompt
- fileList.rename('One.txt');
- $input = fileList.$fileList.find('input.filename');
- $input.val('Tu_after_three.txt');
- // trigger submit because triggering blur doesn't work in all browsers
- $input.closest('form').trigger('submit');
-
- expect(renameStub.calledOnce).toEqual(true);
- expect(renameStub.getCall(0).args[0]).toEqual('/some/subdir/One.txt');
- expect(renameStub.getCall(0).args[1]).toEqual('/some/subdir/Tu_after_three.txt');
- }
- it('Inserts renamed file entry at correct position if rename ajax call suceeded', function() {
- doRename();
-
- deferredRename.resolve(201);
-
- // element stays renamed
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
- expect(fileList.findFileEl('Tu_after_three.txt').length).toEqual(1);
- expect(fileList.findFileEl('Tu_after_three.txt').index()).toEqual(2); // after Two.jpg
-
- expect(notificationStub.notCalled).toEqual(true);
- });
- it('Reverts file entry if rename ajax call failed', function() {
- doRename();
-
- deferredRename.reject(403);
-
- // element was reverted
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(fileList.findFileEl('One.txt').index()).toEqual(1); // after somedir
- expect(fileList.findFileEl('Tu_after_three.txt').length).toEqual(0);
-
- expect(notificationStub.calledOnce).toEqual(true);
- });
- it('Correctly updates file link after rename', function() {
- var $tr;
- doRename();
-
- deferredRename.resolve(201);
-
- $tr = fileList.findFileEl('Tu_after_three.txt');
- expect($tr.find('a.name').attr('href'))
- .toEqual(OC.getRootPath() + '/remote.php/webdav/some/subdir/Tu_after_three.txt');
- });
- it('Triggers "fileActionsReady" event after rename', function() {
- var handler = sinon.stub();
- fileList.$fileList.on('fileActionsReady', handler);
- doRename();
- expect(handler.notCalled).toEqual(true);
-
- deferredRename.resolve(201);
-
- expect(handler.calledOnce).toEqual(true);
- expect(fileList.$fileList.find('.test').length).toEqual(0);
- });
- it('Leaves the summary alone when reinserting renamed element', function() {
- var $summary = $('#filestable .summary');
- doRename();
-
- deferredRename.resolve(201);
-
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('3 files');
- });
- it('Leaves the summary alone when cancel renaming', function() {
- var $summary = $('#filestable .summary');
- doCancelRename();
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('3 files');
- });
- it('Shows busy state while rename in progress', function() {
- var $tr;
- doRename();
-
- // element is renamed before the request finishes
- $tr = fileList.findFileEl('Tu_after_three.txt');
- expect($tr.length).toEqual(1);
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
- // file actions are hidden
- expect($tr.hasClass('busy')).toEqual(true);
-
- // input and form are gone
- expect(fileList.$fileList.find('input.filename').length).toEqual(0);
- expect(fileList.$fileList.find('form').length).toEqual(0);
- });
- it('Validates the file name', function() {
- var $input, $tr;
-
- $tr = fileList.findFileEl('One.txt');
- expect($tr.find('a.name').css('display')).not.toEqual('none');
-
- // trigger rename prompt
- fileList.rename('One.txt');
-
- expect($tr.find('a.name .thumbnail-wrapper').css('display')).not.toEqual('none');
- expect($tr.find('a.name .nametext').css('display')).toEqual('none');
-
- $input = fileList.$fileList.find('input.filename');
- $input.val('Two.jpg');
-
- // simulate key to trigger validation
- $input.trigger(new $.Event('keyup', {keyCode: 97}));
-
- // input is still there with error
- expect(fileList.$fileList.find('input.filename').length).toEqual(1);
- expect(fileList.$fileList.find('input.filename').hasClass('error')).toEqual(true);
-
- // trigger submit does not send server request
- $input.closest('form').trigger('submit');
- expect(renameStub.notCalled).toEqual(true);
-
- // simulate escape key
- $input.trigger(new $.Event('keyup', {keyCode: 27}));
-
- // element is added back with the correct name
- $tr = fileList.findFileEl('One.txt');
- expect($tr.length).toEqual(1);
- expect($tr.find('a .nametext').text().trim()).toEqual('One.txt');
- expect($tr.find('a.name').css('display')).not.toEqual('none');
-
- $tr = fileList.findFileEl('Two.jpg');
- expect($tr.length).toEqual(1);
- expect($tr.find('a .nametext').text().trim()).toEqual('Two.jpg');
- expect($tr.find('a.name').css('display')).not.toEqual('none');
-
- // input and form are gone
- expect(fileList.$fileList.find('input.filename').length).toEqual(0);
- expect(fileList.$fileList.find('form').length).toEqual(0);
- });
- it('Restores thumbnail when rename was cancelled', function(done) {
- doRename();
-
- expect(fileList.findFileEl('Tu_after_three.txt').find('.thumbnail').parent().attr('class'))
- .toContain('icon-loading-small');
-
- deferredRename.reject(409);
-
- return Promise.resolve().then(function() {
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
- .toEqual(OC.imagePath('core', 'filetypes/text.svg'));
- }).then(done, done);
- });
- });
- describe('Moving files', function() {
- var deferredMove;
- var moveStub;
-
- beforeEach(function() {
- deferredMove = $.Deferred();
- moveStub = sinon.stub(filesClient, 'move');
-
- fileList.setFiles(testFiles);
- });
- afterEach(function() {
- moveStub.restore();
- });
-
- it('Moves single file to target folder', function(done) {
- var promise = fileList.move('One.txt', '/somedir');
-
- moveStub.callsFake(function(src, dst){
- expect(moveStub.calledOnce).toEqual(true);
- expect(src).toEqual('/subdir/One.txt');
- expect(dst).toEqual('/somedir/One.txt');
- return deferredMove.promise();
- });
-
- deferredMove.resolve(201);
-
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
-
- // folder size has increased
- expect(fileList.findFileEl('somedir').data('size')).toEqual(262);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('262 B');
-
- expect(notificationStub.notCalled).toEqual(true);
- }).then(done, done);
- });
- it('Moves list of files to target folder', function(done) {
- var deferredMove1 = $.Deferred();
- var deferredMove2 = $.Deferred();
- moveStub.onCall(0).callsFake(function(src, dst){
- expect(moveStub.calledOnce).toEqual(true);
- expect(src).toEqual('/subdir/One.txt');
- expect(dst).toEqual('/somedir/One.txt');
- return deferredMove1.promise();
- });
- moveStub.onCall(1).callsFake(function(src, dst){
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
-
- // folder size has increased during move
- expect(fileList.findFileEl('somedir').data('size')).toEqual(262);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('262 B');
-
- expect(src).toEqual('/subdir/Two.jpg');
- expect(dst).toEqual('/somedir/Two.jpg');
- return deferredMove2.promise();
- });
-
- var promise = fileList.move(['One.txt', 'Two.jpg'], '/somedir');
- deferredMove1.resolve(201);
- deferredMove2.resolve(201);
- return promise.then(function(){
- expect(moveStub.calledTwice).toEqual(true);
-
- expect(fileList.findFileEl('Two.jpg').length).toEqual(0);
-
- // folder size has increased
- expect(fileList.findFileEl('somedir').data('size')).toEqual(12311);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('12 KB');
-
- expect(notificationStub.notCalled).toEqual(true);
- }).then(done, done);
- });
- it('Shows notification if a file could not be moved', function(done) {
- moveStub.callsFake(function(){
- expect(moveStub.calledOnce).toEqual(true);
- return deferredMove.promise();
- });
- var promise = fileList.move('One.txt', '/somedir');
- deferredMove.reject(409);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Could not move "One.txt"');
- }).then(done, done);
- });
- it('Restores thumbnail if a file could not be moved', function(done) {
- moveStub.callsFake(function(){
- expect(fileList.findFileEl('One.txt').find('.thumbnail').parent().attr('class'))
- .toContain('icon-loading-small');
- expect(moveStub.calledOnce).toEqual(true);
- return deferredMove.promise();
- });
- var promise = fileList.move('One.txt', '/somedir');
- deferredMove.reject(409);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Could not move "One.txt"');
- expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
- .toEqual(OC.imagePath('core', 'filetypes/text.svg'));
- }).then(done, done);
- });
- });
-
- describe('Copying files', function() {
- var deferredCopy;
- var copyStub;
-
- beforeEach(function() {
- deferredCopy = $.Deferred();
- copyStub = sinon.stub(filesClient, 'copy');
-
- fileList.setFiles(testFiles);
- });
- afterEach(function() {
- copyStub.restore();
- });
-
- it('Copies single file to target folder', function(done) {
- copyStub.callsFake(function(){
- expect(copyStub.calledOnce).toEqual(true);
- expect(copyStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
- expect(copyStub.getCall(0).args[1]).toEqual('/somedir/One.txt');
-
- return deferredCopy.promise();
- });
-
- var promise = fileList.copy('One.txt', '/somedir');
- deferredCopy.resolve(201);
- return promise.then(function(){
- // File is still here
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
-
- // folder size has increased
- expect(fileList.findFileEl('somedir').data('size')).toEqual(262);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('262 B');
-
- // Copying sents a notification to tell that we've successfully copied file
- expect(notificationStub.notCalled).toEqual(false);
- }).then(done, done);
- });
- it('Copies list of files to target folder', function(done) {
- var deferredCopy1 = $.Deferred();
- var deferredCopy2 = $.Deferred();
- copyStub.onCall(0).callsFake(function(src, dst){
- expect(src).toEqual('/subdir/One.txt');
- expect(dst).toEqual('/somedir/One.txt');
- return deferredCopy1.promise();
- });
- copyStub.onCall(1).callsFake(function(src, dst){
- // folder size has increased during copy
- expect(fileList.findFileEl('somedir').data('size')).toEqual(262);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('262 B');
-
- expect(src).toEqual('/subdir/Two.jpg');
- expect(dst).toEqual('/somedir/Two.jpg');
- return deferredCopy2.promise();
- });
-
- var promise = fileList.copy(['One.txt', 'Two.jpg'], '/somedir');
- deferredCopy1.resolve(201);
- deferredCopy2.resolve(201);
-
- return promise.then(function(){
- expect(copyStub.calledTwice).toEqual(true);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
-
- // folder size has increased
- expect(fileList.findFileEl('somedir').data('size')).toEqual(12311);
- expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('12 KB');
-
- expect(notificationStub.notCalled).toEqual(false);
- }).then(done, done);
- });
- it('Shows notification if a file could not be copied', function(done) {
- copyStub.callsFake(function(){
- expect(copyStub.calledOnce).toEqual(true);
- return deferredCopy.promise();
- });
-
- var promise = fileList.copy('One.txt', '/somedir');
- deferredCopy.reject(409);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Could not copy "One.txt"');
- }).then(done, done);
- });
- it('Restores thumbnail if a file could not be copied', function(done) {
- copyStub.callsFake(function(){
- expect(fileList.findFileEl('One.txt').find('.thumbnail').parent().attr('class'))
- .toContain('icon-loading-small');
- expect(copyStub.calledOnce).toEqual(true);
- return deferredCopy.promise();
- });
-
- var promise = fileList.copy('One.txt', '/somedir');
- deferredCopy.reject(409);
- return promise.then(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
-
- expect(notificationStub.calledOnce).toEqual(true);
- expect(notificationStub.getCall(0).args[0]).toEqual('Could not copy "One.txt"');
-
- expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail')))
- .toEqual(OC.imagePath('core', 'filetypes/text.svg'));
- }).then(done, done);
- });
- });
-
- describe('Update file', function() {
- it('does not change summary', function() {
- var $summary = $('#filestable .summary');
- var fileData = new FileInfo({
- type: 'file',
- name: 'test file',
- });
- var $tr = fileList.add(fileData);
-
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
-
- var model = fileList.getModelForFile('test file');
- model.set({size: '100'});
-
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- });
- })
- describe('List rendering', function() {
- it('renders a list of files using add()', function() {
- expect(fileList.files.length).toEqual(0);
- expect(fileList.files).toEqual([]);
- fileList.setFiles(testFiles);
- expect($('#fileList tr').length).toEqual(4);
- expect(fileList.files.length).toEqual(4);
- expect(fileList.files).toEqual(testFiles);
- });
- it('updates summary using the file sizes', function() {
- var $summary;
- fileList.setFiles(testFiles);
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('3 files');
- expect($summary.find('.filesize').text()).toEqual('69 KB');
- });
- it('shows headers, summary and hide empty content message after setting files', function(){
- fileList.setFiles(testFiles);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(false);
- expect($('#emptycontent').hasClass('hidden')).toEqual(true);
- expect(fileList.$el.find('.summary').hasClass('hidden')).toEqual(false);
- });
- it('hides headers, summary and show empty content message after setting empty file list', function(){
- fileList.setFiles([]);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(true);
- expect($('#emptycontent').hasClass('hidden')).toEqual(false);
- expect($('#emptycontent .uploadmessage').hasClass('hidden')).toEqual(false);
- expect(fileList.$el.find('.summary').hasClass('hidden')).toEqual(true);
- });
- it('hides headers, upload message, and summary when list is empty and user has no creation permission', function(){
- $('#permissions').val(0);
- fileList.setFiles([]);
- expect($('#filestable thead th').hasClass('hidden')).toEqual(true);
- expect($('#emptycontent').hasClass('hidden')).toEqual(false);
- expect($('#emptycontent .uploadmessage').hasClass('hidden')).toEqual(true);
- expect(fileList.$el.find('.summary').hasClass('hidden')).toEqual(true);
- });
- it('calling findFileEl() can find existing file element', function() {
- fileList.setFiles(testFiles);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
- });
- it('calling findFileEl() returns empty when file not found in file', function() {
- fileList.setFiles(testFiles);
- expect(fileList.findFileEl('unexist.dat').length).toEqual(0);
- });
- it('only add file if in same current directory', function() {
- $('#dir').val('/current dir');
- var fileData = {
- type: 'file',
- name: 'testFile.txt',
- directory: '/current dir'
- };
- fileList.add(fileData);
- expect(fileList.findFileEl('testFile.txt').length).toEqual(1);
- });
- it('triggers "fileActionsReady" event after update', function() {
- var handler = sinon.stub();
- fileList.$fileList.on('fileActionsReady', handler);
- fileList.setFiles(testFiles);
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].$files.length).toEqual(testFiles.length);
- });
- it('triggers "fileActionsReady" event after single add', function() {
- var handler = sinon.stub();
- var $tr;
- fileList.setFiles(testFiles);
- fileList.$fileList.on('fileActionsReady', handler);
- $tr = fileList.add({name: 'test.txt'});
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].$files.is($tr)).toEqual(true);
- });
- it('triggers "fileActionsReady" event after next page load with the newly appended files', function() {
- var handler = sinon.stub();
- fileList.setFiles(generateFiles(0, 64));
- fileList.$fileList.on('fileActionsReady', handler);
- fileList._nextPage();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].$files.length).toEqual(fileList.pageSize());
- });
- it('does not trigger "fileActionsReady" event after single add with silent argument', function() {
- var handler = sinon.stub();
- fileList.setFiles(testFiles);
- fileList.$fileList.on('fileActionsReady', handler);
- fileList.add({name: 'test.txt'}, {silent: true});
- expect(handler.notCalled).toEqual(true);
- });
- it('triggers "updated" event after update', function() {
- var handler = sinon.stub();
- fileList.$fileList.on('updated', handler);
- fileList.setFiles(testFiles);
- expect(handler.calledOnce).toEqual(true);
- });
- it('does not update summary when removing non-existing files', function() {
- var $summary;
- // single file
- fileList.setFiles([testFiles[0]]);
- $summary = $('#filestable .summary');
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- fileList.remove('unexist.txt');
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- });
- });
- describe('Filtered list rendering', function() {
- it('filters the list of files using filter()', function() {
- expect(fileList.files.length).toEqual(0);
- expect(fileList.files).toEqual([]);
- fileList.setFiles(testFiles);
- var $summary = $('#filestable .summary');
- var $nofilterresults = fileList.$el.find(".nofilterresults");
- expect($nofilterresults.length).toEqual(1);
- expect($summary.hasClass('hidden')).toEqual(false);
-
- expect($('#fileList tr:not(.hidden)').length).toEqual(4);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('e');
- expect($('#fileList tr:not(.hidden)').length).toEqual(3);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('2 files');
- expect($summary.find('.filter').text()).toEqual(" match \"e\"");
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('ee');
- expect($('#fileList tr:not(.hidden)').length).toEqual(1);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- expect($summary.find('.filter').text()).toEqual(" matches \"ee\"");
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('eee');
- expect($('#fileList tr:not(.hidden)').length).toEqual(0);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(true);
- expect($nofilterresults.hasClass('hidden')).toEqual(false);
-
- fileList.setFilter('ee');
- expect($('#fileList tr:not(.hidden)').length).toEqual(1);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- expect($summary.find('.filter').text()).toEqual(" matches \"ee\"");
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('e');
- expect($('#fileList tr:not(.hidden)').length).toEqual(3);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('2 files');
- expect($summary.find('.filter').text()).toEqual(" match \"e\"");
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('');
- expect($('#fileList tr:not(.hidden)').length).toEqual(4);
- expect(fileList.files.length).toEqual(4);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').text()).toEqual('1 folder');
- expect($summary.find('.fileinfo').text()).toEqual('3 files');
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
- });
- it('filters the list of non-rendered rows using filter()', function() {
- var $summary = $('#filestable .summary');
- var $nofilterresults = fileList.$el.find(".nofilterresults");
- fileList.setFiles(generateFiles(0, 64));
-
- fileList.setFilter('63');
- expect($('#fileList tr:not(.hidden)').length).toEqual(1);
- expect($summary.hasClass('hidden')).toEqual(false);
- expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(true);
- expect($summary.find('.fileinfo').text()).toEqual('1 file');
- expect($summary.find('.filter').text()).toEqual(" matches \"63\"");
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
- });
- it('hides the emptyfiles notice when using filter()', function() {
- expect(fileList.files.length).toEqual(0);
- expect(fileList.files).toEqual([]);
- fileList.setFiles([]);
- var $summary = $('#filestable .summary');
- var $emptycontent = fileList.$el.find("#emptycontent");
- var $nofilterresults = fileList.$el.find(".nofilterresults");
- expect($emptycontent.length).toEqual(1);
- expect($nofilterresults.length).toEqual(1);
-
- expect($('#fileList tr:not(.hidden)').length).toEqual(0);
- expect(fileList.files.length).toEqual(0);
- expect($summary.hasClass('hidden')).toEqual(true);
- expect($emptycontent.hasClass('hidden')).toEqual(false);
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- fileList.setFilter('e');
- expect($('#fileList tr:not(.hidden)').length).toEqual(0);
- expect(fileList.files.length).toEqual(0);
- expect($summary.hasClass('hidden')).toEqual(true);
- expect($emptycontent.hasClass('hidden')).toEqual(true);
- expect($nofilterresults.hasClass('hidden')).toEqual(false);
-
- fileList.setFilter('');
- expect($('#fileList tr:not(.hidden)').length).toEqual(0);
- expect(fileList.files.length).toEqual(0);
- expect($summary.hasClass('hidden')).toEqual(true);
- expect($emptycontent.hasClass('hidden')).toEqual(false);
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
- });
- it('does not show the emptyfiles or nofilterresults notice when the mask is active', function() {
- expect(fileList.files.length).toEqual(0);
- expect(fileList.files).toEqual([]);
- fileList.showMask();
- fileList.setFiles(testFiles);
- var $emptycontent = fileList.$el.find("#emptycontent");
- var $nofilterresults = fileList.$el.find(".nofilterresults");
- expect($emptycontent.length).toEqual(1);
- expect($nofilterresults.length).toEqual(1);
-
- expect($emptycontent.hasClass('hidden')).toEqual(true);
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
-
- /*
- fileList.setFilter('e');
- expect($emptycontent.hasClass('hidden')).toEqual(true);
- expect($nofilterresults.hasClass('hidden')).toEqual(false);
- */
-
- fileList.setFilter('');
- expect($emptycontent.hasClass('hidden')).toEqual(true);
- expect($nofilterresults.hasClass('hidden')).toEqual(true);
- });
- });
- describe('Rendering next page on scroll', function() {
- beforeEach(function() {
- fileList.setFiles(generateFiles(0, 64));
- });
- it('renders only the first page', function() {
- expect(fileList.files.length).toEqual(65);
- expect($('#fileList tr').length).toEqual(20);
- });
- it('renders the full first page despite hidden rows', function() {
- filesConfig.set('showhidden', false);
- var files = _.map(generateFiles(0, 23), function(data) {
- return _.extend(data, {
- name: '.' + data.name
- });
- });
- // only hidden files + one visible
- files.push(testFiles[0]);
- fileList.setFiles(files);
- expect(fileList.files.length).toEqual(25);
- // render 24 hidden elements + the visible one
- expect($('#fileList tr').length).toEqual(25);
- });
- it('renders the full first page despite hidden rows', function() {
- filesConfig.set('showhidden', true);
- var files = _.map(generateFiles(0, 23), function(data) {
- return _.extend(data, {
- name: '.' + data.name
- });
- });
- // only hidden files + one visible
- files.push(testFiles[0]);
- fileList.setFiles(files);
- expect(fileList.files.length).toEqual(25);
- // render 20 first hidden elements as visible
- expect($('#fileList tr').length).toEqual(20);
- });
- it('renders the second page when scrolling down (trigger nextPage)', function() {
- // TODO: can't simulate scrolling here, so calling nextPage directly
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(40);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(60);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(65);
- fileList._nextPage(true);
- // stays at 65
- expect($('#fileList tr').length).toEqual(65);
- });
- it('inserts into the DOM if insertion point is in the visible page ', function() {
- fileList.add({
- id: 2000,
- type: 'file',
- name: 'File with index 15b.txt'
- });
- expect($('#fileList tr').length).toEqual(21);
- expect(fileList.findFileEl('File with index 15b.txt').index()).toEqual(16);
- });
- it('does not inserts into the DOM if insertion point is not the visible page ', function() {
- fileList.add({
- id: 2000,
- type: 'file',
- name: 'File with index 28b.txt'
- });
- expect($('#fileList tr').length).toEqual(20);
- expect(fileList.findFileEl('File with index 28b.txt').length).toEqual(0);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(40);
- expect(fileList.findFileEl('File with index 28b.txt').index()).toEqual(29);
- });
- it('appends into the DOM when inserting a file after the last visible element', function() {
- fileList.add({
- id: 2000,
- type: 'file',
- name: 'File with index 19b.txt'
- });
- expect($('#fileList tr').length).toEqual(21);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(41);
- });
- it('appends into the DOM when inserting a file on the last page when visible', function() {
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(40);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(60);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(65);
- fileList._nextPage(true);
- fileList.add({
- id: 2000,
- type: 'file',
- name: 'File with index 88.txt'
- });
- expect($('#fileList tr').length).toEqual(66);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(66);
- });
- it('shows additional page when appending a page of files and scrolling down', function() {
- var newFiles = generateFiles(66, 81);
- for (var i = 0; i < newFiles.length; i++) {
- fileList.add(newFiles[i]);
- }
- expect($('#fileList tr').length).toEqual(20);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(40);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(60);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(80);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(81);
- fileList._nextPage(true);
- expect($('#fileList tr').length).toEqual(81);
- });
- it('automatically renders next page when there are not enough elements visible', function() {
- // delete the 15 first elements
- for (var i = 0; i < 15; i++) {
- fileList.remove(fileList.files[0].name);
- }
- // still makes sure that there are 20 elements visible, if any
- expect($('#fileList tr').length).toEqual(25);
- });
- });
- describe('file previews', function() {
- var previewLoadStub;
-
- beforeEach(function() {
- previewLoadStub = sinon.stub(OCA.Files.FileList.prototype, 'lazyLoadPreview');
- });
- afterEach(function() {
- previewLoadStub.restore();
- });
- it('renders default file icon when none provided and no mime type is set', function() {
- var fileData = {
- name: 'testFile.txt'
- };
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.getRootPath() + '/core/img/filetypes/file.svg');
- // tries to load preview
- expect(previewLoadStub.calledOnce).toEqual(true);
- });
- it('renders default icon for folder when none provided', function() {
- var fileData = {
- name: 'test dir',
- mimetype: 'httpd/unix-directory'
- };
-
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.getRootPath() + '/core/img/filetypes/folder.svg');
- // no preview since it's a directory
- expect(previewLoadStub.notCalled).toEqual(true);
- });
- it('renders provided icon for file when provided', function() {
- var fileData = new FileInfo({
- type: 'file',
- name: 'test file',
- icon: OC.getRootPath() + '/core/img/filetypes/application-pdf.svg',
- mimetype: 'application/pdf'
- });
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.getRootPath() + '/core/img/filetypes/application-pdf.svg');
- // try loading preview
- expect(previewLoadStub.calledOnce).toEqual(true);
- });
- it('renders provided icon for file when provided', function() {
- var fileData = new FileInfo({
- name: 'somefile.pdf',
- icon: OC.getRootPath() + '/core/img/filetypes/application-pdf.svg'
- });
-
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.getRootPath() + '/core/img/filetypes/application-pdf.svg');
- // try loading preview
- expect(previewLoadStub.calledOnce).toEqual(true);
- });
- it('renders provided icon for folder when provided', function() {
- var fileData = new FileInfo({
- name: 'some folder',
- mimetype: 'httpd/unix-directory',
- icon: OC.getRootPath() + '/core/img/filetypes/folder-alt.svg'
- });
-
- var $tr = fileList.add(fileData);
- var $imgDiv = $tr.find('td.filename .thumbnail');
- expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-alt.svg');
- // do not load preview for folders
- expect(previewLoadStub.notCalled).toEqual(true);
- });
- it('renders preview when no icon was provided', function() {
- var fileData = {
- type: 'file',
- name: 'test file'
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail')))
- .toEqual(OC.getRootPath() + '/core/img/filetypes/file.svg');
- expect(previewLoadStub.calledOnce).toEqual(true);
- // third argument is callback
- previewLoadStub.getCall(0).args[0].callback(OC.getRootPath() + '/somepath.png');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/somepath.png');
- });
- it('does not render preview for directories', function() {
- var fileData = {
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir'
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/core/img/filetypes/folder.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- });
- it('render encrypted folder icon for encrypted root', function() {
- var fileData = {
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir',
- isEncrypted: true
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-encrypted.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- });
- it('render encrypted folder icon for encrypted subdir', function() {
- var fileData = {
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir',
- isEncrypted: true
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-encrypted.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- // default icon override
- expect($tr.attr('data-icon')).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-encrypted.svg');
- });
- it('render external storage icon for external storage root', function() {
- var fileData = {
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir',
- mountType: 'external-root'
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-external.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- });
- it('render external storage icon for external storage subdir', function() {
- var fileData = {
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir',
- mountType: 'external'
- };
- var $tr = fileList.add(fileData);
- var $td = $tr.find('td.filename');
- expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-external.svg');
- expect(previewLoadStub.notCalled).toEqual(true);
- // default icon override
- expect($tr.attr('data-icon')).toEqual(OC.getRootPath() + '/core/img/filetypes/folder-external.svg');
- });
-
- });
- describe('viewer mode', function() {
- it('enabling viewer mode hides files table and action buttons', function() {
- fileList.setViewerMode(true);
- expect($('#filestable').hasClass('hidden')).toEqual(true);
- expect($('.actions').hasClass('hidden')).toEqual(true);
- expect($('.notCreatable').hasClass('hidden')).toEqual(true);
- });
- it('disabling viewer mode restores files table and action buttons', function() {
- fileList.setViewerMode(true);
- fileList.setViewerMode(false);
- expect($('#filestable').hasClass('hidden')).toEqual(false);
- expect($('.actions').hasClass('hidden')).toEqual(false);
- expect($('.notCreatable').hasClass('hidden')).toEqual(true);
- });
- it('disabling viewer mode restores files table and action buttons with correct permissions', function() {
- $('#permissions').val(0);
- fileList.setViewerMode(true);
- fileList.setViewerMode(false);
- expect($('#filestable').hasClass('hidden')).toEqual(false);
- expect($('.actions').hasClass('hidden')).toEqual(true);
- expect($('.notCreatable').hasClass('hidden')).toEqual(false);
- });
- it('toggling viewer mode triggers event', function() {
- var handler = sinon.stub();
- fileList.$el.on('changeViewerMode', handler);
- fileList.setViewerMode(true);
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].viewerModeEnabled).toEqual(true);
-
- handler.reset();
- fileList.setViewerMode(false);
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].viewerModeEnabled).toEqual(false);
- });
- });
- describe('loading file list', function() {
- var deferredList;
- var getFolderContentsStub;
-
- beforeEach(function() {
- deferredList = $.Deferred();
- getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
- });
- afterEach(function() {
- getFolderContentsStub.restore();
- });
- it('fetches file list from server and renders it when reload() is called', function(done) {
- var reloading = fileList.reload();
- expect(getFolderContentsStub.calledOnce).toEqual(true);
- expect(getFolderContentsStub.calledWith('/subdir')).toEqual(true);
- deferredList.resolve(200, [testRoot].concat(testFiles));
- return reloading.then(function() {
- expect($('#fileList tr').length).toEqual(4);
- expect(fileList.findFileEl('One.txt').length).toEqual(1);
- }).then(done, done);
- });
- it('switches dir and fetches file list when calling changeDirectory()', function() {
- fileList.changeDirectory('/anothersubdir');
- expect(fileList.getCurrentDirectory()).toEqual('/anothersubdir');
- expect(getFolderContentsStub.calledOnce).toEqual(true);
- expect(getFolderContentsStub.calledWith('/anothersubdir')).toEqual(true);
- });
- it('converts backslashes to slashes when calling changeDirectory()', function() {
- fileList.changeDirectory('/another\\subdir');
- expect(fileList.getCurrentDirectory()).toEqual('/another/subdir');
- });
- it('switches to root dir when current directory is invalid', function() {
- _.each([
- '..',
- '/..',
- '../',
- '/../',
- '/../abc',
- '/abc/..',
- '/abc/../',
- '/../abc/',
- '/foo%0Abar/',
- '/foo%00bar/',
- '/another\\subdir/../foo\\../bar\\..\\file/..\\folder/../'
- ], function(path) {
- fileList.changeDirectory(decodeURI(path));
- expect(fileList.getCurrentDirectory()).toEqual('/');
- });
- });
- it('allows paths with dotdot at the beginning or end', function() {
- _.each([
- '/..abc',
- '/def..',
- '/...',
- '/abc../def'
- ], function(path) {
- fileList.changeDirectory(path);
- expect(fileList.getCurrentDirectory()).toEqual(path);
- });
- });
- it('switches to root dir when current directory does not exist', function(done) {
- var changing = fileList.changeDirectory('/unexist');
-
- deferredList.reject(404);
-
- return changing.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- }).then(done, done);
- });
- it('switches to root dir when current directory returns 400', function(done) {
- var changing = fileList.changeDirectory('/unexist');
-
- deferredList.reject(400);
-
- return changing.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- }).then(done, done);
- });
- it('switches to root dir when current directory returns 405', function(done) {
- var changing = fileList.changeDirectory('/unexist');
-
- deferredList.reject(405);
-
- return changing.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- }).then(done, done);
- });
- it('switches to root dir when current directory is forbidden', function(done) {
- var changing = fileList.changeDirectory('/unexist');
-
- deferredList.reject(403);
-
- return changing.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- }).then(done, done);
- });
- it('switches to root dir when current directory is unavailable', function(done) {
- var changing = fileList.changeDirectory('/unexist');
-
- deferredList.reject(500);
-
- return changing.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- }).then(done, done);
- });
- it('shows mask before loading file list then hides it at the end', function(done) {
- var showMaskStub = sinon.stub(fileList, 'showMask');
- var hideMaskStub = sinon.stub(fileList, 'hideMask');
-
- var changing = fileList.changeDirectory('/anothersubdir');
- expect(showMaskStub.calledOnce).toEqual(true);
- expect(hideMaskStub.calledOnce).toEqual(false);
- deferredList.resolve(200, [testRoot].concat(testFiles));
-
- return changing.then(function() {
- expect(showMaskStub.calledOnce).toEqual(true);
- expect(hideMaskStub.calledOnce).toEqual(true);
- showMaskStub.restore();
- hideMaskStub.restore();
- }).then(done, done);
- });
- it('triggers "changeDirectory" event when changing directory', function(done) {
- var handler = sinon.stub();
- $('#app-content-files').on('changeDirectory', handler);
- var changing = fileList.changeDirectory('/somedir');
-
- deferredList.resolve(200, [testRoot].concat(testFiles));
-
- return changing.then(function() {
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].dir).toEqual('/somedir');
- }).then(done, done);
- });
- it('triggers "afterChangeDirectory" event with fileid after changing directory', function(done) {
- var handler = sinon.stub();
- $('#app-content-files').on('afterChangeDirectory', handler);
- var changing = fileList.changeDirectory('/somedir');
-
- deferredList.resolve(200, [testRoot].concat(testFiles));
-
- return changing.then(function() {
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].dir).toEqual('/somedir');
- expect(handler.getCall(0).args[0].fileId).toEqual(99);
- }).then(done, done);
- });
- it('changes the directory when receiving "urlChanged" event', function() {
- $('#app-content-files').trigger(new $.Event('urlChanged', {view: 'files', dir: '/somedir'}));
- expect(fileList.getCurrentDirectory()).toEqual('/somedir');
- });
- it('reloads the list when leaving hidden state', function() {
- var reloadStub = sinon.stub(fileList, 'reload');
-
- // First show should not trigger
- $('#app-content-files').trigger(new $.Event('show'));
- expect(reloadStub.calledOnce).toEqual(false);
-
- // Second show should!
- $('#app-content-files').trigger(new $.Event('show'));
- expect(reloadStub.calledOnce).toEqual(true);
- reloadStub.restore();
- });
- it('refreshes breadcrumb after update', function() {
- var setDirSpy = sinon.spy(fileList.breadcrumb, 'setDirectory');
- fileList.changeDirectory('/anothersubdir');
- deferredList.resolve(200, [testRoot].concat(testFiles));
- // twice because setDirectory gets called by _setCurrentDir which
- // gets called directly by changeDirectory and via reload()
- expect(fileList.breadcrumb.setDirectory.calledTwice).toEqual(true);
- expect(fileList.breadcrumb.setDirectory.calledWith('/anothersubdir')).toEqual(true);
- setDirSpy.restore();
- getFolderContentsStub.restore();
- });
- it('prepends a slash to directory if none was given', function() {
- fileList.changeDirectory('');
- expect(fileList.getCurrentDirectory()).toEqual('/');
- fileList.changeDirectory('noslash');
- expect(fileList.getCurrentDirectory()).toEqual('/noslash');
- });
- });
- describe('breadcrumb events', function() {
- var deferredList;
- var getFolderContentsStub;
-
- beforeEach(function() {
- deferredList = $.Deferred();
- getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
- });
- afterEach(function() {
- getFolderContentsStub.restore();
- });
- it('clicking on root breadcrumb changes directory to root', function() {
- fileList.changeDirectory('/subdir/two/three with space/four/five');
- deferredList.resolve(200, [testRoot].concat(testFiles));
- var changeDirStub = sinon.stub(fileList, 'changeDirectory');
- fileList.breadcrumb.$el.find('.crumb:eq(1) > a').trigger({type: 'click', which: 1});
-
- expect(changeDirStub.calledOnce).toEqual(true);
- expect(changeDirStub.getCall(0).args[0]).toEqual('/');
- changeDirStub.restore();
- });
- it('clicking on breadcrumb changes directory', function() {
- fileList.changeDirectory('/subdir/two/three with space/four/five');
- deferredList.resolve(200, [testRoot].concat(testFiles));
- var changeDirStub = sinon.stub(fileList, 'changeDirectory');
- fileList.breadcrumb.$el.find('.crumb:eq(4) > a').trigger({type: 'click', which: 1});
-
- expect(changeDirStub.calledOnce).toEqual(true);
- expect(changeDirStub.getCall(0).args[0]).toEqual('/subdir/two/three with space');
- changeDirStub.restore();
- });
- it('dropping files on breadcrumb calls move operation', function() {
- var testDir = '/subdir/two/three with space/four/five';
- var moveStub = sinon.stub(filesClient, 'move');
- var deferredMove1 = $.Deferred();
- var deferredMove2 = $.Deferred();
- moveStub.onCall(0).returns(deferredMove1.promise());
- moveStub.onCall(1).returns(deferredMove2.promise());
- fileList.changeDirectory(testDir);
- deferredList.resolve(200, [testRoot].concat(testFiles));
- var $crumb = fileList.breadcrumb.$el.find('.crumb:eq(4)');
- // no idea what this is but is required by the handler
- var ui = {
- helper: {
- find: sinon.stub()
- }
- };
- // returns a list of tr that were dragged
- ui.helper.find.returns([
- $('<tr data-file="One.txt" data-dir="' + testDir + '"></tr>'),
- $('<tr data-file="Two.jpg" data-dir="' + testDir + '"></tr>')
- ]);
- // simulate drop event
- var result = fileList._onDropOnBreadCrumb(new $.Event('drop', {target: $crumb}), ui).then(function(){
- expect(moveStub.callCount).toEqual(2);
- expect(moveStub.getCall(0).args[0]).toEqual(testDir + '/One.txt');
- expect(moveStub.getCall(0).args[1]).toEqual('/subdir/two/three with space/One.txt');
- expect(moveStub.getCall(1).args[0]).toEqual(testDir + '/Two.jpg');
- expect(moveStub.getCall(1).args[1]).toEqual('/subdir/two/three with space/Two.jpg');
- moveStub.restore();
- });
- deferredMove1.resolve(201);
- deferredMove2.resolve(201);
- return result;
- });
- it('dropping files on same dir breadcrumb does nothing', function() {
- var testDir = '/subdir/two/three with space/four/five';
- var moveStub = sinon.stub(filesClient, 'move').returns($.Deferred().promise());
- fileList.changeDirectory(testDir);
- deferredList.resolve(200, [testRoot].concat(testFiles));
- var $crumb = fileList.breadcrumb.$el.find('.crumb:last');
- // no idea what this is but is required by the handler
- var ui = {
- helper: {
- find: sinon.stub()
- }
- };
- // returns a list of tr that were dragged
- ui.helper.find.returns([
- $('<tr data-file="One.txt" data-dir="' + testDir + '"></tr>'),
- $('<tr data-file="Two.jpg" data-dir="' + testDir + '"></tr>')
- ]);
- // simulate drop event
- fileList._onDropOnBreadCrumb(new $.Event('drop', {target: $crumb}), ui);
-
- // no extra server request
- expect(moveStub.notCalled).toEqual(true);
- });
- });
- describe('Download Url', function() {
- it('returns correct download URL for single files', function() {
- expect(fileList.getDownloadUrl('some file.txt'))
- .toEqual(OC.getRootPath() + '/remote.php/webdav/subdir/some%20file.txt');
- expect(fileList.getDownloadUrl('some file.txt', '/anotherpath/abc'))
- .toEqual(OC.getRootPath() + '/remote.php/webdav/anotherpath/abc/some%20file.txt');
- $('#dir').val('/');
- expect(fileList.getDownloadUrl('some file.txt'))
- .toEqual(OC.getRootPath() + '/remote.php/webdav/some%20file.txt');
- });
- it('returns correct download URL for multiple files', function() {
- expect(fileList.getDownloadUrl(['a b c.txt', 'd e f.txt']))
- .toEqual(OC.getRootPath() + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22a%20b%20c.txt%22%2C%22d%20e%20f.txt%22%5D');
- });
- it('returns the correct ajax URL', function() {
- expect(fileList.getAjaxUrl('test', {a:1, b:'x y'}))
- .toEqual(OC.getRootPath() + '/index.php/apps/files/ajax/test.php?a=1&b=x%20y');
- });
- });
- describe('File selection', function() {
- beforeEach(function() {
- fileList.setFiles(testFiles);
- });
- it('Selects a file when clicking its checkbox', function() {
- var $tr = fileList.findFileEl('One.txt');
- expect($tr.find('input:checkbox').prop('checked')).toEqual(false);
- $tr.find('td.selection input:checkbox').click();
-
- expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
- });
- it('Selects a range when clicking on one file then Shift clicking on another one', function() {
- var $tr = fileList.findFileEl('One.txt');
- var $tr2 = fileList.findFileEl('Three.pdf');
- var e;
- $tr.find('td.selection input:checkbox').click();
- e = new $.Event('click');
- e.shiftKey = true;
- $tr2.find('td.filename .name').trigger(e);
-
- expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
- expect($tr2.find('input:checkbox').prop('checked')).toEqual(true);
- expect(fileList.findFileEl('Two.jpg').find('input:checkbox').prop('checked')).toEqual(true);
- var selection = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selection.length).toEqual(3);
- expect(selection).toContain('One.txt');
- expect(selection).toContain('Two.jpg');
- expect(selection).toContain('Three.pdf');
- });
- it('Selects a range when clicking on one file then Shift clicking on another one that is above the first one', function() {
- var $tr = fileList.findFileEl('One.txt');
- var $tr2 = fileList.findFileEl('Three.pdf');
- var e;
- $tr2.find('td.selection input:checkbox').click();
- e = new $.Event('click');
- e.shiftKey = true;
- $tr.find('td.filename .name').trigger(e);
-
- expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
- expect($tr2.find('input:checkbox').prop('checked')).toEqual(true);
- expect(fileList.findFileEl('Two.jpg').find('input:checkbox').prop('checked')).toEqual(true);
- var selection = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selection.length).toEqual(3);
- expect(selection).toContain('One.txt');
- expect(selection).toContain('Two.jpg');
- expect(selection).toContain('Three.pdf');
- });
- it('Selecting all files will automatically check "select all" checkbox', function() {
- expect($('.select-all').prop('checked')).toEqual(false);
- $('#fileList tr td.selection input:checkbox').click();
- expect($('.select-all').prop('checked')).toEqual(true);
- });
- it('Selecting all files on the first visible page will not automatically check "select all" checkbox', function() {
- fileList.setFiles(generateFiles(0, 41));
- expect($('.select-all').prop('checked')).toEqual(false);
- $('#fileList tr td.selection input:checkbox').click();
- expect($('.select-all').prop('checked')).toEqual(false);
- });
- it('Selecting all files also selects hidden files when invisible', function() {
- filesConfig.set('showhidden', false);
- var $tr = fileList.add(new FileInfo({
- name: '.hidden',
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- size: 150
- }));
- $('.select-all').click();
- expect($tr.find('td.selection input:checkbox').prop('checked')).toEqual(true);
- expect(_.pluck(fileList.getSelectedFiles(), 'name')).toContain('.hidden');
- });
- it('Clicking "select all" will select/deselect all files', function() {
- fileList.setFiles(generateFiles(0, 41));
- $('.select-all').click();
- expect($('.select-all').prop('checked')).toEqual(true);
- $('#fileList tr input:checkbox').each(function() {
- expect($(this).prop('checked')).toEqual(true);
- });
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(42);
-
- $('.select-all').click();
- expect($('.select-all').prop('checked')).toEqual(false);
-
- $('#fileList tr input:checkbox').each(function() {
- expect($(this).prop('checked')).toEqual(false);
- });
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(0);
- });
- it('Clicking "select all" then deselecting a file will uncheck "select all"', function() {
- $('.select-all').click();
- expect($('.select-all').prop('checked')).toEqual(true);
-
- var $tr = fileList.findFileEl('One.txt');
- $tr.find('input:checkbox').click();
-
- expect($('.select-all').prop('checked')).toEqual(false);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(3);
- });
- it('Updates the selection summary when doing a few manipulations with "Select all"', function() {
- $('.select-all').click();
- expect($('.select-all').prop('checked')).toEqual(true);
-
- var $tr = fileList.findFileEl('One.txt');
- // unselect one
- $tr.find('input:checkbox').click();
-
- expect($('.select-all').prop('checked')).toEqual(false);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(3);
-
- // select all
- $('.select-all').click();
- expect($('.select-all').prop('checked')).toEqual(true);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(4);
-
- // unselect one
- $tr.find('input:checkbox').click();
- expect($('.select-all').prop('checked')).toEqual(false);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(3);
-
- // re-select it
- $tr.find('input:checkbox').click();
- expect($('.select-all').prop('checked')).toEqual(true);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(4);
- });
- it('Auto-selects files on next page when "select all" is checked', function() {
- fileList.setFiles(generateFiles(0, 41));
- $('.select-all').click();
-
- expect(fileList.$fileList.find('tr input:checkbox:checked').length).toEqual(20);
- fileList._nextPage(true);
- expect(fileList.$fileList.find('tr input:checkbox:checked').length).toEqual(40);
- fileList._nextPage(true);
- expect(fileList.$fileList.find('tr input:checkbox:checked').length).toEqual(42);
- expect(_.pluck(fileList.getSelectedFiles(), 'name').length).toEqual(42);
- });
- it('Selecting files updates selection summary', function() {
- var $summary = $('#headerName a.name>span:first');
- expect($summary.text()).toEqual('Name');
- fileList.findFileEl('One.txt').find('input:checkbox').click();
- fileList.findFileEl('Three.pdf').find('input:checkbox').click();
- fileList.findFileEl('somedir').find('input:checkbox').click();
- expect($summary.text()).toEqual('1 folder and 2 files');
- });
- it('Unselecting files hides selection summary', function() {
- var $summary = $('#headerName a.name>span:first');
- fileList.findFileEl('One.txt').find('input:checkbox').click().click();
- expect($summary.text()).toEqual('Name');
- });
- it('Displays the number of hidden files in selection summary if hidden files are invisible', function() {
- filesConfig.set('showhidden', false);
- var $tr = fileList.add(new FileInfo({
- name: '.hidden',
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- size: 150
- }));
- $('.select-all').click();
- var $summary = $('#headerName a.name>span:first');
- expect($summary.text()).toEqual('2 folders and 3 files (including 1 hidden)');
- });
- it('Does not displays the number of hidden files in selection summary if hidden files are visible', function() {
- filesConfig.set('showhidden', true);
- var $tr = fileList.add(new FileInfo({
- name: '.hidden',
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- size: 150
- }));
- $('.select-all').click();
- var $summary = $('#headerName a.name>span:first');
- expect($summary.text()).toEqual('2 folders and 3 files');
- });
- it('Toggling hidden file visibility updates selection summary', function() {
- filesConfig.set('showhidden', false);
- var $tr = fileList.add(new FileInfo({
- name: '.hidden',
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- size: 150
- }));
- $('.select-all').click();
- var $summary = $('#headerName a.name>span:first');
- expect($summary.text()).toEqual('2 folders and 3 files (including 1 hidden)');
- filesConfig.set('showhidden', true);
- expect($summary.text()).toEqual('2 folders and 3 files');
- });
- it('Select/deselect files shows/hides file actions', function() {
- var $actions = $('#headerName .selectedActions');
- var $checkbox = fileList.findFileEl('One.txt').find('input:checkbox');
- expect($actions.hasClass('hidden')).toEqual(true);
- $checkbox.click();
- expect($actions.hasClass('hidden')).toEqual(false);
- $checkbox.click();
- expect($actions.hasClass('hidden')).toEqual(true);
- });
- it('Selection is cleared when switching dirs', function() {
- $('.select-all').click();
- var deferredList = $.Deferred();
- var getFolderContentsStub = sinon.stub(filesClient, 'getFolderContents').returns(deferredList.promise());
-
- fileList.changeDirectory('/');
-
- deferredList.resolve(200, [testRoot].concat(testFiles));
-
- expect($('.select-all').prop('checked')).toEqual(false);
- expect(_.pluck(fileList.getSelectedFiles(), 'name')).toEqual([]);
-
- getFolderContentsStub.restore();
- });
- it('getSelectedFiles returns the selected files even when they are on the next page', function() {
- var selectedFiles;
- fileList.setFiles(generateFiles(0, 41));
- $('.select-all').click();
- // unselect one to not have the "allFiles" case
- fileList.$fileList.find('tr input:checkbox:first').click();
-
- // only 20 files visible, must still return all the selected ones
- selectedFiles = _.pluck(fileList.getSelectedFiles(), 'name');
-
- expect(selectedFiles.length).toEqual(41);
- });
- describe('clearing the selection', function() {
- it('clears selected files selected individually calling setFiles()', function() {
- var selectedFiles;
-
- fileList.setFiles(generateFiles(0, 41));
- fileList.$fileList.find('tr:eq(5) input:checkbox:first').click();
- fileList.$fileList.find('tr:eq(7) input:checkbox:first').click();
-
- selectedFiles = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selectedFiles.length).toEqual(2);
-
- fileList.setFiles(generateFiles(0, 2));
-
- selectedFiles = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selectedFiles.length).toEqual(0);
- });
- it('clears selected files selected with select all when calling setFiles()', function() {
- var selectedFiles;
-
- fileList.setFiles(generateFiles(0, 41));
- $('.select-all').click();
-
- selectedFiles = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selectedFiles.length).toEqual(42);
-
- fileList.setFiles(generateFiles(0, 2));
-
- selectedFiles = _.pluck(fileList.getSelectedFiles(), 'name');
- expect(selectedFiles.length).toEqual(0);
- });
- });
- describe('Selection overlay', function() {
- it('show doesnt show the copy/move action if one or more files are not copiable/movable', function () {
- fileList.setFiles(testFiles);
- $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-copyMove').hasClass('hidden')).toEqual(false);
- expect(fileList.$el.find('.selectedActions .item-copyMove .label').text()).toEqual('Move or copy');
- testFiles[0].permissions = OC.PERMISSION_READ;
- $('.select-all').click();
- fileList.setFiles(testFiles);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-copyMove').hasClass('hidden')).toEqual(false);
- expect(fileList.$el.find('.selectedActions .item-copyMove .label').text()).toEqual('Copy');
- testFiles[0].permissions = OC.PERMISSION_NONE;
- $('.select-all').click();
- fileList.setFiles(testFiles);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-copyMove').hasClass('hidden')).toEqual(true);
- });
- it('show doesnt show the download action if one or more files are not downloadable', function () {
- fileList.setFiles(testFiles);
- $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-download').hasClass('hidden')).toEqual(false);
- testFiles[0].permissions = OC.PERMISSION_UPDATE;
- $('.select-all').click();
- fileList.setFiles(testFiles);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-download').hasClass('hidden')).toEqual(true);
- });
- it('show doesnt show the delete action if one or more files are not deletable', function () {
- fileList.setFiles(testFiles);
- $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_DELETE);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-delete').hasClass('hidden')).toEqual(false);
- testFiles[0].permissions = OC.PERMISSION_READ;
- $('.select-all').click();
- fileList.setFiles(testFiles);
- $('.select-all').click();
- expect(fileList.$el.find('.selectedActions .item-delete').hasClass('hidden')).toEqual(true);
- });
- });
- describe('Actions', function() {
- beforeEach(function() {
- fileList.findFileEl('One.txt').find('input:checkbox').click();
- fileList.findFileEl('Three.pdf').find('input:checkbox').click();
- fileList.findFileEl('somedir').find('input:checkbox').click();
- });
- it('getSelectedFiles returns the selected file data', function() {
- var files = fileList.getSelectedFiles();
- expect(files.length).toEqual(3);
- expect(files[0]).toEqual({
- id: 1,
- name: 'One.txt',
- mimetype: 'text/plain',
- mtime: 123456789,
- type: 'file',
- size: 12,
- etag: 'abc',
- quotaAvailableBytes: '-1',
- permissions: OC.PERMISSION_ALL,
- hasPreview: true,
- isEncrypted: false
- });
- expect(files[1]).toEqual({
- id: 3,
- type: 'file',
- name: 'Three.pdf',
- mimetype: 'application/pdf',
- mtime: 234560000,
- size: 58009,
- quotaAvailableBytes: '-1',
- etag: '123',
- permissions: OC.PERMISSION_ALL,
- hasPreview: true,
- isEncrypted: false
- });
- expect(files[2]).toEqual({
- id: 4,
- type: 'dir',
- name: 'somedir',
- mimetype: 'httpd/unix-directory',
- mtime: 134560000,
- size: 250,
- quotaAvailableBytes: '-1',
- etag: '456',
- permissions: OC.PERMISSION_ALL,
- hasPreview: true,
- isEncrypted: false
- });
- expect(files[0].id).toEqual(1);
- expect(files[0].name).toEqual('One.txt');
- expect(files[1].id).toEqual(3);
- expect(files[1].name).toEqual('Three.pdf');
- expect(files[2].id).toEqual(4);
- expect(files[2].name).toEqual('somedir');
- });
- it('Removing a file removes it from the selection', function() {
- fileList.remove('Three.pdf');
- var files = fileList.getSelectedFiles();
- expect(files.length).toEqual(2);
- expect(files[0]).toEqual({
- id: 1,
- name: 'One.txt',
- mimetype: 'text/plain',
- mtime: 123456789,
- type: 'file',
- size: 12,
- quotaAvailableBytes: '-1',
- etag: 'abc',
- permissions: OC.PERMISSION_ALL,
- hasPreview: true,
- isEncrypted: false
- });
- expect(files[1]).toEqual({
- id: 4,
- type: 'dir',
- name: 'somedir',
- mimetype: 'httpd/unix-directory',
- mtime: 134560000,
- size: 250,
- quotaAvailableBytes: '-1',
- etag: '456',
- permissions: OC.PERMISSION_ALL,
- hasPreview: true,
- isEncrypted: false
- });
- });
- describe('Download', function() {
- beforeEach(function() {
- fileList.$el.find('.actions-selected').click();
- });
-
- it('Opens download URL when clicking "Download"', function() {
- $('.selectedActions .filesSelectMenu .download').click();
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(OC.getRootPath() + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22One.txt%22%2C%22Three.pdf%22%2C%22somedir%22%5D');
- redirectStub.restore();
- });
- it('Downloads root folder when all selected in root folder', function() {
- $('#dir').val('/');
- $('.select-all').click();
- $('.selectedActions .filesSelectMenu .download').click();
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(OC.getRootPath() + '/index.php/apps/files/ajax/download.php?dir=%2F&files=');
- });
- it('Downloads parent folder when all selected in subfolder', function() {
- $('.select-all').click();
- $('.selectedActions .filesSelectMenu .download').click();
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(OC.getRootPath() + '/index.php/apps/files/ajax/download.php?dir=%2F&files=subdir');
- });
-
- afterEach(function() {
- fileList.$el.find('.actions-selected').click();
- });
- });
-
- describe('Delete', function() {
- var deleteStub, deferredDelete;
- beforeEach(function() {
- deferredDelete = $.Deferred();
- deleteStub = sinon.stub(filesClient, 'remove');
- fileList.$el.find('.actions-selected').click();
- });
-
- afterEach(function() {
- fileList.$el.find('.actions-selected').click();
- deleteStub.restore();
- });
-
- it('Deletes selected files when "Delete" clicked', function(done) {
- var deferred = $.Deferred();
-
- deleteStub.returns(deferredDelete.promise());
- deleteStub.onCall(2).callsFake(function(){
- expect(deleteStub.callCount).toEqual(3);
- expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
- expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Three.pdf');
- expect(deleteStub.getCall(2).args[0]).toEqual('/subdir/somedir');
- return deferredDelete.promise();
- });
-
- stub = sinon.stub(fileList._operationProgressBar, 'hideProgressBar').callsFake(function(){
- expect(fileList.findFileEl('One.txt').length).toEqual(0);
- expect(fileList.findFileEl('Three.pdf').length).toEqual(0);
- expect(fileList.findFileEl('somedir').length).toEqual(0);
- expect(fileList.findFileEl('Two.jpg').length).toEqual(1);
- done();
- deferred.resolve();
- });
- $('.selectedActions .filesSelectMenu .delete').click();
- deferredDelete.resolve(204);
- return deferred.promise();
- });
- it('Deletes all files when all selected when "Delete" clicked', function(done) {
- var deferred = $.Deferred();
-
- deleteStub.returns(deferredDelete.promise());
- deleteStub.onCall(3).callsFake(function(){
- expect(deleteStub.getCall(0).args[0]).toEqual('/subdir/One.txt');
- expect(deleteStub.getCall(1).args[0]).toEqual('/subdir/Two.jpg');
- expect(deleteStub.getCall(2).args[0]).toEqual('/subdir/Three.pdf');
- expect(deleteStub.getCall(3).args[0]).toEqual('/subdir/somedir');
- return deferredDelete.promise();
- });
-
- stub = sinon.stub(fileList._operationProgressBar, 'hideProgressBar').callsFake(function(){
- expect(fileList.isEmpty).toEqual(true);
- expect(deleteStub.callCount).toEqual(4);
- done();
- deferred.resolve();
- });
- $('.select-all').click();
- $('.selectedActions .filesSelectMenu .delete').click();
- deferredDelete.resolve(204);
-
- return deferred.promise();
- });
- });
- });
- it('resets the file selection on reload', function() {
- fileList.$el.find('.select-all').click();
- fileList.reload();
- expect(fileList.$el.find('.select-all').prop('checked')).toEqual(false);
- expect(fileList.getSelectedFiles()).toEqual([]);
- });
- describe('Disabled selection', function() {
- beforeEach(function() {
- fileList._allowSelection = false;
- fileList.setFiles(testFiles);
- });
- it('Does not render checkboxes', function() {
- expect(fileList.$fileList.find('.selectCheckBox').length).toEqual(0);
- });
- it('Does not select a file with Ctrl or Shift if selection is not allowed', function() {
- var $tr = fileList.findFileEl('One.txt');
- var $tr2 = fileList.findFileEl('Three.pdf');
- var e;
- e = new $.Event('click');
- e.ctrlKey = true;
- $tr.find('td.filename .name').trigger(e);
-
- // click on second entry, does not clear the selection
- e = new $.Event('click');
- e.ctrlKey = true;
- $tr2.find('td.filename .name').trigger(e);
-
- expect(fileList.getSelectedFiles().length).toEqual(0);
-
- // deselect now
- e = new $.Event('click');
- e.shiftKey = true;
- $tr2.find('td.filename .name').trigger(e);
- expect(fileList.getSelectedFiles().length).toEqual(0);
- });
- });
- });
- describe('File actions', function() {
- it('Clicking on a file name will trigger default action', function() {
- var actionStub = sinon.stub();
- fileList.setFiles(testFiles);
- fileList.fileActions.registerAction({
- mime: 'text/plain',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_ALL,
- icon: function() {
- // Specify icon for hitory button
- return OC.imagePath('core','actions/history');
- },
- actionHandler: actionStub
- });
- fileList.fileActions.setDefault('text/plain', 'Test');
- var $tr = fileList.findFileEl('One.txt');
- $tr.find('td.filename .nametext').click();
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('One.txt');
- var context = actionStub.getCall(0).args[1];
- expect(context.$file.is($tr)).toEqual(true);
- expect(context.fileList).toBeDefined();
- expect(context.fileActions).toBeDefined();
- expect(context.dir).toEqual('/subdir');
- });
- it('Clicking on an empty space of the file row will trigger the "Details" action', function() {
- var detailsActionStub = sinon.stub();
- fileList.setFiles(testFiles);
- // Override the "Details" action set internally by the FileList for
- // easier testing.
- fileList.fileActions.registerAction({
- mime: 'all',
- name: 'Details',
- permissions: OC.PERMISSION_NONE,
- actionHandler: detailsActionStub
- });
- // Ensure that the action works even if fileActions.currentFile is
- // not set.
- fileList.fileActions.currentFile = null;
- var $tr = fileList.findFileEl('One.txt');
- $tr.find('td.filesize').click();
- expect(detailsActionStub.calledOnce).toEqual(true);
- expect(detailsActionStub.getCall(0).args[0]).toEqual('One.txt');
- var context = detailsActionStub.getCall(0).args[1];
- expect(context.$file.is($tr)).toEqual(true);
- expect(context.fileList).toBe(fileList);
- expect(context.fileActions).toBe(fileList.fileActions);
- expect(context.dir).toEqual('/subdir');
- });
- it('redisplays actions when new actions have been registered', function() {
- var actionStub = sinon.stub();
- var readyHandler = sinon.stub();
- var clock = sinon.useFakeTimers();
- var debounceStub = sinon.stub(_, 'debounce').callsFake(function(callback) {
- return function() {
- // defer instead of debounce, to make it work with clock
- _.defer(callback);
- };
- });
-
- // need to reinit the list to make the debounce call
- fileList.destroy();
- fileList = new OCA.Files.FileList($('#app-content-files'));
-
- fileList.setFiles(testFiles);
-
- fileList.$fileList.on('fileActionsReady', readyHandler);
-
- fileList.fileActions.registerAction({
- mime: 'text/plain',
- name: 'Test',
- type: OCA.Files.FileActions.TYPE_INLINE,
- permissions: OC.PERMISSION_ALL,
- icon: function() {
- // Specify icon for hitory button
- return OC.imagePath('core','actions/history');
- },
- actionHandler: actionStub
- });
- var $tr = fileList.findFileEl('One.txt');
- expect($tr.find('.action-test').length).toEqual(0);
- expect(readyHandler.notCalled).toEqual(true);
-
- // update is delayed
- clock.tick(100);
- expect($tr.find('.action-test').length).toEqual(1);
- expect(readyHandler.calledOnce).toEqual(true);
-
- clock.restore();
- debounceStub.restore();
- });
- });
- describe('Sorting files', function() {
-
- var getCurrentUserStub;
-
- beforeEach(function() {
- getCurrentUserStub = sinon.stub(OC, 'getCurrentUser').returns({
- uid: 1,
- displayName: 'user1'
- });
- });
-
- afterEach(function() {
- getCurrentUserStub.restore();
- });
-
- it('Toggles the sort indicator when clicking on a column header', function() {
- var ASC_CLASS = fileList.SORT_INDICATOR_ASC_CLASS;
- var DESC_CLASS = fileList.SORT_INDICATOR_DESC_CLASS;
- var request;
- var sortingUrl = OC.generateUrl('/apps/files/api/v1/sorting');
- fileList.$el.find('.column-size .columntitle').click();
- // moves triangle to size column, check indicator on name is hidden
- expect(
- fileList.$el.find('.column-name .sort-indicator').hasClass('hidden')
- ).toEqual(true);
- // check indicator on size is visible and defaults to descending
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass('hidden')
- ).toEqual(false);
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
- ).toEqual(true);
- // check if changes are persisted
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(request.url).toEqual(sortingUrl);
-
- // click again on size column, reverses direction
- fileList.$el.find('.column-size .columntitle').click();
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass('hidden')
- ).toEqual(false);
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass(ASC_CLASS)
- ).toEqual(true);
- // check if changes are persisted
- expect(fakeServer.requests.length).toEqual(2);
- request = fakeServer.requests[1];
- expect(request.url).toEqual(sortingUrl);
-
- // click again on size column, reverses direction
- fileList.$el.find('.column-size .columntitle').click();
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass('hidden')
- ).toEqual(false);
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
- ).toEqual(true);
- expect(fakeServer.requests.length).toEqual(3);
- request = fakeServer.requests[2];
- expect(request.url).toEqual(sortingUrl);
-
- // click on mtime column, moves indicator there
- fileList.$el.find('.column-mtime .columntitle').click();
- expect(
- fileList.$el.find('.column-size .sort-indicator').hasClass('hidden')
- ).toEqual(true);
- expect(
- fileList.$el.find('.column-mtime .sort-indicator').hasClass('hidden')
- ).toEqual(false);
- expect(
- fileList.$el.find('.column-mtime .sort-indicator').hasClass(DESC_CLASS)
- ).toEqual(true);
- expect(fakeServer.requests.length).toEqual(4);
- request = fakeServer.requests[3];
- expect(request.url).toEqual(sortingUrl);
- });
- it('Uses correct sort comparator when inserting files', function() {
- testFiles.sort(OCA.Files.FileList.Comparators.size);
- testFiles.reverse(); //default is descending
- fileList.setFiles(testFiles);
- fileList.$el.find('.column-size .columntitle').click();
- var newFileData = new FileInfo({
- id: 999,
- name: 'new file.txt',
- mimetype: 'text/plain',
- size: 40001,
- etag: '999'
- });
- fileList.add(newFileData);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(0);
- expect(fileList.findFileEl('new file.txt').index()).toEqual(1);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(2);
- expect(fileList.findFileEl('somedir').index()).toEqual(3);
- expect(fileList.findFileEl('One.txt').index()).toEqual(4);
- expect(fileList.files.length).toEqual(5);
- expect(fileList.$fileList.find('tr').length).toEqual(5);
- });
- it('Uses correct reversed sort comparator when inserting files', function() {
- testFiles.sort(OCA.Files.FileList.Comparators.size);
- fileList.setFiles(testFiles);
- fileList.$el.find('.column-size .columntitle').click();
-
- // reverse sort
- fileList.$el.find('.column-size .columntitle').click();
- var newFileData = new FileInfo({
- id: 999,
- name: 'new file.txt',
- mimetype: 'text/plain',
- size: 40001,
- etag: '999'
- });
- fileList.add(newFileData);
- expect(fileList.findFileEl('One.txt').index()).toEqual(0);
- expect(fileList.findFileEl('somedir').index()).toEqual(1);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(2);
- expect(fileList.findFileEl('new file.txt').index()).toEqual(3);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(4);
- expect(fileList.files.length).toEqual(5);
- expect(fileList.$fileList.find('tr').length).toEqual(5);
- });
- it('does not sort when clicking on header whenever multiselect is enabled', function() {
- var sortStub = sinon.stub(OCA.Files.FileList.prototype, 'setSort');
-
- fileList.setFiles(testFiles);
- fileList.findFileEl('One.txt').find('input:checkbox:first').click();
-
- fileList.$el.find('.column-size .columntitle').click();
-
- expect(sortStub.notCalled).toEqual(true);
-
- // can sort again after deselecting
- fileList.findFileEl('One.txt').find('input:checkbox:first').click();
-
- fileList.$el.find('.column-size .columntitle').click();
-
- expect(sortStub.calledOnce).toEqual(true);
-
- sortStub.restore();
- });
-
- describe('if no user logged in', function() {
- beforeEach(function() {
- getCurrentUserStub.returns({
- uid: null,
- displayName: 'Guest'
- });
- });
-
- it('shouldn\'t send an update sort order request', function() {
- OC.currentUser = false;
- fileList.$el.find('.column-size .columntitle').click();
- // check if there was no request
- expect(fakeServer.requests.length).toEqual(0);
- });
- });
-
- describe('with favorites', function() {
- it('shows favorite files on top', function() {
- testFiles.push(new FileInfo({
- id: 5,
- type: 'file',
- name: 'ZZY Before last file in ascending order',
- mimetype: 'text/plain',
- mtime: 999999998,
- size: 9999998,
- // Tags would be added by TagsPlugin
- tags: [OC.TAG_FAVORITE],
- }), new FileInfo({
- id: 6,
- type: 'file',
- name: 'ZZZ Last file in ascending order',
- mimetype: 'text/plain',
- mtime: 999999999,
- size: 9999999,
- // Tags would be added by TagsPlugin
- tags: [OC.TAG_FAVORITE],
- }));
-
- fileList.setFiles(testFiles);
-
- // Sort by name in ascending order (default sorting is by name
- // in ascending order, but setFiles does not trigger a sort, so
- // the files must be sorted before being set or a sort must be
- // triggered afterwards by clicking on the header).
- fileList.$el.find('.column-name .columntitle').click();
- fileList.$el.find('.column-name .columntitle').click();
-
- expect(fileList.findFileEl('ZZY Before last file in ascending order').index()).toEqual(0);
- expect(fileList.findFileEl('ZZZ Last file in ascending order').index()).toEqual(1);
- expect(fileList.findFileEl('somedir').index()).toEqual(2);
- expect(fileList.findFileEl('One.txt').index()).toEqual(3);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(4);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(5);
-
- // Sort by size in ascending order
- fileList.$el.find('.column-size .columntitle').click();
- fileList.$el.find('.column-size .columntitle').click();
-
- expect(fileList.findFileEl('ZZY Before last file in ascending order').index()).toEqual(0);
- expect(fileList.findFileEl('ZZZ Last file in ascending order').index()).toEqual(1);
- expect(fileList.findFileEl('One.txt').index()).toEqual(2);
- expect(fileList.findFileEl('somedir').index()).toEqual(3);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(4);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(5);
-
- // Sort by modification time in ascending order
- fileList.$el.find('.column-mtime .columntitle').click();
- fileList.$el.find('.column-mtime .columntitle').click();
-
- expect(fileList.findFileEl('ZZY Before last file in ascending order').index()).toEqual(0);
- expect(fileList.findFileEl('ZZZ Last file in ascending order').index()).toEqual(1);
- expect(fileList.findFileEl('One.txt').index()).toEqual(2);
- expect(fileList.findFileEl('somedir').index()).toEqual(3);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(4);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(5);
- });
- it('shows favorite files on top also when using descending order', function() {
- testFiles.push(new FileInfo({
- id: 5,
- type: 'file',
- name: 'AAB Before last file in descending order',
- mimetype: 'text/plain',
- mtime: 2,
- size: 2,
- // Tags would be added by TagsPlugin
- tags: [OC.TAG_FAVORITE],
- }), new FileInfo({
- id: 6,
- type: 'file',
- name: 'AAA Last file in descending order',
- mimetype: 'text/plain',
- mtime: 1,
- size: 1,
- // Tags would be added by TagsPlugin
- tags: [OC.TAG_FAVORITE],
- }));
-
- fileList.setFiles(testFiles);
-
- // Sort by name in descending order
- fileList.$el.find('.column-name .columntitle').click();
-
- expect(fileList.findFileEl('AAB Before last file in descending order').index()).toEqual(0);
- expect(fileList.findFileEl('AAA Last file in descending order').index()).toEqual(1);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(2);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(3);
- expect(fileList.findFileEl('One.txt').index()).toEqual(4);
- expect(fileList.findFileEl('somedir').index()).toEqual(5);
-
- // Sort by size in descending order
- fileList.$el.find('.column-size .columntitle').click();
-
- expect(fileList.findFileEl('AAB Before last file in descending order').index()).toEqual(0);
- expect(fileList.findFileEl('AAA Last file in descending order').index()).toEqual(1);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(2);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(3);
- expect(fileList.findFileEl('somedir').index()).toEqual(4);
- expect(fileList.findFileEl('One.txt').index()).toEqual(5);
-
- // Sort by modification time in descending order
- fileList.$el.find('.column-mtime .columntitle').click();
-
- expect(fileList.findFileEl('AAB Before last file in descending order').index()).toEqual(0);
- expect(fileList.findFileEl('AAA Last file in descending order').index()).toEqual(1);
- expect(fileList.findFileEl('Two.jpg').index()).toEqual(2);
- expect(fileList.findFileEl('Three.pdf').index()).toEqual(3);
- expect(fileList.findFileEl('somedir').index()).toEqual(4);
- expect(fileList.findFileEl('One.txt').index()).toEqual(5);
- });
- });
- });
- describe('create file', function() {
- var deferredCreate;
- var deferredInfo;
- var createStub;
- var getFileInfoStub;
-
- beforeEach(function() {
- deferredCreate = $.Deferred();
- deferredInfo = $.Deferred();
- createStub = sinon.stub(filesClient, 'putFileContents')
- .returns(deferredCreate.promise());
- getFileInfoStub = sinon.stub(filesClient, 'getFileInfo')
- .returns(deferredInfo.promise());
- });
- afterEach(function() {
- createStub.restore();
- getFileInfoStub.restore();
- });
-
- it('creates file with given name and adds it to the list', function(done) {
- var creating = fileList.createFile('test.txt');
-
- expect(createStub.calledOnce).toEqual(true);
- expect(createStub.getCall(0).args[0]).toEqual('/subdir/test.txt');
- expect(createStub.getCall(0).args[2]).toEqual({
- contentType: 'text/plain',
- overwrite: true
- });
-
- deferredCreate.resolve(200);
-
- expect(getFileInfoStub.calledOnce).toEqual(true);
- expect(getFileInfoStub.getCall(0).args[0]).toEqual('/subdir/test.txt');
-
- deferredInfo.resolve(
- 200,
- new FileInfo({
- path: '/subdir',
- name: 'test.txt',
- mimetype: 'text/plain'
- })
- );
-
- return creating.then(function() {
- var $tr = fileList.findFileEl('test.txt');
- expect($tr.length).toEqual(1);
- expect($tr.attr('data-mime')).toEqual('text/plain');
- }).then(done, done);
- });
- // TODO: error cases
- // TODO: unique name cases
- });
- describe('create folder', function() {
- var deferredCreate;
- var deferredInfo;
- var createStub;
- var getFileInfoStub;
-
- beforeEach(function() {
- deferredCreate = $.Deferred();
- deferredInfo = $.Deferred();
- createStub = sinon.stub(filesClient, 'createDirectory')
- .returns(deferredCreate.promise());
- getFileInfoStub = sinon.stub(filesClient, 'getFileInfo')
- .returns(deferredInfo.promise());
- });
- afterEach(function() {
- createStub.restore();
- getFileInfoStub.restore();
- });
-
- it('creates folder with given name and adds it to the list', function(done) {
- var creating = fileList.createDirectory('sub dir');
-
- expect(createStub.calledOnce).toEqual(true);
- expect(createStub.getCall(0).args[0]).toEqual('/subdir/sub dir');
-
- deferredCreate.resolve(200);
-
- expect(getFileInfoStub.calledOnce).toEqual(true);
- expect(getFileInfoStub.getCall(0).args[0]).toEqual('/subdir/sub dir');
-
- deferredInfo.resolve(
- 200,
- new FileInfo({
- path: '/subdir',
- name: 'sub dir',
- mimetype: 'httpd/unix-directory'
- })
- );
-
- return creating.then(function() {
- var $tr = fileList.findFileEl('sub dir');
- expect($tr.length).toEqual(1);
- expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
- }).then(done, done);
- });
- // TODO: error cases
- // TODO: unique name cases
- });
- describe('addAndFetchFileInfo', function() {
- var getFileInfoStub;
- var getFileInfoDeferred;
-
- beforeEach(function() {
- getFileInfoDeferred = $.Deferred();
- getFileInfoStub = sinon.stub(OC.Files.Client.prototype, 'getFileInfo');
- getFileInfoStub.returns(getFileInfoDeferred.promise());
- });
- afterEach(function() {
- getFileInfoStub.restore();
- });
- it('does not fetch if the given folder is not the current one', function() {
- var promise = fileList.addAndFetchFileInfo('testfile.txt', '/another');
- expect(getFileInfoStub.notCalled).toEqual(true);
-
- expect(promise.state()).toEqual('resolved');
- });
- it('fetches info when folder is the current one', function(done) {
- fileList.addAndFetchFileInfo('testfile.txt', '/subdir');
-
- return Promise.resolve().then(function() {
- expect(getFileInfoStub.calledOnce).toEqual(true);
- expect(getFileInfoStub.getCall(0).args[0]).toEqual('/subdir/testfile.txt');
- }).then(done, done);
- });
- it('adds file data to list when fetching is done', function(done) {
- var adding = fileList.addAndFetchFileInfo('testfile.txt', '/subdir');
- getFileInfoDeferred.resolve(200, {
- name: 'testfile.txt',
- size: 100
- });
-
- return adding.then(function() {
- expect(fileList.findFileEl('testfile.txt').attr('data-size')).toEqual('100');
- }).then(done, done);
- });
- it('replaces file data to list when fetching is done', function(done) {
- var adding = fileList.addAndFetchFileInfo('testfile.txt', '/subdir', {replace: true});
- fileList.add({
- name: 'testfile.txt',
- size: 95
- });
- getFileInfoDeferred.resolve(200, {
- name: 'testfile.txt',
- size: 100
- });
- expect(fileList.findFileEl('testfile.txt').attr('data-size')).toEqual('95');
- return adding.then(function() {
- expect(fileList.findFileEl('testfile.txt').attr('data-size')).toEqual('100');
- }).then(done, done);
- });
- it('resolves promise with file data when fetching is done', function(done) {
- var promise = fileList.addAndFetchFileInfo('testfile.txt', '/subdir', {replace: true});
- getFileInfoDeferred.resolve(200, {
- name: 'testfile.txt',
- size: 100
- });
- expect(promise.state()).toEqual('pending');
- return promise.then(function(status, data) {
- expect(promise.state()).toEqual('resolved');
- expect(status).toEqual(200);
- expect(data.name).toEqual('testfile.txt');
- expect(data.size).toEqual(100);
- }).then(done, done);
- });
- });
- /**
- * Test upload mostly by testing the code inside the event handlers
- * that were registered on the magic upload object
- */
- describe('file upload', function() {
- var uploadData;
- var uploader;
-
- beforeEach(function() {
- fileList.setFiles(testFiles);
- uploader = fileList._uploader;
- // simulate data structure from jquery.upload
- uploadData = {
- files: [{
- name: 'upload.txt'
- }]
- };
- });
-
- afterEach(function() {
- uploader = null;
- uploadData = null;
- });
-
- describe('enableupload', function() {
- it('sets up uploader when enableUpload is true', function() {
- expect(fileList._uploader).toBeDefined();
- });
- it('does not sets up uploader when enableUpload is false', function() {
- fileList.destroy();
- fileList = new OCA.Files.FileList($('#app-content-files'), {
- filesClient: filesClient
- });
- expect(fileList._uploader).toBeFalsy();
- });
- });
-
- describe('adding files for upload', function() {
- /**
- * Simulate add event on the given target
- *
- * @return event object including the result
- */
- function addFile(data) {
- uploader.trigger('add', {}, data || {});
- }
-
- it('sets target dir to the current directory', function() {
- addFile(uploadData);
- expect(uploadData.targetDir).toEqual('/subdir');
- });
- });
- describe('dropping external files', function() {
-
- /**
- * Simulate drop event on the given target
- *
- * @param $target target element to drop on
- * @return event object including the result
- */
- function dropOn($target, data) {
- var eventData = {
- delegatedEvent: {
- target: $target
- },
- preventDefault: function () {
- },
- stopPropagation: function() {
- }
- };
- uploader.trigger('drop', eventData, data || {});
- return !!data.targetDir;
- }
- it('drop on a tr or crumb outside file list does not trigger upload', function() {
- var $anotherTable = $('<table><tbody><tr><td>outside<div class="crumb">crumb</div></td></tr></table>');
- var ev;
- $('#testArea').append($anotherTable);
- ev = dropOn($anotherTable.find('tr'), uploadData);
- expect(ev).toEqual(false);
-
- ev = dropOn($anotherTable.find('.crumb'), uploadData);
- expect(ev).toEqual(false);
- });
- it('drop on an element outside file list container does not trigger upload', function() {
- var $anotherEl = $('<div>outside</div>');
- var ev;
- $('#testArea').append($anotherEl);
- ev = dropOn($anotherEl, uploadData);
-
- expect(ev).toEqual(false);
- });
- it('drop on an element inside the table triggers upload', function() {
- var ev;
- ev = dropOn(fileList.$fileList.find('th:first'), uploadData);
-
- expect(ev).not.toEqual(false);
- expect(uploadData.targetDir).toEqual('/subdir');
- });
- it('drop on an element on the table container triggers upload', function() {
- var ev;
- ev = dropOn($('#app-content-files'), uploadData);
-
- expect(ev).not.toEqual(false);
- expect(uploadData.targetDir).toEqual('/subdir');
- });
- it('drop on an element inside the table does not trigger upload if no upload permission', function() {
- $('#permissions').val(0);
- var ev;
- ev = dropOn(fileList.$fileList.find('th:first'), uploadData);
-
- expect(ev).toEqual(false);
- expect(notificationStub.calledOnce).toEqual(true);
- });
- it('drop on an folder does not trigger upload if no upload permission on that folder', function() {
- var $tr = fileList.findFileEl('somedir');
- var ev;
- $tr.data('permissions', OC.PERMISSION_READ);
- ev = dropOn($tr, uploadData);
-
- expect(ev).toEqual(false);
- expect(notificationStub.calledOnce).toEqual(true);
- });
- it('drop on a file row inside the table triggers upload to current folder', function() {
- var ev;
- ev = dropOn(fileList.findFileEl('One.txt').find('td:first'), uploadData);
-
- expect(ev).not.toEqual(false);
- expect(uploadData.targetDir).toEqual('/subdir');
- });
- it('drop on a folder row inside the table triggers upload to target folder', function() {
- var ev;
- ev = dropOn(fileList.findFileEl('somedir').find('td:eq(2)'), uploadData);
-
- expect(ev).not.toEqual(false);
- expect(uploadData.targetDir).toEqual('/subdir/somedir');
- });
- it('drop on a breadcrumb inside the table triggers upload to target folder', function() {
- var ev;
- fileList.changeDirectory('a/b/c/d');
- ev = dropOn(fileList.$el.find('.crumb:eq(3)'), uploadData);
-
- expect(ev).not.toEqual(false);
- expect(uploadData.targetDir).toEqual('/a/b');
- });
- it('renders upload indicator element for folders only', function() {
- fileList.add({
- name: 'afolder',
- type: 'dir',
- mime: 'httpd/unix-directory'
- });
- fileList.add({
- name: 'afile.txt',
- type: 'file',
- mime: 'text/plain'
- });
-
- expect(fileList.findFileEl('afolder').find('.uploadtext').length).toEqual(1);
- expect(fileList.findFileEl('afile.txt').find('.uploadtext').length).toEqual(0);
- });
- });
-
- describe('after folder creation due to folder upload', function() {
- it('fetches folder info', function() {
- var fetchInfoStub = sinon.stub(fileList, 'addAndFetchFileInfo');
-
- uploader.trigger('createdfolder', '/subdir/newfolder');
-
- expect(fetchInfoStub.calledOnce).toEqual(true);
- expect(fetchInfoStub.getCall(0).args[0]).toEqual('newfolder');
- expect(fetchInfoStub.getCall(0).args[1]).toEqual('/subdir');
-
- fetchInfoStub.restore();
- });
- });
-
- describe('after upload', function() {
- var fetchInfoStub;
-
- beforeEach(function() {
- fetchInfoStub = sinon.stub(fileList, 'addAndFetchFileInfo');
-
- });
- afterEach(function() {
- fetchInfoStub.restore();
- });
-
-
- function createUpload(name, dir) {
- var jqXHR = {
- status: 200
- };
- return {
- getFileName: sinon.stub().returns(name),
- getFullPath: sinon.stub().returns(dir),
- data: {
- jqXHR: jqXHR
- }
- };
- }
-
- /**
- * Simulate add event on the given target
- *
- * @return event object including the result
- */
- function addFile(data) {
- var ev = new $.Event('done', {
- jqXHR: {status: 200}
- });
- var deferred = $.Deferred();
- fetchInfoStub.returns(deferred.promise());
- uploader.trigger('done', ev, data || {});
- return deferred;
- }
-
- it('fetches file info', function() {
- addFile(createUpload('upload.txt', '/subdir'));
- expect(fetchInfoStub.calledOnce).toEqual(true);
- expect(fetchInfoStub.getCall(0).args[0]).toEqual('upload.txt');
- expect(fetchInfoStub.getCall(0).args[1]).toEqual('/subdir');
- });
- it('highlights all uploaded files after all fetches are done', function(done) {
- var highlightStub = sinon.stub(fileList, 'highlightFiles');
- var def1 = addFile(createUpload('upload.txt', '/subdir'));
- var def2 = addFile(createUpload('upload2.txt', '/subdir'));
- var def3 = addFile(createUpload('upload3.txt', '/another'));
- uploader.trigger('stop', {});
-
- expect(highlightStub.notCalled).toEqual(true);
- def1.resolve();
- expect(highlightStub.notCalled).toEqual(true);
- def2.resolve();
- def3.resolve();
- setTimeout(function() {
- expect(highlightStub.callCount).toEqual(1);
- expect(highlightStub.getCall(0).args[0]).toEqual(['upload.txt', 'upload2.txt']);
-
- highlightStub.restore();
-
- done();
- }, 5);
- });
- it('queries storage stats after all fetches are done', function(done) {
- var statStub = sinon.stub(fileList, 'updateStorageStatistics');
- var highlightStub = sinon.stub(fileList, 'highlightFiles');
- var def1 = addFile(createUpload('upload.txt', '/subdir'));
- var def2 = addFile(createUpload('upload2.txt', '/subdir'));
- var def3 = addFile(createUpload('upload3.txt', '/another'));
- uploader.trigger('stop', {});
-
- expect(statStub.notCalled).toEqual(true);
- def1.resolve();
- expect(statStub.notCalled).toEqual(true);
- def2.resolve();
- def3.resolve();
- setTimeout(function() {
- expect(statStub.calledOnce).toEqual(true);
-
- highlightStub.restore();
-
- done();
- }, 3);
- });
- });
- });
- describe('Handling errors', function () {
- var deferredList;
- var getFolderContentsStub;
- var reloading;
-
- beforeEach(function() {
- deferredList = $.Deferred();
- getFolderContentsStub =
- sinon.stub(filesClient, 'getFolderContents');
- getFolderContentsStub.onCall(0).returns(deferredList.promise());
- getFolderContentsStub.onCall(1).returns($.Deferred().promise());
- reloading = fileList.reload();
- });
- afterEach(function() {
- getFolderContentsStub.restore();
- fileList = undefined;
- });
- it('redirects to root folder in case of forbidden access', function (done) {
- deferredList.reject(403);
-
- return reloading.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- expect(getFolderContentsStub.calledTwice).toEqual(true);
- }).then(done, done);
- });
- it('redirects to root folder and shows notification in case of internal server error', function (done) {
- expect(notificationStub.notCalled).toEqual(true);
- deferredList.reject(500);
-
- return reloading.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- expect(getFolderContentsStub.calledTwice).toEqual(true);
- expect(notificationStub.calledOnce).toEqual(true);
- }).then(done, done);
- });
- it('redirects to root folder and shows notification in case of storage not available', function (done) {
- expect(notificationStub.notCalled).toEqual(true);
- deferredList.reject(503, 'Storage is temporarily not available');
-
- return reloading.then(function() {
- expect(fileList.getCurrentDirectory()).toEqual('/');
- expect(getFolderContentsStub.calledTwice).toEqual(true);
- expect(notificationStub.calledOnce).toEqual(true);
- }).then(done, done);
- });
- });
- describe('showFileBusyState', function() {
- var $tr;
-
- beforeEach(function() {
- fileList.setFiles(testFiles);
- $tr = fileList.findFileEl('Two.jpg');
- });
- it('shows spinner on busy rows', function() {
- fileList.showFileBusyState('Two.jpg', true);
- expect($tr.hasClass('busy')).toEqual(true);
- expect($tr.find('.thumbnail').parent().attr('class'))
- .toContain('icon-loading-small');
-
- fileList.showFileBusyState('Two.jpg', false);
- expect($tr.hasClass('busy')).toEqual(false);
- expect(OC.TestUtil.getImageUrl($tr.find('.thumbnail')))
- .toEqual(OC.imagePath('core', 'filetypes/image.svg'));
- });
- it('accepts multiple input formats', function() {
- _.each([
- 'Two.jpg',
- ['Two.jpg'],
- $tr,
- [$tr]
- ], function(testCase) {
- fileList.showFileBusyState(testCase, true);
- expect($tr.hasClass('busy')).toEqual(true);
- fileList.showFileBusyState(testCase, false);
- expect($tr.hasClass('busy')).toEqual(false);
- });
- });
- });
- describe('elementToFile', function() {
- var $tr;
-
- beforeEach(function() {
- fileList.setFiles(testFiles);
- $tr = fileList.findFileEl('One.txt');
- });
-
- it('converts data attributes to file info structure', function() {
- var fileInfo = fileList.elementToFile($tr);
- expect(fileInfo.id).toEqual(1);
- expect(fileInfo.name).toEqual('One.txt');
- expect(fileInfo.mtime).toEqual(123456789);
- expect(fileInfo.etag).toEqual('abc');
- expect(fileInfo.permissions).toEqual(OC.PERMISSION_ALL);
- expect(fileInfo.size).toEqual(12);
- expect(fileInfo.mimetype).toEqual('text/plain');
- expect(fileInfo.type).toEqual('file');
- expect(fileInfo.path).not.toBeDefined();
- expect(fileInfo.isEncrypted).toEqual(false);
- });
- it('sets isEncrypted attribute if data includes true e2eencrypted', function() {
- testFiles[3].isEncrypted = true;
-
- fileList.setFiles(testFiles);
- $tr = fileList.findFileEl('somedir');
-
- var fileInfo = fileList.elementToFile($tr);
- expect(fileInfo.isEncrypted).toEqual(true);
- });
- it('adds path attribute if available', function() {
- $tr.attr('data-path', '/subdir');
- var fileInfo = fileList.elementToFile($tr);
- expect(fileInfo.path).toEqual('/subdir');
- });
- });
- describe('new file menu', function() {
- var newFileMenuStub;
-
- beforeEach(function() {
- newFileMenuStub = sinon.stub(OCA.Files.NewFileMenu.prototype, 'showAt');
- });
- afterEach(function() {
- newFileMenuStub.restore();
- })
- it('renders new button when no legacy upload button exists', function() {
- expect(fileList.$el.find('.button.upload').length).toEqual(0);
- expect(fileList.$el.find('.button.new').length).toEqual(1);
- });
- it('does not render new button when no legacy upload button exists (public page)', function() {
- fileList.destroy();
- $('#controls').append('<input type="button" class="button upload" />');
- fileList = new OCA.Files.FileList($('#app-content-files'));
- expect(fileList.$el.find('.button.upload').length).toEqual(1);
- expect(fileList.$el.find('.button.new').length).toEqual(0);
- });
- it('opens the new file menu when clicking on the "New" button', function() {
- var $button = fileList.$el.find('.button.new');
- $button.click();
- expect(newFileMenuStub.calledOnce).toEqual(true);
- });
- it('does not open the new file menu when button is disabled', function() {
- var $button = fileList.$el.find('.button.new');
- $button.addClass('disabled');
- $button.click();
- expect(newFileMenuStub.notCalled).toEqual(true);
- });
- });
- describe('mount type detection', function() {
- function testMountType(dirInfoId, dirInfoMountType, inputMountType, expectedMountType) {
- var $tr;
- fileList.dirInfo.id = dirInfoId;
- fileList.dirInfo.mountType = dirInfoMountType;
- $tr = fileList.add({
- type: 'dir',
- mimetype: 'httpd/unix-directory',
- name: 'test dir',
- mountType: inputMountType
- });
-
- expect($tr.attr('data-mounttype')).toEqual(expectedMountType);
- }
-
- it('leaves mount type as is if no parent exists', function() {
- testMountType(null, null, 'external', 'external');
- testMountType(null, null, 'shared', 'shared');
- });
- it('detects share root if parent exists', function() {
- testMountType(123, null, 'shared', 'shared-root');
- testMountType(123, 'shared', 'shared', 'shared');
- testMountType(123, 'shared-root', 'shared', 'shared');
- });
- it('detects external storage root if parent exists', function() {
- testMountType(123, null, 'external', 'external-root');
- testMountType(123, 'external', 'external', 'external');
- testMountType(123, 'external-root', 'external', 'external');
- });
- });
- describe('file list should not refresh if url does not change', function() {
- var fileListStub;
-
- beforeEach(function() {
- fileListStub = sinon.stub(OCA.Files.FileList.prototype, 'changeDirectory');
- fileList._currentDirectory = '/subdir';
- });
- afterEach(function() {
- fileListStub.restore();
- });
- it('File list must not be refreshed', function() {
- $('#app-content-files').trigger(new $.Event('urlChanged', {dir: '/subdir'}));
- expect(fileListStub.notCalled).toEqual(true);
- });
- it('File list must be refreshed', function() {
- $('#app-content-files').trigger(new $.Event('urlChanged', {dir: '/'}));
- expect(fileListStub.notCalled).toEqual(false);
- });
- });
-});
diff --git a/apps/files/tests/js/filesSpec.js b/apps/files/tests/js/filesSpec.js
deleted file mode 100644
index cb215397420..00000000000
--- a/apps/files/tests/js/filesSpec.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Felix Heidecke <felix@heidecke.me>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.Files tests', function() {
- var Files = OCA.Files.Files;
-
- describe('File name validation', function() {
- it('Validates correct file names', function() {
- var fileNames = [
- 'boringname',
- 'something.with.extension',
- 'now with spaces',
- '.a',
- '..a',
- '.dotfile',
- 'single\'quote',
- ' spaces before',
- 'spaces after ',
- 'allowed chars including the crazy ones $%&_-^@!,()[]{}=;#',
- '汉字也能用',
- 'und Ümläüte sind auch willkommen'
- ];
- for ( var i = 0; i < fileNames.length; i++ ) {
- var error = false;
- try {
- expect(Files.isFileNameValid(fileNames[i])).toEqual(true);
- }
- catch (e) {
- error = e;
- }
- expect(error).toEqual(false);
- }
- });
- it('Detects invalid file names', function() {
- var fileNames = [
- '',
- ' ',
- '.',
- '..',
- ' ..',
- '.. ',
- '. ',
- ' .',
- 'foo.part',
- 'bar.filepart'
- ];
- for ( var i = 0; i < fileNames.length; i++ ) {
- var threwException = false;
- try {
- Files.isFileNameValid(fileNames[i]);
- console.error('Invalid file name not detected:', fileNames[i]);
- }
- catch (e) {
- threwException = true;
- }
- expect(threwException).toEqual(true);
- }
- });
- });
- describe('getDownloadUrl', function() {
- it('returns the ajax download URL when filename and dir specified', function() {
- var url = Files.getDownloadUrl('test file.txt', '/subdir');
- expect(url).toEqual(OC.getRootPath() + '/remote.php/webdav/subdir/test%20file.txt');
- });
- it('returns the webdav download URL when filename and root dir specified', function() {
- var url = Files.getDownloadUrl('test file.txt', '/');
- expect(url).toEqual(OC.getRootPath() + '/remote.php/webdav/test%20file.txt');
- });
- it('returns the ajax download URL when multiple files specified', function() {
- var url = Files.getDownloadUrl(['test file.txt', 'abc.txt'], '/subdir');
- expect(url).toEqual(OC.getRootPath() + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22test%20file.txt%22%2C%22abc.txt%22%5D');
- });
- });
- describe('handleDownload', function() {
- var redirectStub;
- var cookieStub;
- var clock;
- var testUrl;
-
- beforeEach(function() {
- testUrl = 'http://example.com/owncloud/path/download.php';
- redirectStub = sinon.stub(OC, 'redirect');
- cookieStub = sinon.stub(OC.Util, 'isCookieSetToValue');
- clock = sinon.useFakeTimers();
- });
- afterEach(function() {
- redirectStub.restore();
- cookieStub.restore();
- clock.restore();
- });
-
- it('appends secret to url when no existing parameters', function() {
- Files.handleDownload(testUrl);
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(testUrl + '?downloadStartSecret=');
- });
- it('appends secret to url with existing parameters', function() {
- Files.handleDownload(testUrl + '?test=1');
- expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toContain(testUrl + '?test=1&downloadStartSecret=');
- });
- it('sets cookie and calls callback when cookie appears', function() {
- var callbackStub = sinon.stub();
- var token;
- Files.handleDownload(testUrl, callbackStub);
- expect(redirectStub.calledOnce).toEqual(true);
- token = OC.parseQueryString(redirectStub.getCall(0).args[0]).downloadStartSecret;
- expect(token).toBeDefined();
-
- expect(cookieStub.calledOnce).toEqual(true);
- cookieStub.returns(false);
- clock.tick(600);
-
- expect(cookieStub.calledTwice).toEqual(true);
- expect(cookieStub.getCall(1).args[0]).toEqual('ocDownloadStarted');
- expect(cookieStub.getCall(1).args[1]).toEqual(token);
- expect(callbackStub.notCalled).toEqual(true);
-
- cookieStub.returns(true);
- clock.tick(2000);
-
- expect(cookieStub.callCount).toEqual(3);
- expect(callbackStub.calledOnce).toEqual(true);
- });
- });
-});
diff --git a/apps/files/tests/js/filesummarySpec.js b/apps/files/tests/js/filesummarySpec.js
deleted file mode 100644
index 8692b8b14aa..00000000000
--- a/apps/files/tests/js/filesummarySpec.js
+++ /dev/null
@@ -1,243 +0,0 @@
-/**
-* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.FileSummary tests', function() {
- var FileSummary = OCA.Files.FileSummary;
- var $container;
-
- beforeEach(function() {
- $container = $('<table><tr></tr></table>').find('tr');
- });
- afterEach(function() {
- $container = null;
- });
-
- it('renders summary as text', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000
- });
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('5 folders');
- expect($container.find('.fileinfo').text()).toEqual('2 files');
- expect($container.find('.filesize').text()).toEqual('250 KB');
- });
- it('hides summary when no files or folders', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 0,
- totalFiles: 0,
- totalSize: 0
- });
- expect($container.hasClass('hidden')).toEqual(true);
- });
- it('increases summary when adding files', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000
- });
- s.add({type: 'file', size: 256000});
- s.add({type: 'dir', size: 100});
- s.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('6 folders');
- expect($container.find('.fileinfo').text()).toEqual('3 files');
- expect($container.find('.filesize').text()).toEqual('500 KB');
- expect(s.summary.totalDirs).toEqual(6);
- expect(s.summary.totalFiles).toEqual(3);
- expect(s.summary.totalSize).toEqual(512100);
- });
- it('decreases summary when removing files', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000
- });
- s.remove({type: 'file', size: 128000});
- s.remove({type: 'dir', size: 100});
- s.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('4 folders');
- expect($container.find('.fileinfo').text()).toEqual('1 file');
- expect($container.find('.filesize').text()).toEqual('125 KB');
- expect(s.summary.totalDirs).toEqual(4);
- expect(s.summary.totalFiles).toEqual(1);
- expect(s.summary.totalSize).toEqual(127900);
- });
-
- it('renders filtered summary as text', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000,
- filter: 'foo'
- });
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('5 folders');
- expect($container.find('.fileinfo').text()).toEqual('2 files');
- expect($container.find('.filter').text()).toEqual(' match "foo"');
- expect($container.find('.filesize').text()).toEqual('250 KB');
- });
- it('hides filtered summary when no files or folders', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 0,
- totalFiles: 0,
- totalSize: 0,
- filter: 'foo'
- });
- expect($container.hasClass('hidden')).toEqual(true);
- });
- it('increases filtered summary when adding files', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000,
- filter: 'foo'
- });
- s.add({name: 'bar.txt', type: 'file', size: 256000});
- s.add({name: 'foo.txt', type: 'file', size: 256001});
- s.add({name: 'bar', type: 'dir', size: 100});
- s.add({name: 'foo', type: 'dir', size: 102});
- s.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('6 folders');
- expect($container.find('.fileinfo').text()).toEqual('3 files');
- expect($container.find('.filter').text()).toEqual(' match "foo"');
- expect($container.find('.filesize').text()).toEqual('500 KB');
- expect(s.summary.totalDirs).toEqual(6);
- expect(s.summary.totalFiles).toEqual(3);
- expect(s.summary.totalSize).toEqual(512103);
- });
- it('decreases filtered summary when removing files', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 5,
- totalFiles: 2,
- totalSize: 256000,
- filter: 'foo'
- });
- s.remove({name: 'bar.txt', type: 'file', size: 128000});
- s.remove({name: 'foo.txt', type: 'file', size: 127999});
- s.remove({name: 'bar', type: 'dir', size: 100});
- s.remove({name: 'foo', type: 'dir', size: 98});
- s.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('4 folders');
- expect($container.find('.fileinfo').text()).toEqual('1 file');
- expect($container.find('.filter').text()).toEqual(' match "foo"');
- expect($container.find('.filesize').text()).toEqual('125 KB');
- expect(s.summary.totalDirs).toEqual(4);
- expect(s.summary.totalFiles).toEqual(1);
- expect(s.summary.totalSize).toEqual(127903);
- });
- it('properly sum up pending folder sizes after adding', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 0,
- totalFiles: 0,
- totalSize: 0
- });
- s.add({type: 'dir', size: -1});
- s.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('1 folder');
- expect($container.find('.fileinfo').hasClass('hidden')).toEqual(true);
- expect($container.find('.filesize').text()).toEqual('Pending');
- expect(s.summary.totalDirs).toEqual(1);
- expect(s.summary.totalFiles).toEqual(0);
- expect(s.summary.totalSize).toEqual(0);
- });
- it('properly sum up pending folder sizes after remove', function() {
- var s = new FileSummary($container);
- s.setSummary({
- totalDirs: 0,
- totalFiles: 0,
- totalSize: 0
- });
- s.add({type: 'dir', size: -1});
- s.remove({type: 'dir', size: -1});
- s.update();
- expect($container.hasClass('hidden')).toEqual(true);
- expect(s.summary.totalDirs).toEqual(0);
- expect(s.summary.totalFiles).toEqual(0);
- expect(s.summary.totalSize).toEqual(0);
- });
- describe('hidden files', function() {
- var config;
- var summary;
-
- beforeEach(function() {
- config = new OC.Backbone.Model();
- summary = new FileSummary($container, {
- config: config
- });
- });
-
- it('renders hidden count section when hidden files are hidden', function() {
- config.set('showhidden', false);
- summary.add({name: 'abc', type: 'file', size: 256000});
- summary.add({name: 'def', type: 'dir', size: 100});
- summary.add({name: '.hidden', type: 'dir', size: 512000});
- summary.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('2 folders');
- expect($container.find('.fileinfo').text()).toEqual('1 file');
- expect($container.find('.hiddeninfo').hasClass('hidden')).toEqual(false);
- expect($container.find('.hiddeninfo').text()).toEqual(' (including 1 hidden)');
- expect($container.find('.filesize').text()).toEqual('750 KB');
- });
- it('does not render hidden count section when hidden files exist but are visible', function() {
- config.set('showhidden', true);
- summary.add({name: 'abc', type: 'file', size: 256000});
- summary.add({name: 'def', type: 'dir', size: 100});
- summary.add({name: '.hidden', type: 'dir', size: 512000});
- summary.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('2 folders');
- expect($container.find('.fileinfo').text()).toEqual('1 file');
- expect($container.find('.hiddeninfo').hasClass('hidden')).toEqual(true);
- expect($container.find('.filesize').text()).toEqual('750 KB');
- });
- it('does not render hidden count section when no hidden files exist', function() {
- config.set('showhidden', false);
- summary.add({name: 'abc', type: 'file', size: 256000});
- summary.add({name: 'def', type: 'dir', size: 100});
- summary.update();
- expect($container.hasClass('hidden')).toEqual(false);
- expect($container.find('.dirinfo').text()).toEqual('1 folder');
- expect($container.find('.fileinfo').text()).toEqual('1 file');
- expect($container.find('.hiddeninfo').hasClass('hidden')).toEqual(true);
- expect($container.find('.filesize').text()).toEqual('250 KB');
- });
- });
-});
diff --git a/apps/files/tests/js/mainfileinfodetailviewSpec.js b/apps/files/tests/js/mainfileinfodetailviewSpec.js
deleted file mode 100644
index 5793db8fb98..00000000000
--- a/apps/files/tests/js/mainfileinfodetailviewSpec.js
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
-* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author Michael Jobst <mjobst+github@tecratech.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Raghu Nayyar <hey@raghunayyar.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.MainFileInfoDetailView tests', function() {
- var view, tooltipStub, fileActions, fileList, testFileInfo;
-
- beforeEach(function() {
- tooltipStub = sinon.stub($.fn, 'tooltip');
- fileActions = new OCA.Files.FileActions();
- fileList = new OCA.Files.FileList($('<table></table>'), {
- fileActions: fileActions
- });
- view = new OCA.Files.MainFileInfoDetailView({
- fileList: fileList,
- fileActions: fileActions
- });
- testFileInfo = new OCA.Files.FileInfoModel({
- id: 5,
- name: 'One.txt',
- mimetype: 'text/plain',
- permissions: 31,
- path: '/subdir',
- size: 123456789,
- etag: 'abcdefg',
- mtime: Date.UTC(2015, 6, 17, 1, 2, 0, 0)
- });
- });
- afterEach(function() {
- view.remove();
- view = undefined;
- tooltipStub.restore();
-
- });
- describe('rendering', function() {
- it('displays basic info', function() {
- var clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3));
- var dateExpected = OC.Util.formatDate(Date(Date.UTC(2015, 6, 17, 1, 2, 0, 0)));
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.fileName h3').text()).toEqual('One.txt');
- expect(view.$el.find('.fileName h3').attr('title')).toEqual('One.txt');
- expect(view.$el.find('.size').text()).toEqual('117.7 MB');
- expect(view.$el.find('.size').attr('title')).toEqual('123456789 bytes');
- expect(view.$el.find('.date').text()).toEqual('seconds ago');
- expect(view.$el.find('.date').attr('title')).toEqual(dateExpected);
- clock.restore();
- });
- it('displays permalink', function() {
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.permalink').attr('href'))
- .toEqual(OC.getProtocol() + '://' + OC.getHost() + OC.generateUrl('/f/5'));
- });
- it('displays favorite icon', function() {
- fileActions.registerAction({
- name: 'Favorite',
- mime: 'all',
- permissions: OC.PERMISSION_NONE
- });
-
- testFileInfo.set('tags', [OC.TAG_FAVORITE]);
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
-
- testFileInfo.set('tags', []);
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
- });
- it('does not display favorite icon if favorite action is not available', function() {
- testFileInfo.set('tags', [OC.TAG_FAVORITE]);
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.action-favorite').length).toEqual(0);
-
- testFileInfo.set('tags', []);
- view.setFileInfo(testFileInfo);
- expect(view.$el.find('.action-favorite').length).toEqual(0);
- });
- it('displays mime icon', function() {
- // File
- var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
- testFileInfo.set('mimetype', 'text/calendar');
- view.setFileInfo(testFileInfo);
-
- expect(lazyLoadPreviewStub.calledOnce).toEqual(true);
- var previewArgs = lazyLoadPreviewStub.getCall(0).args;
- expect(previewArgs[0].mime).toEqual('text/calendar');
- expect(previewArgs[0].path).toEqual('/subdir/One.txt');
- expect(previewArgs[0].etag).toEqual('abcdefg');
-
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true);
-
- // returns mime icon first without img parameter
- previewArgs[0].callback(
- OC.imagePath('core', 'filetypes/text-calendar.svg')
- );
-
- // still loading
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true);
-
- // preview loading failed, no prview
- previewArgs[0].error();
-
- // loading stopped, the mimetype icon gets displayed
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false);
- expect(view.$el.find('.thumbnail').css('background-image'))
- .toContain('filetypes/text-calendar.svg');
-
- // Folder
- testFileInfo.set('mimetype', 'httpd/unix-directory');
- view.setFileInfo(testFileInfo);
-
- expect(view.$el.find('.thumbnail').css('background-image'))
- .toContain('filetypes/folder.svg');
-
- lazyLoadPreviewStub.restore();
- });
- it('uses icon from model if present in model', function() {
- var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
- testFileInfo.set('mimetype', 'httpd/unix-directory');
- testFileInfo.set('icon', OC.MimeType.getIconUrl('dir-external'));
- view.setFileInfo(testFileInfo);
-
- expect(lazyLoadPreviewStub.notCalled).toEqual(true);
-
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false);
- expect(view.$el.find('.thumbnail').css('background-image'))
- .toContain('filetypes/folder-external.svg');
-
- lazyLoadPreviewStub.restore();
- });
- it('displays thumbnail', function() {
- var lazyLoadPreviewStub = sinon.stub(fileList, 'lazyLoadPreview');
-
- testFileInfo.set('mimetype', 'text/plain');
- view.setFileInfo(testFileInfo);
-
- expect(lazyLoadPreviewStub.calledOnce).toEqual(true);
- var previewArgs = lazyLoadPreviewStub.getCall(0).args;
- expect(previewArgs[0].mime).toEqual('text/plain');
- expect(previewArgs[0].path).toEqual('/subdir/One.txt');
- expect(previewArgs[0].etag).toEqual('abcdefg');
-
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true);
-
- // returns mime icon first without img parameter
- previewArgs[0].callback(
- OC.imagePath('core', 'filetypes/text-plain.svg')
- );
-
- // still loading
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(true);
-
- // return an actual (simulated) image
- previewArgs[0].callback(
- 'testimage', {
- width: 100,
- height: 200
- }
- );
-
- // loading stopped, image got displayed
- expect(view.$el.find('.thumbnail').css('background-image'))
- .toContain('testimage');
-
- expect(view.$el.find('.thumbnail').hasClass('icon-loading')).toEqual(false);
-
- lazyLoadPreviewStub.restore();
- });
- it('does not show size if no size available', function() {
- testFileInfo.unset('size');
- view.setFileInfo(testFileInfo);
-
- expect(view.$el.find('.size').length).toEqual(0);
- });
- it('renders displayName instead of name if available', function() {
- testFileInfo.set('displayName', 'hello.txt');
- view.setFileInfo(testFileInfo);
-
- expect(view.$el.find('.fileName h3').text()).toEqual('hello.txt');
- expect(view.$el.find('.fileName h3').attr('title')).toEqual('hello.txt');
- });
- it('rerenders when changes are made on the model', function() {
- // Show the "Favorite" icon
- fileActions.registerAction({
- name: 'Favorite',
- mime: 'all',
- permissions: OC.PERMISSION_NONE
- });
-
- view.setFileInfo(testFileInfo);
-
- testFileInfo.set('tags', [OC.TAG_FAVORITE]);
-
- expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(true);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(false);
-
- testFileInfo.set('tags', []);
-
- expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
- });
- it('unbinds change listener from model', function() {
- // Show the "Favorite" icon
- fileActions.registerAction({
- name: 'Favorite',
- mime: 'all',
- permissions: OC.PERMISSION_NONE
- });
-
- view.setFileInfo(testFileInfo);
- view.setFileInfo(new OCA.Files.FileInfoModel({
- id: 999,
- name: 'test.txt',
- path: '/'
- }));
-
- // set value on old model
- testFileInfo.set('tags', [OC.TAG_FAVORITE]);
-
- // no change
- expect(view.$el.find('.action-favorite > span').hasClass('icon-starred')).toEqual(false);
- expect(view.$el.find('.action-favorite > span').hasClass('icon-star')).toEqual(true);
- });
- });
- describe('events', function() {
- it('triggers default action when clicking on the thumbnail', function() {
- var actionHandler = sinon.stub();
-
- fileActions.registerAction({
- name: 'Something',
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- actionHandler: actionHandler
- });
- fileActions.setDefault('text/plain', 'Something');
-
- view.setFileInfo(testFileInfo);
-
- view.$el.find('.thumbnail').click();
-
- expect(actionHandler.calledOnce).toEqual(true);
- expect(actionHandler.getCall(0).args[0]).toEqual('One.txt');
- expect(actionHandler.getCall(0).args[1].fileList).toEqual(fileList);
- expect(actionHandler.getCall(0).args[1].fileActions).toEqual(fileActions);
- expect(actionHandler.getCall(0).args[1].fileInfoModel).toEqual(testFileInfo);
- });
- it('triggers "Favorite" action when clicking on the star', function() {
- var actionHandler = sinon.stub();
-
- fileActions.registerAction({
- name: 'Favorite',
- mime: 'all',
- permissions: OC.PERMISSION_READ,
- actionHandler: actionHandler
- });
-
- view.setFileInfo(testFileInfo);
-
- view.$el.find('.action-favorite').click();
-
- expect(actionHandler.calledOnce).toEqual(true);
- expect(actionHandler.getCall(0).args[0]).toEqual('One.txt');
- expect(actionHandler.getCall(0).args[1].fileList).toEqual(fileList);
- expect(actionHandler.getCall(0).args[1].fileActions).toEqual(fileActions);
- expect(actionHandler.getCall(0).args[1].fileInfoModel).toEqual(testFileInfo);
- });
- });
-});
diff --git a/apps/files/tests/js/newfilemenuSpec.js b/apps/files/tests/js/newfilemenuSpec.js
deleted file mode 100644
index db85d105709..00000000000
--- a/apps/files/tests/js/newfilemenuSpec.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
-* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.NewFileMenu', function() {
- var FileList = OCA.Files.FileList;
- var menu, fileList, $uploadField, $trigger;
-
- beforeEach(function() {
- // dummy upload button
- var $container = $('<div id="app-content-files"></div>');
- $uploadField = $('<input id="file_upload_start"></input>');
- $trigger = $('<a href="#">Menu</a>');
- $container.append($uploadField).append($trigger);
- $('#testArea').append($container);
-
- fileList = new FileList($container);
- menu = new OCA.Files.NewFileMenu({
- fileList: fileList
- });
- menu.showAt($trigger);
- });
- afterEach(function() {
- OC.hideMenus();
- fileList = null;
- menu = null;
- });
-
- describe('rendering', function() {
- it('renders menu items', function() {
- var $items = menu.$el.find('.menuitem');
- expect($items.length).toEqual(2);
- // label points to the file_upload_start item
- var $item = $items.eq(0);
- expect($item.is('label')).toEqual(true);
- expect($item.attr('for')).toEqual('file_upload_start');
- });
- });
- describe('New file/folder', function() {
- var $input;
- var createDirectoryStub;
-
- beforeEach(function() {
- createDirectoryStub = sinon.stub(FileList.prototype, 'createDirectory');
- menu.$el.find('.menuitem').eq(1).click();
- $input = menu.$el.find('form.filenameform input');
- });
- afterEach(function() {
- createDirectoryStub.restore();
- });
-
- it('sets default text in field', function() {
- // text + submit
- expect($input.length).toEqual(2);
- expect($input.val()).toEqual('New folder');
- });
- it('prevents entering invalid file names', function() {
- $input.val('..');
- $input.trigger(new $.Event('keyup', {keyCode: 13}));
- $input.closest('form').submit();
-
- expect(createDirectoryStub.notCalled).toEqual(true);
- });
- it('prevents entering file names that already exist', function() {
- var inListStub = sinon.stub(fileList, 'inList').returns(true);
- $input.val('existing.txt');
- $input.trigger(new $.Event('keyup', {keyCode: 13}));
- $input.closest('form').submit();
-
- expect(createDirectoryStub.notCalled).toEqual(true);
- inListStub.restore();
- });
- it('creates directory when clicking on create directory field', function() {
- $input = menu.$el.find('form.filenameform input');
- $input.val('some folder');
- $input.trigger(new $.Event('keyup', {keyCode: 13}));
- $input.closest('form').submit();
-
- expect(createDirectoryStub.calledOnce).toEqual(true);
- expect(createDirectoryStub.getCall(0).args[0]).toEqual('some folder');
- });
- });
- describe('custom entries', function() {
- var oldPlugins;
- var plugin;
- var actionStub;
-
- beforeEach(function() {
- oldPlugins = _.extend({}, OC.Plugins._plugins);
- actionStub = sinon.stub();
- plugin = {
- attach: function(menu) {
- menu.addMenuEntry({
- id: 'file',
- displayName: t('files_texteditor', 'Text file'),
- templateName: t('files_texteditor', 'New text file.txt'),
- iconClass: 'icon-filetype-text',
- fileType: 'file',
- actionHandler: actionStub
- });
- }
- };
-
- OC.Plugins.register('OCA.Files.NewFileMenu', plugin);
- menu = new OCA.Files.NewFileMenu({
- fileList: fileList
- });
- menu.showAt($trigger);
- });
- afterEach(function() {
- OC.Plugins._plugins = oldPlugins;
- });
- it('renders custom menu items', function() {
- expect(menu.$el.find('.menuitem').length).toEqual(3);
- expect(menu.$el.find('.menuitem[data-action=file]').length).toEqual(1);
- });
- it('calls action handler when clicking on custom item', function() {
- menu.$el.find('.menuitem').eq(2).click();
- var $input = menu.$el.find('form.filenameform input');
- $input.val('some name');
- $input.trigger(new $.Event('keyup', {keyCode: 13}));
- $input.closest('form').submit();
-
- expect(actionStub.calledOnce).toEqual(true);
- expect(actionStub.getCall(0).args[0]).toEqual('some name');
- });
- it('switching fields removes the previous form', function() {
- menu.$el.find('.menuitem').eq(2).click();
- expect(menu.$el.find('form').length).toEqual(1);
- });
- });
-});
diff --git a/apps/files/tests/js/tagspluginspec.js b/apps/files/tests/js/tagspluginspec.js
deleted file mode 100644
index 2ac67e64cea..00000000000
--- a/apps/files/tests/js/tagspluginspec.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-describe('OCA.Files.TagsPlugin tests', function() {
- var fileList;
- var testFiles;
-
- beforeEach(function() {
- var $content = $('<div id="content"></div>');
- $('#testArea').append($content);
- // dummy file list
- var $div = $(
- '<div>' +
- '<table id="filestable">' +
- '<thead></thead>' +
- '<tbody id="fileList"></tbody>' +
- '</table>' +
- '</div>');
- $('#content').append($div);
-
- fileList = new OCA.Files.FileList($div);
- OCA.Files.TagsPlugin.attach(fileList);
-
- testFiles = [{
- id: 1,
- type: 'file',
- name: 'One.txt',
- path: '/subdir',
- mimetype: 'text/plain',
- size: 12,
- permissions: OC.PERMISSION_ALL,
- etag: 'abc',
- shareOwner: 'User One',
- isShareMountPoint: false,
- tags: ['tag1', 'tag2']
- }];
- });
- afterEach(function() {
- fileList.destroy();
- fileList = null;
- });
-
- describe('Favorites icon', function() {
- it('renders favorite icon and extra data', function() {
- var $favoriteMark, $tr;
- fileList.setFiles(testFiles);
- $tr = fileList.$el.find('tbody tr:first');
- $favoriteMark = $tr.find('.favorite-mark');
- expect($favoriteMark.length).toEqual(1);
- expect($favoriteMark.hasClass('permanent')).toEqual(false);
-
- expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2']);
- expect($tr.attr('data-favorite')).not.toBeDefined();
- });
- it('renders permanent favorite icon and extra data', function() {
- var $favoriteMark, $tr;
- testFiles[0].tags.push(OC.TAG_FAVORITE);
- fileList.setFiles(testFiles);
- $tr = fileList.$el.find('tbody tr:first');
- $favoriteMark = $tr.find('.favorite-mark');
- expect($favoriteMark.length).toEqual(1);
- expect($favoriteMark.hasClass('permanent')).toEqual(true);
-
- expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2', OC.TAG_FAVORITE]);
- expect($tr.attr('data-favorite')).toEqual('true');
- });
- });
- describe('Applying tags', function() {
- it('through FileActionsMenu sends request to server and updates icon', function(done) {
- var request;
- fileList.setFiles(testFiles);
- var $tr = fileList.findFileEl('One.txt');
- var $favoriteMark = $tr.find('.favorite-mark');
- var $showMenuAction = $tr.find('.action-menu');
- $showMenuAction.click();
- var $favoriteActionInMenu = $tr.find('.fileActionsMenu .action-favorite');
- $favoriteActionInMenu.click();
-
- expect(fakeServer.requests.length).toEqual(1);
- request = fakeServer.requests[0];
- expect(JSON.parse(request.requestBody)).toEqual({
- tags: ['tag1', 'tag2', OC.TAG_FAVORITE]
- });
- request.respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- tags: ['tag1', 'tag2', 'tag3', OC.TAG_FAVORITE]
- }));
-
- setTimeout(function () {
- // re-read the element as it was re-inserted
- $tr = fileList.findFileEl('One.txt');
- $favoriteMark = $tr.find('.favorite-mark');
- $showMenuAction = $tr.find('.action-menu');
-
- expect($tr.attr('data-favorite')).toEqual('true');
- expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2', 'tag3', OC.TAG_FAVORITE]);
- expect(fileList.files[0].tags).toEqual(['tag1', 'tag2', 'tag3', OC.TAG_FAVORITE]);
- expect($favoriteMark.find('.icon').hasClass('icon-star')).toEqual(false);
- expect($favoriteMark.find('.icon').hasClass('icon-starred')).toEqual(true);
-
- // show again the menu and get the new action, as the menu was
- // closed and removed (and with it, the previous action) when that
- // action was clicked
- $showMenuAction.click();
- $favoriteActionInMenu = $tr.find('.fileActionsMenu .action-favorite');
- $favoriteActionInMenu.click();
-
- setTimeout(function() {
- expect(fakeServer.requests.length).toEqual(2);
- request = fakeServer.requests[1];
- expect(JSON.parse(request.requestBody)).toEqual({
- tags: ['tag1', 'tag2', 'tag3']
- });
-
- request.respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
- tags: ['tag1', 'tag2', 'tag3']
- }));
-
- setTimeout(function() {
- // re-read the element as it was re-inserted
- $tr = fileList.findFileEl('One.txt');
- $favoriteMark = $tr.find('.favorite-mark');
-
- expect($tr.attr('data-favorite')).toBeFalsy();
- expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2', 'tag3']);
- expect(fileList.files[0].tags).toEqual(['tag1', 'tag2', 'tag3']);
- expect($favoriteMark.find('.icon').hasClass('icon-star')).toEqual(true);
- expect($favoriteMark.find('.icon').hasClass('icon-starred')).toEqual(false);
-
- done();
- }, 1);
- }, 1);
- }, 1);
- });
- });
- describe('elementToFile', function() {
- it('returns tags', function() {
- fileList.setFiles(testFiles);
- var $tr = fileList.findFileEl('One.txt');
- var data = fileList.elementToFile($tr);
- expect(data.tags).toEqual(['tag1', 'tag2']);
- });
- it('returns empty array when no tags present', function() {
- delete testFiles[0].tags;
- fileList.setFiles(testFiles);
- var $tr = fileList.findFileEl('One.txt');
- var data = fileList.elementToFile($tr);
- expect(data.tags).toEqual([]);
- });
- });
-});