aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files')
-rw-r--r--apps/files/appinfo/info.xml2
-rw-r--r--apps/files/composer/composer/autoload_classmap.php2
-rw-r--r--apps/files/composer/composer/autoload_static.php2
-rw-r--r--apps/files/l10n/be.js258
-rw-r--r--apps/files/l10n/be.json256
-rw-r--r--apps/files/l10n/de_DE.js8
-rw-r--r--apps/files/l10n/de_DE.json8
-rw-r--r--apps/files/l10n/pt_BR.js21
-rw-r--r--apps/files/l10n/pt_BR.json21
-rw-r--r--apps/files/l10n/sr.js25
-rw-r--r--apps/files/l10n/sr.json25
-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/Service/OwnershipTransferService.php13
14 files changed, 830 insertions, 17 deletions
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index aedcd5b7ed5..fb53cef79b8 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -53,6 +53,8 @@
<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>
diff --git a/apps/files/composer/composer/autoload_classmap.php b/apps/files/composer/composer/autoload_classmap.php
index 070cb46de38..0c0f734251f 100644
--- a/apps/files/composer/composer/autoload_classmap.php
+++ b/apps/files/composer/composer/autoload_classmap.php
@@ -37,6 +37,8 @@ return array(
'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',
diff --git a/apps/files/composer/composer/autoload_static.php b/apps/files/composer/composer/autoload_static.php
index ce79d370e7c..19310ed4e92 100644
--- a/apps/files/composer/composer/autoload_static.php
+++ b/apps/files/composer/composer/autoload_static.php
@@ -52,6 +52,8 @@ class ComposerStaticInitFiles
'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',
diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js
new file mode 100644
index 00000000000..1c72fa29839
--- /dev/null
+++ b/apps/files/l10n/be.js
@@ -0,0 +1,258 @@
+OC.L10N.register(
+ "files",
+ {
+ "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
new file mode 100644
index 00000000000..7cc4d30cdac
--- /dev/null
+++ b/apps/files/l10n/be.json
@@ -0,0 +1,256 @@
+{ "translations": {
+ "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/de_DE.js b/apps/files/l10n/de_DE.js
index 4b897553f31..f5b58fcde18 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -115,7 +115,7 @@ OC.L10N.register(
"Name" : "Name",
"File type" : "Dateityp",
"Size" : "Größe",
- "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
"{displayName}: done" : "{displayName}: Abgeschlossen",
"{displayName}: failed" : "{displayName}: Fehlgeschlagen",
"Actions" : "Aktionen",
@@ -126,8 +126,8 @@ OC.L10N.register(
"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 everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
"Search scope options" : "Suchbereichsoptionen",
"Search here" : "Hier suchen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
@@ -224,7 +224,7 @@ OC.L10N.register(
"Selection" : "Auswahl",
"Select all files" : "Alle Dateien auswählen",
"Deselect all" : "Auswahl aufheben",
- "Select or deselect" : "Aus- oder Abwählen",
+ "Select or deselect" : "Aus- oder abwählen",
"Select a range" : "Einen Bereich auswählen",
"Navigation" : "Navigation",
"Go to parent folder" : "Zum übergeordneten Ordner wechseln",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 26b5abdbd75..403987f92f0 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -113,7 +113,7 @@
"Name" : "Name",
"File type" : "Dateityp",
"Size" : "Größe",
- "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
+ "{displayName}: failed on some elements" : "{displayName}: Ist bei einigen Elementen fehlgeschlagen",
"{displayName}: done" : "{displayName}: Abgeschlossen",
"{displayName}: failed" : "{displayName}: Fehlgeschlagen",
"Actions" : "Aktionen",
@@ -124,8 +124,8 @@
"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 everywhere …" : "Überall suchen …",
+ "Search here …" : "Hier suchen …",
"Search scope options" : "Suchbereichsoptionen",
"Search here" : "Hier suchen",
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
@@ -222,7 +222,7 @@
"Selection" : "Auswahl",
"Select all files" : "Alle Dateien auswählen",
"Deselect all" : "Auswahl aufheben",
- "Select or deselect" : "Aus- oder Abwählen",
+ "Select or deselect" : "Aus- oder abwählen",
"Select a range" : "Einen Bereich auswählen",
"Navigation" : "Navigation",
"Go to parent folder" : "Zum übergeordneten Ordner wechseln",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 6b64267ec74..2b19b2bf39c 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -115,6 +115,9 @@ OC.L10N.register(
"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.",
@@ -123,7 +126,10 @@ OC.L10N.register(
"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",
@@ -187,6 +193,7 @@ OC.L10N.register(
"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",
@@ -197,24 +204,37 @@ OC.L10N.register(
"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",
"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",
@@ -322,6 +342,7 @@ OC.L10N.register(
"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"],
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index dd50c32b179..55a603b6107 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -113,6 +113,9 @@
"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.",
@@ -121,7 +124,10 @@
"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",
@@ -185,6 +191,7 @@
"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",
@@ -195,24 +202,37 @@
"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",
"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",
@@ -320,6 +340,7 @@
"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"],
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index da03fc7ccc4..50b07bbe6ca 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -115,6 +115,9 @@ OC.L10N.register(
"Name" : "Назив",
"File type" : "Тип фајла",
"Size" : "Величина",
+ "{displayName}: failed on some elements" : "{displayName}: није успело на неким елементима",
+ "{displayName}: done" : "{displayName}: завршено",
+ "{displayName}: failed" : "{displayName}: није успело",
"Actions" : "Радње",
"(selected)" : "(изабрано)",
"List of files and folders." : "Листа фајлова и фолдера.",
@@ -123,7 +126,10 @@ OC.L10N.register(
"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}% искоришћено",
@@ -135,6 +141,7 @@ OC.L10N.register(
"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" : "Пошаљи",
@@ -186,32 +193,48 @@ OC.L10N.register(
"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 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" : "Дељено више пута са разним људима",
@@ -300,6 +323,7 @@ OC.L10N.register(
"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. Нећете моћи да отпремате директоријуме",
@@ -318,6 +342,7 @@ OC.L10N.register(
"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 фајлова"],
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index b97d3ffc9b0..8746aa285a7 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -113,6 +113,9 @@
"Name" : "Назив",
"File type" : "Тип фајла",
"Size" : "Величина",
+ "{displayName}: failed on some elements" : "{displayName}: није успело на неким елементима",
+ "{displayName}: done" : "{displayName}: завршено",
+ "{displayName}: failed" : "{displayName}: није успело",
"Actions" : "Радње",
"(selected)" : "(изабрано)",
"List of files and folders." : "Листа фајлова и фолдера.",
@@ -121,7 +124,10 @@
"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}% искоришћено",
@@ -133,6 +139,7 @@
"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" : "Пошаљи",
@@ -184,32 +191,48 @@
"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 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" : "Дељено више пута са разним људима",
@@ -298,6 +321,7 @@
"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. Нећете моћи да отпремате директоријуме",
@@ -316,6 +340,7 @@
"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 фајлова"],
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/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php
index 84c99f32109..afef5d2093d 100644
--- a/apps/files/lib/Service/OwnershipTransferService.php
+++ b/apps/files/lib/Service/OwnershipTransferService.php
@@ -333,15 +333,10 @@ class OwnershipTransferService {
if ($path !== "$sourceUid/files") {
$sharePage = array_filter($sharePage, function (IShare $share) use ($view, $normalizedPath) {
try {
- $relativePath = $view->getPath($share->getNodeId());
- $singleFileTranfer = $view->is_file($normalizedPath);
- if ($singleFileTranfer) {
- return Filesystem::normalizePath($relativePath) === $normalizedPath;
- }
+ $sourceNode = $share->getNode();
+ $relativePath = $view->getRelativePath($sourceNode->getPath());
- return mb_strpos(
- Filesystem::normalizePath($relativePath . '/', false),
- $normalizedPath . '/') === 0;
+ return str_starts_with($relativePath . '/', $normalizedPath . '/');
} catch (Exception $e) {
return false;
}
@@ -357,7 +352,7 @@ class OwnershipTransferService {
return array_values(array_filter(array_map(function (IShare $share) use ($view, $normalizedPath, $output, $sourceUid) {
try {
- $nodePath = $view->getPath($share->getNodeId());
+ $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;