diff --git a/.drone.star b/.drone.star index 75b3e130dcb..ba9be92b17b 100644 --- a/.drone.star +++ b/.drone.star @@ -53,7 +53,7 @@ config = { "master", "stable-*", ], - "pnpmlint": True, + "pnpmlint": False, "e2e": { "1": { "earlyFail": True, @@ -207,17 +207,12 @@ def main(ctx): return pipelines def beforePipelines(ctx): - return checkStarlark() + \ - licenseCheck(ctx) + \ - documentation(ctx) + \ - changelog(ctx) + \ - pnpmCache(ctx) + \ + return pnpmCache(ctx) + \ cacheOcisPipeline(ctx) + \ - pipelinesDependsOn(buildCacheWeb(ctx), pnpmCache(ctx)) + \ - pipelinesDependsOn(pnpmlint(ctx), pnpmCache(ctx)) + pipelinesDependsOn(buildCacheWeb(ctx), pnpmCache(ctx)) def stagePipelines(ctx): - unit_test_pipelines = unitTests(ctx) + unit_test_pipelines = [] # run only unit tests when publishing a standalone package if (determineReleasePackage(ctx) != None): diff --git a/packages/web-app-files/l10n/.tx/config b/packages/web-app-files/l10n/.tx/config deleted file mode 100644 index c0488e6d091..00000000000 --- a/packages/web-app-files/l10n/.tx/config +++ /dev/null @@ -1,10 +0,0 @@ -[main] -host = https://www.transifex.com - -[o:owncloud-org:p:owncloud-web:r:files] -file_filter = locale//app.po -minimum_perc = 0 -resource_name = web-files -source_file = template.pot -source_lang = en -type = PO diff --git a/packages/web-app-files/l10n/translations.json b/packages/web-app-files/l10n/translations.json deleted file mode 100644 index c3b25885d4d..00000000000 --- a/packages/web-app-files/l10n/translations.json +++ /dev/null @@ -1 +0,0 @@ -{"af":{},"ar":{"(me)":"(أنا)","Access denied":"الدخول مرفوض","Actions":"إجراءات","An error occurred while loading the public link":"حدث خطأ أثناء تحميل الرابط العام","Cancel":"إلغاء","Confirm":"تأكيد","Custom permissions":"صلاحيات مخصصة","Delete":"حذف","Deleted files":"الملفات المحذوفة","Details":"التفاصيل","Disabled":"تعطيل","Download":"تحميل","Enabled":"تمكين","Expiration date":"تاريخ إنتهاء الصلاحية\n ","Favorites":"التفضيلات","File name":"اسم الملف","Files":"ملفات","Filter members":"تصفية الأعضاء","Filter:":"تصفيه","Group":"مجموعة","Internal":"داخلي","Members":"اعضاء","Name":"اسم","New":"جديد","New folder":"ملف جديد","Owner":"المالك","Password":"كلمة المرور","Paste here":"الصق هنا","Person was added":"تمت إضافة الشخص","Public link":"رابط عام","Reload public link":"إعادة تحميل الرابط العام","Remove expiration date":"إزالة تاريخ انتهاء الصلاحية","Remove password":"إزالة كلمة المرور ","Rename":"إعادة تسمية","Resource not found":"لم يتم العثور على المورد","Restore":"استرجع","Save":"حفظ","Search":"بحث","Share":"شارك","Shared by":"تمت المشاركة بواسطة","Shared via link":"تمت المشاركة عبر الرابط","Shared with me":"مشاركة معي","Shared with others":"مشاركة مع الآخرين","Show context menu":"إظهار قائمة السياق","Spaces":"مسافات","The file type is unsupported":"نوع الملف غير معتمد","There are no resources marked as favorite":"لا توجد موارد تم تحديدها كمفضلة","User":"مستخدم","Versions":"إصدارات","We went looking everywhere, but were unable to find the selected resource.":"قمنا بالبحث في كل مكان ، ولكن لم نتمكن من العثور على المورد المحدد.","You don't have permission to share this file.":"ليس لديك إذن بمشاركة هذا الملف.","You don't have permission to share this folder.":"ليس لديك إذن بمشاركة هذا المجلد.","You have no deleted files":"ليس لديك ملفات محذوفة","You have no permission to upload!":"ليس لديك إذن للتحميل!"},"bs":{},"bg":{"“via folder”":"\"чрез папка\"","(me)":"(аз)","%{ itemCount } item selected":["%{ itemCount } избран елемент","%{ itemCount } избрани елемента"],"%{collaboratorName} (me)":"%{collaboratorName} (аз)","%{count} member":["%{count} член","%{count} члена"],"%{shareType} cannot access %{resourceName}":"%{shareType} няма достъп до %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} съвпадащи пространства","%{spaceCount} matching trashes":"%{spaceCount} съответстващи кошчета","%{spaceCount} spaces in total":"%{spaceCount} пространства общо","%{spaceCount} trashes in total":"Общо %{spaceCount} кошчета","%{spaceName} (disabled)":"%{spaceName} (деактивирано)","Access denied":"Отказан достъп","Access details":"Достъп до подробности","Access expires":"Срокът за достъп изтича","Access was denied successfully":"Достъпът успешно е забранен","Access was granted successfully":"Достъпът е разрешен успешно","Actions":"Действия","Activities":"Дейности","Add":"Добавяне","Add link":"Добавяне на връзка","Add members":"Добавяне на членове","Add members to this Space":"Добавяне на членове към това пространство","Add password":"Добавяне на парола","An error occurred while loading the public link":"Възникна грешка при зареждането на публичната връзка","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Сигурни ли сте, че искате да изтриете тази връзка? Повторното създаване на същата връзка не е възможно.","Are you sure you want to remove this member?":"Сигурни ли сте, че искате да премахнете този член?","Are you sure you want to remove this share?":"Сигурни ли сте, че искате да премахнете това споделяне?","Cancel":"Отказ","Choose how access is granted":"Избор на начина на предоставяне на достъп","Close filter":"Затваряне на филтъра","Confirm":"Потвърждаване","Context menu of the share":"Контекстно меню на споделянето","Copy link to clipboard":"Копиране на връзката в клипборда","Create new files or folders":"Създаване на нови файлове или папки","Custom permissions":"Персонализирани разрешения","Delete":"Изтриване","Delete link":"Изтриване на връзка","Deleted files":"Изтрити файлове","Deny access":"Отказан достъп","Deselect %{label}":"Премахване на избора от %{label}","Deselect %{name}":"Премахване избора на %{name}","Details":"Подробности","Disabled":"Деактивирано","Download":"Изтегляне","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Плъзнете тук файлове и папки или използвайте бутоните \"Нов\" или \"Качване\", за да добавите файлове.","Edit description":"Редактиране на описание","Edit expiration date":"Редактиране на датата на изтичане на валидността","Edit image":"Редактиране на изображението","Edit name":"Редактиране на името","Edit password":"Редактиране на паролата","Edit permission":"Редактиране на разрешенията","Enabled":"Активирано","Enter a name to add people or groups as members to this Space.":"Въведете име, за да добавите хора или групи като членове на това пространство.","Error while editing the share.":"Грешка при редактиране на споделянето.","Expires %{timeToExpiry} (%{expiryDate})":"Изтича на %{timeToExpiry} (%{expiryDate})","Failed to apply expiration date":"Неуспешно прилагане на датата на валидност","Failed to apply new permissions":"Неуспешно прилагане на новите разрешения","Failed to delete link":"Неуспех при изтриването на връзка","Failed to deny access":"Отказът за достъп е неуспешен","Failed to edit tags":"Неуспешна промяна на етикетите","Failed to grant access":"Предоставянето на достъп е неуспешно","Failed to remove share":"Неуспех при премахването на споделяне","Failed to update link":"Неуспех при актуализирането на връзка","Failed to upload space image":"Неуспешно качване на изображение на пространството","Favorites":"Любими","File already exists":"Файлът вече съществува","File name":"Име на файл","Files":"Файлове","Filter members":"Филтър за членове","Filter tags":"Филтър за етикети","Filter:":"Филтър:","Folder":"Папка","Folder already exists":"Папката вече съществува","Folders":"Папки","Found %{totalResults}, showing the %{itemCount} best matching results":"Намерени %{totalResults}, показващи %{itemCount} от най-подходящите резултати","Go to »Personal« page":"Отидете на страницата »Лични«.","Go to »Spaces Overview«":"Отидете на \"Преглед на пространства\"","Group":"Група","Guest user":"Гост потребител","Hide":"Скриване","How to edit indirect links":"Как да редактирате непреки връзки","If you share a folder, all of its contents and subfolders will be shared as well.":"Ако споделите папка, цялото ѝ съдържание и подпапки също ще бъдат споделени.","Incognito":"Инкогнито","Indirect links are links giving access by a parent folder.":"Индиректните връзки са връзки, даващи достъп чрез основната папка.","Internal":"Вътрешен","Invited by":"Поканен от","Last modified":"Последна промяна","Link name":"Име на връзка","Link name cannot exceed 255 characters":"Името на връзката не може да надвишава 255 символа","Link was deleted successfully":"Връзката е изтрита успешно","Link was updated successfully":"Връзката е актуализирана успешно","Loading list of shares":"Зареждане на списък със споделяния","Member capabilities":"Възможности на члена","Members":"Членове","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Членовете могат да виждат кой има достъп до това пространство и да имат достъп до всички файлове в него. Разрешенията за четене или писане могат да бъдат зададени чрез задаване на роля.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Членовете с роля Мениджър могат да редактират всички свойства и съдържание на Пространство, например да добавят или премахват членове, да споделят подпапки с нечленове или да създават връзки за споделяне.","Merge":"Обединяване","Name":"Име","Navigate to '%{folder}'":"Преминаване към '%{folder}'","New":"Нов","New folder":"Нова папка","New Folder":"Нова папка","no":"няма","No activities":"Няма активност","No information to display":"Няма информация за показване","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Не се изисква влизане в системата. Всеки, който има връзка може да получи достъп. Ако споделите тази връзка с хора от списъка \"Поканени хора\", те ще трябва да влязат в системата, за да се задействат техните индивидуално зададени права. Ако те не са влезли в системата, влизат в сила разрешенията на връзката.","No resources found":"Няма намерени ресурси","No results found":"Няма намерени резултати","No users or groups found.":"Няма намерени потребители или групи.","Notification":"Известие","Open context menu and show members":"Отваряне на контекстното меню и показване на членовете","Overview of the information about the selected file":"Преглед на информацията за избрания файл","Overview of the information about the selected files":"Преглед на информацията за избраните файлове","Owner":"Собственик","Password":"Парола","Paste here":"Поставяне тук","People you share resources with can not see who else has access.":"Хората, с които споделяте ресурси, не могат да видят кой друг има достъп до тях.","People you share resources with will be notified via email or in-app notification.":"Хората, с които споделяте ресурси, ще бъдат уведомени чрез имейл или известие в приложението.","Person was added":"Лицето е добавено","Personal":"Лични","Public files":"Публични файлове","Public link":"Публична връзка","Reload public link":"Презареждане на публичната връзка","Remove":"Премахване","Remove expiration date":"Премахване на датата на изтичане на срока на валидност","Remove member":"Изтриване на член","Remove password":"Премахване на парола","Remove share":"Премахване на споделяне","Rename":"Преименуване","Replace":"Замяна","Resource not found":"Ресурсът не е намерен","Restore":"Възстановяване","Save":"Запазване","Search":"Търсене","Search for files":"Търсене на файлове","Search for service or secondary Account":"Търсене на услуга или допълнителен профил","Search results for \"%{searchTerm}\"":"Резултати от търсенето за \"%{searchTerm}\"","See all versions":"Вижте всички версии","Select permission":"Избор на разрешение","Select role for the invitation":"Избор на роля за поканата","Set expiration date":"Задаване на дата на валидност","Share":"Споделяне","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Споделянето е валидно до %{ expiry Date Relative } (%{ expiry Date })","Share receiver name: %{ displayName }":"Име на получателя на споделянето: %{ displayName }","Share receivers":"Споделяне на получатели","Share successfully changed":"Споделянето е успешно променено","Share was added successfully":"Споделянето е добавено успешно","Share was removed successfully":"Споделянето беше успешно премахнато","Share with people":"Споделяне с хората","Shared by":"Споделено от","Shared on":"Споделено на","Shared via":"Споделено чрез","Shared via link":"Споделено чрез връзка","Shared with":"Споделено с","Shared with me":"Споделено с мен","Shared with others":"Споделено с други","Shares":"Споделяния","Shares pages navigation":"Навигация на страниците със споделяния","Show":"Показване","Show context menu":"Показване на контекстното меню","Show less":"Показване на по-малко","Show members":"Показване на членовете","Show more":"Показване на повече","Showing up to %{searchLimit} results":"Показват се до %{searchLimit} резултатa","Size":"Размер","Space has no deleted files":"В пространството няма изтрити файлове","Space image was uploaded successfully":"Изображението на пространството е успешно качено","Space manager capabilities":"Възможности на мениджъра на пространство","Space members":"Членове на пространството","Spaces":"Пространства","Subfolders":"Подпапки","Switch to condensed table view":"Превключване към съкратен изглед на таблицата","Switch to default table view":"Превключване към изглед по подразбиране на таблицата","Switch to tiles view":"Превключване към изглед с плочки","Tag must not consist of blanks only":"Етикетът не може да се състои единствено от празни полета.","Tags":"Етикети","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"\"Чрез папка\" се показва до споделяне, ако вече е даден достъп чрез основната папка. Щракнете върху \"чрез папка\", за да редактирате споделянето в основната му папка.","The file type is unsupported":"Типът файл не се поддържа","The link \"%{linkName}\" has been copied to your clipboard.":"Връзката „%{linkName}“ е копирана в клипборда.","The link has been copied to your clipboard.":"Връзката е копирана в клипборда.","There are no resources marked as favorite":"Няма ресурси, отбелязани като любими","This file has been shared.":"Този файл е споделен.","This folder contains %{ amount } item.":["Тази папка съдържа %{ amount } елемент.","Тази папка съдържа %{ amount } елемента."],"This folder has been shared.":"Тази папка е споделена.","This folder has no content.":"В папката няма съдържание.","This link is password-protected":"Тази връзка е защитена с парола","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"За търсене на служебни или допълнителни профили използвайте префикс на потребителското име с \"a:\" (например \"a:doe\"), а за профили на гости използвайте префикс на потребителското име с \"l:\" (например \"l:doe\").","Type":"Тип","Upload":{"":"Качване","The label of the upload button in secret file upload view":"Качване"},"Upload files or folders":"Качване на файлове и папки","Use the input field to search for users and groups. Select them to share the item.":"Използвайте полето за въвеждане, за да търсите потребители и групи. Изберете ги, за да споделите елемента.","User":"Потребител","Versions":"Версии","We went looking everywhere, but were unable to find the selected resource.":"Търсихме навсякъде, но не успяхме да открием избрания ресурс.","What are indirect links?":"Какво представляват непреките връзки?","You don't have access to any spaces":"Нямате достъп до никакви пространства","You don't have access to any trashbins":"Нямате достъп до кошчето","You don't have permission to share this file.":"Нямате необходимите права за споделяне на този файл.","You don't have permission to share this folder.":"Нямате необходимите права за споделяне на тази папка","You have no deleted files":"Нямате изтрити файлове","You have no permission to create new files!":"Нямате необходимите права за създаване на нови файлове!","You have no permission to upload!":"Нямате необходимите права за качване!","You have not shared any resource via link.":"Не сте споделили никакъв ресурс чрез връзка.","You have not shared any resources with other people.":"Не сте споделили никакви ресурси с други хора.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} сподели с вас тази папка за качване"}},"cs":{"“via folder”":"“složkou”","(me)":"(já)","%{ itemCount } item selected":["%{ itemCount } položka vybrána","%{ itemCount } položky vybrány","%{ itemCount } položek vybráno","%{ itemCount } položek vybráno"],"%{collaboratorName} (me)":"%{collaboratorName} (já)","%{count} member":["%{count} člen","%{count} členové","%{count} členů","%{count} členů"],"%{spaceCount} matching spaces":"%{spaceCount} odpovídajících míst","%{spaceCount} matching trashes":"%{spaceCount} odpovídajících košů","%{spaceCount} spaces in total":"%{spaceCount} míst celkem","%{spaceCount} trashes in total":"Celkem %{spaceCount} košů","Access denied":"Přístup odepřen","Access details":"Podrobnosti o přístupu","Access expires":"Přístup vyprší","Actions":"Akce","Activities":"Aktivity","Add":"Přidat","Add link":"Přidat link","Add members":"Přidat členy","Add password":"Přidat heslo","An error occurred while loading the public link":"Při načítání veřejného odkazu došlo k chybě","Cancel":"Zrušit","Close filter":"Zavřít filtr","Confirm":"Potvrdit","Copy link to clipboard":"Zkopírovat link do schránky","Custom permissions":"Vlastní oprávnění","Delete":"Odstranit","Delete link":"Smazat link","Deleted files":"Smazané soubory","Deny access":"Zamítnout přístup","Deselect %{label}":"Zrušit výběr %{label}","Details":"Detaily","Disabled":"Zakázáno","Download":"Stáhnout","Edit description":"Změnit popisek","Edit expiration date":"Změnit datum platnosti","Edit image":"Změnit obrázek","Edit name":"Změnit jméno","Edit password":"Změnit heslo","Enabled":"Povoleno","Expiration date":"Datum vypršení","Failed to delete link":"Nezdařilo se smazat odkaz","Favorites":"Oblíbené","File name":"Název souboru","Files":"Soubory","Folders":"Složky","Group":"Skupina","Internal":"Interní","Members":"Členové","Name":"Název","New":"Nový","New folder":"Nová složka","No activities":"Žádné aktivity","Owner":"Vlastník","Password":"Heslo","Personal":"Osobní","Public files":"Veřejné soubory","Public link":"Veřejný odkaz","Remove password":"Odstranit heslo","Rename":"Přejmenovat","Restore":"Obnovit","Save":"Uložit","Search":"Hledat","Share":"Sdílet","Shared with me":"Sdíleno se mnou","Show":"Ukázat","Show context menu":"Ukázat kontextovou nabídku","Size":"Velikost","Spaces":"Místa","Upload":{"":"Nahrát","The label of the upload button in secret file upload view":"Nahrát"},"User":"Uživatel","Versions":"Verze","You have no permission to upload!":"Nemáte oprávnění nahrávat soubory.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} s vámi sdílí tuto složku k nahrávání"}},"ca":{"“via folder”":"\"via carpeta\"","(me)":"(jo)","%{ itemCount } item selected":["%{ itemCount } element seleccionat","%{ itemCount } elements seleccionats"],"%{collaboratorName} (me)":"%{collaboratorName} (jo)","%{count} member":["%{count} membre","%{count} membres"],"%{shareType} cannot access %{resourceName}":"%{shareType} no pot accedir a %{resourceName}","%{spaceCount} matching spaces":"%{groupCount} espais coincidents","%{spaceCount} matching trashes":"%{spaceCount} papereres coincidents","%{spaceCount} spaces in total":"%{spaceCount} espais en total","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} espais en total (incloent %{disabledSpaceCount} inhabilitats)","%{spaceCount} trashes in total":"%{spaceCount} papereres en total","%{spaceName} (disabled)":"%{spaceName} (inhabilitat)","A Space can have multiple Managers. Each Space has at least one Manager.":"Un espai pot tenir múltiples gestors. Cada espai ha de tenir com a mínim un gestor.","Access denied":"Accés denegat","Access details":"Detalls d'accés","Access expires":"Accés caducat","Access was denied successfully":"S'ha denegat l'accés correctament","Access was granted successfully":"L'accés s'ha concedit correctament","Account type":"Tipus de compte","Actions":"Accions","Activities":"Activitats","Add":"Afegir","Add link":"Afegir enllaç","Add members":"Afegir membres","Add members to this Space":"Afegeix membres a aquest espai","Add password":"Afegeix una contrasenya","Album":"Àlbum","An error occurred while loading the public link":"S'ha produït un error en carregar l'enllaç públic","Archive":"Arxiu","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Esteu segur que voleu suprimir aquest enllaç? No és possible tornar a crear el mateix enllaç.","Are you sure you want to remove this member?":"Esteu segur que voleu eliminar aquest membre?","Are you sure you want to remove this share?":"Esteu segur que voleu eliminar aquesta compartició?","Are you sure you want to send a reminder about this share?":"Esteu segur que voleu enviar un recordatori sobre aquesta compartició?","Attach as copy":"Adjunta com a còpia","Audio":"Àudio","Audio Info":"Informació de l'àudio","Authors":"Autors","Cancel":"Cancel·la","Choose":"Escull","Choose how access is granted":"Trieu com es concedeix l'accés","Close filter":"Tanca el filtre","Confirm":"Confirmar","Context menu of the share":"Menú contextual de l'acció","Copy link to clipboard":"Copia l'enllaç al porta-retalls","Copy location to clipboard":"Copia la ubicació al porta-retalls","Copy the link to point your team to this item. Works only for people with existing access.":"Copia l'enllaç perquè el vostre equip tingui accés a aquest element. Funciona només per a persones amb accés existent.","Create new files or folders":"Crea fitxers o carpetes noves","Custom permissions":"Permisos personalitzats","Dear user, please replace this legacy role with one of the currently available roles":"Benvolgut usuari, si us plau, substituïu aquest rol heretat per un dels rols disponibles actualment","Delete":"Suprimeix","Delete link":"Suprimeix l'enllaç","Deleted at":"Eliminat a","Deleted files":"Fitxers eliminats","Deny access":"Accés denegat","Deselect %{label}":"Desselecciona %{label}","Deselect %{name}":"Desselecciona %{name}","Details":"Detalls","Device make":"Fabricant","Device model":"Model","Dimensions":"Dimensions","Disabled":"Desactivat","Disc":"Disc","Document":"Document","Domain":"Domini","Download":"Baixa","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Arrossega fitxers i carpetes aquí o utilitza els botons «Nou» o «Carrega» per afegir fitxers","Drop files here to upload or use the 'Upload' button.":"Deixeu anar els fitxers aquí per a carregar o utilitzeu el botó 'Carrega'.","Duration":"Durada","Edit description":"Edita la descripció","Edit expiration date":"Edita la data de venciment","Edit image":"Edita la imatge","Edit name":"Edita el nom","Edit password":"Edita la contrasenya","Edit permission":"Edita permisos","Enabled":"Habilitat","Enter a name to add people or groups as members to this Space.":"Introduïu un nom per afegir persones o grups com a membres a aquest espai.","Enter text to create a Tag":"Introduïu text per a crear una etiqueta","Error while editing the share.":"S'ha produït un error en editar la compartició.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Tothom que pugui veure el fitxer pot veure les seves etiquetes. Així mateix, tothom que pugui editar el fitxer pot editar les seves etiquetes.","Expiration date":"Data de venciment","Expires %{timeToExpiry} (%{expiryDate})":"Caduca %{timeToExpiry} (%{expiryDate})","Exposure time":"Temps d'exposició","External":"Extern","External user":"Usuari extern","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Usuari extern, registrat amb el compte d'una altra organització però permisos d'accés als seus recursos. Els usuaris externs només poden tenir el permís «veure» o «editar».","External users":"Usuaris externs","F number":"Número F","Failed to add share for \"%{displayName}\"":"No s'ha pogut afegir el recurs compartit per \"%{displayName}\"","Failed to apply expiration date":"No s'ha pogut aplicar la data de venciment","Failed to apply new permissions":"No s'han pogut aplicar els permisos nous","Failed to delete link":"No s'ha pogut suprimir l'enllaç","Failed to deny access":"No s'ha pogut denegar l'accés","Failed to edit tags":"Error en editar les etiquetes","Failed to grant access":"No s'ha pogut concedir l'accés","Failed to remove share":"No s'ha pogut eliminar la compartició","Failed to update link":"No s'ha pogut actualitzar l'enllaç","Failed to upload space image":"No s'ha pogut carregar la imatge de l'espai","Favorites":"Preferits","File":"Fitxer","File already exists":"El fitxer ja existeix","File name":"Nom del fitxer","Files":"Fitxers","Filter members":"Filtra els membres","Filter share types":"Filtra els tipus de compartició","Filter shared by":"Filtre compartit per","Filter tags":"Filtra les etiquetes","Filter:":"Filtre:","Focal length":"Distància focal","Folder":"Carpeta","Folder already exists":"La carpeta ja existeix","Folders":"Carpetes","Found %{totalResults}, showing the %{itemCount} best matching results":"S'han trobat %{totalResults}, mostrant els %{itemCount} millors resultats coincidents","Genre":"Gènere","Go to »Personal« page":"Ves a la pàgina »Personal«","Go to »Spaces Overview«":"Ves a »Vista General d'Espais«","Group":"Grup","Guest user":"Usuari convidat","Hidden Shares":"Comparticions ocultes","Hide":"Oculta","How to edit indirect links":"Com editar enllaços indirectes","If you share a folder, all of its contents and subfolders will be shared as well.":"Si compartiu una carpeta, també es compartiran tots els seus continguts i subcarpetes.","Image":"Imatge","Image Info":"Informació de la imatge","Include disabled":"Incloure desactivat","Incognito":"Incògnit","Indirect (%{ count })":"Indirecte (%{ count })","Indirect links are links giving access by a parent folder.":"Els enllaços indirectes són enllaços que donen accés per una carpeta superior.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Els enllaços indirectes només es poden editar en la seva carpeta superior. Feu clic a la icona de carpeta que hi ha a sota de l'enllaç per navegar a la carpeta superior.","Insufficient quota":"Quota insuficient","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Quota insuficient a %{spaceName}. Necessiteu %{missingSpace} addicional per carregar aquests fitxers","Internal":"Intern","Internal users":"Usuaris interns","Invited by":"Convidat per","ISO":"ISO","last 30 days":"darrers 30 dies","last 7 days":"darrers 7 dies","Last modified":"Darrera modificació","Last Modified":"Darrera modificació","last month":"mes passat","last week":"la setmana passada","last year":"l'any passat","Learn about spaces":"Apreneu sobre els espais","Learn more about ownCloud":"Apreneu més sobre ownCloud","Link name":"Nom de l'enllaç","Link name cannot exceed 255 characters":"El nom de l'enllaç no pot excedir de 255 caràcters","Link was deleted successfully":"L'enllaç s'ha suprimit correctament","Link was updated successfully":"L'enllaç s'ha actualitzat correctament","Loading list of shares":"S'està carregant la llista compartits","Loading members failed. Try again later.":"Ha fallat la càrrega dels membres. Torneu-ho a provar més tard.","Loading shares failed. Try again later.":"Ha fallat la càrrega de les comparticions. Torneu-ho a provar més tard.","Loading users and groups":"S'estan carregant usuaris i grups","Location":"Ubicació","Locked via":"Bloquejat via","Member capabilities":"Funcionalitats dels membres","Members":"Membres","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Els membres poden veure qui té accés a aquest espai i accedir a tots els arxius d'aquest espai. Els permisos de lectura o escriptura es poden establir assignant un rol.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Els membres amb el rol d'administrador són capaços d'editar totes les propietats i continguts d'un espai, com ara afegir o eliminar membres, compartir subcarpetes amb no membres, o crear enllaços per compartir.","Members with the Manager role can add or remove other members from the Space.":"Els membres amb el rol d'administrador poden afegir o eliminar altres membres de l'espai.","Merge":"Fusiona","More options":"Més opcions","Name":"Nom","Navigate to '%{folder}'":"Navega a '%{folder}'","Navigate to parent":"Anar a la carpeta superior","New":"Nou","New folder":"Nova carpeta","New Folder":"Nova carpeta","no":"no","No activities":"No s'ha trobat cap activitat","No external users found.":"No s'ha trobat cap usuari extern.","No hidden shares":"No hi ha comparticions ocultes","No information to display":"No hi ha informació a mostrar","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"No cal iniciar sessió. Tothom amb l'enllaç pot accedir. Si compartiu aquest enllaç amb persones de la llista \"Persones convidades\", han d'iniciar sessió perquè els seus permisos individuals assignats puguin tenir efecte. Si no estan connectats, els permisos de l'enllaç entraran en vigor.","No resources found":"No s'ha trobat cap recurs","No results found":"No s'han trobat resultats","No shares":"Sense comparticions","No users or groups found.":"No s'ha trobat cap usuari o grup.","No versions available for this file":"No hi ha versions disponibles per a aquest fitxer","Notification":"Notificació","Notify via mail":"Notifica per correu","Open context menu and show members":"Obre el menú contextual i mostra els membres","Open context menu with share editing options":"Obre el menú contextual amb les opcions d'edició de compartició","Orientation":"Orientació","Overview of the information about the selected file":"Informació general sobre el fitxer seleccionat","Overview of the information about the selected files":"Informació general sobre els fitxers seleccionats","Owner":"Propietari","Password":"Contrasenya","Paste here":"Enganxa aquí","PDF":"PDF","People you share resources with can not see who else has access.":"Les persones amb les quals comparteixes recursos no poden veure qui té accés.","People you share resources with will be notified via email or in-app notification.":"Les persones amb les quals compartiu recursos seran notificades per correu electrònic o notificació a l'aplicació.","Permanent link":"Enllaç permanent","Permanent link copied":"Enllaç permanent copiat","Person was added":"S'ha afegit una persona","Personal":"Personal","Please wait until all imports have finished":"Espereu fins que finalitzin totes les importacions","Presentation":"Presentació","Public files":"Fitxers públics","Public link":"Enllaç públic","Public links":"Enllaços públics","Reload public link":"Torna a carregar l'enllaç públic","Remove":"Elimina","Remove expiration date":"Elimina la data de venciment","Remove member":"Elimina el membre","Remove password":"Elimina la contrasenya","Remove share":"Elimina l'enllaç","Rename":"Canvia el nom","Replace":"Reemplaça","Resource is temporarily locked, unable to manage share":"El recurs està bloquejat temporalment, no es pot gestionar la compartició","Resource not found":"No s'ha trobat el recurs","Restore":"Restaura","Save":"Desa","Search":"Cerca","Search for files":"Cerca fitxers","Search for service or secondary Account":"Cerca un servei o un compte secundari","Search results for \"%{searchTerm}\"":"Resultats de la cerca per a \"%{searchTerm}\"","See all versions":"Mostra totes les versions","Select a file or folder to view details":"Seleccioneu un fitxer o carpeta per veure'n els detalls","Select a trash to view details":"Seleccioneu una paperera per a veure els detalls","Select permission":"Seleccioneu el permís","Select role for the invitation":"Seleccioneu el rol per a la invitació","Send":"Envia","Send a reminder":"Envia un recordatori","Set expiration date":"Estableix la data de venciment","Share":"Comparteix","Share expires %{ expiryDateRelative } (%{ expiryDate })":"La compartició expira %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Comparteix els enllaços","Share receiver name: %{ displayName }":"Nom del destinatari del contingut compartit: %{ displayName }","Share receivers":"Destinataris del contingut compartit","Share successfully changed":"La compartició s'ha canviat correctament","Share Type":"Tipus de compartició","Share was added successfully":"La compartició s'ha afegit correctament","Share was removed successfully":"La compartició s'ha eliminat correctament","Share with people":"Comparteix amb les persones","Shared by":"Compartit per","Shared By":"Compartit per","Shared on":"Compartit el","Shared via":"Compartit via","Shared via link":"Compartit via enllaç","Shared via the parent folder \"%{sharedParentDir}\"":"Compartit a través de la carpeta superior \"%{sharedParentDir}\"","Shared with":"Compartit amb","Shared with me":"Compartit amb mi","Shared with others":"Compartit amb altres","Shares":"Comparticions","Shares pages navigation":"Navegació per les pàgines de compartició","Shortcut":"Drecera","Show":"Mostra","Show context menu":"Mostra el menú contextual","Show less":"Mostra menys","Show members":"Mostra membres","Show more":"Mostra més","Show more actions":"Mostra més accions","Showing %{activitiesCount} activity":["Mostrant %{activitiesCount} activitat","Mostrant %{activitiesCount} activitats"],"Showing up to %{searchLimit} results":"S'estan mostrant fins a %{searchLimit} resultats","Size":"Mida","Space has no deleted files":"L'espai no té fitxers eliminats","Space image was uploaded successfully":"La imatge de l'espai s'ha penjat correctament","Space manager capabilities":"Funcionalitats del gestor d'espais","Space members":"Membres de l'espai","Space not found":"Espai no trobat","Spaces":"Espais","Spaces are special folders for making files accessible to a team.":"Els espais són carpetes especials per fer accessibles els fitxers a un equip.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Els espais pertanyen a un equip i no a una sola persona. Fins i tot si s'eliminen els membres, els arxius romanen a l'espai perquè l'equip pugui continuar treballant en els arxius.","Spreadsheet":"Full de càlcul","Subfolders":"Subcarpetes","Switch to condensed table view":"Canvia a la vista de taula condensada","Switch to default table view":"Canvia a la vista predeterminada de taula","Switch to tiles view":"Canvia a la vista de fitxes","Synced with your devices":"Sincronitzat amb els vostres dispositius","Tag must not consist of blanks only":"L'etiqueta no pot ser només espais en blanc","Tags":"Etiquetes","Tags must not be longer than %{max} characters":"Les etiquetes no poden excedir de %{max} caràcters","Taken time":"Temps requerit","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"La «via carpeta» es mostra al costat d'una compartició, si ja s'ha donat accés a través d'una carpeta superior. Feu clic a «via carpeta» per a editar la compartició a la seva carpeta superior.","The file type is unsupported":"El tipus de fitxer no és compatible","The link \"%{linkName}\" has been copied to your clipboard.":"L'enllaç \"%{linkName}\" s'ha copiat al porta-retalls.","The link has been copied to your clipboard.":"L'enllaç s'ha copiat al porta-retalls.","The location has been copied to your clipboard.":"La ubicació s'ha copiat al porta-retalls.","The permanent link has been copied to your clipboard.":"S'ha copiat l'enllaç permanent al porta-retalls.","There are no resources marked as favorite":"No hi ha recursos marcats com a preferits","This feature is brought to you by ownCloud":"Aquesta característica us la presenta ownCloud","This file has been shared.":"Aquest fitxer s'ha compartit.","This file has no public link.":"Aquest fitxer no té cap enllaç públic.","This folder contains %{ amount } item.":["Aquesta carpeta conté %{ amount } element.","Aquesta carpeta conté %{ amount } elements."],"This folder has been shared.":"S'ha compartit aquesta carpeta.","This folder has no content.":"Aquesta carpeta no té contingut.","This folder has no public link.":"Aquesta carpeta no té cap enllaç públic.","This link is password-protected":"Aquest enllaç està protegit amb contrasenya","this month":"aquest mes","This space has no public links.":"Aquest espai no té enllaços públics.","this week":"aquesta setmana","this year":"aquest any","Title":"Títol","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Per a cercar comptes de servei o secundaris, el nom d'usuari es prefixa amb \"a:\" (com \"a:doe\") i per als comptes de convidat es prefixa el nom d'usuari amb \"l:\" (com \"l:doe\").","today":"avui","Track":"Pista","Type":"Tipus","Unrestricted":"Sense restriccions","Upload":{"":"Puja","The label of the upload button in secret file upload view":"Puja"},"Upload files or folders":"Puja fitxers o carpetes","Use the input field to search for users and groups. Select them to share the item.":"Utilitzeu el camp d'entrada per a cercar usuaris i grups. Seleccioneu-los per a compartir l'element.","User":"Usuari","Versions":"Versions","Video":"Vídeo","We went looking everywhere, but were unable to find the selected resource.":"Hem mirat pertot arreu, però no hem pogut trobar el recurs seleccionat.","What are indirect links?":"Què són els enllaços indirectes?","Who can view tags?":"Qui pot veure les etiquetes?","Year recorded":"Any registrat","yesterday":"ahir","You cannot cut and paste resources into the same folder.":"No podeu retallar i enganxar recursos a la mateixa carpeta.","You do not have permission to create public links.":"No teniu permís per crear enllaços públics.","You don't have access to any spaces":"No teniu accés a cap espai","You don't have access to any trashbins":"No teniu accés a cap paperera","You don't have permission to share this file.":"No teniu permís per compartir aquest fitxer.","You don't have permission to share this folder.":"No teniu permís per compartir aquesta carpeta.","You have no deleted files":"No teniu fitxers eliminats","You have no permission to create new files!":"No teniu permís per crear fitxers nous!","You have no permission to paste files here.":"No teniu permís per enganxar fitxers aquí.","You have no permission to upload!":"No teniu permís per pujar elements!","You have not shared any resource via link.":"No heu compartit cap recurs a través de l'enllaç.","You have not shared any resources with other people.":"No heu compartit cap recurs amb altres persones.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} ha compartit aquesta carpeta amb tu per carregar elements"},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Tothom que tingui permís de lectura a qualsevol carpeta superior pot veure el contingut."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"La transferència d'estructures de carpetes niades no és possible. Els fitxers de les subcarpetes es penjaran un a un."},"Full Text Search":{"Label of a search page filter used to search for resources with the search term in their name and content.":"Cerca en tot el text"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Només el títol"}},"de":{"“via folder”":"Übergeordneter Ordner","(me)":"(ich)","%{ itemCount } item selected":["%{ itemCount } Datei ausgewählt","%{ itemCount } Elemente ausgewählt"],"%{collaboratorName} (me)":"%{collaboratorName} (Ich)","%{count} member":["%{count} Mitglied","%{count} Mitglieder"],"%{shareType} cannot access %{resourceName}":"%{shareType} kann nicht zugreifen auf %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} Suchergebnisse","%{spaceCount} matching trashes":"%{spaceCount} Suchergebnisse im Papierkorb","%{spaceCount} spaces in total":"%{spaceCount} Spaces insgesamt","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} Spaces insgesamt (einschließlich %{disabledSpaceCount} deaktivierter Spaces)","%{spaceCount} trashes in total":"%{spaceCount} Papierkörbe insgesamt","%{spaceName} (disabled)":"%{spaceName} (deaktiviert)","A Space can have multiple Managers. Each Space has at least one Manager.":"Ein Space kann mehrere Mitglieder mit der Rolle \"Kann verwalten\" haben. Jeder Space hat mindestens ein Mitglied mit dieser Rolle.","Access denied":"Zugriff verweigert","Access details":"Zugriffdetails","Access expires":"Zugriff läuft ab","Access was denied successfully":"Zugriff wurde erfolgreich verweigert","Access was granted successfully":"Zugriff wurde erfolgreich gewährt","Account type":"Art des Kontos","Actions":"Aktionen","Activities":"Aktivitäten","Add":"Hinzufügen","Add link":"Link hinzufügen","Add members":"Mitglieder hinzufügen","Add members to this Space":"Mitglieder zu diesem Space hinzufügen","Add password":"Passwort setzen","Album":"Album","An error occurred while loading the public link":"Beim Laden des öffentlichen Links ist ein Fehler aufgetreten","Archive":"Archiv","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Soll der ausgewählte Link wirklich gelöscht werden? Derselbe Link kann danach nicht wieder erzeugt werden.","Are you sure you want to remove this member?":"Soll dieses Mitglied wirklich entfernt werden?","Are you sure you want to remove this share?":"Soll die Freigabe wirklich entfernt werden?","Are you sure you want to send a reminder about this share?":"Soll wirklich eine Erinnerung wegen dieser Freigabe verschickt werden?","Attach as copy":"Als Kopie anhängen","Audio":"Audio","Audio Info":"Audio-Informationen","Authors":"Autoren","Cancel":"Abbrechen","Choose":"Auswählen","Choose how access is granted":"Bitte auswählen, wie der Zugriff erteilt wird","Close filter":"Filter schließen","Confirm":"Bestätigen","Context menu of the share":"Kontextmenü der Freigabe","Copy link to clipboard":"Link in die Zwischenablage kopieren","Copy location to clipboard":"Ordner in die Zwischenablage kopieren","Copy the link to point your team to this item. Works only for people with existing access.":"Der Link funktioniert nur für berechtigte Personen.","Create new files or folders":"Dateien oder Ordner neu erstellen","Custom permissions":"Benutzerdefinierte Berechtigungen","Dear user, please replace this legacy role with one of the currently available roles":"Sehr geehrter Benutzer, bitte ersetzen Sie diese veraltete Rolle durch eine der derzeit verfügbaren Rollen","Delete":"Löschen","Delete link":"Link löschen","Deleted at":"Gelöscht am","Deleted files":"Gelöschte Dateien","Deny access":"Zugriff verweigern","Deselect %{label}":"%{label} abwählen","Deselect %{name}":"Auswahl für %{name} aufheben","Details":"Details","Device make":"Marke","Device model":"Gerätemodell","Dimensions":"Abmessungen","Disabled":"Deaktiviert","Disc":"Disc","Document":"Dokument","Domain":"Domäne","Download":"Herunterladen","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Dateien oder Ordner hierherziehen oder die \"Neu\" oder \"Hochladen\" Buttons nutzen, um Dateien hinzuzufügen","Drop files here to upload or use the 'Upload' button.":"Sie können Dateien hier ablegen oder die Schaltfläche „Hochladen“ verwenden.","Duration":"Dauer","Edit description":"Beschreibung bearbeiten","Edit expiration date":"Ablaufdatum bearbeiten","Edit image":"Bild bearbeiten","Edit name":"Namen bearbeiten","Edit password":"Passwort bearbeiten","Edit permission":"Berechtigungen bearbeiten","Enabled":"Aktiviert","Enter a name to add people or groups as members to this Space.":"Geben Sie einen Namen ein, um Personen oder Gruppen als Mitglieder zu diesem Space hinzuzufügen.","Enter text to create a Tag":"Text eingeben, um Schlagworte zu erzeugen","Error while editing the share.":"Fehler beim Bearbeiten der Freigabe.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Personen, die Zugriff auf die Datei bzw. den Ordner haben, können die Schlagworte einsehen. Personen, die Bearbeitungsrechte für die Datei bzw. den Ordner haben, können die Schlagworte bearbeiten.","Expiration date":"Ablaufdatum","Expires %{timeToExpiry} (%{expiryDate})":"Läuft %{timeToExpiry} ab (%{expiryDate})","Exposure time":"Belichtungsdauer","External":"Extern","External user":"Externer Benutzer","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Externe Person, die mit einem Konto einer anderen Organisation registriert ist, aber Zugriff auf Ihre Ressourcen hat. Externe Personen können nur die Berechtigung „Kann anzeigen“ oder „Kann bearbeiten“ haben.","External users":"Externe Benutzer","F number":"Blende","Failed to add share for \"%{displayName}\"":"Hinzufügen der Freigabe für \"%{displayName}\" fehlgeschlagen","Failed to apply expiration date":"Fehler beim Anwenden des Ablaufdatums","Failed to apply new permissions":"Fehler beim Setzen der Berechtigungen","Failed to delete link":"Fehler beim Löschen des Links","Failed to deny access":"Zugriffsverweigerung fehlgeschlagen","Failed to edit tags":"Schlagworte konnten nicht bearbeitet werden","Failed to grant access":"Erteilung von Zugriffsrechten fehlgeschlagen","Failed to remove share":"Fehler beim Löschen der Freigabe","Failed to update link":"Fehler beim Bearbeiten des Links","Failed to upload space image":"Fehler beim Hochladen des Space-Bildes","Favorites":"Favoriten","File":"Datei","File already exists":"Die Datei existiert bereits","File name":"Dateiname","Files":"Dateien","Filter members":"Mitglieder filtern","Filter share types":"Nach dem Typ der Freigabe filtern","Filter shared by":"Nach Personen und Gruppen filtern","Filter tags":"Schlagworte filtern","Filter:":"Filter:","Focal length":"Brennweite","Folder":"Ordner","Folder already exists":"Der Ordner existiert bereits","Folders":"Ordner","Found %{totalResults}, showing the %{itemCount} best matching results":"%{totalResults} Ergebnisse gefunden, zeige die %{itemCount} besten passenden Treffer","Genre":"Genre","Go to »Personal« page":"Persönliche Seite anzeigen","Go to »Spaces Overview«":"Zur »Spaces Übersicht« gehen","Group":"Gruppe","Guest user":"Gastnutzer/-in","Hidden Shares":"Ausgeblendete Freigaben","Hide":"Ausblenden","How to edit indirect links":"Bearbeiten von indirekten Links","If you share a folder, all of its contents and subfolders will be shared as well.":"Beim Teilen eines Ordners werden alle Inhalte und Unterordner mit derselben Berechtigung geteilt.","Image":"Bild","Image Info":"Bild-Informationen","Include disabled":"Deaktivierte Spaces einbeziehen","Incognito":"Inkognito","Indirect (%{ count })":"Indirekt (%{ count })","Indirect links are links giving access by a parent folder.":"Indirekte Links sind Links, die den Zugriff durch einen übergeordneten Ordner ermöglichen.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Indirekte Links können nur in Ihrem übergeordneten Ordner bearbeitet werden. Über das Kontextmenü und Klick auf \"Zum übergeordneten Ordner wechseln\" kann die Freigabe bearbeitet werden. ","Insufficient quota":"Kontingent nicht ausreichend","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Kontingent bei %{spaceName} nicht ausreichend. Sie brauchen zusätzlich %{missingSpace} um diese Dateien hochzuladen","Internal":"Intern","Internal users":"Interne Benutzer","Invited by":"Eingeladen von","ISO":"ISO","last 30 days":"letzte 30 Tage","last 7 days":"letzte 7 Tage","Last modified":"Zuletzt bearbeitet","Last Modified":"Zuletzt bearbeitet","last month":"letzten Monat","last week":"letzte Woche","last year":"letztes Jahr","Learn about spaces":"Mehr über Spaces herausfinden","Learn more about ownCloud":"Erfahren Sie mehr über ownCloud","Link name":"Link-Name","Link name cannot exceed 255 characters":"Der Space-Name darf nicht länger als 255 Zeichen sein","Link was deleted successfully":"Der Link wurde erfolgreich gelöscht","Link was updated successfully":"Der Link wurde erfolgreich bearbeitet","Loading list of shares":"Lade die Liste der Freigaben","Loading members failed. Try again later.":"Das Laden der Mitglieder ist fehlgeschlagen. Versuche es später nochmals.","Loading shares failed. Try again later.":"Das Laden von Freigaben ist fehlgeschlagen. Versuche es später nochmals.","Loading users and groups":"Lade Benutzer und Gruppen","Location":"Ordner","Locked via":"Gesperrt durch","Member capabilities":"Berechtigungen für Mitglieder","Members":"Mitglieder","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Mitglieder können sehen, wer Zugriff auf diesen Space und alle darin enthaltenen Datein hat. Lese- und Schreibberechtigungen können mittels Rollen zugewiesen werden.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Mitglieder mit der Rolle Management können alle Eigenschaften und Inhalte eines Spaces bearbeiten. Zum Beispiel können sie Personen hinzufügen oder entfernen, Unterordner mit Personen teilen, die nicht zum Space gehören, oder Freigabe-Links erstellen.","Members with the Manager role can add or remove other members from the Space.":"Mitglieder mit der Rolle \"Kann verwalten\" können andere Mitglieder hinzufügen oder entfernen.","Merge":"Zusammenführen","More options":"Weitere Optionen","Name":"Name","Navigate to '%{folder}'":"Zu '%{folder}' navigieren","Navigate to parent":"Zum übergeordneten Ordner wechseln","New":"Neu","New folder":"Neuer Ordner","New Folder":"Neuer Ordner","no":"nein","No activities":"Keine Aktivitäten","No external users found.":"Keine externen Benutzer gefunden.","No hidden shares":"Keine ausgeblendeten Freigaben","No information to display":"Keine Informationen anzeigbar","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Öffentliche Links können entweder mit der Berechtigung „Kann ansehen“ oder „Kann bearbeiten“ erstellt werden. Initial wird ein Passwort gesetzt, das Setzen eines Ablaufdatums ist optional möglich. Öffentliche Links können ohne Anmeldung geöffnet werden.","No resources found":"Keine Dateien gefunden","No results found":"Keine Ergebnisse gefunden","No shares":"Keine Freigaben","No users or groups found.":"Keine Personen oder Gruppen gefunden.","No versions available for this file":"Für diese Datei sind keine Versionen vorhanden","Notification":"Benachrichtigung","Notify via mail":"Per E-Mail benachrichtigen","Open context menu and show members":"Kontextmenü öffnen und Mitglieder anzeigen","Open context menu with share editing options":"Öffne das Kontextmenü um Freigabe Optionen zu ändern","Orientation":"Ausrichtung","Overview of the information about the selected file":"Übersicht der Informationen für die ausgewählte Datei","Overview of the information about the selected files":"Überblick der Informationen zu den ausgewählten Dateien","Owner":"Besitzer/-in","Password":"Passwort","Paste here":"Hier einfügen","PDF":"PDF","People you share resources with can not see who else has access.":"Je nach gewählter Rolle ist potenziell ersichtlich, wer noch Zugriff hat.","People you share resources with will be notified via email or in-app notification.":"Personen, mit denen Dateien oder Ordner geteilt werden, werden darüber per E\u0002Mail oder In-App benachrichtigt, wenn sie dies aktiviert haben. ","Permanent link":"Permanenter Link","Permanent link copied":"Permanenter Link kopiert","Person was added":"Person hinzugefügt","Personal":"Persönlich","Please wait until all imports have finished":"Bitte warten, bis alle Importe abgeschlossen sind.","Presentation":"Präsentation","Public files":"Öffentliche Dateien","Public link":"Öffentlicher Link","Public links":"Öffentliche Links","Reload public link":"Öffentlichen Link neu laden","Remove":"Entfernen","Remove expiration date":"Entferne Ablaufdatum","Remove member":"Mitglied entfernen","Remove password":"Passwort entfernen","Remove share":"Freigabe entfernen","Rename":"Umbenennen","Replace":"Ersetzen","Resource is temporarily locked, unable to manage share":"Die Ressource ist vorübergehend gesperrt und kann die Freigabe nicht verwalten","Resource not found":"Datei nicht gefunden","Restore":"Wiederherstellen","Save":"Speichern","Search":"Suchen","Search for files":"Suche nach Dateien","Search for service or secondary Account":"Suche nach Dienst oder Zweitkonto","Search results for \"%{searchTerm}\"":"Suchergebnisse für \"%{searchTerm}\"","See all versions":"Alle Versionen anzeigen","Select a file or folder to view details":"Bitte wählen Sie eine Datei um Details anzuzeigen","Select a trash to view details":"Bitte wählen Sie einen Papierkorb, um Details anzuzeigen","Select permission":"Berechtigung auswählen","Select role for the invitation":"Rolle für Freigabe-Einladung auswählen","Send":"Verschicken","Send a reminder":"Erinnerung verschicken","Set expiration date":"Ablaufdatum setzen","Share":"Teilen","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Freigabe läuft ab %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Link(s) teilen","Share receiver name: %{ displayName }":"Freigabe für: %{ displayName }","Share receivers":"Empfänger/-in der Freigabe","Share successfully changed":"Freigabe erfolgreich geändert","Share Type":"Freigabetyp","Share was added successfully":"Freigabe wurde erfolgreich hinzugefügt.","Share was removed successfully":"Freigabe wurde erfolgreich entfernt.","Share with people":"Mit Personen teilen","Shared by":"Geteilt von","Shared By":"Geteilt von","Shared on":"Geteilt am","Shared via":"Geteilt durch","Shared via link":"Per Link geteilt","Shared via the parent folder \"%{sharedParentDir}\"":"Geteilt über den übergeordneten Ordner \"%{sharedParentDir}\"","Shared with":"Geteilt mit","Shared with me":"Mit mir geteilt","Shared with others":"Mit anderen geteilt","Shares":"Freigaben","Shares pages navigation":"Navigation der geteilten Dateien Seiten","Shortcut":"Verknüpfung","Show":"Anzeigen","Show context menu":"Kontextmenü anzeigen","Show less":"Weniger anzeigen","Show members":"Mitglieder anzeigen","Show more":"Mehr anzeigen","Show more actions":"Mehr Aktionen anzeigen","Showing %{activitiesCount} activity":["Es wird %{activitiesCount} Aktivität angezeigt","Es werden %{activitiesCount} Aktivitäten angezeigt"],"Showing up to %{searchLimit} results":"Zeige bis zu %{searchLimit} Ergebnisse","Size":"Größe","Space has no deleted files":"Der Space hat keine gelöschten Dateien.","Space image was uploaded successfully":"Das Space-Bild wurde erfolgreich hochgeladen.","Space manager capabilities":"Berechtigungen für Space-Verwalter/-innen","Space members":"Space-Mitglieder","Space not found":"Space nicht gefunden","Spaces":"Spaces","Spaces are special folders for making files accessible to a team.":"Spaces sind besondere Ordner, in denen Dateien für ein Team gespeichert werden.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Spaces gehören einem Team, nicht einer einzelnen Person. Auch wenn Mitglieder entfernt werden, bleiben die Dateien im Space, damit das Team weiter daran arbeiten kann.","Spreadsheet":"Tabellenkalkulation","Subfolders":"Unterordner","Switch to condensed table view":"Zur verdichteten Tabellenansicht wechseln","Switch to default table view":"Zur normalen Tabellenansicht wechseln","Switch to tiles view":"Zur Kachelansicht wechseln","Synced with your devices":"Mit Ihren Geräten synchronisiert","Tag must not consist of blanks only":"Tag darf nicht nur aus Leerzeichen bestehen","Tags":"Schlagworte","Tags must not be longer than %{max} characters":"Schlagworte dürfen nicht länger als %{max} Zeichen sein","Taken time":"Aufnahmedatum","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"Ein Ordnersymbol wird neben einer Freigabe angezeigt, wenn die Freigabe bereits über einen übergeordneten Ordner erteilt wurde. Über das Kontextmenü und Klick auf \"Zum übergeordneten Ordner wechseln\" kann die Freigabe bearbeitet werden.","The file type is unsupported":"Dieser Dateityp wird nicht unterstützt","The link \"%{linkName}\" has been copied to your clipboard.":"Der Link \"%{linkName}\" wurde in die Zwischenablage kopiert.","The link has been copied to your clipboard.":"Der Link wurde in die Zwischenablage kopiert.","The location has been copied to your clipboard.":"Der Ordner wurde in die Zwischenablage kopiert.","The permanent link has been copied to your clipboard.":"Der permanente Link wurde in die Zwischenablage kopiert.","There are no resources marked as favorite":"Keine Elemente als Favoriten ausgewählt","This feature is brought to you by ownCloud":"Diese Funktion wird Ihnen von ownCloud zur Verfügung gestellt","This file has been shared.":"Diese Datei wurde geteilt.","This file has no public link.":"Die Datei ist nicht öffentlich geteilt.","This folder contains %{ amount } item.":["Der Ordner enthält %{ amount } Datei.","Der Ordner enthält %{ amount } Dateien."],"This folder has been shared.":"Dieser Ordner wurde geteilt.","This folder has no content.":"Dieser Ordner ist leer.","This folder has no public link.":"Dieser Ordner ist nicht öffentlich geteilt.","This link is password-protected":"Dieser Link ist passwortgeschützt","this month":"diesen Monat","This space has no public links.":"Für diesen Space gibt es keine öffentlichen Links.","this week":"diese Woche","this year":"dieses Jahr","Title":"Titel","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Für die Suche nach Service- oder Zweitaccounts muss ein „a:“ (Beispielsweise „a:Martina“) vor den Nutzernamen hinzugefügt werden, für Gastaccounts ein „l:“ (Beispielsweise „l:Max“).","today":"heute","Track":"Track","Type":"Typ","Unrestricted":"Uneingeschränkt","Upload":{"":"Hochladen","The label of the upload button in secret file upload view":"Hochladen"},"Upload files or folders":"Dateien oder Ordner hochladen","Use the input field to search for users and groups. Select them to share the item.":"Suche nach Personen und Gruppen über das Eingabefeld","User":"Person","Versions":"Versionen","Video":"Video","We went looking everywhere, but were unable to find the selected resource.":"Wir haben überall gesucht, konnten das ausgewählte Element aber nicht finden.","What are indirect links?":"Was sind indirekte Links?","Who can view tags?":"Wer darf sich Schlagworte ansehen?","Year recorded":"Aufnahmejahr","yesterday":"gestern","You cannot cut and paste resources into the same folder.":"Sie können Ressourcen nicht ausschneiden und in denselben Ordner einfügen.","You do not have permission to create public links.":"Keine Berechtigung öffentliche Links zu erstellen.","You don't have access to any spaces":"Sie haben aktuell keinen Zugriff auf einen Space","You don't have access to any trashbins":"Sie haben aktuell keinen Zugriff auf Papierkörbe","You don't have permission to share this file.":"Sie haben keine Berechtigung diese Datei zu teilen","You don't have permission to share this folder.":"Sie haben keine Berechtigung diesen Ordner zu teilen","You have no deleted files":"Sie haben keine gelöschten Dateien","You have no permission to create new files!":"Sie haben keine Berechtigung, um neue Dateien zu erstellen","You have no permission to paste files here.":"Sie haben hier keine Erlaubnis Dateien einzufügen","You have no permission to upload!":"Sie haben keine Berechtigung zum Hochladen!","You have not shared any resource via link.":"Sie haben keine Ressourcen per Link geteilt.","You have not shared any resources with other people.":"Sie haben keine Ressourcen mit anderen Personen geteilt.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} hat diesen Ordner zum Upload geteilt"},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Jeder, der Lesezugriff auf einen übergeordneten Ordner hat, kann diesen Inhalt sehen."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"Die Übertragung von verschachtelten Ordnerstrukturen ist nicht möglich. Stattdessen werden alle Dateien aus den Unterordnern einzeln hochgeladen."},"Full Text Search":{"Label of a search page filter used to search for resources with the search term in their name and content.":"Volltextsuche"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Datei-/Ordnername"}},"el":{"Actions":"Ενέργειες","An error occurred while loading the public link":"Παρουσιάστηκε σφάλμα κατά την φόρτωση του δημόσιου συνδέσμου","Cancel":"Ακύρωση","Delete":"Διαγραφή","Deleted files":"Διαγραμμένα αρχεία","Download":"Λήψη","Expiration date":"Ημερομηνία λήξης","Favorites":"Αγαπημένα","Files":"Αρχεία","Folders":"Φάκελοι","Group":"Ομάδα","Name":"Όνομα","Password":"Συνθηματικό","Rename":"Μετονομασία","Restore":"Επαναφορά","Save":"Αποθήκευση","Search":"Αναζήτηση","Shared with":"Διαμοιράστηκε με","Shared with others":"Διαμοιρασμένα με άλλους","Size":"Μέγεθος","User":"Χρήστης","Versions":"Εκδόσεις","You have no permission to upload!":"Δεν έχετε δικαιώματα για μεταφόρτωση!"},"es":{"“via folder”":"\"via carpeta\"","(me)":"(yo)","%{ itemCount } item selected":["%{ itemCount } elemento seleccionado","%{ itemCount } elementos seleccionados","%{ itemCount } elementos seleccionados"],"%{collaboratorName} (me)":"%{collaboratorName} (yo)","%{count} member":["%{count} miembro","%{count} miembros","%{count} miembros"],"%{shareType} cannot access %{resourceName}":"%{shareType} no puede acceder a %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} spaces coincidentes","%{spaceCount} matching trashes":"%{spaceCount} papeleras coinciden","%{spaceCount} spaces in total":"%{spaceCount} spaces en total","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} espacios en total (including %{disabledSpaceCount} desactivados)","%{spaceCount} trashes in total":"%{spaceCount} papeleras en total","%{spaceName} (disabled)":"%{spaceName} (deshabilitado)","A Space can have multiple Managers. Each Space has at least one Manager.":"Un Space puede tener múltiples administradores. Cada Space tiene al menos un administrador.","Access denied":"Acceso denegado","Access details":"Datos de acceso","Access expires":"Acceso caducado","Access was denied successfully":"Acceso denegado con éxito","Access was granted successfully":"El acceso se ha concedido con éxito","Account type":"Tipo de cuenta","Actions":"Acciones","Activities":"Actividades","Add":"Añadir","Add link":"Añadir enlace","Add members":"Añadir miembros","Add members to this Space":"Añadir miembros a este espacio","Add password":"Añadir contraseña","Album":"Álbum","An error occurred while loading the public link":"Se ha producido un error al cargar el enlace público","Archive":"Archivador","Are you sure you want to delete this link? Recreating the same link again is not possible.":"¿Está seguro de que desea eliminar este enlace? No es posible volver a crear el mismo enlace.","Are you sure you want to remove this member?":"¿Estás seguro de que quieres eliminar a este miembro?","Are you sure you want to remove this share?":"¿Está seguro de que desea eliminar esta acción?","Are you sure you want to send a reminder about this share?":"¿Está seguro de que desea enviar un recordatorio sobre esta acción?","Attach as copy":"Adjuntar como copia","Audio":"Audio","Audio Info":"Información del audio","Authors":"Autores","Cancel":"Cancelar","Choose":"Elige","Choose how access is granted":"Elija cómo se concede el acceso","Close filter":"Cerrar filtro","Confirm":"Confirmar","Context menu of the share":"Menú contextual de la acción","Copy link to clipboard":"Copiar el enlace al portapapeles","Copy location to clipboard":"Copiar localización al portapapeles","Copy the link to point your team to this item. Works only for people with existing access.":"Copie el enlace para que su equipo pueda obtener este elemento. Solo para usuarios con acceso permitido.","Create new files or folders":"Crear nuevos archivos y carpetas?","Custom permissions":"Permisos personalizados","Dear user, please replace this legacy role with one of the currently available roles":"Querido usuario, por favor, sustituye este rol antiguo por uno de los roles disponibles actualmente","Delete":"Eliminar","Delete link":"Eliminar enlace","Deleted at":"Eliminado a las","Deleted files":"Archivos borrados","Deny access":"Acceso denegado","Deselect %{label}":"Deseleccionar %{label}","Deselect %{name}":"Deseleccionar %{nombre}","Details":"Detalles","Device make":"Fabricante","Device model":"Modelo","Dimensions":"Dimensiones","Disabled":"Deshabilitado","Disc":"Disco","Document":"Documento","Domain":"Dominio","Download":"Descargar","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Arrastre archivos y carpetas aquí o utilice los botones \"Nuevo\" o \"Cargar\" para añadir archivos","Drop files here to upload or use the 'Upload' button.":"Arrastre ficheros aquí para subirlos o use el botón 'Subir'","Duration":"Duración","Edit description":"Editar la descripción","Edit expiration date":"Editar fecha de expiración","Edit image":"Editar imagen","Edit name":"Editar nombre","Edit password":"Editar contraseña","Edit permission":"Editar permisos","Enabled":"Habilitado","Enter a name to add people or groups as members to this Space.":"Introduzca un nombre para añadir personas o grupos como miembros de este espacio.","Enter text to create a Tag":"Introduzca texto para crear una Etiqueta","Error while editing the share.":"Error al editar la acción.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Todos los que pueden ver el archivo pueden ver sus etiquetas. Del mismo modo, todos los que pueden editar el archivo pueden editar sus etiquetas.","Expiration date":"Fecha de expiración","Expires %{timeToExpiry} (%{expiryDate})":"Expira %{timeToExpiry} (%{expiryDate})","Exposure time":"Tiempo de exposición","External":"Externo","External user":"Usuario externo","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Usuario externo, registrado con cuenta de otra organización pero con acceso permitido a sus recursos. Usuarios externos solamente disponen de permisos \"Ver\" y \"Editar\"","External users":"Usuario externo","F number":"Número F","Failed to add share for \"%{displayName}\"":"Fallo al añadir recurso compartido para \"%{displayName}\"","Failed to apply expiration date":"Error al aplicar la fecha de expiración","Failed to apply new permissions":"Error al aplicar los nuevos permisos","Failed to delete link":"Error al eliminar el enlace","Failed to deny access":"No se ha podido denegar el acceso","Failed to edit tags":"Error al editar etiquetas","Failed to grant access":"No se ha podido conceder el acceso","Failed to remove share":"No se ha podido eliminar la acción","Failed to update link":"Error al actualizar el enlace","Failed to upload space image":"Error al subir la imagen al espacio","Favorites":"Favoritos","File":"Archivo","File already exists":"El archivo ya existe","File name":"Nombre de archivo","Files":"Archivos","Filter members":"Filtrar miebros","Filter share types":"Filtrar tipos de recursos compartidos","Filter shared by":"Filtrar compartido por","Filter tags":"Filtrar etiquetas","Filter:":"Filtrar:","Focal length":"Distancia focal","Folder":"Carpeta","Folder already exists":"La carpeta ya existe","Folders":"Carpetas","Found %{totalResults}, showing the %{itemCount} best matching results":"Encontrados %{totalResults}, mostrando los %{itemCount} mejores resultados coincidentes.","Genre":"Género","Go to »Personal« page":"Ir a la página »Personal«","Go to »Spaces Overview«":"Ir a »Visión general de los espacios«","Group":"Grupo","Guest user":"Usuario invitado","Hidden Shares":"Acciones ocultas","Hide":"Ocultar","How to edit indirect links":"Cómo editar enlaces indirectos","If you share a folder, all of its contents and subfolders will be shared as well.":"Si compartes una carpeta, todos sus contenidos y subcarpetas se compartirán también.","Image":"Imagen","Image Info":"Información de la imagen","Include disabled":"Incluir desactivados","Incognito":"Incógnito","Indirect (%{ count })":"Indirecto (%{ count })","Indirect links are links giving access by a parent folder.":"Los enlaces indirectos son enlaces que dan acceso mediante una carpeta padre.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Enlaces indirectos solamente pueden ser editados en su carpeta padre. Haga click en el icono de carpeta bajo el enlace para navegar hacia la carpeta padre.","Insufficient quota":"Espacio insuficiente","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Espacio insuficiente en %{spaceName}. Necesitas %{missingSpace} adicionales para subir estos ficheros","Internal":"Interno","Internal users":"Usuarios internos","Invited by":"Invitado por","ISO":"ISO","last 30 days":"últimos 30 días","last 7 days":"últimos 7 días","Last modified":"Última modificación","Last Modified":"Última modificación","last month":"último mes","last week":"última semana","last year":"último año","Learn about spaces":"Aprende sobre los espacios","Learn more about ownCloud":"Saber más sobre ownCloud","Link name":"Nombre del enlace","Link name cannot exceed 255 characters":"El nombre del enlace no puedo exceder de los 255 caracteres ","Link was deleted successfully":"Enlace eliminado correctamente","Link was updated successfully":"Enlace actualizado correctamente","Loading list of shares":"Cargar lista de compartidos","Loading members failed. Try again later.":"Fallo al cargar miembros. Inténtelo más tarde.","Loading shares failed. Try again later.":"Fallo al cargar comparticiones. Inténtelo más tarde.","Loading users and groups":"Cargando usuarios y grupos","Location":"Localización","Locked via":"Bloqueado vía","Member capabilities":"Capacidades del miembro","Members":"Miembros","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Los miembros pueden ver quién tiene acceso a este espacio y acceder a todos los archivos de este espacio. Los permisos de lectura o escritura pueden establecerse asignando un rol.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Los miembros con el rol de administrador pueden editar todas las propiedades y contenidos de un espacio, como añadir o eliminar miembros, compartir subcarpetas con no miembros o crear enlaces para compartir.","Members with the Manager role can add or remove other members from the Space.":"Los miembros con el rol administrador pueden añadir o quitar a otros miembros del Space.","Merge":"Combinar","More options":"Más opciones","Name":"Nombre","Navigate to '%{folder}'":"Navegar a '%{carpeta}'","Navigate to parent":"Navegar al padre","New":"Nuevo","New folder":"Nueva carpeta","New Folder":"Nueva carpeta","no":"no","No activities":"No hay actividades","No external users found.":"No se encontraron usuarios externos","No hidden shares":"No hay compartidos ocultos","No information to display":"No hay información que mostrar","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"No es necesario iniciar sesión. Todos los que tengan el enlace pueden acceder. Si compartes este enlace con personas de la lista \"Personas invitadas\", deberán iniciar sesión para que surtan efecto los permisos individuales asignados. Si no inician sesión, los permisos del enlace surtirán efecto.","No resources found":"No se han encontrado recursos","No results found":"No se han encontrado resultados","No shares":"No hay compartidos","No users or groups found.":"No se han encontrado usuarios ni grupos.","No versions available for this file":"No hay versiones disponibles para el archivo","Notification":"Notificación","Notify via mail":"Notificar por correo","Open context menu and show members":"Abrir el menú contextual y mostrar los miembros","Open context menu with share editing options":"Abir menú de contexto con opciones de edición compartida","Orientation":"Orientación","Overview of the information about the selected file":"Resumen de la información sobre el archivo seleccionado","Overview of the information about the selected files":"Resumen de la información sobre los archivos seleccionados","Owner":"Propietario","Password":"Contraseña","Paste here":"Pegar aquí","PDF":"PDF","People you share resources with can not see who else has access.":"Las personas con las que compartes recursos no pueden ver quién más tiene acceso.","People you share resources with will be notified via email or in-app notification.":"Las personas con las que compartas recursos recibirán una notificación por correo electrónico o a través de la aplicación.","Permanent link":"Enlace permanente","Permanent link copied":"Enlace permanente copiado","Person was added":"La persona ha sido agregada","Personal":"Personal","Please wait until all imports have finished":"Espere a que finalicen todas las importaciones","Presentation":"Presentación","Public files":"Archivos públicos","Public link":"Enlace público","Public links":"Enlaces públicos","Reload public link":"Recargar enlace público","Remove":"Eliminar","Remove expiration date":"Eliminar fecha de vencimiento","Remove member":"Eliminar miembro","Remove password":"Eliminar contraseña","Remove share":"Eliminar recurso compartido","Rename":"Renombrar","Replace":"Reemplazar","Resource is temporarily locked, unable to manage share":"El recurso está bloqueado temporalmente, no se puede gestionar el recurso","Resource not found":"Recurso no encontrado","Restore":"Restaurar","Save":"Guardar","Search":"Buscar","Search for files":"Buscar archivos","Search for service or secondary Account":"Buscar servicio o cuenta secundaria","Search results for \"%{searchTerm}\"":"Resultados de la búsqueda para \"%{searchTerm}\"","See all versions":"Ver todas las versiones","Select a file or folder to view details":"Selecciona un archivo o carpeta para ver los detalles","Select a trash to view details":"Seleccione una papelera para ver los detalles","Select permission":"Seleccionar permisos","Select role for the invitation":"Seleccione un rol para la invitación","Send":"Enviar","Send a reminder":"Enviar un recordatorio","Set expiration date":"Fijar la fecha de caducidad","Share":"Compartir","Share expires %{ expiryDateRelative } (%{ expiryDate })":"El recurso expira %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Compartir enlace(s)","Share receiver name: %{ displayName }":"Nombre del receptor: %{ displayName }","Share receivers":"Receptores de recursos","Share successfully changed":"Recurso modificado con éxito","Share Type":"Tipo de recurso compartido","Share was added successfully":"La compartición se ha añadido correctamente","Share was removed successfully":"La compartición se ha eliminado correctamente","Share with people":"Compartir con los demás","Shared by":"Compartido por","Shared By":"Compartido por","Shared on":"Compartido en","Shared via":"Compartido a través de","Shared via link":"Compartido vía enlace","Shared via the parent folder \"%{sharedParentDir}\"":"Compartido vía la carpeta padre \"%{sharedParentDir}\"","Shared with":"Compartido con","Shared with me":"Compartido conmigo","Shared with others":"Compartido con otros","Shares":"Compartidos","Shares pages navigation":"Navegación por las páginas de recursos compartidos","Shortcut":"Acceso directo","Show":"Mostrar","Show context menu":"Mostrar menú contextual","Show less":"Mostrar menos","Show members":"Mostrar miembros","Show more":"Mostrar más","Show more actions":"Mostrar más acciones","Showing %{activitiesCount} activity":["Mostrando %{activitiesCount} actividad","Mostrando %{activitiesCount} actividades","Mostrando %{activitiesCount} actividad/es"],"Showing up to %{searchLimit} results":"Presentarse a %{searchLimit} results","Size":"Tamaño","Space has no deleted files":"El espacio no tiene archivos eliminados","Space image was uploaded successfully":"La imagen espacial se ha cargado correctamente","Space manager capabilities":"Capacidades del gestor espacial","Space members":"Miembros del espacio","Space not found":"Space no encontrado","Spaces":"Spaces","Spaces are special folders for making files accessible to a team.":"Los Spaces son carpetas especiales para hacer archivos accesibles a un equipo.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Los Spaces pertenecen a un equipo y no a una sola persona. Incluso si se eliminan miembros, los ficheros continúan en el Space de tal manera que el equipo puede continuar trabajando con ellos.","Spreadsheet":"Hoja de cálculo","Subfolders":"Sub-carpetas","Switch to condensed table view":"Cambiar a la vista de tabla condensada","Switch to default table view":"Cambiar a la vista de tabla por defecto","Switch to tiles view":"Cambiar a la vista de mosaicos","Synced with your devices":"Sincronizado con tus dispositivos","Tag must not consist of blanks only":"La etiqueta no debe constar únicamente de espacios en blanco","Tags":"Etiquetas","Tags must not be longer than %{max} characters":"Etiquetas no deben ser más largas que %{max} caracteres","Taken time":"Tiempo utilizado","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"La opción \"a través de carpeta\" aparece junto a un recurso compartido si ya se ha dado acceso a través de una carpeta principal. Haga clic en \"a través de carpeta\" para editar el recurso compartido en su carpeta principal.","The file type is unsupported":"Tipo de archivo no compatible","The link \"%{linkName}\" has been copied to your clipboard.":"El enlace \"%{linkName}\" se ha copiado en el portapapeles.","The link has been copied to your clipboard.":"El enlace se ha copiado en el portapapeles.","The location has been copied to your clipboard.":"La localización se ha copiado al portapapeles","The permanent link has been copied to your clipboard.":"El enlace permanente se ha copiado al portapapeles","There are no resources marked as favorite":"No hay recursos marcados como favoritos","This feature is brought to you by ownCloud":"Esta funcionalidad llega a usted por ownCloud","This file has been shared.":"Este archivo ha sido compartido.","This file has no public link.":"Este fichero no tiene enlace público.","This folder contains %{ amount } item.":["Esta carpeta contiene %{ amount } elemento.","Esta carpeta contiene %{ amount } elementos.","Esta carpeta contiene %{ amount } elementos."],"This folder has been shared.":"Esta carpeta ha sido compartida","This folder has no content.":"Esta carpeta no tiene contenido","This folder has no public link.":"Esta carpeta no tiene enlace público.","This link is password-protected":"Este enlace está protegido por contraseña","this month":"este mes","This space has no public links.":"Este space no tiene enlaces públicos.","this week":"esta semana","this year":"este año","Title":"Título","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Para buscar cuentas de servicio o secundarias, escriba el nombre de usuario con \"a:\" (por ejemplo, \"a:doe\") y, para las cuentas de invitado, escriba el nombre de usuario con \"l:\" (por ejemplo, \"l:doe\").","today":"hoy","Track":"Pista","Type":"Tipo","Unrestricted":"Sin restricciones","Upload":{"":"Subir","The label of the upload button in secret file upload view":"Subir"},"Upload files or folders":"cargar archivos y carpetas","Use the input field to search for users and groups. Select them to share the item.":"Utiliza el campo de entrada para buscar usuarios y grupos. Selecciónalos para compartir el elemento.","User":"Usuario","Versions":"Versiones","Video":"Video","We went looking everywhere, but were unable to find the selected resource.":"Buscamos por todas partes, pero no pudimos encontrar el recurso seleccionado.","What are indirect links?":"¿Qué son los enlaces indirectos?","Who can view tags?":"¿Quién puede ver las etiquetas?","Year recorded":"Año registrado","yesterday":"ayer","You cannot cut and paste resources into the same folder.":"No se pueden cortar y pegar recursos dentro de la misma carpeta.","You do not have permission to create public links.":"No tienes permiso para crear enlaces públicos.","You don't have access to any spaces":"No tienes acceso a ningún espacio","You don't have access to any trashbins":"No tienes acceso a ninguna papelera","You don't have permission to share this file.":"Usted no tiene permisos para compartir este archivo","You don't have permission to share this folder.":"Usted no tiene permisos para compartir esta carpeta","You have no deleted files":"Tu no tienes archivos eliminados","You have no permission to create new files!":"No tienes permiso para crear nuevos archivos.","You have no permission to paste files here.":"No tienes permiso para pegar ficheros aquí.","You have no permission to upload!":"No tienes permisos para subir.","You have not shared any resource via link.":"No has compartido ningún recurso mediante enlace.","You have not shared any resources with other people.":"No has compartido ningún recurso con otras personas.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} compartió esta carpeta con usted para subir archivos."},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Cualquiera con permiso de escritura a una carpeta superior puede ver el contenido."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"Transferencia de estructuras de carpeta anidadas no es posible. En su lugar, todos los ficheros incluidos en subcarpetas se subirán individualmente."},"Full Text Search":{"Label of a search page filter used to search for resources with the search term in their name and content.":"Búsqueda por texto"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Solo título"}},"et":{},"gl":{"(me)":"(eu)","Actions":"Accións","An error occurred while loading the public link":"Produciuse un erro ao cargar a ligazón pública","Cancel":"Cancelar","Confirm":"Confirmar","Delete":"Eliminar","Deleted files":"Ficheiros eliminados","Download":"Descargar","Expiration date":"Data de caducidade","Favorites":"Favoritos","File name":"Nome de ficheiro","Files":"Ficheiros","Folders":"Cartafoles","Group":"Grupo","Name":"Nome","New":"Novo","New folder":"Novo cartafol","Owner":"Propietario","Password":"Contrasinal","Paste here":"Pegar aquí","Person was added":"Engadiuse a persoa","Public link":"Ligazón pública","Reload public link":"Volvendo cargar a ligazón pública","Remove expiration date":"Retirar a data de caducidade","Remove password":"Retirar o contrasinal","Rename":"Renomear","Resource not found":"Non se atopou o recurso","Restore":"Restaurar","Save":"Gardar","Search":"Buscar","Share":"Compartir","Shared with":"Compartido con","Shared with me":"Compartido comigo","Shared with others":"Compartido con outros","Size":"Tamaño","Upload":{"":"Envío","The label of the upload button in secret file upload view":"Envío"},"User":"Usuario","Versions":"Versións","We went looking everywhere, but were unable to find the selected resource.":"Buscamos por todas partes, mais non puidemos atopar o recurso seleccionado.","You don't have permission to share this file.":"Non ten permiso para compartir este ficheiro.","You don't have permission to share this folder.":"Non ten permiso para compartir este cartafol.","You have no permission to upload!":"Non ten permiso para facer envíos!","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} compartiu este cartafol con vostede para envialo"}},"fr":{"“via folder”":"Via le dossier","(me)":"(moi)","%{ itemCount } item selected":["%{ itemCount } fichier sélectionner","%{ itemCount } fichiers sélectionnés","%{ itemCount } éléments sélectionnés"],"%{collaboratorName} (me)":"%{collaboratorName} (Moi)","%{count} member":["%{count} membre","%{count} membres","%{count} membres"],"%{shareType} cannot access %{resourceName}":"%{shareType} ne peut pas accéder à %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} espaces correspondants","%{spaceCount} matching trashes":"%{spaceCount} poubelles correspondantes","%{spaceCount} spaces in total":"%{spaceCount} espaces en tout","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} espaces au total (y compris %{disabledSpaceCount} espaces désactivés)","%{spaceCount} trashes in total":"%{spaceCount} poubelles au total","%{spaceName} (disabled)":"%{spaceName} (désactivé)","A Space can have multiple Managers. Each Space has at least one Manager.":"Un espace peut avoir plusieurs gestionnaires. Chaque espace a au moins un gestionnaire.","Access denied":"Accès refusé","Access details":"Détails de l'accès","Access expires":"Accès expirée","Access was denied successfully":"L'accès a été refusé avec succès","Access was granted successfully":"L'accès a été accordé avec succès","Account type":"Type de compte","Actions":"Actions","Activities":"Activités","Add":"Ajouter","Add link":"Ajouter un lien","Add members":"Ajouter des membres","Add members to this Space":"Ajouter des membres a l'Espace","Add password":"Ajouter un mot de passe","Album":"Album","An error occurred while loading the public link":"Une erreur est apparue lors du chargement du lien public","Archive":"Archive","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Êtes-vous sûr de vouloir supprimer ce lien ? Recréer le même lien ne sera pas possibe à l'avenir.","Are you sure you want to remove this member?":"Êtes-vous sûr de vouloir supprimer ce membre ?","Are you sure you want to remove this share?":"Êtes-vous sûr de vouloir supprimer ce partage ?","Are you sure you want to send a reminder about this share?":"Êtes-vous sûr de vouloir envoyer un rappel concernant ce partage ?","Attach as copy":"Joindre en copie","Audio":"Audio","Audio Info":"Info audio","Authors":"Auteurs","Cancel":"Annuler","Choose":"Choisissez","Choose how access is granted":"Choisissez qu'elle accès sont accordés","Close filter":"Fermer le filtre","Confirm":"Confirmer","Context menu of the share":"Menu contextuel de partage","Copy link to clipboard":"Copier le lien dans le presse papier","Copy location to clipboard":"Copier l'emplacement dans le presse-papiers","Copy the link to point your team to this item. Works only for people with existing access.":"Copiez le lien pour diriger votre équipe vers cet élément. Fonctionne uniquement pour les personnes disposant d'un accès existant.","Create new files or folders":"Créer de nouveaux fichiers ou dossiers","Custom permissions":"Permissions personnalisées","Dear user, please replace this legacy role with one of the currently available roles":"Cher utilisateur, veuillez remplacer ce rôle hérité par l'un des rôles actuellement disponibles","Delete":"Supprimer","Delete link":"Supprimer le lien","Deleted at":"Supprimé à","Deleted files":"Fichiers supprimés","Deny access":"Refuser l'accès","Deselect %{label}":"Désélectionner %{label}","Deselect %{name}":"désélectionner %{name}","Details":"Détails","Device model":"Modèle d'appareil","Dimensions":"Dimensions","Disabled":"Désactivé","Disc":"Disque","Document":"Document","Domain":"Domaine","Download":"Télécharger","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Faites glisser les fichiers et les dossiers ici ou utilisez les boutons « Nouveau » ou « Télécharger » pour ajouter des fichiers.","Duration":"Durée","Edit description":"Modifier la description","Edit expiration date":"Modifier la date d'expiration","Edit image":"Modifier l'image","Edit name":"Modifier le nom","Edit password":"Modifier le mot de passe","Edit permission":"Modifier la permission","Enabled":"Activé","Enter a name to add people or groups as members to this Space.":"Entrez un nom pour ajouter des personnes ou des groupes en tant que membres de cet espace.","Enter text to create a Tag":"Entrez du texte pour créer une balise","Error while editing the share.":"Erreur lors de l'édition du partage.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":" Toutes les personnes qui peuvent voir le fichier peuvent voir ses balises. De même, toutes les personnes qui peuvent modifier le fichier peuvent modifier ses balises.","Expiration date":"Date d'éxpiration","Expires %{timeToExpiry} (%{expiryDate})":"Expire %{timeToExpiry} (%{expiryDate})","Exposure time":"Délai d'exposition","External":"Externe","External user":"Utilisateur externe","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Utilisateur externe, inscrit sur le compte d'une autre organisation mais ayant accès à vos ressources. Les utilisateurs externes ne peuvent avoir que l'autorisation de « voir » ou de « modifier ».","External users":"Utilisateurs externes","F number":"Numéro F","Failed to add share for \"%{displayName}\"":"Échec de l'ajout d'un partage pour \"%{displayName}\"","Failed to apply expiration date":"Impossible d'appliquer la date d'expiration","Failed to apply new permissions":"Impossible d'appliquer les nouvelles autorisations","Failed to delete link":"Impossible de supprimer le lien","Failed to deny access":"Impossible de refuser l'accès","Failed to edit tags":"Impossible de modifier les balises","Failed to grant access":"Impossible d'accorder l'accès","Failed to remove share":"Impossible de supprimer le partage","Failed to update link":"Impossible de mettre à jour le lien","Failed to upload space image":"Impossible de télécharger l'image de l'espace","Favorites":"Favoris","File":"Fichier","File already exists":"Fichier déjà existant","File name":"Nom de fichier","Files":"Fichiers","Filter members":"Filtrer les membres","Filter share types":"Filtrer les types d'actions","Filter shared by":"Filtre partagé par","Filter tags":"Filtrer les balises","Filter:":"Filtre :","Folder":"Dossier","Folder already exists":"Le dossier existe déjà","Folders":"Dossiers","Found %{totalResults}, showing the %{itemCount} best matching results":"Trouvé %{totalResults}, montrant les %{itemCount} meilleurs résultats correspondants","Genre":"Genre","Go to »Personal« page":"Aller à la page « Personnel »","Go to »Spaces Overview«":"Aller à « Aperçu des espaces »","Group":"Groupe","Guest user":"Utilisateur invité","Hidden Shares":"Partages cachés","Hide":"Masquer","How to edit indirect links":"Comment modifier les liens indirects","If you share a folder, all of its contents and subfolders will be shared as well.":"Si vous partagez un dossier, tout son contenu et ses sous-dossiers seront également partagés.","Image":"Image","Image Info":"Informations sur l'image","Incognito":"Incognito","Indirect (%{ count })":"Indirect (%{ count })","Indirect links are links giving access by a parent folder.":"Les liens indirects sont des liens donnant accès à un dossier parent.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Les liens indirects ne peuvent être modifiés que dans leur dossier parent. Cliquez sur l'icône de dossier sous le lien pour naviguer vers le dossier parent.","Insufficient quota":"Quota insuffisant","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Quota insuffisant sur %{spaceName}. Vous avez besoin de %{missingSpace} supplémentaire pour télécharger ces fichiers.","Internal":"Interne","Internal users":"Utilisateurs internes","Invited by":"Invité par","ISO":"ISO","last 30 days":"30 derniers jours","last 7 days":"7 derniers jours","Last modified":"Dernière modification","Last Modified":"Dernière modification","last month":"mois dernier","last week":"semaine dernière","last year":"l'an dernier","Learn about spaces":"En savoir plus sur les espaces","Link name":"Nom du lien","Link name cannot exceed 255 characters":"Le nom du lien ne peut pas dépasser 255 caractères","Link was deleted successfully":"Le lien a été supprimé avec succès","Link was updated successfully":"Le lien a été mis à jour avec succès","Loading list of shares":"Chargement de la liste des actions","Loading members failed. Try again later.":"Le chargement des membres a échoué. Réessayez plus tard.","Loading shares failed. Try again later.":"Le chargement des partages a échoué. Réessayez plus tard.","Loading users and groups":"Chargement des utilisateurs et des groupes","Location":"Emplacement","Locked via":"Verrouillé via","Member capabilities":"Capacités des membres","Members":"Membres","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Les membres peuvent voir qui a accès à cet espace et accéder à tous les fichiers de cet espace. Les autorisations de lecture ou d'écriture peuvent être définies en attribuant un rôle.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Les membres avec le rôle de Gestionnaire peuvent modifier toutes les propriétés et le contenu d'un espace, comme ajouter ou supprimer des membres, partager des sous-dossiers avec des non-membres ou créer des liens à partager.","Members with the Manager role can add or remove other members from the Space.":"Les membres ayant le rôle de Gestionnaire peuvent ajouter ou supprimer d’autres membres de l’Espace.","Merge":"Fusionner","More options":"Plus d'options","Name":"Nom","Navigate to '%{folder}'":"Aller à \"%{folder}\"","Navigate to parent":"Accéder au parent","New":"Nouveau","New folder":"Nouveau dossier","New Folder":"Nouveau dossier","no":"Non","No activities":"Pas d'activités","No external users found.":"Aucun utilisateur externe trouvé.","No hidden shares":"Pas de partages cachés","No information to display":"Aucune information à afficher","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Aucune connexion n'est requise. Toutes les personnes disposant du lien peuvent y accéder. Si vous partagez ce lien avec des personnes de la liste « Personnes invitées », elles doivent se connecter pour que les autorisations qui leur sont attribuées individuellement prennent effet. Si elles ne sont pas connectées, les autorisations du lien prennent effet.","No resources found":"Aucune ressource trouvée","No results found":"Aucun résultats trouvés","No shares":"Aucun partages","No users or groups found.":"Aucun utilisateur ou groupe n'a été trouvé","No versions available for this file":"Aucune version disponible pour ce fichier","Notification":"Notification","Notify via mail":"Notification par e-mail","Open context menu and show members":"Ouvrir le menu contextuel et afficher les membres","Open context menu with share editing options":"Ouvrir le menu contextuel avec les options d'édition de partage","Orientation":"Orientation","Overview of the information about the selected file":"Aperçu des informations sur le fichier sélectionné","Overview of the information about the selected files":"Aperçu des informations sur les fichiers sélectionnés","Owner":"Propriétaire","Password":"Mot de passe","Paste here":"Coller ici","PDF":"PDF","People you share resources with can not see who else has access.":"Les personnes avec lesquelles vous partagez des ressources ne peuvent pas voir qui d’autre y a accès.","People you share resources with will be notified via email or in-app notification.":"Les personnes avec lesquelles vous partagez des ressources seront averties par e-mail ou par notification intégrée à l'application.","Permanent link":"Lien permanent","Permanent link copied":"Lien permanent copié","Person was added":"Une personne a été ajoutée","Personal":"Personnel","Please wait until all imports have finished":"Veuillez patienter jusqu'à ce que toutes les importations soient terminées","Presentation":"Présentation","Public files":"Fichiers publics","Public link":"Lien public","Public links":"Liens publics","Reload public link":"Recharger le lien public","Remove":"Retirer","Remove expiration date":"Supprimer date d'expiration","Remove member":"Supprimer un membre","Remove password":"Supprimer mot de passe","Remove share":"Supprimer le partage","Rename":"Renommer","Replace":"Remplacer","Resource is temporarily locked, unable to manage share":"La ressource est temporairement verrouillée, impossible de gérer le partage","Resource not found":" Ressource introuvable ","Restore":"Restaurer","Save":"Sauvegarder","Search":"Recherche","Search for files":"Rechercher des fichiers","Search for service or secondary Account":"Rechercher un service ou un compte secondaire","Search results for \"%{searchTerm}\"":"Résultats de la recherche pour « %{searchTerm} »","See all versions":"Voir toutes les versions","Select a file or folder to view details":"Sélectionnez un fichier ou un dossier pour afficher les détails","Select a trash to view details":"Sélectionnez une corbeille pour afficher les détails","Select permission":"Sélectionner la permission","Select role for the invitation":"Sélectionner le rôle de l'invitation","Send":"Envoyer","Send a reminder":"Envoyer un rappel","Set expiration date":"Définir la date d'expiration","Share":"Partager","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Le partage expire %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Partager le(s) lien(s)","Share receiver name: %{ displayName }":"Nom du destinataire de l'action : %{ displayName }","Share receivers":"Partager les destinataires","Share successfully changed":"Le partage a été modifié avec succès","Share Type":"Type de partage","Share was added successfully":"Le partage a été ajouté avec succès","Share was removed successfully":"Le partage a été supprimé avec succès","Share with people":"Partager avec des personnes","Shared by":"Partagé par","Shared By":"Partagé par","Shared on":"Partagé sur","Shared via":"Partagé via","Shared via link":"Partagé par lien","Shared via the parent folder \"%{sharedParentDir}\"":"Partagé via le dossier parent « %{sharedParentDir} »","Shared with":"Partagé avec","Shared with me":"Partagé avec moi","Shared with others":"Partagé avec autres","Shares":"Partages","Shares pages navigation":"Partage des pages de navigation","Shortcut":"Raccourci","Show":"Afficher","Show context menu":"Afficher le menu contextuel","Show less":"Afficher moins","Show members":"Afficher les membres","Show more":"Afficher plus","Show more actions":"Afficher plus d'actions","Showing %{activitiesCount} activity":["Afficher l'activité de %{activitiesCount}","Afficher les activités de %{activitiesCount}","Afficher les activités de %{activitiesCount}"],"Showing up to %{searchLimit} results":"Afficher jusqu'à %{searchLimit} résultats","Size":"Taille","Space has no deleted files":"L’espace n'a pas de fichier supprimé","Space image was uploaded successfully":"L'image de l'espace a été téléchargée avec succès","Space manager capabilities":"Capacités du gestionnaire espace","Space members":"Membres d'espace","Space not found":"Espace introuvable","Spaces":"Espaces","Spaces are special folders for making files accessible to a team.":"Les espaces sont des dossiers spéciaux permettant de rendre les fichiers accessibles à une équipe.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Les espaces appartiennent à une équipe et non à une seule personne. Même si des membres sont retirés, les fichiers restent dans l'espace afin que l'équipe puisse continuer à travailler sur les fichiers.","Spreadsheet":"Tableur","Subfolders":"Sous-dossiers","Switch to condensed table view":"Passer à la vue condensée du tableau","Switch to default table view":"Passer à la vue de tableau par défaut","Switch to tiles view":"Passer à la vue en mosaïque","Synced with your devices":"Synchronisé avec vos appareils","Tag must not consist of blanks only":"La balise ne doit pas être composée uniquement de blancs","Tags":"Étiquettes","Taken time":"Temps consacré","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"Le \"dossier via\" s'affiche à côté d'un partage, si l'accès a déjà été accordé via un dossier parent. Cliquez sur le \"dossier via\" pour modifier le partage sur son dossier parent.","The file type is unsupported":"Type de fichier non supporté","The link \"%{linkName}\" has been copied to your clipboard.":"Le lien « %{linkName} » a été copié dans votre presse-papiers.","The link has been copied to your clipboard.":"Le lien a été copié dans votre presse-papiers.","The location has been copied to your clipboard.":"L'emplacement a été copié dans votre presse-papiers.","The permanent link has been copied to your clipboard.":"Le lien permanent a été copié dans votre presse-papiers.","There are no resources marked as favorite":"Il n'y a aucun élément marqué comme favoris","This file has been shared.":"Ce fichier a été partagé","This file has no public link.":"Ce fichier n'a pas de lien public.","This folder contains %{ amount } item.":["Ce dossier contient %{ amount } d'élément.","Ce dossier contient %{ amount } d'éléments.","Ce dossier contient %{ amount } d'éléments."],"This folder has been shared.":"Ce dossier est partagé.","This folder has no content.":"Ce dossier est vide.","This folder has no public link.":"Ce dossier n'a pas de lien public.","This link is password-protected":"Ce lien est protégé par mot de passe","this month":"ce mois","This space has no public links.":"Cet espace n'a pas de liens publics.","this week":"cette semaine","this year":"cette année","Title":"Titre","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Pour rechercher les comptes de service ou secondaires, préfixez le nom d'utilisateur par « a : » (comme « a:doe ») et pour les comptes invités, préfixez le nom d'utilisateur par « l : » (comme « l:doe »).","today":"aujourd'hui","Track":"Piste","Type":"Type","Unrestricted":"Sans restriction","Upload":{"":"Envoyer","The label of the upload button in secret file upload view":"Envoyer"},"Upload files or folders":"Envoyer des fichiers ou des dossiers","Use the input field to search for users and groups. Select them to share the item.":"Utilisez le champ de saisie pour rechercher des utilisateurs et des groupes. Sélectionnez-les pour partager l'élément.","User":"Utilisateur","Versions":"Versions","Video":"Vidéo","We went looking everywhere, but were unable to find the selected resource.":"Nous avons cherché partout, mais nous n’avons pas pu trouver la ressource sélectionnée.","What are indirect links?":"Que sont les liens indirects ?","Who can view tags?":"Qui peut voir les tags ?","Year recorded":"Année d'enregistrement","yesterday":"hier","You cannot cut and paste resources into the same folder.":"Vous ne pouvez pas copier et coller des ressources dans le même dossier.","You do not have permission to create public links.":"Vous n'avez pas la permission de créer des liens publics.","You don't have access to any spaces":"Vous n'avez accès à aucun espace","You don't have access to any trashbins":"Vous n'avez accès à aucune poubelle","You don't have permission to share this file.":"Vous n'avez pas la permission de partager ce fichier.","You don't have permission to share this folder.":"Vous n'avez pas la permission de partager ce dossier.","You have no deleted files":"Vous n'avez aucun fichier supprimé","You have no permission to create new files!":"Vous n'avez pas les droits pour créer de nouveaux fichiers !","You have no permission to paste files here.":"Vous n'êtes pas autorisé à coller des fichiers ici.","You have no permission to upload!":"Vous n'avez pas la permission d'uploader !","You have not shared any resource via link.":"Vous n'avez partagé aucune ressource via un lien.","You have not shared any resources with other people.":"Vous n’avez partagé aucune ressource avec d’autres personnes.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} a partagé ce dossier avec vous pour uploader."},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Titre uniquement"}},"hr":{"Activities":"Aktivnosti","Details":"Detalji","Disabled":"Onemogučen","Download":"Preuzmi","External":"Vanjski","Group":"Grupa","Location":"Lokacija","Search":"Pretraga","Tags":"Oznake","User":"Korisnik"},"he":{"(me)":"(אני)","%{ itemCount } item selected":["פריט אחד נבחר","%{ itemCount } פריטים נבחרו","%{ itemCount } פריטים נבחרו","%{ itemCount } פריטים נבחרו"],"%{collaboratorName} (me)":"%{collaboratorName} (אני)","%{count} member":["חבר/ה","%{count} חברים","%{count} חברים","%{count} חברים"],"Access denied":"הגישה נדחתה","Access details":"פרטי גישה","Access expires":"הגישה תפוג","Actions":"פעולות","Activities":"פעילויות","Add":"הוספה","Add link":"הוספת קישור","Add password":"הוספה סיסמה","An error occurred while loading the public link":"שגיאה אירעה בזמן טעינת הקישור הציבורי","Are you sure you want to delete this link? Recreating the same link again is not possible.":"למחוק את הקישור הזה? יצירת אותו הקישור שוב אינה אפשרית.","Are you sure you want to remove this share?":"להסיר את השיתוף הזה?","Cancel":"ביטול","Choose how access is granted":"נא לבחור איך מוענקת גישה","Confirm":"אישור","Context menu of the share":"תפריט ההקשר של השיתוף","Copy link to clipboard":"העתקת קישור ללוח גזירים","Create new files or folders":"יצירת קבצים או תיקיות חדשים","Delete":"מחיקה","Delete link":"מחיקת קישור","Deleted files":"קבצים מחוקים","Deselect %{label}":"ביטול הבחירה ב־%{label}","Deselect %{name}":"ביטול הבחירה ב־%{name}","Details":"פרטים","Disabled":"מושבת","Download":"הורדה","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"אפשר לגרור קבצים ולשחרר לכאן או להשתמש בכפתורים „חדש” או „העלאה” כדי להוסיף קבצים","Edit description":"עריכת תיאור","Edit expiration date":"עריכת תאריך תפוגת תוקף","Edit image":"עריכת תמונה","Edit name":"עריכת שם","Edit password":"עריכת סיסמה","Enabled":"פעיל","Expiration date":"תאריך תפוגה","External":"חיצוני","Failed to apply expiration date":"החלת תאריך התפוגה נכשלה","Failed to apply new permissions":"החלת ההרשאות החדשות נכשלה","Failed to delete link":"מחיקת קישור נכשלה","Failed to remove share":"הסרת השיתוף נכשלה","Failed to update link":"עדכון הקישור נכשל","Failed to upload space image":"העלאת תמונת מרחב נכשלה","Favorites":"מועדפים","File name":"שם קובץ","Files":"קבצים","Filter members":"סינון חברים","Filter:":"מסנן:","Folder":"תיקייה","Folders":"תיקיות","Go to »Personal« page":"מעבר לעמוד „פרטי”","Go to »Spaces Overview«":"מעבר ל„סקירת מרחבים”","Group":"קבוצה","Guest user":"אורח","Internal":"פנימי","Last modified":"שינוי אחרון","Link name":"שם קישור","Link was deleted successfully":"הקישור נמחק בהצלחה","Link was updated successfully":"הקישור עודכן בהצלחה","Members":"חברים","Name":"שם","Navigate to '%{folder}'":"ניווט אל ‚%{folder}’","New":"חדש","New folder":"תיקייה חדשה","No activities":"אין פעילויות","No information to display":"אין מידע להצגה","No resources found":"לא נמצאו משאבים","No users or groups found.":"לא נמצאו משתמשים או קבוצות.","Open context menu and show members":"לפתוח את תפריט ההקשר ולהציג חברים","Overview of the information about the selected file":"סקירת מידע על הקובץ הנבחר","Overview of the information about the selected files":"סקירת מידע על הקבצים הנבחרים","Owner":"בעלים","Password":"סיסמה:","Paste here":"להדביק לכאן","Person was added":"איש קשר נוסף","Personal":"אישי","Please wait until all imports have finished":"נא להמתין לסיום תהליכי הייבוא","Public files":"קבצים ציבוריים","Public link":"קישור ציבורי","Reload public link":"טעינה חוזרת של קישור ציבורי","Remove":"הסרה","Remove expiration date":"הסרת תאריך תפוגה","Remove password":"הסרת סיסמה","Remove share":"הסרת סיסמה","Rename":"שינוי שם","Replace":"החלפה","Resource not found":"משאב לא נמצא","Restore":"שחזור","Save":"שמירה","Search":"חיפוש","See all versions":"הצגת כל הגרסאות","Select role for the invitation":"נא לבחור תפקיד להזמנה","Set expiration date":"הגדרת תאריך תפוגה","Share":"שיתוף","Share expires %{ expiryDateRelative } (%{ expiryDate })":"השיתוף יפוג %{ expiryDateRelative } (%{ expiryDate })","Share receiver name: %{ displayName }":"שם נמען השיתוף: %{ displayName }","Share receivers":"נמעני השיתופים","Share was removed successfully":"השיתוף הוסר בהצלחה","Share with people":"שיתוף עם אנשים","Shared by":"שותף על ידי","Shared on":"שותף על גבי","Shared via":"שותף דרך","Shared via link":"שותף דרך קישור","Shared with":"שיתוף עם","Shared with me":"שיתוף איתי","Shared with others":"שיתוף עם אחרים","Shares":"שיתופים","Shares pages navigation":"משתף את ניווט העמודים","Show":"הצגה","Show context menu":"הצגת תפריט הקשר","Show less":"להציג פחות","Show members":"הצגת חברים","Show more":"להציג עוד","Size":"גודל","Space has no deleted files":"במרחב אין קבצים שנמחקו","Space image was uploaded successfully":"תמונת המרחב הועלתה בהצלחה","Space members":"חברי המרחב","Spaces":"מרחבים","The file type is unsupported":"סוג הקובץ לא נתמך","The link \"%{linkName}\" has been copied to your clipboard.":"הקישור „%{linkName}” הועתק ללוח הגזירים.","There are no resources marked as favorite":"אין משאבים שמסומנים כמועדפים","This file has been shared.":"הקובץ שותף.","This folder contains %{ amount } item.":["התיקייה מכילה פריט אחד.","התיקייה מכילה %{ amount } פריטים.","התיקייה מכילה %{ amount } פריטים.","התיקייה מכילה %{ amount } פריטים."],"This folder has been shared.":"התיקייה הזאת שותפה.","This folder has no content.":"בתיקייה הזאת אין תוכן.","This link is password-protected":"הקישור הזה מוגן בסיסמה","Upload":{"":"העלאה","The label of the upload button in secret file upload view":"העלאה"},"Upload files or folders":"העלאת קבצים או תיקיות","User":"משתמש","Versions":"גרסאות","We went looking everywhere, but were unable to find the selected resource.":"חפשנו בכל מקום, אך לא הצלחנו למצוא את המשאב שנבחר.","You don't have access to any spaces":"אין לך מפתחות גישה לאף אחד מהמרחבים","You don't have permission to share this file.":"אין לך הרשאות לשיתוף קובץ זה.","You don't have permission to share this folder.":"אין לך הרשאות לשיתוף תיקייה זו.","You have no deleted files":"אין לך קבצים שנמחקו","You have no permission to create new files!":"אין לך הרשאה ליצור קבצים חדשים!","You have no permission to upload!":"אין לך הרשאות להעלאה!","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"התיקייה הזו שותפה אתך על ידי %{owner} להעלאה."}},"it":{"“via folder”":"\"tramite cartella\"","(me)":"(io)","%{ itemCount } item selected":["%{ itemCount } elemento selezionato","%{ itemCount } elementi selezionati","%{ itemCount } elementi selezionati"],"%{collaboratorName} (me)":"%{collaboratorName} (io)","%{count} member":["%{count} membro","%{count} membri","%{count} membri"],"%{shareType} cannot access %{resourceName}":"%{shareType} non ha l'accesso a %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} spazi corrispondenti","%{spaceCount} spaces in total":"%{spaceCount} spazi in totale","%{spaceName} (disabled)":"%{spaceName} (disabilitato)","A Space can have multiple Managers. Each Space has at least one Manager.":"Uno Spazio può avere più gestori. Ogni Spazio ha almeno un gestore.","Access denied":"Accesso negato","Access details":"Dettagli di accesso","Access expires":"Scadenza accesso","Access was denied successfully":"Accesso negato con successo","Access was granted successfully":"Accesso concesso con successo","Account type":"Tipo di account","Actions":"Azioni","Activities":"Attività","Add":"Aggiungi","Add link":"Aggiungi collegamento","Add members":"Aggiungi membri","Add members to this Space":"Aggiungi membri a questo Spazio","Add password":"Aggiungi password","Album":"Album","An error occurred while loading the public link":"Si è verificato un errore nel caricamento del collegamento pubblico","Archive":"Archivio","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Si è sicuri di voler eliminare questo collegamento? Non sarà possibile ricreare lo stesso collegamento in futuro.","Are you sure you want to remove this member?":"Si è sicuri di voler rimuovere questo membro?","Are you sure you want to remove this share?":"Si è sicuri di voler rimuovere questa condivisione?","Are you sure you want to send a reminder about this share?":"Si è sicuri di voler inviare un promemoria per questa condivisione?","Attach as copy":"Allegare come copia","Audio":"Audio","Audio Info":"Audio Info","Authors":"Autori","Cancel":"Cancella","Choose":"Scegliere","Choose how access is granted":"Scegliere come concedere l'accesso","Close filter":"Chiudi filtri","Confirm":"Conferma","Context menu of the share":"Menu contestuale della condivisione","Copy link to clipboard":"Copia collegamento negli appunti","Create new files or folders":"Creare nuovi file o cartelle","Custom permissions":"Permessi personalizzati","Delete":"Elimina","Delete link":"Elimina collegamento","Deleted files":"File eliminati","Deny access":"Negare l'accesso","Deselect %{label}":"Deseleziona %{label}","Deselect %{name}":"Deseleziona %{name}","Details":"Dettagli","Dimensions":"Dimensioni","Disabled":"Disabilitato","Disc":"Disco","Document":"Documento","Download":"Scarica","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Trascinate qui i file e le cartelle o utilizzate i pulsanti \"Nuovo\" o \"Carica\" per aggiungere i file.","Duration":"Durata","Edit description":"Modifica la descrizione","Edit expiration date":"Modifica data di scadenza","Edit image":"Modifica immagine","Edit name":"Modifica nome","Edit password":"Modifica password","Edit permission":"Modifica permessi","Enabled":"Abilitato","Enter a name to add people or groups as members to this Space.":"Scrivi un nome per aggiungere persone o gruppi come membri di questo Spazio","Enter text to create a Tag":"Immettere il testo per creare una Tag","Error while editing the share.":"Errore nella modifica della condivisione","Expires %{timeToExpiry} (%{expiryDate})":"Scade tra %{timeToExpiry} (%{expiryDate})","External":"Esterno","Failed to apply expiration date":"Applicazione della data di scadenza non riuscita","Failed to apply new permissions":"Applicazione di nuovi permessi non riuscita","Failed to delete link":"Non è stato possibile rimuovere il collegamento","Failed to deny access":"Non è stato possibile negare l'accesso","Failed to edit tags":"Non è stato possibile modificare i tag","Failed to grant access":"Non è stato possibile dare l'accesso","Failed to remove share":"Non è stato possibile rimuovere la condivisione","Failed to update link":"Non è stato possibile caricare il collegamento","Failed to upload space image":"Non è stato possibile caricare l'immagine dello spazio","Favorites":"Preferiti","File":"File","File already exists":"Il file esiste già","File name":"Nome file","Files":"Files","Filter members":"Filtra membri","Filter tags":"Filtro tags","Filter:":"Filtra:","Focal length":"Lunghezza focale","Folder":"Cartella","Folder already exists":"La cartella esiste già","Folders":"Cartelle","Genre":"Genere","Go to »Personal« page":"Vai alla pagina »Personale«","Go to »Spaces Overview«":"Vai a »Panoramica Spazi«","Group":"Gruppo","Guest user":"Ospite","Image":"Immagine","Image Info":"Immagine Info","Incognito":"Incognito","Insufficient quota":"Quota insufficiente","Internal":"Interno","ISO":"ISO","Learn about spaces":"Informazioni sugli spazi","Link name":"Nome del link","Location":"Posizione","Members":"Membri","Merge":"Unire","More options":"Altre opzioni","Name":"Nome","Navigate to '%{folder}'":"Andare a '%{folder}'","Navigate to parent":"Navigare verso il genitore","New":"Nuovo","New folder":"Nuova cartella","New Folder":"Nuova Cartella","no":"no","No activities":"Nessuna attività","No resources found":"Nessuna risorsa trovata","No results found":"Nessun risultato trovato","Notification":"Notifica","Owner":"Proprietario","Password":"Password","Paste here":"Incolla qui","PDF":"PDF","Personal":"Personale","Public files":"File pubblici","Public link":"Link pubblico","Remove":"Rimuovi","Rename":"Rinomina","Restore":"Ripristina","Save":"Salva","Search":"Cerca","Send":"Inviare","Share":"Condividi","Show context menu":"Visualizza menu contestuale","Size":"Dimensione","Spaces":"Spazi","Subfolders":"Sottocartelle","Tags":"Tags","The file type is unsupported":"Il tipo di file non è supportato","Type":"Tipo","Unrestricted":"Non limitato","Upload":{"":"Carica","The label of the upload button in secret file upload view":"Carica"},"Upload files or folders":"Caricare file o cartelle","User":"Utente","Versions":"Versioni","Video":"Video","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} ha condiviso con te questa cartella per il caricamento"}},"id":{"Activities":"Aktifitas","Cancel":"Batal","Custom permissions":"Izin khusus","Delete":"Hapus","Deny access":"Tolak Akses","Group":"Grup","Internal":"Internal","Location":"Lokasi","Password":"Kata Sandi","Please wait until all imports have finished":"Tunggu sampai semua import selesai","Search":"Cari"},"ja":{"Access denied":"アクセスが拒否されました","Activities":"アクティビティー","An error occurred while loading the public link":"公開リンクを読込中にエラーが発生しました","Download":"ダウンロード","External":"外部","Group":"グループ","Password":"パスワード","Personal":"個人","Public link":"公開リンク","User":"ユーザー"},"pl":{"“via folder”":"“poprzez folder”","(me)":"(ja)","%{ itemCount } item selected":["%{ itemCount } zaznaczony element","%{ itemCount } zaznaczone elementy","%{ itemCount } zaznaczonych elementów","%{ itemCount } zaznaczonych elementów"],"%{collaboratorName} (me)":"%{collaboratorName} (ja)","%{count} member":["%{count} członek","%{count} członków","%{count} członków","%{count} członków"],"%{spaceCount} matching spaces":"Dopasowano %{spaceCount} przestrzeni","%{spaceCount} spaces in total":"%{spaceCount} przestrzeni całkowitej","%{spaceName} (disabled)":"%{spaceName} (nieaktywne)","Access denied":"Odmowa dostępu","Access was denied successfully":"Dostęp został zablokowany pomyślnie","Access was granted successfully":"Dostęp został przyznany pomyślnie","Account type":"Typ konta","Actions":"Akcje","Activities":"Aktywności","Add":"Dodaj","Add link":"Dodaj link","Add members":"Dodaj członków","Add members to this Space":"Dodaj członków do tej Przestrzeni","Add password":"Dodaj hasło","Album":"Album","An error occurred while loading the public link":"Wystąpił problem przy próbie załadowania publicznego linku","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Czy na pewno chcesz usunąć ten link? Odzyskanie tego linku nie będzie możliwe.","Are you sure you want to remove this member?":"Czy na pewno chcesz usunąć tego członka?","Are you sure you want to remove this share?":"Czy na pewno chcesz usunąć to udostępnienie?","Attach as copy":"Załącz kopię","Audio":"Dźwięk","Authors":"Autorzy","Cancel":"Anuluj","Choose":"Wybór","Confirm":"Potwierdź","Context menu of the share":"Menu kontekstowe dla udostępnienia","Copy link to clipboard":"Kopiuj link do schowka","Copy location to clipboard":"Skopiuj lokalizację do schowka","Create new files or folders":"Utwórz nowe pliki lub foldery","Custom permissions":"Niestandardowe uprawnienia","Delete":"Usuń","Delete link":"Usuń link","Deleted at":"Usunięty","Deleted files":"Usunięte pliki","Deny access":"Odmów dostępu","Deselect %{label}":"Odznacz %{label}","Details":"Szczegóły","Dimensions":"Wymiary","Disabled":"Wyłączone","Disc":"Dysk","Document":"Dokument","Download":"Pobierz","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Przeciągnij tutaj pliki i foldery lub użyj przycisków \"Nowy\" oraz \"Prześlij\" aby dodać pliki","Duration":"Czas trwania","Edit description":"Edytuj opis","Edit expiration date":"Zmień datę wygaśnięcia","Edit image":"Edytuj obraz","Edit name":"Zmień nazwę","Edit password":"Zmień hasło","Edit permission":"Zmień uprawnienia","Enabled":"Włączone","Error while editing the share.":"Wystąpił problem w czasie edycji udostępnienia.","Expiration date":"Data wygaśnięcia","Failed to apply expiration date":"Nie udało się zmienić daty ważności","Failed to apply new permissions":"Nie udało się zastosować nowych uprawnień","Failed to delete link":"Nie udało się usunąć linku","Failed to deny access":"Nie udało się odmówić dostępu","Failed to edit tags":"Nie udało się zmienić tagów","Failed to grant access":"Nie udało się udzielić dostępu","Failed to remove share":"Nie udało się usunąć udostępnienia","Failed to update link":"Nie udało się zaktualizować linku","Favorites":"Ulubione","File":"Plik","File already exists":"Plik już istnieje","File name":"Nazwa pliku","Files":"Pliki","Filter members":"Filtruj członków","Filter:":"Filtr:","Folder":"Folder","Folder already exists":"Folder już istnieje","Folders":"Foldery","Genre":"Gatunek","Group":"Grupa","Guest user":"Gość","Hide":"Ukryj","If you share a folder, all of its contents and subfolders will be shared as well.":"Jeśli udostępnisz folder, cała jego zawartość oraz podfoldery również zostaną udostępnione.","Image":"Obraz","Image Info":"Informacje o obrazie","Indirect links are links giving access by a parent folder.":"Linki pośrednie to linki, które dają dostęp poprzez folder nadrzędny.","Internal":"Wewnętrzny","last 30 days":"ostatnie 30 dni","last 7 days":"ostatnie 7 dni","Last modified":"Zmodyfikowany","Last Modified":"Zmodyfikowany","last month":"miesiąc temu","last week":"tydzień temu","last year":"rok temu","Learn about spaces":"Więcej o przestrzeniach","Link name":"Nazwa linku","Link name cannot exceed 255 characters":"Nazwa linku nie może przekroczyć 255 znaków","Link was deleted successfully":"Link został pomyślnie usunięty","Link was updated successfully":"Link został pomyślnie zaktualizowany","Loading list of shares":"Ładowanie listy udostępnień","Location":"Lokalizacja","Members":"Członkowie","More options":"Więcej opcji","Name":"Nazwa","Navigate to '%{folder}'":"Przejdź do '%{folder}'","New":"Nowy","New folder":"Nowy folder","New Folder":"Nowy folder","no":"nie","No activities":"Brak aktywności","No shares":"Brak udostępnionych elementów","No versions available for this file":"Brak wersji dla tego pliku","Notification":"Powiadomienie","Owner":"Właściciel","Password":"Hasło","Paste here":"Wklej tutaj","Person was added":"Osoba została dodana","Personal":"Prywatne","Please wait until all imports have finished":"Poczekaj, aż import się zakończy","Public files":"Pliki publiczne","Public link":"Link publiczny","Reload public link":"Załaduj link publiczny","Remove expiration date":"Usuń datę ważności","Remove member":"Usuń członka","Remove password":"Usuń hasło","Remove share":"Usuń udostępnienie","Rename":"Zmień nazwę","Replace":"Zamień","Resource not found":"Nie znaleziono zasobów","Restore":"Przywróć","Save":"Zapisz","Search":"Szukaj","Search for files":"Wyszukaj pliki","See all versions":"Zobacz wszystkie wersje","Send":"Wyślij","Send a reminder":"Wyślij przypomnienie","Set expiration date":"Ustaw datę ważności","Share":"Udostępnij","Share receivers":"Odbiorcy udostępnienia","Share successfully changed":"Udostępnienie zostało pomyślnie zmodyfikowane","Share was added successfully":"Udostępnienie zostało pomyślnie dodane","Share was removed successfully":"Udostępnienie zostało pomyślnie usunięte","Share with people":"Udostępnij innym osobom","Shared by":"Udostępnione przez","Shared via":"Udostępnione poprzez","Shared via link":"Udostępnione poprzez link","Shared with":"Udostępnione dla","Shared with me":"Udostępnione dla mnie","Shared with others":"Udostępnione dla innych","Shares":"Udostępnione","Shortcut":"Skrót","Show":"Pokaż","Show context menu":"Pokaż menu kontekstowe","Size":"Rozmiar","Space has no deleted files":"Przestrzeń nie ma usuniętych plików","Spaces":"Przestrzenie","Spreadsheet":"Arkusz kalkulacyjny","Subfolders":"Podfoldery","Switch to condensed table view":"Przełącz na widok zagęszczony","Switch to default table view":"Przełącz na widok domyślny","Switch to tiles view":"Przełącz na widok kafelków","Tags":"Klucze","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"\"poprzez folder\" jest wyświetlane obok udostępnienia, jeśli dostęp został już nadany poprzez folder nadrzędny. Kliknij na \"poprzez folder\" aby wyedytować udostępnienie z poziomu katalogu nadrzędnego.","The file type is unsupported":"Typ pliku nie jest obsługiwany","There are no resources marked as favorite":"Nie ma zasobów oznaczonych jako ulubione","This file has been shared.":"Ten plik został udostępniony.","This folder contains %{ amount } item.":["Ten folder zawiera %{ amount } element.","Ten folder zawiera %{ amount } elementy.","Ten folder zawiera %{ amount } elementów.","Ten folder zawiera %{ amount } elementów."],"This folder has been shared.":"Ten folder został udostępniony.","This folder has no content.":"Ten folder jest pusty.","This link is password-protected":"Ten link jest chroniony hasłem","this month":"w tym miesiącu","this week":"w tym tygodniu","this year":"w tym roku","Title":"Tytuł","today":"dzisiaj","Track":"Ścieżka","Type":"Typ","Upload":{"":"Prześlij","The label of the upload button in secret file upload view":"Prześlij"},"Upload files or folders":"Prześlij pliki lub foldery","User":"Użytkownik","Versions":"Wersje","Video":"Wideo","We went looking everywhere, but were unable to find the selected resource.":"Sprawdzaliśmy wszędzie, ale nie byliśmy w stanie znaleźć wybranego zasobu.","yesterday":"wczoraj","You don't have access to any spaces":"Nie masz dostępu do żadnej przestrzeni","You don't have access to any trashbins":"Nie masz dostępu do żadnego kosza","You don't have permission to share this file.":"Nie masz uprawnień aby udostępnić ten plik.","You don't have permission to share this folder.":"Nie masz uprawnień aby udostępnić ten folder.","You have no deleted files":"Nie masz usuniętych plików","You have no permission to create new files!":"NIe masz uprawnień aby tworzyć nowe pliki!","You have no permission to paste files here.":"Nie masz uprawnień do wklejania plików w tym miejscu.","You have no permission to upload!":"Nie masz uprawnień aby przesyłać!","You have not shared any resource via link.":"Nie udostępniasz nic poprzez link.","You have not shared any resources with other people.":"Nie udostępniasz nic innym osobom.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} udostępnił Ci ten folder do przesyłania"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Tylko tytuł"}},"nl":{"“via folder”":"“via map”","(me)":"(mijzelf)","%{ itemCount } item selected":["%{ itemCount } item geselecteerd","%{ itemCount } items geselecteerd"],"%{collaboratorName} (me)":"%{collaboratorName} (ik)","%{count} member":["%{count} lid","%{count} leden"],"%{spaceCount} matching spaces":"%{spaceCount} overeenkomende ruimtes","%{spaceCount} matching trashes":"%{spaceCount} overeenkomende verwijderde items","%{spaceCount} spaces in total":"%{spaceCount} ruimtes in totaal","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} ruimtes in totaal (inclusief %{disabledSpaceCount} uitgeschakeld)","%{spaceCount} trashes in total":"%{spaceCount} verwijderde items in totaal","%{spaceName} (disabled)":"%{spaceName} (uitgeschakeld)","Access denied":"Toegang geweigerd","Access details":"Toegangsgegevens","Access expires":"Toegang verloopt","Actions":"Acties","Activities":"Activiteiten","Add":"Toevoegen","Add link":"Link toevoegen","Add members":"Leden toevoegen","Add members to this Space":"Leden toevoegen aan deze ruimte","Add password":"Wachtwoord toevoegen","An error occurred while loading the public link":"Er is een fout opgetreden tijdens het laden van de openbare link","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Weet u zeker dat u deze link wilt verwijderen? Dezelfde link opnieuw maken is niet mogelijk.","Are you sure you want to remove this member?":"Weet u zeker dat u dit lid wilt verwijderen?","Are you sure you want to remove this share?":"Weet u zeker dat u dit gedeelde item wilt verwijderen?","Cancel":"Annuleren","Choose how access is granted":"Kiezen hoe toegang wordt verleend","Close filter":"Filter sluiten","Confirm":"Bevestigen","Context menu of the share":"Contextmenu van het gedeelde item","Copy link to clipboard":"Link naar klembord kopiëren","Create new files or folders":"Maak nieuwe bestanden of mappen","Custom permissions":"Aangepaste machtigingen","Delete":"Verwijderen","Delete link":"Link verwijderen","Deleted at":"Verwijderd op","Deleted files":"Prullenbak","Deny access":"Toegang weigeren","Deselect %{label}":"Deselecteer %{label}","Deselect %{name}":"Deselecteer %{name}","Details":"Details","Disabled":"Uitgeschakeld","Download":"Downloaden","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Sleep bestanden en mappen hierheen of gebruik de knoppen \"Nieuw\" of \"Uploaden\" om bestanden toe te voegen","Edit description":"Beschrijving bewerken","Edit expiration date":"Vervaldatum bewerken","Edit image":"Bewerk afbeelding","Edit name":"Naam bewerken","Edit password":"Wachtwoord bewerken","Edit permission":"Rechten bewerken","Enabled":"Ingeschakeld","Enter a name to add people or groups as members to this Space.":"Voer een naam in om personen of groepen als leden aan deze ruikte toe te voegen.","Enter text to create a Tag":"Voer tekst in om een ​​tag te maken","Error while editing the share.":"Fout tijdens het bewerken van het gedeelde item.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Iedereen die het bestand kan bekijken, kan ook de tags ervan bekijken. En iedereen die het bestand kan bewerken, kan ook de tags ervan bewerken.","Expires %{timeToExpiry} (%{expiryDate})":"Verloopt %{timeToExpiry} (%{expiryDate})","External":"Extern","Failed to apply expiration date":"Kan vervaldatum niet toepassen","Failed to apply new permissions":"Kan geen nieuwe machtigingen toepassen","Failed to delete link":"Kan link niet verwijderen","Failed to edit tags":"Bewerken van tags is mislukt","Failed to remove share":"Kan gedeeld item niet verwijderen","Failed to update link":"Kan link niet bijwerken","Failed to upload space image":"Kan image van ruimte niet uploaden","Favorites":"Favorieten","File already exists":"Bestand bestaat al","File name":"Bestandsnaam","Files":"Bestanden","Filter members":"Filter leden","Filter:":"Filter:","Folder":"Map","Folder already exists":"Map bestaat al","Folders":"Mappen","Found %{totalResults}, showing the %{itemCount} best matching results":"%{totalResults} gevonden, de %{itemCount} best overeenkomende resultaten worden getoond","Go to »Personal« page":"Ga naar de »Persoonlijk« pagina","Go to »Spaces Overview«":"Ga naar »Overzicht ruimtes«","Group":"Groep","Guest user":"Gastgebruiker","Hide":"Verbergen","How to edit indirect links":"Hoe indirecte link te bewerken","If you share a folder, all of its contents and subfolders will be shared as well.":"Als u een map deelt, worden alle inhoud en submappen ook gedeeld.","Include disabled":"Inclusief uitgeschakeld","Incognito":"Incognito","Indirect links are links giving access by a parent folder.":"Indirecte links zijn links die toegang geven tot een bovenliggende map.","Internal":"Intern","Invited by":"Uitgenodigd door","Last modified":"Laatst gewijzigd","Link name":"Link naam","Link name cannot exceed 255 characters":"De linknaam mag niet langer zijn dan 255 tekens","Link was deleted successfully":"Link is met succes verwijderd","Link was updated successfully":"Link is met succes bijgewerkt","Loading list of shares":"Laden van lijst met gedeelde items","Location":"Locatie","Members":"Leden","Merge":"Samenvoegen","Name":"Naam","Navigate to '%{folder}'":"Navigeer naar '%{folder}'","New":"Nieuw","New folder":"Nieuwe map","New Folder":"Nieuwe map","no":"nee","No activities":"Geen activiteiten","No information to display":"Geen informatie om weer te geven","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Inloggen is niet nodig. Iedereen met de link heeft toegang. Als u deze link deelt met personen uit de lijst \"Uitgenodigde personen\", moeten ze inloggen zodat hun individueel toegewezen machtigingen van kracht kunnen worden. Als ze niet zijn ingelogd, worden de machtigingen van de link van kracht.","No resources found":"Geen bronnen gevonden","No results found":"Geen resultaten gevonden","No users or groups found.":"Geen gebruikers of groepen gevonden.","Notification":"Bekendmaking","Open context menu and show members":"Contextmenu openen en laat leden zien","Overview of the information about the selected file":"Overzicht van de informatie over het geselecteerde bestand","Overview of the information about the selected files":"Overzicht van de informatie over de geselecteerde bestanden","Owner":"Eigenaar","Password":"Wachtwoord","Paste here":"Hier plakken","Permanent link":"Permanente link","Permanent link copied":"Permanente link gekopieerd","Person was added":"Persoon is toegevoegd","Personal":"Persoonlijk","Please wait until all imports have finished":"Wacht svp tot alle imports zijn voltooid","Public files":"Openbare bestanden","Public link":"Openbare link","Public links":"Openbare links","Reload public link":"Openbare link opnieuw laden","Remove":"Verwijderen","Remove expiration date":"Vervaldatum verwijderen","Remove member":"Lid verwijderen","Remove password":"Wachtwoord verwijderen","Remove share":"Gedeeld item verwijderen","Rename":"Hernoemen","Replace":"Vervangen","Resource not found":"Bron niet gevonden","Restore":"Herstellen","Save":"Opslaan","Search":"Zoeken","Search for files":"Zoeken naar bestanden","Search for service or secondary Account":"Zoeken naar service of secundair account","Search results for \"%{searchTerm}\"":"Zoekresultaten voor \"%{searchTerm}\"","See all versions":"Zie alle versies","Select a file or folder to view details":"Selecteer een bestand of map om details te bekijken","Select a trash to view details":"Selecteer een verwijderd item om details te bekijken","Select role for the invitation":"Rol selecteren voor de uitnodiging","Set expiration date":"Vervaldatum instellen","Share":"Delen","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Item delen verloopt op %{ expiryDateRelative } (%{ expiryDate })","Share receiver name: %{ displayName }":"Gedeeld item ontvangersnaam: %{ displayName }","Share receivers":"Ontvangers van gedeelde item","Share was removed successfully":"Gedeeld item is met succes verwijderd","Share with people":"Delen met personen","Shared by":"Gedeeld door","Shared By":"Gedeeld door","Shared on":"Gedeeld op","Shared via":"Delen via","Shared via link":"Gedeeld via link","Shared with":"Gedeeld met","Shared with me":"Met mij gedeeld","Shared with others":"Gedeeld met anderen","Shares":"Gedeelde items","Shares pages navigation":"Gedeelde items pagina navigatie","Shortcut":"Snelkoppeling","Show":"Toon","Show context menu":"Toon contextmenu","Show less":"Toon minder","Show members":"Toon leden","Show more":"Toon meer","Showing up to %{searchLimit} results":"Er worden maximaal %{searchLimit} resultaten weergegeven","Size":"Grootte","Space has no deleted files":"Ruimte heeft geen verwijderde bestanden","Space image was uploaded successfully":"Image van ruimte met succes geüpload","Space members":"Ruimte leden","Spaces":"Ruimtes","Subfolders":"Submappen","Switch to condensed table view":"Overschakelen naar verkorte tabelweergave","Switch to default table view":"Overschakelen naar de standaardtabelweergave","Switch to tiles view":"Overschakelen naar de tegel weergave","Tag must not consist of blanks only":"De tag mag niet alleen uit spaties bestaan","Tags":"Tags","Tags must not be longer than %{max} characters":"Tags mogen niet langer zijn dan %{max} tekens","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"De \"via map\" wordt naast een gedeeld item getoond, als er al toegang is gegeven via een bovenliggende map. Klik op de \"via map\" om het gedeelde item in de bovenliggende map te bewerken.","The file type is unsupported":"Het bestandstype wordt niet ondersteund","The link \"%{linkName}\" has been copied to your clipboard.":"De link \"%{linkName}\" is naar uw klembord gekopieerd.","The link has been copied to your clipboard.":"De link is gekopieerd naar uw klembord.","The permanent link has been copied to your clipboard.":"De permanente link is naar uw klembord gekopieerd.","There are no resources marked as favorite":"Er zijn geen bronnen gemarkeerd als favoriet","This file has been shared.":"Dit bestand wordt gedeeld.","This file has no public link.":"Dit bestand heeft geen openbare link.","This folder contains %{ amount } item.":["Deze map bevat %{ amount } item.","Deze map bevat %{ amount } items."],"This folder has been shared.":"Deze map wordt gedeeld.","This folder has no content.":"Deze map heeft geen inhoud.","This folder has no public link.":"Deze map heeft geen openbare link.","This link is password-protected":"Deze link is beveiligd met een wachtwoord","This space has no public links.":"Deze ruimte heeft geen openbare link.","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Om te zoeken naar service- of secundaire accounts, wordt de gebruikersnaam voorafgegaan door \"a:\" (zoals \"a:jansen\") en voor gastaccounts de gebruikersnaam met \"l:\" (zoals \"l:jansen\").","Type":"Type","Unrestricted":"Onbeperkt","Upload":{"":"Uploaden","The label of the upload button in secret file upload view":"Uploaden"},"Upload files or folders":"Upload bestanden of mappen","Use the input field to search for users and groups. Select them to share the item.":"Gebruik het invoerveld om te zoeken naar gebruikers en groepen. Selecteer ze om het item te delen.","User":"Gebruiker","Versions":"Versies","We went looking everywhere, but were unable to find the selected resource.":"We hebben overal gezocht, maar konden de geselecteerde bron niet vinden.","What are indirect links?":"Wat zijn indirecte links?","Who can view tags?":"Wie kan tags bekijken?","You cannot cut and paste resources into the same folder.":"U kunt geen bronnen kopiëren en plakken in dezelfde map.","You do not have permission to create public links.":"U heeft geen toestemming om openbare links te maken.","You don't have access to any spaces":"U hebt geen toegang tot enige ruimtes","You don't have access to any trashbins":"Je hebt geen toegang tot prullenbakken","You don't have permission to share this file.":"U bent niet gemachtigd dit bestand te delen.","You don't have permission to share this folder.":"U bent niet gemachtigd om deze map te delen.","You have no deleted files":"U hebt geen verwijderde bestanden","You have no permission to create new files!":"U heeft geen toestemming om nieuwe bestanden te maken!","You have no permission to paste files here.":"U heeft geen toestemming om hier bestanden te plakken.","You have no permission to upload!":"U hebt geen toestemming om te uploaden!","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} heeft deze map met u gedeeld om te uploaden"}},"ka":{},"pt":{"“via folder”":"\"pela pasta\"","(me)":"(eu)","%{ itemCount } item selected":["%{ itemCount } item selecionado","%{ itemCount } itens selecionados","%{ itemCount } itens selecionados"],"%{collaboratorName} (me)":"%{collaboratorName} (eu)","%{count} member":["%{count} membro","%{count} membros","%{count} membros"],"%{shareType} cannot access %{resourceName}":"%{shareType} não pode acessar %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} Espaços correspondentes","%{spaceCount} matching trashes":"%{spaceCount} lixos correspondentes","%{spaceCount} spaces in total":"%{spaceCount} Total de espaços","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} espaços no total (incluindo %{disabledSpaceCount} desativados)","%{spaceCount} trashes in total":"%{spaceCount} total de lixos","%{spaceName} (disabled)":"%{spaceName} (desativado)","A Space can have multiple Managers. Each Space has at least one Manager.":"Um Espaço pode ter vários Gerentes. Cada Espaço possui pelo menos um Gerente.","Access denied":"Acesso negado","Access details":"Detalhes de acesso","Access expires":"Acesso expira em","Access was denied successfully":"Acesso foi negado com sucesso","Access was granted successfully":"Acesso foi liberado com sucesso","Account type":"Tipo de conta","Actions":"Ações","Activities":"Atividades","Add":"Adicionar","Add link":"Adicionar link","Add members":"Adicionar membros","Add members to this Space":"Adicionar membros a este Espaço","Add password":"Adicionar senha","Album":"Álbum","An error occurred while loading the public link":"Um erro ocorreu enquanto carregava o link público","Archive":"Arquivo","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Tem certeza de que deseja excluir este link? Não é possível recriar o mesmo link novamente.","Are you sure you want to remove this member?":" \nTem certeza de que deseja remover este membro?","Are you sure you want to remove this share?":" Tem certeza de que deseja remover este compartilhamento?","Are you sure you want to send a reminder about this share?":"Tem certeza de que deseja enviar um lembrete sobre este compartilhamento?","Attach as copy":" Anexar como cópia","Audio":"Áudio","Audio Info":"Informação do áudio","Authors":"Autores","Cancel":"Cancelar","Choose":"Escolher","Choose how access is granted":" Escolha como o acesso é concedido","Close filter":"Fechar o filtro","Confirm":"Confirmar","Context menu of the share":"Menu de contexto do compartilhamento","Copy link to clipboard":" Copiar link para a área de transferência","Copy location to clipboard":"Copiar a localização da área de transferência","Copy the link to point your team to this item. Works only for people with existing access.":"Copie o link para direcionar sua equipe para este item. Funciona apenas para pessoas com acesso existente.","Create new files or folders":"Criar novos arquivos ou pastas","Custom permissions":"Permissões personalizadas","Dear user, please replace this legacy role with one of the currently available roles":" Caro usuário, substitua esta função herdada por uma das funções atualmente disponíveis","Delete":"Remover","Delete link":"Remover link","Deleted at":"Remover em","Deleted files":"Remover arquivos","Deny access":"Negar acesso","Deselect %{label}":"Desmarcar %{label}","Deselect %{name}":"Desmarcar %{name}","Details":"Detalhes","Device make":"Marca do dispositivo","Device model":"Modelo do dispositivo","Dimensions":"Dimensões","Disabled":"Desativado","Disc":"Disco","Document":"Documento","Download":"Baixar","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Arraste arquivos e pastas aqui ou use os botões \"Novo\" ou \"Carregar\" para adicionar arquivos","Duration":"Duração","Edit description":"Editar descrição","Edit expiration date":"Editar data de expiração","Edit image":"Editar imagem","Edit name":"Editar nome","Edit password":"Editar senha","Edit permission":"Editar permissão","Enabled":"Ativado","Enter a name to add people or groups as members to this Space.":"Insira um nome para adicionar pessoas ou grupos como membros deste Espaço.","Enter text to create a Tag":"Insira o texto para criar uma Tag","Error while editing the share.":"Erro ao editar o compartilhamento.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Todos que podem visualizar o arquivo podem visualizar suas tags. Da mesma forma, todos que podem editar o arquivo podem editar suas tags","Expiration date":"Data de expiração","Expires %{timeToExpiry} (%{expiryDate})":"Expira em %{timeToExpiry} (%{expiryDate})","Exposure time":"Tempo de exposição","External":"Externo","External user":"Usuário externo","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Usuário externo, registrado na conta de outra organização, mas com acesso aos seus recursos. Usuários externos só podem ter permissão para “visualizar” ou “editar”.","External users":"Usuários externos","F number":"Número F","Failed to add share for \"%{displayName}\"":"Falha ao adicionar o compartilhamento para \"%{displayName}\"","Failed to apply expiration date":"Falha ao aplicar a data de validade","Failed to apply new permissions":"Falha ao aplicar novas permissões","Failed to delete link":"Falha ao excluir link","Failed to deny access":"Falha ao negar acesso","Failed to edit tags":"Falha ao editar Tags","Failed to grant access":"Falha ao liberar acesso","Failed to remove share":"Falha ao remover compartilhamento","Failed to update link":"Falha ao atualizar link","Failed to upload space image":"Falha ao carregar imagem do espaço","Favorites":"Favoritos","File":"Arquivo","File already exists":"Arquivo já existente","File name":"Nome do arquivo","Files":"Arquivos","Filter members":"Filtro por membros","Filter share types":"Filtro por tipos de compartilhamento","Filter shared by":"Filtro por compartilhamento","Filter tags":"Filtro por tags","Filter:":"Filtro:","Focal length":"Distância focal","Folder":"Pasta","Folder already exists":"Pasta já existente","Folders":"Pastas","Found %{totalResults}, showing the %{itemCount} best matching results":"Encontrados %{totalResults}, mostrando os %{itemCount} melhores resultados","Genre":"Gênero","Go to »Personal« page":"Ir para página »Pessoal«","Go to »Spaces Overview«":"Vá para »Visão geral dos espaços«","Group":"Grupo","Guest user":"Usuário convidado","Hidden Shares":"Ocultar compartilhamentos","Hide":"Ocultar","How to edit indirect links":"Como editar links indiretos","If you share a folder, all of its contents and subfolders will be shared as well.":"Se você compartilhar uma pasta, todo o seu conteúdo e subpastas também serão compartilhados.","Image":"Imagem","Image Info":"Informação da imagem","Include disabled":"Incluir desativado","Incognito":"Incógnita","Indirect (%{ count })":"Indireto (%{ count })","Indirect links are links giving access by a parent folder.":"Links indiretos são links que dão acesso por uma pasta pai.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Links indiretos só podem ser editados na pasta pai. Clique no ícone da pasta abaixo do link para navegar até a pasta pai.","Insufficient quota":"Cota insuficiente","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Cota insuficiente %{spaceName}. Você precisa de %{missingSpace} de espaço adicional para carregar esses arquivos.","Internal":"Interno","Internal users":"Usuários internos","Invited by":"Convidado por","ISO":"ISO","last 30 days":"últimos 30 dias","last 7 days":"últimos 7 dias","Last modified":"Última modificação","Last Modified":"Última Modificação","last month":"último mês","last week":"última semana","last year":"último ano","Learn about spaces":"Aprender sobre espaços","Link name":"Nome do Link","Link name cannot exceed 255 characters":"Nome do Link não pode ultrapassa 255 caracteres","Link was deleted successfully":"Link foi excluído com sucesso","Link was updated successfully":"Link foi atualizado com sucesso","Loading list of shares":"Carregando lista de compartilhamento","Loading users and groups":"Carregando usuários e grupos","Location":"Localização","Locked via":"Via travada","Member capabilities":"Capacidades do Membro","Members":"Membros","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Os membros podem ver quem tem acesso a este espaço e acessar todos os arquivos neste espaço. As permissões de leitura ou gravação podem ser definidas atribuindo uma função.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Os membros com a função de Gerente podem editar todas as propriedades e conteúdo de um Espaço, como adicionar ou remover membros, compartilhar subpastas com não-membros ou criar links para compartilhar.","Members with the Manager role can add or remove other members from the Space.":" Membros com função de Gerente podem adicionar ou remover outros membros do Espaço.","Merge":"Mesclar","More options":"Mais opções","Name":"Nome","Navigate to '%{folder}'":"Navegar para '%{folder}'","Navigate to parent":"Navegar para pasta acima","New":"Novo","New folder":"Nova pasta","New Folder":"Nova Pasta","no":"não","No activities":"Sem atividades","No external users found.":"Nenhum usuário externo encontrado.","No hidden shares":"Nenhum compartilhamento oculto","No information to display":"Nenhuma informação para mostrar","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Não é necessário fazer login. Todos com o link podem acessar. Se você compartilhar este link com pessoas da lista \"Pessoas convidadas\", elas precisarão fazer login para que as permissões individuais atribuídas entrem em vigor. Se não estiverem logados, as permissões do link entrarão em vigor.","No resources found":"Nenhum recurso encontrado","No results found":"Nenhum resultado encontrado","No shares":"Nenhum compartilhamento","No users or groups found.":"Nenhum usuário ou grupo encontrado","No versions available for this file":"Nenhuma versão disponível para este arquivo","Notification":"Notificação","Notify via mail":"Notificação via email","Open context menu and show members":"Abrir menu de contexto e mostrar membros","Open context menu with share editing options":"Abrir menu de contexto com as opções de edição de compartilhamento","Orientation":"Orientação","Overview of the information about the selected file":"Visão geral das informações sobre o arquivo selecionado","Overview of the information about the selected files":"Visão geral das informações sobre os arquivos selecionados","Owner":"Dono","Password":"Senha","Paste here":"Cole aqui","PDF":"PDF","People you share resources with can not see who else has access.":"As pessoas com quem você compartilha recursos não podem ver quem mais tem acesso.","People you share resources with will be notified via email or in-app notification.":"As pessoas com quem você compartilha recursos serão notificadas por email ou notificação no aplicativo.\n ","Permanent link":"Link permanente","Permanent link copied":"Link permanente copiado","Person was added":"Pessoa foi adicionada","Personal":"Pessoal","Please wait until all imports have finished":"Aguarde até que todas as importações tenham terminado","Presentation":"Apresentação","Public files":"Arquivos públicos","Public link":"Link público","Public links":"Links públicos","Reload public link":"Recarregar link público","Remove":"Remover","Remove expiration date":"Remover data de validade","Remove member":"Remover membro","Remove password":"Remover senha","Remove share":"Remover compartilhamento","Rename":"Renomear","Replace":"Substituir","Resource is temporarily locked, unable to manage share":"O recurso está temporariamente bloqueado, não é possível gerenciar o compartilhamento","Resource not found":"Recurso não encontrado","Restore":"Restaurar","Save":"Salvar","Search":"Buscar","Search for files":"Buscar por arquivos","Search for service or secondary Account":"Buscar por serviço em uma conta secundária","Search results for \"%{searchTerm}\"":"Buscar resultador por \"%{searchTerm}\"","See all versions":"Ver todas as versões","Select a file or folder to view details":"Selecionar um arquivo ou pasta para ver detalhes","Select a trash to view details":"Selecionar uma lixeira para ver detalhes","Select permission":"Selecionar permissão","Select role for the invitation":"Selecione a função do convite","Send":"Enviar","Send a reminder":"Enviar um lembrete","Set expiration date":"Definir data de validade","Share":"Compartilhar","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Compartilhamento expira em %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Link(s) compartilhados","Share receiver name: %{ displayName }":"Nome do receptor de compartilhamento: %{ displayName }","Share receivers":"Receptor de compartilhamento:","Share successfully changed":"Compartilhamento alterado com sucesso","Share Type":"Tipo de Compartilhamento","Share was added successfully":"Compartilhamento foi adicionado com sucesso","Share was removed successfully":"Compartilhamento foi excluído com sucesso","Share with people":"Compartilhar com pessoas","Shared by":"Compartilhado por","Shared By":"Compartilhado Por","Shared on":"Compartilhado em","Shared via":"Compartilhado via","Shared via link":"Compartilhado via link","Shared via the parent folder \"%{sharedParentDir}\"":"Compartilhado via pasta pai \"%{sharedParentDir}\"","Shared with":"Compartilhado com","Shared with me":"Compartilhado comigo","Shared with others":"Compartilhado com outros","Shares":"Compartilhados","Shares pages navigation":"Páginas de navegação de compartilhamento","Shortcut":"Atalho","Show":"Mostrar","Show context menu":"Mostrar o menu contexto","Show less":"Mostrar menos","Show members":"Mostrar membros","Show more":"Mostra mais","Show more actions":"Mostrar mais ações","Showing %{activitiesCount} activity":["Mostrando %{activitiesCount} atividade","Mostrando %{activitiesCount} atividades","Mostrando %{activitiesCount} atividades"],"Showing up to %{searchLimit} results":"Mostrando até %{searchLimit} resultados","Size":"Tamanho","Space has no deleted files":"Espaço não tem arquivos excluídos","Space image was uploaded successfully":"Imagem do Espaço foi carregado com sucesso","Space manager capabilities":"Gerente de capacidades do Espaço","Space members":"Membros do Espaço","Spaces":"Espaços","Spaces are special folders for making files accessible to a team.":"Espaços são pastas especiais para tornar os arquivos acessíveis a uma equipe.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Os espaços pertencem a uma equipe e não a uma única pessoa. Mesmo que os membros sejam removidos, os arquivos permanecem no Espaço para que a equipe possa continuar trabalhando nos arquivos.","Spreadsheet":"Planilha","Subfolders":"Subpastas","Switch to condensed table view":"Mudar para visualização de tabela condensada","Switch to default table view":"Mudar para visualização de tabela padrão","Switch to tiles view":"Mudar para visualização em blocos","Synced with your devices":"Sincronizado com seus dispositivos","Tag must not consist of blanks only":"Tag não pode conter apenas espaços em branco","Tags":"Tags","Taken time":"Tempo gasto","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"O “via pasta” é mostrado ao lado de um compartilhamento, se o acesso já tiver sido concedido através de uma pasta pai. Clique em “via pasta” para editar o compartilhamento em sua pasta pai.","The file type is unsupported":"O tipo do arquivo não é suportado","The link \"%{linkName}\" has been copied to your clipboard.":"O link \"%{linkName}\" foi copiado para sua área de transferência.","The link has been copied to your clipboard.":"O link foi copiado para sua área de transferência.","The location has been copied to your clipboard.":"A localização foi copiada para sua área de transferência.","The permanent link has been copied to your clipboard.":"O link permanente foi copiado para sua área de transferência.","There are no resources marked as favorite":"Nenhum recurso favorito","This file has been shared.":"Este arquivo foi compartilhado.","This file has no public link.":"Este arquivo não tem link público.","This folder contains %{ amount } item.":["Esta pasta contém %{ amount } item.","Esta pasta contém %{ amount } itens.","Esta pasta contém %{ amount } itens."],"This folder has been shared.":"Esta pasta foi compartilhada.","This folder has no content.":"Esta pasta não tem conteúdo.","This folder has no public link.":"Esta pasta não tem link público.","This link is password-protected":"Esta link é protegido por senha","this month":"este mês","This space has no public links.":"Este Espaço não tem links públicos.","this week":"esta semana","this year":"este ano","Title":"Título","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Para pesquisar contas de serviço ou secundárias, prefixe o nome de usuário com \"a:\" (como \"a:doe\") e para contas de convidados, prefixe o nome de usuário com \"l:\" (como \"l:doe\").","today":"hoje","Track":"Localizar","Type":"Tipo","Unrestricted":"Irrestrito","Upload":{"":"Carregar","The label of the upload button in secret file upload view":"Carregar"},"Upload files or folders":"Carregar arquivos ou pastas","Use the input field to search for users and groups. Select them to share the item.":"Use o campo de entrada para procurar usuários e grupos. Selecione-os para compartilhar o item.","User":"Usuário","Versions":"Versões","Video":"Vídeo","We went looking everywhere, but were unable to find the selected resource.":"Procuramos em todos os lugares, mas não conseguimos encontrar o recurso selecionado.","What are indirect links?":"O que são links indiretos?","Who can view tags?":"Como ver tags?","Year recorded":"Ano registrado","yesterday":"ontem","You do not have permission to create public links.":"Você não tem permissão para criar links públicos.","You don't have access to any spaces":"Você não tem acesso a nenhum espaço","You don't have access to any trashbins":"Você não tem acesso a nenhuma lixeira","You don't have permission to share this file.":"Você não tem permissão para compartilhar este arquivo.","You don't have permission to share this folder.":"Você não tem permissão para compartilha esta pasta.","You have no deleted files":"Você não tem arquivos excluídos","You have no permission to create new files!":"Você não tem permissão para criar novos arquivos!","You have no permission to upload!":"Você não tem permissão para carregar arquivos!","You have not shared any resource via link.":"Você não compartilhou nenhum recurso por link.","You have not shared any resources with other people.":"Você não compartilhou nenhum recurso com outras pessoas.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} compartilhou esta pasta com você para upload"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Apenas Título"}},"ro":{"%{spaceCount} matching spaces":"%{spaceCount} spații potrivite","%{spaceCount} spaces in total":"%{spaceCount} spații în total","Actions":"Acțiuni","Cancel":"Anulează","Confirm":"Confirmă","Delete":"Șterge","Details":"Detalii","Disabled":"Dezactivat","Enabled":"Activat","Filter members":"Filtrează membrii","Filter:":"Filtrează","Members":"Membrii","Name":"Nume","Password":"Parola","Search":"Caută","Show context menu":"Arată meniul contextual","Spaces":"Spații","The file type is unsupported":"Tipul de fișier nu este suportat","Unrestricted":"Nerestricționat"},"ko":{"“via folder”":"\"폴더를 통해\"","(me)":"(나)","%{ itemCount } item selected":"항목 %{ itemCount }개 선택됨","%{collaboratorName} (me)":"%{collaboratorName} (나)","%{count} member":"%{count}명의 구성원","%{shareType} cannot access %{resourceName}":"%{shareType}(이)가 %{resourceName}에 접근할 수 없음","%{spaceCount} matching spaces":"일치하는 스페이스 %{spaceCount}개","%{spaceCount} matching trashes":"휴지통 내 일치 항목 %{spaceCount}개","%{spaceCount} spaces in total":"스페이스 총 %{spaceCount}개","%{spaceCount} trashes in total":"휴지통 내 총 항목 %{spaceCount}개","%{spaceName} (disabled)":"%{spaceName} (꺼짐)","Access denied":"접근 거부됨","Access details":"액세스 세부 정보","Access expires":"액세스가 만료됨","Access was denied successfully":"접근 거부됨","Access was granted successfully":"접근 허용됨","Account type":"계정 유형","Actions":"작업","Activities":"활동","Add":"추가","Add link":"링크 추가","Add members":"구성원 추가","Add members to this Space":"이 스페이스에 구성원 추가","Add password":"암호 추가","An error occurred while loading the public link":"공개 링크를 불러오는 중 오류 발생","Are you sure you want to delete this link? Recreating the same link again is not possible.":"이 링크를 삭제하시겠습니까? 동일한 링크를 다시 만들 수 없습니다.","Are you sure you want to remove this member?":"이 사용자를 제거하시겠습니까?","Are you sure you want to remove this share?":"이 공유를 제거하시겠습니까?","Are you sure you want to send a reminder about this share?":"이 공유에 대한 리마인더를 보내시겠습니까?","Attach as copy":"사본으로 첨부","Audio":"오디오","Cancel":"취소","Choose":"선택","Choose how access is granted":"액세스 권한 부여 방법 선택","Close filter":"필터 닫기","Confirm":"확인","Context menu of the share":"공유된 컨텍스트 메뉴","Copy link to clipboard":"링크를 클립보드에 복사하기","Create new files or folders":"새 파일 또는 폴더 만들기","Custom permissions":"사용자 지정 권한","Delete":"삭제","Delete link":"링크 제거","Deleted files":"삭제된 파일","Deny access":"접근 거부","Deselect %{label}":"%{label} 선택 해제","Deselect %{name}":"%{name} 선택 취소","Details":"자세히","Disabled":"꺼짐","Document":"문서","Download":"다운로드","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"파일 및 폴더를 여기로 끌거나 \"새로 만들기\" 또는 \"업로드\" 단추를 사용하여 파일 추가","Edit description":"설명 편집","Edit expiration date":"만료 날짜 수정","Edit image":"이미지 편집","Edit name":"이름 편집","Edit password":"암호 편집","Edit permission":"권한 편집","Enabled":"켜짐","Enter a name to add people or groups as members to this Space.":"이 스페이스에 사람 또는 그룹을 추가하려면 이름을 입력하세요.","Enter text to create a Tag":"문구를 입력하여 태그 만들기","Error while editing the share.":"공유를 편집하는 동안 오류가 발생했습니다.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"파일을 볼 수 있는 모든 사람이 태그를 볼 수 있습니다. 마찬가지로 파일을 편집할 수 있는 모든 사람은 태그를 편집할 수 있습니다.","Expires %{timeToExpiry} (%{expiryDate})":"%{timeToExpiry}에 만료 (%{expiryDate})","Failed to add share for \"%{displayName}\"":"\"%{displayName}\"에 공유 추가 실패","Failed to apply expiration date":"만료 날짜를 적용하지 못했습니다","Failed to apply new permissions":"새 권한을 적용하지 못했습니다","Failed to delete link":"링크를 삭제하지 못했습니다","Failed to deny access":"접근 거부 실패","Failed to edit tags":"태그 편집 실패","Failed to grant access":"접근 허용 실패","Failed to remove share":"공유를 제거하지 못했습니다","Failed to update link":"링크를 업데이트하지 못했습니다","Failed to upload space image":"스페이스 이미지를 업로드하지 못했습니다","Favorites":"즐겨찾기","File":"파일","File already exists":"파일이 이미 있습니다","File name":"파일 이름","Files":"파일","Filter members":"구성원 필터","Filter share types":"공유 유형 필터","Filter shared by":"공유 대상 필터","Filter tags":"태그 필터","Filter:":"필터:","Folder":"폴더","Folder already exists":"폴더가 이미 있습니다","Folders":"폴더","Found %{totalResults}, showing the %{itemCount} best matching results":"%{totalResults}을(를) 찾았습니다. %{itemCount}개의 가장 적합한 결과를 표시합니다.","Go to »Personal« page":"»Personal« 페이지로 이동","Go to »Spaces Overview«":"»Spaces Overview«로 가세요","Group":"그룹","Guest user":"게스트 사용자","Hidden Shares":"숨겨진 공유","Hide":"숨기기","How to edit indirect links":"간접 링크 편집 방법","If you share a folder, all of its contents and subfolders will be shared as well.":"폴더를 공유하면 폴더의 모든 내용과 하위 폴더도 공유됩니다.","Image":"이미지","Incognito":"신원 미상의","Indirect links are links giving access by a parent folder.":"간접 링크는 상위 폴더를 통해 액세스할 수 있는 링크입니다.","Internal":"내부","Invited by":"를 통해 초대됨","last 30 days":"최근 30일","last 7 days":"최근 7일","Last modified":"최종 수정됨","Last Modified":"마지막 수정","last month":"지난달","last week":"지난 주","last year":"작년","Learn about spaces":"스페이스에 대해 알아보기","Link name":"링크 이름","Link name cannot exceed 255 characters":"링크 이름은 255자를 초과할 수 없음","Link was deleted successfully":"링크 제거됨","Link was updated successfully":"링크 업데이트됨","Loading list of shares":"공유 목록 불러오는 중","Member capabilities":"멤버 기능","Members":"구성원","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"구성원들은 이 스페이스의 모든 파일에 접근할 수 있으며, 접근 가능한 사람 목록을 볼 수 있습니다. 역할을 배정하여 읽기/쓰기 권한을 설정할 수 있습니다.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"운영자 역할을 가진 구성원은 구성원 추가 및 제거, 구성원이 아닌 이와 하위 폴더 공유, 공유를 위한 링크 생성 등 스페이스의 모든 속성과 콘텐츠를 편집할 수 있습니다.","Merge":"병합","Name":"이름","Navigate to '%{folder}'":"'%{folder}'(으)로 이동합니다","New":"새로 만들기","New folder":"새 폴더","New Folder":"새 폴더","no":"아니오","No activities":"활동 없음","No hidden shares":"숨겨진 공유 없음","No information to display":"표시할 정보가 없습니다","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"로그인할 필요가 없습니다. 링크가 있는 모든 사용자가 액세스할 수 있습니다. 이 링크를 \"초대받은 사용자\" 목록에 있는 사용자와 공유할 경우 사용자가 로그인해야 개별적으로 할당된 사용 권한이 적용됩니다. 로그인하지 않은 경우 링크의 사용 권한이 적용됩니다.","No resources found":"리소스를 찾을 수 없습니다","No results found":"결과를 찾을 수 없습니다","No shares":"공유 없음","No users or groups found.":"사용자 또는 그룹을 찾을 수 없습니다.","Notification":"알림","Notify via mail":"메일로 알림","Open context menu and show members":"상황에 맞는 메뉴 열기 및 구성원 표시","Overview of the information about the selected file":"선택한 파일에 대한 정보 개요","Overview of the information about the selected files":"선택한 파일들에 대한 정보 개요","Owner":"주인","Password":"암호","Paste here":"여기에 붙여넣기","PDF":"PDF","People you share resources with can not see who else has access.":"이 리소스를 공유 받은 사람은 자신 외 다른 이가 이 콘텐츠에 접근할 수 있는지 확인할 수 없습니다.","People you share resources with will be notified via email or in-app notification.":"이 리소스를 공유 받은 사람은 이메일 또는 인 앱 알림을 통해 알림을 받게 됩니다.","Person was added":"사용자가 추가되었습니다","Personal":"개인","Please wait until all imports have finished":"내보내기가 완료될 때까지 잠시 기다려주세요","Presentation":"프레젠테이션","Public files":"공개 파일","Public link":"공개 링크","Reload public link":"공개 링크 다시 로드","Remove":"제거","Remove expiration date":"만료 날짜 삭제","Remove member":"구성원 제거","Remove password":"암호 삭제","Remove share":"공유 삭제","Rename":"이름 바꾸기","Replace":"교체","Resource not found":"리소스를 찾을 수 없습니다","Restore":"복원","Save":"저장","Search":"검색","Search for files":"파일 검색","Search for service or secondary Account":"서비스 또는 보조 계정 검색","Search results for \"%{searchTerm}\"":"\"%{searchTerm}\" 검색 결과","See all versions":"모든 버전 보기","Select permission":"권한 선택","Select role for the invitation":"초대에 대한 역할 선택","Send":"보내기","Send a reminder":"리마인더 보내기","Set expiration date":"만료 날짜 설정","Share":"공유","Share expires %{ expiryDateRelative } (%{ expiryDate })":"공유 만료 %{expiryDateRelative}(%{expiryDate})","Share receiver name: %{ displayName }":"공유 수신자 이름: %{displayName}","Share receivers":"수취인 공유","Share successfully changed":"공유 변경됨","Share Type":"공유 유형","Share was added successfully":"공유 추가됨","Share was removed successfully":"공유 제거됨","Share with people":"사용자와 공유","Shared by":"에 의해 공유 ","Shared By":"공유한 이: ","Shared on":"공유 위치","Shared via":"를 통해 공유","Shared via link":"링크를 통해 공유됨","Shared with":"공유 대상","Shared with me":"나와 공유됨","Shared with others":"다른 사람과 공유됨","Shares":"공유","Shares pages navigation":"공유 페이지 탐색","Show":"보이기","Show context menu":"상황에 맞는 메뉴 표시","Show less":"적게 보기","Show members":"구성원 보이기","Show more":"더 보기","Show more actions":"더 많은 액션 표시","Showing up to %{searchLimit} results":"최대 %{searchLimit} 결과 표시","Size":"크기","Space has no deleted files":"스페이스에 삭제된 파일이 없습니다","Space image was uploaded successfully":"스페이스 이미지 업로드됨","Space members":"스페이스 구성원","Spaces":"스페이스","Spreadsheet":"스프레드시트","Subfolders":"하위 폴더","Switch to condensed table view":"축약된 표 보기로 전환","Switch to default table view":"기본 테이블 보기로 전환","Switch to tiles view":"타일 보기로 전환","Synced with your devices":"내 장치와 동기화됨","Tag must not consist of blanks only":"태그는 공백으로 설정할 수 없습니다","Tags":"태그","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"상위 폴더를 통해 이미 액세스 권한이 부여된 경우 \"폴더를 통해\"가 공유 옆에 표시됩니다. 상위 폴더에서 공유를 편집하려면 \"폴더를 통해\"를 클릭합니다.","The file type is unsupported":"파일 형식이 지원되지 않습니다","The link \"%{linkName}\" has been copied to your clipboard.":"%{linkName} 링크가 클립보드에 복사되었습니다.","The link has been copied to your clipboard.":"링크가 클립보드에 복사되었습니다.","There are no resources marked as favorite":"즐겨찾기로 표시된 리소스가 없습니다","This file has been shared.":"이 파일은 공유되었습니다.","This folder contains %{ amount } item.":"이 폴더에는 %{amout}개의 항목이 있습니다.","This folder has been shared.":"이 폴더는 공유되었습니다.","This folder has no content.":"이 폴더에는 내용이 없습니다.","This link is password-protected":"이 링크는 암호로 보호됩니다","this month":"이번달","this week":"이번 주","this year":"올해","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"서비스 또는 보조 계정을 검색하려면 사용자 이름 앞에 \"a:\" 같은(\"a:doe\"와 같은) 접두사를 붙이고 게스트 계정의 경우 사용자 이름 앞에 \"I:\" 같은(\"l:doe\"와 같은) 접두사를 붙입니다.","today":"오늘","Type":"유형","Unrestricted":"무제한","Upload":{"":"업로드","The label of the upload button in secret file upload view":"업로드"},"Upload files or folders":"파일 또는 폴더 업로드","Use the input field to search for users and groups. Select them to share the item.":"입력란을 사용하여 사용자 및 그룹을 검색합니다. 원하는 사용자와 그룹을 선택한 후 항목을 공유할 수 있습니다.","User":"유저","Versions":"버전","Video":"비디오","We went looking everywhere, but were unable to find the selected resource.":"모든 곳을 찾아보았지만 선택한 자원을 찾을 수 없었다.","What are indirect links?":"간접 링크란 무엇입니까?","Who can view tags?":"누가 태그를 볼 수 있나요?","yesterday":"어제","You don't have access to any spaces":"스페이스에 접근할 수 없습니다.","You don't have access to any trashbins":"모든 휴지통에 접근할 수 없음","You don't have permission to share this file.":"이 파일을 공유할 수 있는 권한이 없습니다.","You don't have permission to share this folder.":"이 폴더를 공유할 수 있는 권한이 없습니다.","You have no deleted files":"삭제된 파일이 없습니다","You have no permission to create new files!":"새 파일을 만들 수 있는 권한이 없습니다!","You have no permission to upload!":"업로드 권한이 없습니다!","You have not shared any resource via link.":"링크를 통해 리소스를 공유한 적이 없습니다.","You have not shared any resources with other people.":"다른 사람과 리소스를 공유한 적이 없습니다.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner}이(가) 업로드를 위해 이 폴더를 공유했습니다"}},"sk":{"(me)":"(ja)","%{ itemCount } item selected":["%{ itemCount } označená položka","%{ itemCount } označené položky","%{ itemCount } označených položiek","%{ itemCount } označených položiek"],"Access denied":"Prístup zamietnutý","Actions":"Akcie","Cancel":"Zrušiť","Delete":"Odstrániť","Details":"Podrobnosti","Password":"Heslo","Public link":"Verejný odkaz","Save":"Uložiť"},"ru":{"“via folder”":"«через папку»","(me)":"(я)","%{ itemCount } item selected":["%{ itemCount } элемент выбран","%{ itemCount } элементов выбрано","%{ itemCount } элементов выбрано","%{ itemCount } элементов выбрано"],"%{collaboratorName} (me)":"%{collaboratorName} (я)","%{count} member":["%{count} участник","%{count} участников","%{count} участников","%{count} участников"],"%{shareType} cannot access %{resourceName}":"\"%{shareType}\" не может получить доступ к \"%{resourceName}\"","%{spaceCount} matching spaces":"%{spaceCount} соответствующих пространств","%{spaceCount} matching trashes":"%{spaceCount} соответствующих корзин","%{spaceCount} spaces in total":"%{spaceCount} пространств всего","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} пространств всего (аключая %{disabledSpaceCount} отключенных)","%{spaceCount} trashes in total":"Всего корзин: %{spaceCount}","%{spaceName} (disabled)":"%{spaceName} (отключено)","A Space can have multiple Managers. Each Space has at least one Manager.":"У пространства может быть несколько менеджеров. У каждого пространства есть как минимум один менеджер.","Access denied":"Доступ запрещен","Access details":"Сведения о доступе","Access expires":"Доступ истекает","Access was denied successfully":"Доступ успешно запрещен","Access was granted successfully":"Доступ успешно предоставлен","Account type":"Тип аккаунта","Actions":"Действия","Activities":"Активность","Add":"Добавить ","Add link":"Добавить ссылку","Add members":"Добавить участников","Add members to this Space":"Добавить участников в это пространство","Add password":"Добавить пароль","Album":"Альбом","An error occurred while loading the public link":"При загрузке публичной ссылки возникла ошибка","Archive":"Архив","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Вы уверены, что хотите удалить эту ссылку? Невозможно создать такую же ссылку снова.","Are you sure you want to remove this member?":"Вы уверены, что хотите удалить этого участника?","Are you sure you want to remove this share?":"Вы уверены, что хотите удалить этот общий доступ?","Are you sure you want to send a reminder about this share?":"Вы уверены, что хотите отправить напоминание об этом общем доступе?","Attach as copy":"Прикрепить в виде копии","Audio":"Аудио","Audio Info":"Информация о треке","Authors":"Авторы","Cancel":"Отмена","Choose":"Выбрать","Choose how access is granted":"Выбрать способ предоставления доступа","Close filter":"Закрыть фильтр","Confirm":"Подтвердить","Context menu of the share":"Контекстное меню общего ресурса","Copy link to clipboard":"Копировать ссылку в буфер обмена","Copy location to clipboard":"Копировать геопозицию в буфер обмена","Copy the link to point your team to this item. Works only for people with existing access.":"Скопируйте ссылку на данный элемент для участников. Работает только для уже имеющих доступ.","Create new files or folders":"Создать новые файлы или папки","Custom permissions":"Пользовательские разрешения","Dear user, please replace this legacy role with one of the currently available roles":"Уважаемый пользователь, пожалуйста, замените эту устаревшую роль одной из доступных на данный момент ролей","Delete":"Удалить","Delete link":"Удалить ссылку","Deleted at":"Удалено в","Deleted files":"Удаленные файлы","Deny access":"Отказать в доступе","Deselect %{label}":"Отменить выбор %{label}","Deselect %{name}":"Отменить выбор %{name}","Details":"Сведения","Device make":"Изготовитель устройства","Device model":"Модель устройства","Dimensions":"Размеры","Disabled":"Отключено","Disc":"Диск","Document":"Документ","Domain":"Домен","Download":"Скачать","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Перетащите сюда файлы и папки или используйте кнопки «Новый» или «Загрузить» для добавления файлов.","Drop files here to upload or use the 'Upload' button.":"Перетащите файлы сюда для загрузки или используйте кнопку «Загрузить».","Duration":"Длительность","Edit description":"Редактировать описание","Edit expiration date":"Редактировать срок действия","Edit image":"Редактировать изображение","Edit name":"Редактировать имя","Edit password":"Редактировать пароль","Edit permission":"Редактировать разрешения","Enabled":"Включено","Enter a name to add people or groups as members to this Space.":"Введите имя, чтобы добавить людей или группы в качестве участников этого пространства.","Enter text to create a Tag":"Введите текст, чтобы создать тег","Error while editing the share.":"Ошибка при изменении общего доступа","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Все, кто могут просматривать файл, могут видеть и его теги. Аналогично, все, кто могут редактировать файл, могут редактировать и его теги.","Expiration date":"Срок действия","Expires %{timeToExpiry} (%{expiryDate})":"Истекает %{timeToExpiry} (%{expiryDate})","Exposure time":"Время выдержки","External":"Внешние","External user":"Внешний пользователь","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Внешний пользователь, зарегистрированный с учетной записью другой организации, но имеющий доступ к вашим ресурсам. Внешние пользователи могут иметь только разрешение «просмотр» или «редактирование».","External users":"Внешние пользователи","F number":"Диафрагма","Failed to add share for \"%{displayName}\"":"Не удалось добавить общий доступ для «%{displayName}».","Failed to apply expiration date":"Не удалось применить срок действия","Failed to apply new permissions":"Не удалось применить новые разрешения","Failed to delete link":"Не удалось удалить ссылку","Failed to deny access":"Не удалось запретить доступ","Failed to edit tags":"Не удалось изменить теги","Failed to grant access":"Не удалось предоставить доступ","Failed to remove share":"Не удалось удалить общий доступ","Failed to update link":"Не удалось обновить ссылку","Failed to upload space image":"Не удалось загрузить изображение пространства","Favorites":"Избранное","File":"Файл","File already exists":"Файл уже существует","File name":"Имя файла","Files":"Файлы","Filter members":"Фильтр участников","Filter share types":"Фильтровать по типу общего доступа","Filter shared by":"Фильтровать по предоставившему доступ","Filter tags":"Фильтр тегов","Filter:":"Фильтр:","Focal length":"Фокусное расстояние","Folder":"Папка","Folder already exists":"Папка уже существует","Folders":"Папки","Found %{totalResults}, showing the %{itemCount} best matching results":"Найдено %{totalResults}, показано %{itemCount} лучших результатов совпадений","Genre":"Жанр","Go to »Personal« page":"Перейти на страницу «Личные».","Go to »Spaces Overview«":"Перейти к »Обзор пространств«.","Group":"Группа","Guest user":"Гостевой пользователь","Hidden Shares":"Скрытые общие ресурсы","Hide":"Скрыть","How to edit indirect links":"Как редактировать косвенные ссылки","If you share a folder, all of its contents and subfolders will be shared as well.":"Если вы предоставляете общий доступ к папке, всё её содержимое и вложенные папки также будут предоставлены в общий доступ.","Image":"Изображение","Image Info":"Информация об изображении","Include disabled":"Включение отключено","Incognito":"Инкогнито","Indirect (%{ count })":"Косвенные (%{ count })","Indirect links are links giving access by a parent folder.":"Косвенные ссылки - это ссылки, предоставляющие доступ через родительскую папку.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Косвенные ссылки можно редактировать только в их родительской папке. Нажмите на значок папки под ссылкой, чтобы перейти к родительской папке.","Insufficient quota":"Недостаточная квота","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Недостаточная квота на %{spaceName}. Вам необходимо дополнительное %{missingSpace} для загрузки этих файлов","Internal":"Внутренний","Internal users":"Внутренние пользователи","Invited by":"Приглашен","ISO":"ISO","last 30 days":"последние 30 дней","last 7 days":"последние 7 дней","Last modified":"Последнее изменение","Last Modified":"Последнее изменение","last month":"в прошлом месяце","last week":"на прошлой неделе","last year":"в прошлом году","Learn about spaces":"Узнать о пространствах","Learn more about ownCloud":"Узнайте больше о ownCloud","Link name":"Имя ссылки","Link name cannot exceed 255 characters":"Имя ссылки не может превышать 255 символов","Link was deleted successfully":"Ссылка успешно удалена","Link was updated successfully":"Ссылка успешно обновлена","Loading list of shares":"Загрузка списка общих ресурсов","Loading members failed. Try again later.":"Загрузка участников не удалась. Попробуйте еще раз позже.","Loading shares failed. Try again later.":"Загрузка общих ресурсов не удалась. Попробуйте еще раз позже.","Loading users and groups":"Загрузка пользователей и групп","Location":"Геопозиция","Locked via":"Заблокировано через","Member capabilities":"Возможности участников","Members":"Участники","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Участники могут видеть, кто имеет доступ к этому пространству, и получать доступ ко всем файлам в этом пространстве. Разрешения на чтение или запись можно установить, назначив роль.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Участники с ролью менеджера могут редактировать все свойства и содержимое пространства, например добавлять или удалять участников, предоставлять общий доступ к вложенным папкам другим пользователям или создавать ссылки общего доступа.","Members with the Manager role can add or remove other members from the Space.":"Участники с ролью менеджера могут добавлять или удалять участников из пространства.","Merge":"Объединить","More options":"Дополнительно","Name":"Имя","Navigate to '%{folder}'":"Перейти в папку '%{folder}'.","Navigate to parent":"Перейти в родительскую папку","New":"Новый","New folder":"Новая папка","New Folder":"Новая папка","no":"нет","No activities":"Нет активности","No external users found.":"Внешние пользователи не найдены.","No hidden shares":"Нет скрытых общих ресурсов","No information to display":"Нет информации для отображения","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Вход не требуется. Доступ имеют все, у кого есть ссылка. Если вы поделитесь этой ссылкой с людьми из списка \"Поделиться с людьми\", им нужно будет войти в систему, чтобы вступили в силу их индивидуально назначенные разрешения. Если они не вошли в систему, вступают в силу разрешения ссылки.","No resources found":"Ресурсы не найдены","No results found":"Результаты не найдены","No shares":"Нет общих ресурсов","No users or groups found.":"Не найдено ни одного пользователя или группы.","No versions available for this file":"Для этого файла нет доступных версий","Notification":"Уведомление","Notify via mail":"Уведомлять по Email","Open context menu and show members":"Открыть контекстное меню и показать участников","Open context menu with share editing options":"Открыть контекстное меню с опциями редактирования общего доступа","Orientation":"Ориентация","Overview of the information about the selected file":"Обзор информации о выбранном файле","Overview of the information about the selected files":"Обзор информации о выбранных файлах","Owner":"Владелец","Password":"Пароль","Paste here":"Вставить сюда","PDF":"PDF","People you share resources with can not see who else has access.":"Люди, с которыми вы делитесь ресурсами, не могут видеть, кто еще имеет доступ.","People you share resources with will be notified via email or in-app notification.":"Люди, с которыми вы делитесь ресурсами, будут уведомлены по Email или через уведомление в приложении.","Permanent link":"Постоянная ссылка","Permanent link copied":"Постоянная ссылка скопирована","Person was added":"Человек был добавлен","Personal":"Личные","Please wait until all imports have finished":"Пожалуйста, подождите, пока весь импорт не завершится.","Presentation":"Презентация","Public files":"Публичные файлы","Public link":"Публичная ссылка","Public links":"Публичные ссылки","Reload public link":"Перезагрузить публичную ссылку","Remove":"Удалить","Remove expiration date":"Удалить срок действия","Remove member":"Удалить участника","Remove password":"Удалить пароль","Remove share":"Удалить общее использование","Rename":"Переименовать","Replace":"Заменить","Resource is temporarily locked, unable to manage share":"Ресурс временно заблокирован, невозможно управлять общим доступом","Resource not found":"Ресурс не найден","Restore":"Восстановить","Save":"Сохранить","Search":"Найти","Search for files":"Поиск файлов","Search for service or secondary Account":"Поиск служебного или дополнительного аккаунта","Search results for \"%{searchTerm}\"":"Результаты поиска для \"%{searchTerm}\"","See all versions":"Посмотреть все версии","Select a file or folder to view details":"Выберите файл или папку для просмотра сведений","Select a trash to view details":"Выберите корзину для просмотра сведений","Select permission":"Выбрать разрешение","Select role for the invitation":"Выбрать роль для приглашения","Send":"Отправить","Send a reminder":"Отправить напоминание","Set expiration date":"Установить срок действия","Share":"Поделиться","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Общий доступ истекает %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Ссылка(и) на общий ресурс","Share receiver name: %{ displayName }":"Имя получателя общего доступа: %{ displayName }","Share receivers":"Получатели общего доступа","Share successfully changed":"Общий доступ успешно изменен","Share Type":"Тип общего доступа","Share was added successfully":"Общий доступ был успешно добавлен","Share was removed successfully":"Общий доступ был успешно удален","Share with people":"Поделиться с людьми","Shared by":"Поделился","Shared By":"Поделился","Shared on":"Поделился","Shared via":"Поделился через","Shared via link":"Поделился по ссылке","Shared via the parent folder \"%{sharedParentDir}\"":"Общий доступ через родительскую папку \"%{sharedParentDir}\"","Shared with":"Поделился с","Shared with me":"Поделились со мной","Shared with others":"Поделился с другими","Shares":"Общие ресурсы","Shares pages navigation":"Навигация по страницам общих ресурсов","Shortcut":"Ярлык","Show":"Показать","Show context menu":"Показать контекстное меню","Show less":"Показать меньше","Show members":"Показать участников","Show more":"Показать больше","Show more actions":"Показать больше действий","Showing %{activitiesCount} activity":["Показано %{activitiesCount} действие","Показано %{activitiesCount} действий","Показано %{activitiesCount} действий","Показано %{activitiesCount} действий"],"Showing up to %{searchLimit} results":"Отображение до %{searchLimit} результатов","Size":"Размер","Space has no deleted files":"В пространстве нет удаленных файлов","Space image was uploaded successfully":"Изображение пространства успешно загружено","Space manager capabilities":"Возможности менеджера пространства","Space members":"Участники пространства","Space not found":"Пространство не найдено","Spaces":"Пространства","Spaces are special folders for making files accessible to a team.":"Пространства — это специальные папки, позволяющие сделать файлы доступными для всей команды.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Пространства принадлежат команде, а не одному человеку. Даже если участники удаляются, файлы остаются в пространстве, так что команда может продолжать работать над файлами.","Spreadsheet":"Электронная таблица","Subfolders":"Подпапки","Switch to condensed table view":"Переключить на сжатый вид таблицы","Switch to default table view":"Переключить на вид таблицы по умолчанию","Switch to tiles view":"Переключить на просмотр плиток","Synced with your devices":"Синхронизировано с вашими устройствами","Tag must not consist of blanks only":"Тег не должен состоять только из пробелов","Tags":"Теги","Tags must not be longer than %{max} characters":"Теги не должны быть длиннее %{max} символов.","Taken time":"Время съёмки","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"\"Через папку\" отображается рядом с общим ресурсом, если доступ уже предоставлен через родительскую папку. Щелкните на \"через папку\", чтобы отредактировать доступ в родительской папке.","The file type is unsupported":"Тип файла не поддерживается","The link \"%{linkName}\" has been copied to your clipboard.":"Ссылка \"%{linkName}\" скопирована в буфер обмена.","The link has been copied to your clipboard.":"Ссылка скопирована в буфер обмена.","The location has been copied to your clipboard.":"Геопозиция скопирована в буфер обмена.","The permanent link has been copied to your clipboard.":"Постоянная ссылка скопирована в буфер обмена.","There are no resources marked as favorite":"Нет ресурсов, отмеченных как избранные","This feature is brought to you by ownCloud":"Эту функцию вам предоставил ownCloud","This file has been shared.":"К этому файлу предоставлен общий доступ.","This file has no public link.":"Этот файл не имеет публичных ссылок.","This folder contains %{ amount } item.":["Эта папка содержит %{ amount } элемент.","Эта папка содержит %{ amount } элементов.","Эта папка содержит %{ amount } элементов.","Эта папка содержит %{ amount } элементов."],"This folder has been shared.":"К этой папке предоставлен общий доступ.","This folder has no content.":"Эта папка не содержит содержимого.","This folder has no public link.":"Эта папка не имеет публичных ссылок.","This link is password-protected":"Эта ссылка защищена паролем","this month":"в этом месяце","This space has no public links.":"Это пространство не имеет публичных ссылок.","this week":"на этой неделе","this year":"в этом году","Title":"Название","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Для поиска служебных или дополнительных учетных записей добавьте \"a:\" перед именем пользователя (например, \"a:john\"), а для гостевых учетных записей добавьте \"l:\" (например, \"l:john\").","today":"сегодня","Track":"Трек","Type":"Тип","Unrestricted":"Без ограничений","Upload":{"":"Загрузить","The label of the upload button in secret file upload view":"Загрузить"},"Upload files or folders":"Загрузить файлы или папки","Use the input field to search for users and groups. Select them to share the item.":"Используйте поле ввода для поиска пользователей и групп. Выберите их, чтобы поделиться ресурсом.","User":"Пользователь","Versions":"Версии","Video":"Видео","We went looking everywhere, but were unable to find the selected resource.":"Мы искали везде, но не смогли найти выбранный ресурс.","What are indirect links?":"Что такое косвенные ссылки?","Who can view tags?":"Кто может видеть теги?","Year recorded":"Год записи","yesterday":"вчера","You cannot cut and paste resources into the same folder.":"Вы не можете вырезать и вставлять ресурсы в одну и ту же папку.","You do not have permission to create public links.":"У вас нет прав на создание публичных ссылок.","You don't have access to any spaces":"У вас нет доступа к пространствам","You don't have access to any trashbins":"У вас нет доступа к корзинам","You don't have permission to share this file.":"У вас нет разрешения на предоставление общего доступа к этому файлу.","You don't have permission to share this folder.":"У вас нет разрешения на предоставление общего доступа к этой папке.","You have no deleted files":"У вас нет удаленных файлов","You have no permission to create new files!":"У вас нет разрешения на создание новых файлов!","You have no permission to paste files here.":"У вас нет разрешения на вставку файлов сюда.","You have no permission to upload!":"У вас нет разрешения на загрузку","You have not shared any resource via link.":"Вы не делились ни одним ресурсом по ссылке.","You have not shared any resources with other people.":"Вы не делились ресурсами с другими людьми.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} поделился с вами этой папкой для загрузки"},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Каждый, у кого есть разрешение на чтение любой родительской папки, может видеть ее содержимое."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"Передача вложенных структур папок невозможна. Вместо этого все файлы из подпапок будут загружены по отдельности."},"Full Text Search":{"Label of a search page filter used to search for resources with the search term in their name and content.":"Полный текстовый поиск"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Только заголовок"}},"sq":{"\"via folder\"":"“përmes dosjeje”","“via folder”":"“përmes dosjeje”","(me)":"(unë)","%{ itemCount } item selected":["%{ itemCount } objekt i përzgjedhur","%{ itemCount } objekte të përzgjedhur"],"%{collaboratorName} (me)":"%{collaboratorName} (unë)","%{count} member":["%{count} anëtar","%{count} anëtarë"],"%{shareType} cannot access %{resourceName}":"%{shareType} s’mund të përdorë %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} hapësira me përkim","%{spaceCount} matching trashes":"%{spaceCount} hedhurina me përputhje","%{spaceCount} spaces in total":"%{spaceCount} hapësira gjithsej","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"%{spaceCount} hapësira gjithsej (përfshi %{disabledSpaceCount} të çaktivizuara)","%{spaceCount} trashes in total":"%{spaceCount} hedhurina gjithsej","%{spaceName} (disabled)":"%{spaceName} (e çaktivizuar)","A Space can have multiple Managers. Each Space has at least one Manager.":"Një Hapësirë mund të ketë Përgjegjës të shumtë. Çdo Hapësirë ka të paktën një Përgjegjës.","Access denied":"Hyrje e mohuar","Access details":"Hollësi hyrjeje","Access expires":"Hyrja skadon","Access was denied successfully":"Hyrja u mohua me sukses","Access was granted successfully":"Hyrja u akordua me sukses","Account type":"Lloj llogarie","Actions":"Veprime","Activities":"Veprimtari","Add":"Shto","Add link":"Shtoni lidhje","Add members":"Shtoni anëtarë","Add members to this Space":"Shtoni anëtarë te kjo Hapësirë","Add password":"Shtoni fjalëkalim","Album":"Album","An error occurred while loading the public link":"Ndodhi një gabim gjatë ngarkimit të lidhjes publike","Archive":"Arkiv","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Jeni i sigurt se doni të fshihet kjo lidhje? Rikrijimi sërish i të njëjtës lidhje s’është i mundur.","Are you sure you want to remove this member?":"Jeni i sigurt se doni të hiqet ky anëtar?","Are you sure you want to remove this share?":"Jeni i sigurt se doni të hiqet kjo pjesë?","Are you sure you want to send a reminder about this share?":"Jeni i sigurt se doni të dërgoni një kujtues për këtë pjesë?","Attach as copy":"Bashkëngjite si kopje","Audio":"Audio","Audio Info":"Informacion Audio","Authors":"Autorë","Cancel":"Anuloje","Choose":"Zgjidhni","Choose how access is granted":"Zgjidhni si akordohet hyrje","Close filter":"Mbylle filtrin","Confirm":"Ripohojeni","Context menu of the share":"Menu konteksti për pjesën","Copy link to clipboard":"Kopjoja lidhjen në të papastër","Copy location to clipboard":"Kopjoje vendndodhjen në të papastër","Copy the link to point your team to this item. Works only for people with existing access.":"Kopjoni lidhjen për ta shpënë ekipin tuaj te ky objekt. Funksionon vetëm për persona që kanë tashmë hyrje.","Create new files or folders":"Krijoni kartela ose dosje të reja","Custom permissions":"Leje të përshtatura","Dear user, please replace this legacy role with one of the currently available roles":"I dashur përdorues, ju lutemi, zëvendësoni këtë rol të dikurshëm me një nga rolet e gatshëm tani","Delete":"Fshije","Delete link":"Fshije lidhjen","Deleted at":"Fshirë më","Deleted files":"Kartela të fshira","Deny access":"Mohoji hyrjen","Deselect %{label}":"Shpërzgjidheni %{label}","Deselect %{name}":"Shpërzgjidhe %{name}","Details":"Hollësi","Device make":"Prodhues pajisjeje","Device model":"Model pajisjeje","Dimensions":"Përmasa","Disabled":"E çaktivizuar","Disc":"Disk","Document":"Dokument","Domain":"Përkatësi","Download":"Shkarkoje","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Që të shtoni kartela, tërhiqni kartela dhe dosje këtu, ose përdorni butonat “E re” ose “Ngarkoni”","Drop files here to upload or use the 'Upload' button.":"Hidhni kartela për ngarkim këtu, ose klikoni butonin “Ngarkoje”.","Duration":"Kohëzgjatje","Edit description":"Përpunoni përshkrimin","Edit expiration date":"Përpunoni datë skadimi","Edit image":"Përpunoni figurë","Edit name":"Përpunoni emër","Edit password":"Përpunoni fjalëkalim","Edit permission":"Përpunoni leje","Enabled":"E aktivizuar","Enter a name to add people or groups as members to this Space.":"Jepni një emër që të shtohen persona ose grupe si anëtarë te kjo Hapësirë.","Enter text to create a Tag":"Jepni tekst për krijimin e një Etikete","Error while editing the share.":"Gabim teksa përpunohej pjesa.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Cilido që mund të shohë kartelën, mundet të shohë etiketat për të. Po njësoj, cilido që mund të përpunojë kartelën, mund të përpunojë etiketat e saj.","Expiration date":"Datë skadimi","Expires %{timeToExpiry} (%{expiryDate})":"Skadon më %{timeToExpiry} (%{expiryDate})","Exposure time":"Kohë ekspozimi","External":"I jashtëm","External user":"Përdorues i jashtëm","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Përdorues i jashtëm, i regjistruar me llogarinë e një tjetër enti, por që i është dhënë hyrje në burimet tuaja. Përdoruesit e jashtëm mund të kenë vetëm lejen “shihni”, ose “përpunoni”.","External users":"Përdorues të jashtëm","F number":"Vlerë F","Failed to add share for \"%{displayName}\"":"S’u arrit të shtohej pjesë për “%{displayName}”","Failed to apply expiration date":"S’u arrit të aplikohet datë skadimi","Failed to apply new permissions":"S’u arrit të aplikohen leje të reja","Failed to delete link":"S’u arrit të fshihej lidhje","Failed to deny access":"S’u arrit të mohohej hyrje","Failed to edit tags":"S’u arrit të përpunohen etiketa","Failed to grant access":"S’u arrit të akordohej hyrje","Failed to remove share":"S’u arrit të hiqej pjesë","Failed to update link":"S’u arrit të përditësohej lidhje","Failed to upload space image":"S’u arrit të ngarkohet figurë hapësire","Favorites":"Të parapëlqyera","File":"Kartelë","File already exists":"Kartela ekziston tashmë","File name":"Emër kartele","Files":"Kartela","Filter members":"Filtroni anëtarë","Filter share types":"Filtroni lloj pjesësh","Filter shared by":"Filtroji sipas “ndarë nga”","Filter tags":"Filtroni etiketa","Filter:":"Filtroji sipas:","Folder":"Dosje","Folder already exists":"Ka tashmë një dosje të tillë","Folders":"Dosje","Found %{totalResults}, showing the %{itemCount} best matching results":"U gjetën %{totalResults}, po shfaqen %{itemCount} përfundimet me përkimin më të mirë","Genre":"Zhanër","Go to »Personal« page":"Kalo te faqja »Personale«","Go to »Spaces Overview«":"Kalo te »Përmbledhje Hapësirash«","Group":"Grup","Guest user":"Përdorues mysafir","Hidden Shares":"Pjesë të Fshehura","Hide":"Fshihe","How to edit indirect links":"Si të përpunohen lidhje jo të drejtpërdrejta","If you share a folder, all of its contents and subfolders will be shared as well.":"Nëse ndani me dikë një dosje, do të ndahen dhe krejt lënda dhe nëndosjet e saj.","Image":"Figurë","Image Info":"Hollësi Figure","Include disabled":"Përfshi të çaktivizuarat","Incognito":"Ndarë Nga","Indirect (%{ count })":"Të tërthorta (%{ count })","Indirect links are links giving access by a parent folder.":"Lidhjet e tërthorta janë lidhje që lejojnë hyrje te një dosje mëmë.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Lidhjet e tërthorta mund të përpunohen vetëm në dosjen e tyre mëmë. Klikoni mbi ikonën dosje nën lidhjen që të kaloni te dosja mëmë.","Insufficient quota":"Kuota të pamjaftueshme","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"S’ka kuota të mjaftueshme te %{spaceName}. Ju duhen edhe %{missingSpace}, që të ngarkoni këto kartela","Internal":"I brendshëm","Internal users":"Përdorues të brendshëm","Invited by":"Ftuar nga","ISO":"ISO","last 30 days":"30 ditët e fundit","last 7 days":"7 ditët e fundit","Last modified":"Ndryshuar së fundi më","Last Modified":"Ndryshuar Së Fundi Më","last month":"muajin e kaluar","last week":"javën e kaluar","last year":"vitin e kaluar","Learn about spaces":"Mësoni rreth hapësirash","Learn more about ownCloud":"Mësoni më tepër rreth ownCloud-it","Link name":"Emër lidhjeje","Link name cannot exceed 255 characters":"Emri i lidhjes s’mund të tejkalojë 255 shenja","Link was deleted successfully":"Lidhja u fshi me sukses","Link was updated successfully":"Lidhja u përditësua me sukses","Loading list of shares":"Po ngarkohet listë e pjesëve","Loading members failed. Try again later.":"Dështoi ngarkimi i anëtarëve. Riprovoni më vonë.","Loading shares failed. Try again later.":"Dështoi ngarkimi i pjesëve. Riprovoni më vonë.","Loading users and groups":"Po ngarkohen përdorues dhe grupe","Location":"Vendndodhje","Locked via":"Kyçur përmes","Member capabilities":"Aftësi anëtarësh","Members":"Anëtarë","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Anëtarët janë në gjendje të shohin se kush ka hyrje në këtë hapësirë dhe hyrje te krejt kartelat në këtë hapësirë. Lejet për lexim ose shkrim mund të ujdisen duke akorduar një rol.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Anëtarë me rolin Përgjegjës janë në gjendje të përpunojnë krejt vetitë dhe lëndën e një Hapësire, bie fjala, të shtojnë ose të heqin anëtarë, të ndajnë nëndosje me jo anëtarë, ose të krijojnë lidhje për ndarje me të tjerë.","Members with the Manager role can add or remove other members from the Space.":"Anëtarët me rolin Përgjegjës mund të shtojnë ose heqin anëtarë të tjerë nga Hapësira.","Merge":"Përzieji","More options":"Më tepër mundësi","Name":"Emër","Navigate to '%{folder}'":"Kalo te '%{folder}'","Navigate to parent":"Kalo te mëma","New":"E re","New folder":"Dosje e re","New Folder":"Dosje e Re","no":"jo","No activities":"Pa veprimtari","No external users found.":"S’u gjetën përdorues të jashtëm.","No hidden shares":"Pa pjesë të fshehura","No information to display":"S’ka hollësi për shfaqje","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"S’lyp bërjen e hyrjes. Cilido me lidhjen mund ta përdorë. Nëse e ndani këtë lidhje me persona prej listës “Persona të ftuar”, atyre u duhet të bëjnë hyrjen, që të mund të kenë veprim lejet individuale dhënë atyre. Nëse s’kanë bërë hyrjen, në fuqi do të jenë lejet e lidhjes.","No resources found":"S’u gjetën përfundime","No results found":"S’u gjetën përfundime","No shares":"Pa pjesë","No users or groups found.":"S’u gjetën përdorues ose grupe.","No versions available for this file":"S’ka versione të gatshëm për këtë kartelë","Notification":"Njoftim","Notify via mail":"Njofto përmes email-i","Open context menu and show members":"Hap menu konteksti dhe shfaq anëtarë","Open context menu with share editing options":"Hap menu konteksti me mundësi përpunimi pjese","Orientation":"Orientim","Overview of the information about the selected file":"Përmbledhje e hollësive rreth kartelës së përzgjedhur","Overview of the information about the selected files":"Përmbledhje e hollësive rreth kartelave të përzgjedhura","Owner":"Pronar","Password":"Fjalëkalim","Paste here":"Ngjite këtu","PDF":"PDF","People you share resources with can not see who else has access.":"Personat me të cilët ndani burime s’mund të shohin se kush tjetër mund t’i përdorë.","People you share resources with will be notified via email or in-app notification.":"Personat me të cilët ndani burime do të njoftohen me email, ose me njoftime nga aplikacioni.","Permanent link":"Lidhje e përhershme","Permanent link copied":"Lidhja e përhershme u kopjua","Person was added":"Personi u shtua","Personal":"Personale","Please wait until all imports have finished":"Ju lutemi, pritni deri sa të kenë përfunduar krejt importimet","Presentation":"Paraqitje","Public files":"Kartela publike","Public link":"Lidhje publike","Public links":"Lidhje publike","Reload public link":"Ringarko lidhjen publike","Remove":"Hiqe","Remove expiration date":"Hiqi datë skadimi","Remove member":"Hiqe anëtarin","Remove password":"Hiqe fjalëkalimin","Remove share":"Hiqe pjesën","Rename":"Riemërtoje","Replace":"Zëvendësoje","Resource is temporarily locked, unable to manage share":"Burimi është përkohësisht i kyçur, s’arrihet të administrohet pjesë","Resource not found":"Burimi s’u gjet","Restore":"Riktheje","Save":"Ruaje","Search":"Kërko","Search for files":"Kërkoni për kartela","Search for service or secondary Account":"Kërkoni për shërbim, ose Llogari dytësore","Search results for \"%{searchTerm}\"":"Përfundime kërkimi për “%{searchTerm}”","See all versions":"Shihini krejt versionet","Select a file or folder to view details":"Që të shihni hollësitë, përzgjidhni një kartelë ose dosje.","Select a trash to view details":"Përzgjidhni një kosh hedhurinash për t’i parë hollësitë","Select permission":"Përzgjidhni leje","Select role for the invitation":"Përzgjidhni rol për ftesën","Send":"Dërgoje","Send a reminder":"Dërgoje si kujtues","Set expiration date":"Caktoni datë skadimi","Share":"Pjesë","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Ndarja skadon më %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Ndani lidhje me të tjerë","Share receiver name: %{ displayName }":"Emër marrësi pjese: %{ displayName }","Share receivers":"Marrës pjesësh","Share successfully changed":"Pjesa u ndryshua me sukses","Share Type":"Lloj Pjese","Share was added successfully":"Pjesa u shtua me sukses","Share was removed successfully":"Pjesa u hoq me sukses","Share with people":"Ndajeni me të tjerë","Shared by":"Ndarë me të tjerët nga","Shared By":"Ndarë nga","Shared on":"Ndarë më","Shared via":"Ndarë me të tjerë përmes","Shared via link":"Ndarë përmes lidhjeje","Shared via the parent folder \"%{sharedParentDir}\"":"Ndarë me të tjerët përmes dosjes mëmë “%{sharedParentDir}”","Shared with":"Ndarë me","Shared with me":"Ndarë me","Shared with others":"Ndarë me të tjerë","Shares":"Pjesë","Shares pages navigation":"Lëvizje në faqe pjesësh","Shortcut":"Shkurtore","Show":"Shfaqe","Show context menu":"Shfaq menu konteksti","Show less":"Shfaq më pak","Show members":"Shfaqi anëtarët","Show more":"Shfaq më shumë","Show more actions":"Shfaq më tepër veprime","Showing %{activitiesCount} activity":["Po shfaqet %{activitiesCount} veprimtari","Po shfaqen %{activitiesCount} veprimtari"],"Showing up to %{searchLimit} results":"Po shfaqen deri në %{searchLimit} përfundime","Size":"Madhësi","Space has no deleted files":"Hapësira s’ka kartela të fshira","Space image was uploaded successfully":"Figura e hapësirë u ngarkua me sukses","Space manager capabilities":"Aftësi përgjegjësi hapësire","Space members":"Anëtarë hapësire","Space not found":"S’u gjet hapësirë","Spaces":"Hapësira","Spaces are special folders for making files accessible to a team.":"Hapësira janë dosje të posaçme për t’i bërë kartelat të përdorshme nga një ekip.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Hapësirat i takojnë një ekipi dhe jo një personi të vetëm. Edhe nëse anëtarët hiqen, kartelat mbesin në Hapësirë, që ekipi të mund të vazhdojë punën me kartelat.","Spreadsheet":"Fletëllogaritje","Subfolders":"Nëndosje","Switch to condensed table view":"Kalo te pamje e ngjeshur e tabelës","Switch to default table view":"Kalo te pamje parazgjedhje e tabelës","Switch to tiles view":"Kalo te pamja me kuadrate","Synced with your devices":"Njëkohësuar me pajisjet tuaja","Tag must not consist of blanks only":"Etiketa s’duhet të jetë vetëm hapësira të zbrazëta","Tags":"Etiketa","Tags must not be longer than %{max} characters":"Etiketat s’duhet të jenë më të gjatë se %{max} shenja","Taken time":"Kohë kur është bërë","The \"via folder\" is shown next to a share, if access has already been given via a parent folder. Click on the \"via folder\" to edit the share on its parent folder.":"Në krah të një pjese shfaqet “përmes dosjeje”, nëse është dhënë tashmë hyrje përmes një dosjeje mëmë. Klikoni mbi “përmes dosjeje”, që të përpunoni pjesën te dosja e vet mëmë.","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"Në krah të një pjesë shfaqe “përmes dosjeje”, nëse është dhënë tashmë hyrje përmes një dosjeje mëmë. Klikoni mbi “përmes dosjeje”, që të përpunoni pjesën te dosja e vet mëmë.","The file type is unsupported":"Lloji i kartelës nuk mbulohet","The link \"%{linkName}\" has been copied to your clipboard.":"Lidhja “%{linkName}” u kopjua në të papastrën tuaj.","The link has been copied to your clipboard.":"Lidhja u kopjua te e papastra juaj.","The location has been copied to your clipboard.":"Vendndodhja u kopjua në të papastrën tuaj.","The permanent link has been copied to your clipboard.":"Lidhja e përhershme u kopjua në të papastrën tuaj.","There are no resources marked as favorite":"S’ka burime me shenjë si të parapëlqyer","This feature is brought to you by ownCloud":"Kjo veçori ju vjen nga ownCloud-i","This file has been shared.":"Kjo kartelë është ndarë me të tjerë.","This file has no public link.":"Kjo kartelë s’ka lidhje publike.","This folder contains %{ amount } item.":["Kjo dosje përmban %{ amount } objekt.","Kjo dosje përmban %{ amount } objekte."],"This folder has been shared.":"Kjo dosje është ndarë me të tjerë.","This folder has no content.":"Kjo dosje s’ka lëndë.","This folder has no public link.":"Kjo dosje s’ka lidhje publike.","This link is password-protected":"Kjo lidhje është e mbrojtur me fjalëkalim","this month":"këtë muaj","This space has no public links.":"Kjo hapësirë s’ka lidhje publike.","this week":"këtë javë","this year":"këtë vit","Title":"Titull","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Që të kërkohet për një shërbim ose llogari dytësore, paraprijeni emrin e përdoruesit me “a:” (pra, “a:gimi”) dhe për llogari mysafire paraprijeni emrin e përdoruesit me “l:” (pra, “l:gimi”).","today":"sot","Track":"Pjesë","Type":"Lloj","Unrestricted":"E pakufizuar","Upload":{"":"Ngarkoni","The label of the upload button in secret file upload view":"Ngarkoni"},"Upload files or folders":"Ngarkoni kartela ose dosje","Use the input field to search for users and groups. Select them to share the item.":"Përdorni fusha dhënieje që të kërkoni për përdorues dhe grupe. Që të ndani me të tjerë objektin, përzgjidheni.","User":"Përdorues","Versions":"Versione","Video":"Video","We went looking everywhere, but were unable to find the selected resource.":"Kërkuam ngado, por s’qemë në gjendje të gjejmë burimin e përzgjedhur.","What are indirect links?":"Ç’janë lidhjet e tërthorta?","Who can view tags?":"Cilët mund të shohin etiketat?","Year recorded":"Vit incizimi","yesterday":"dje","You cannot cut and paste resources into the same folder.":"S’mund të prisni gjëra nga një dosje dhe t’i ngjisni po aty.","You do not have permission to create public links.":"S’keni leje të krijoni lidhje publike.","You don't have access to any spaces":"S’keni hyrje te ndonjë hapësirë","You don't have access to any trashbins":"S’keni hyrje te ndonjë kosh hedhurinash","You don't have permission to share this file.":"S’keni leje të ndani këtë kartelë me të tjerë.","You don't have permission to share this folder.":"S’keni leje të ndani këtë dosje me të tjerë.","You have no deleted files":"S’keni kartela të fshira","You have no permission to create new files!":"S’keni leje të krijoni kartela të reja!","You have no permission to paste files here.":"S’keni leje të ngjitni kartela këtu.","You have no permission to upload!":"S’keni leje të ngarkoni!","You have not shared any resource via link.":"S’keni ndarë ndonjë burim përmes lidhjeje.","You have not shared any resources with other people.":"S’keni ndarë ndonjë burim me persona të tjerë.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} ndau këtë dosje me ju për ngarkime"},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Cilido që ka leje leximi te cilado dosje mëmë, mund të shohë lëndën."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"S’është e mundshme shpërngulje strukturash dosjesh brenda njëra-tjetrës. Në vend të kësaj, krejt kartelat nga nëndosjet do të ngarkohen individualisht."},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Vetëm titull"}},"sv":{"Access denied":"Åtkomst nekad","Actions":"Åtgärder","Activities":"Aktiviteter","An error occurred while loading the public link":"Ett fel uppstod när den publika länken laddades","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Är du säker på att du vill radera denna länk? Det är ej möjligt att återskapa samma länk igen.","Attach as copy":"Bifoga som kopia","Audio":"Ljud","Cancel":"Avbryt","Choose":"Välj","Confirm":"Bekräfta","Create new files or folders":"Skapa nya filer eller mappar","Custom permissions":"Anpassade behörigheter","Delete":"Ta bort","Delete link":"Ta bort länk","Deleted files":"Radera filer","Deny access":"Neka åtkomst","Details":"Detaljer","Disabled":"Inaktiverat","Document":"Dokument","Download":"Ladda ned","Enabled":"Aktiverad","Failed to delete link":"Misslyckades med att ta bort länk","Failed to remove share":"MIsslyckades med att ta bort delning","Failed to update link":"Misslyckades med att uppdatera länk","Failed to upload space image":"Misslyckades med att ladda upp rumsbild","Favorites":"Favoriter","File":"Fil","Files":"Filer","Filter members":"Filtrera medlemmar","Filter:":"Filter:","Folder":"Mapp","Folders":"Mappar","Group":"Grupp","Guest user":"Gästanvändare","Hidden Shares":"Gömda delade ytor","Hide":"Dölj","How to edit indirect links":"Hur man redigerar indirekta länkar","Image":"Bild","Internal":"Intern","Members":"Medlem","Name":"Namn","New":"Ny","New Folder":"Ny mapp","No activities":"Inga aktiviteter","Owner":"Ägare","Password":"Lösenord","PDF":"PDF","Personal":"Personlig","Please wait until all imports have finished":"Vänligen vänta tills importeringen blir klar","Public files":"Publika filer","Public link":"Publik länk","Restore":"Återställ","Save":"Spara","Search":"Sök","Search for files":"Sök efter filer","See all versions":"Visa alla versioner","Send":"Skicka","Send a reminder":"Skicka en påminnelse","Share":"Dela","Share Type":"Delningstyp","Shared by":"Delad av","Shared on":"Delad på","Shared via":"Delad via","Shared via link":"Delad via länk","Shared with":"Delad med","Shared with me":"Delad med mig","Shared with others":"Delad med andra","Shortcut":"Genväg","Show":"Visa","Show context menu":"Visa innehållsmeny","Show less":"Visa mindre","Show members":"Visa medlemmar","Show more":"Visa mer","Size":"Storlek","Spaces":"Ytor","Tags":"Taggar","The file type is unsupported":"Filtypen stöds inte","today":"idag","User":"Användare"},"si":{"(me)":"(මා)","Actions":"ක්‍රියාමාර්ග","Cancel":"අවලංගු","Download":"බාගන්න","Expiration date":"කා. ඉ. දිනය","File name":"ගොනුවේ නම","Files":"ගොනු","Group":"සමූහය","Name":"නම","New":"නව","New folder":"නව බහාලුම","Owner":"හිමිකරු","Password":"මුරපදය","Paste here":"මෙහි අලවන්න","Remove password":"මුරපදය ඉවත් කරන්න","Rename":"නැවත නම් කරන්න","Save":"සුරකින්න","Search":"සොයන්න","Share":"හුවමාරු කරන්න","Size":"ප්‍රමාණය","User":"පරිශීලක","Versions":"අනුවාද"},"sr":{},"ta":{"(me)":"(நான்)","Actions":"செயல்கள்","Cancel":"ரத்துசெய்","Download":"பதிவிறக்க"},"ug":{},"zh":{"“via folder”":"“通过文件夹”","(me)":"(我)","%{ itemCount } item selected":"已选择 %{ itemCount } 项","%{collaboratorName} (me)":"%{collaboratorName} (我)","%{count} member":"%{count} 个成员","%{shareType} cannot access %{resourceName}":"%{shareType} 无法访问 %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} 个匹配的空间","%{spaceCount} matching trashes":"%{spaceCount} 个匹配的回收站","%{spaceCount} spaces in total":"总计 %{spaceCount} 个空间","%{spaceCount} trashes in total":"总计 %{spaceCount} 个回收站","%{spaceName} (disabled)":"%{spaceName} (已禁用)","Access denied":"拒绝访问","Access details":"查看详情","Access expires":"访问权限过期","Access was denied successfully":"已取消权限","Access was granted successfully":"已授予权限","Actions":"操作","Activities":"活动","Add":"添加","Add link":"添加链接","Add members to this Space":"添加成员到空间","Add password":"添加密码","An error occurred while loading the public link":"加载公开链接时出错","Are you sure you want to delete this link? Recreating the same link again is not possible.":"确定删除此链接吗?无法再次重新创建相同的链接。","Are you sure you want to remove this member?":"确定移除这些成员吗?","Are you sure you want to remove this share?":"确定移除此共享吗?","Cancel":"取消","Choose how access is granted":"选择如何授权","Close filter":"清除过滤","Confirm":"确认","Context menu of the share":"菜单","Copy link to clipboard":"复制链接到剪贴板","Create new files or folders":"创建新文件或文件夹","Custom permissions":"自定义权限","Delete":"删除","Delete link":"删除链接","Deleted files":"已删除的文件","Deny access":"拒绝访问","Deselect %{label}":"取消选择 %{label}","Deselect %{name}":"取消选择 %{name}","Details":"详情","Disabled":"已禁用","Download":"下载","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"将文件和文件夹拖至此处或使用“新建”或“上传”按钮添加文件","Edit description":"编辑描述","Edit expiration date":"修改到期日期","Edit image":"修改图片","Edit name":"修改名称","Edit password":"修改密码","Edit permission":"修改权限","Enabled":"已启用","Enter a name to add people or groups as members to this Space.":"输入名称以将人员或群组添加为该空间的成员。","Error while editing the share.":"修改此共享时出错","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"所有可以查看文件的人都可以查看其标签。同样,所有可以编辑文件的人都可以编辑其标签。","Expires %{timeToExpiry} (%{expiryDate})":"%{timeToExpiry} 后到期 (%{expiryDate})","External":"外部","Failed to add share for \"%{displayName}\"":"添加“%{displayName}”的共享失败。","Failed to apply expiration date":"应用到期日期失败","Failed to apply new permissions":"应用新权限失败","Failed to delete link":"删除链接失败","Failed to deny access":"取消授权失败","Failed to edit tags":"修改标签失败","Failed to grant access":"授权失败","Failed to remove share":"移除共享失败","Failed to update link":"更新链接失败","Failed to upload space image":"上传空间图片失败","Favorites":"收藏","File already exists":"文件已存在","File name":"文件名称","Files":"文件","Filter members":"按成员过滤","Filter tags":"按标签过滤","Filter:":"过滤:","Folder":"文件夹","Folder already exists":"文件夹已存在","Folders":"文件夹","Found %{totalResults}, showing the %{itemCount} best matching results":"找到 %{totalResults} 个,显示 %{itemCount} 个最佳匹配结果","Go to »Personal« page":"跳转到 »个人« 页面","Go to »Spaces Overview«":"跳转到 »空间预览«","Group":"分组","Guest user":"访客用户","Hide":"隐藏","How to edit indirect links":"怎么修改间接链接","If you share a folder, all of its contents and subfolders will be shared as well.":"如果您共享文件夹,则其所有内容和子文件夹也将被共享。","Incognito":"匿名","Indirect links are links giving access by a parent folder.":"间接链接是由父文件夹提供访问权限的链接。","Internal":"内置","Invited by":"邀请者","Last modified":"最后修改于","Link name":"链接名称","Link name cannot exceed 255 characters":"链接名称不能超过255个字符","Link was deleted successfully":"链接删除成功","Link was updated successfully":"链接更新成功","Loading list of shares":"正在加载共享列表","Member capabilities":"成员功能","Members":"成员","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"成员可以查看谁有权访问该空间并访问该空间中的所有文件。 可以通过分配角色来设置读取或写入权限。","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"具有管理员角色的成员可以编辑空间的所有属性和内容,例如添加或删除成员、与非成员共享子文件夹或创建共享链接。","Name":"文件名称","Navigate to '%{folder}'":"导航到 '%{folder}'","New":"创建","New folder":"创建文件夹","New Folder":"创建文件夹","no":"没有","No activities":"没有活动","No information to display":"没有可显示的信息","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"无需登录。 知道链接的每个人都可以访问。 如果您与“受邀人员”列表中的人员共享此链接,他们需要登录才能生效。 如果未登录,则链接的权限生效。","No resources found":"未找到资源","No results found":"未找到结果","No users or groups found.":"未找到用户或组。","Notification":"通知","Open context menu and show members":"打开菜单并显示成员","Overview of the information about the selected file":"有关所选文件的信息概述","Overview of the information about the selected files":"有关所选文件的信息概述","Owner":"拥有者","Password":"密码","Paste here":"状态到此处","People you share resources with can not see who else has access.":"被您共享资源的人无法看到其他人是否有权访问。","People you share resources with will be notified via email or in-app notification.":"您与之共享资源的人将通过电子邮件或应用内通知收到通知。","Person was added":"人员已添加","Personal":"个人","Please wait until all imports have finished":"请等待所有导入完成。","Public files":"公开文件","Public link":"公开链接","Reload public link":"重新加载公开链接","Remove":"移除","Remove expiration date":"移除到期时间","Remove member":"移除成员","Remove password":"移除密码","Remove share":"移除共享","Rename":"重命名","Replace":"替换","Resource not found":"找不到资源","Restore":"恢复","Save":"保存","Search":"搜索","Search for files":"搜索文件","Search for service or secondary Account":"搜索服务或辅助帐户","Search results for \"%{searchTerm}\"":"\"%{searchTerm}\" 的搜索结果","See all versions":"查看所有版本","Select permission":"选择权限","Select role for the invitation":"选择邀请的角色","Set expiration date":"设置到期日期","Share":"共享","Share expires %{ expiryDateRelative } (%{ expiryDate })":"共享于 %{ expiryDateRelative } 后到期 (%{ expiryDate })","Share receiver name: %{ displayName }":"共享接收者名称:%{ displayName }","Share receivers":"共享接受者","Share successfully changed":"共享更改成功","Share was added successfully":"共享添加成功","Share was removed successfully":"共享移除成功","Share with people":"与人共享","Shared by":"共享通过","Shared on":"共享于","Shared via":"共享通过","Shared via link":"通过链接共享","Shared with":"共享给","Shared with me":"与我共享","Shared with others":"与其他人共享","Shares":"共享","Shares pages navigation":"共享页面导航","Show":"显示","Show context menu":"显示菜单","Show less":"显示更少","Show members":"显示成员","Show more":"显示更多","Showing up to %{searchLimit} results":"显示最多 %{search Limit} 个结果","Size":"大小","Space has no deleted files":"空间没有已删除的文件","Space image was uploaded successfully":"空间图片上传成功","Space manager capabilities":"空间管理员功能","Space members":"空间成员","Spaces":"空间","Subfolders":"子文件夹","Switch to condensed table view":"切换至紧凑视图","Switch to default table view":"切换至默认视图","Switch to tiles view":"切换至网格视图","Tag must not consist of blanks only":"标签不得仅包含空格","Tags":"标签","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"如果已通过父文件夹授予访问权限,则“通过文件夹”将显示在共享旁边。 单击“通过文件夹”可编辑其父文件夹上的共享。","The file type is unsupported":"不支持该文件类型","The link \"%{linkName}\" has been copied to your clipboard.":"链接 \"%{linkName}\" 已复制到您的剪贴板。","The link has been copied to your clipboard.":"该链接已复制到您的剪贴板。","There are no resources marked as favorite":"没有标记为收藏的资源","This file has been shared.":"文件已共享。","This folder contains %{ amount } item.":"该文件夹包含 %{ amount } 个项目。","This folder has been shared.":"文件夹已共享。","This folder has no content.":"该文件夹没有内容。","This link is password-protected":"该链接受密码保护","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"要搜索服务或辅助帐户,请在用户名前添加“a:”(如“a:doe”),而要搜索访客帐户,请在用户名前添加“l:”(如“l:doe”)。","Type":"类型","Unrestricted":"无限制","Upload":{"":"上传","The label of the upload button in secret file upload view":"上传"},"Upload files or folders":"上传文件或文件夹","Use the input field to search for users and groups. Select them to share the item.":"使用下方输入框搜索用户和组。 选择他们来共享该项目。","User":"用户","Versions":"版本","We went looking everywhere, but were unable to find the selected resource.":"我们到处寻找,但找不到所选的资源。","What are indirect links?":"什么是间接链接?","Who can view tags?":"谁可以查看标签?","You don't have access to any spaces":"您无权访问任何空间","You don't have access to any trashbins":"您无权访问任何回收站","You don't have permission to share this file.":"您无权共享此文件。","You don't have permission to share this folder.":"您无权共享此文件夹。","You have no deleted files":"您没有已删除的文件","You have no permission to create new files!":"您无权创建新文件!","You have no permission to upload!":"您无权上传文件!","You have not shared any resource via link.":"您尚未通过链接与其他人共享任何资源。","You have not shared any resources with other people.":"您尚未与其他人共享任何资源。","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} 与您共享此文件夹以便上传"}},"tr":{"“via folder”":"\"klasör aracılığıyla\"","(me)":"(ben)","%{ itemCount } item selected":["%{ itemCount } öge seçildi","%{ itemCount } öge seçildi"],"%{collaboratorName} (me)":"%{collaboratorName} (ben)","%{count} member":["%{count} üye","%{count} üye"],"%{shareType} cannot access %{resourceName}":"%{shareType}, %{resourceName} öğesine erişemez","%{spaceCount} matching spaces":"%{spaceCount} eşleşen alan","%{spaceCount} matching trashes":"%{spaceCount} eşleşen çöp","%{spaceCount} spaces in total":"Toplamda %{spaceCount} alan","%{spaceCount} trashes in total":"Toplamda %{spaceCount} çöp","%{spaceName} (disabled)":"%{spaceName} (devre dışı)","Access denied":"Erişim reddedildi","Access details":"Erişim detayları","Access expires":"Erişim sona eriyor","Access was denied successfully":"Erişim başarıyla reddedildi","Access was granted successfully":"Erişim başarıyla verildi","Actions":"Aksiyonlar","Activities":"Aktiviteler","Add":"Ekle","Add link":"Bağlantı ekle","Add members":"Üyeler ekle","Add members to this Space":"Bu Alana üyeler ekle","Add password":"Parola ekle","An error occurred while loading the public link":"Herkese açık bağlantı yüklenirken bir hata oluştu","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Bu bağlantıyı silmek istediğinizden emin misiniz? Aynı bağlantıyı yeniden oluşturmak mümkün değildir.","Are you sure you want to remove this member?":"Bu üyeyi kaldırmak istediğinizden emin misiniz?","Are you sure you want to remove this share?":"Bu paylaşımı kaldırmak istediğinizden emin misiniz?","Cancel":"İptal","Choose how access is granted":"Erişimin nasıl verileceğini seçin","Close filter":"Filtreyi kapat","Confirm":"Onayla","Context menu of the share":"Paylaşımın içerik menüsü","Copy link to clipboard":"Bağlantıyı panoya kopyala","Create new files or folders":"Yeni dosyalar veya klasörler oluştur","Custom permissions":"Özel izinler","Delete":"Sil","Delete link":"Bağlantıyı sil","Deleted files":"Silinen dosyalar","Deny access":"Erişimi reddet","Deselect %{label}":"Seçimi kaldır %{label}","Deselect %{name}":"%{name}'yi seçme","Details":"Detaylar","Disabled":"Devre dışı bırakıldı","Download":"İndir","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Dosyaları ve klasörleri buraya sürükleyin veya dosya eklemek için \"Yeni\" veya \"Yükle\" düğmelerini kullanın","Edit description":"Açıklamayı düzenle","Edit expiration date":"Son kullanma tarihini düzenle","Edit image":"Resmi düzenle","Edit name":"Adı düzenle","Edit password":"Parolayı düzenle","Edit permission":"İzni düzenle","Enabled":"Etkin","Enter a name to add people or groups as members to this Space.":"Kişileri veya grupları bu Alana üye olarak eklemek için bir ad girin.","Error while editing the share.":"Paylaşım düzenlenirken hata.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Dosyayı görüntüleyebilen herkes, etiketlerini görüntüleyebilir. Aynı şekilde, dosyayı düzenleyebilen herkes onun etiketlerini de düzenleyebilir.","Expiration date":"Geçerlilik sonu tarihi","Expires %{timeToExpiry} (%{expiryDate})":"%{timeToExpiry} (%{expiryDate}) tarihinde sona eriyor","Failed to add share for \"%{displayName}\"":"\"%{displayName}\" için paylaşım ekleme başarısız","Failed to apply expiration date":"Son kullanma tarihi uygulanamadı","Failed to apply new permissions":"Yeni izinler uygulanamadı","Failed to delete link":"Bağlantı silinemedi","Failed to deny access":"Erişim reddetme başarısız","Failed to edit tags":"Etiketleri düzenleme başarısız","Failed to grant access":"Erişim izni verme başarısız","Failed to remove share":"Paylaşım kaldırılamadı","Failed to update link":"Bağlantı güncellenemedi","Failed to upload space image":"Alan resmi yüklenemedi","Favorites":"Favoriler","File already exists":"Dosya zaten mevcut","File name":"Dosya adı","Files":"Dosyalar","Filter members":"Filtre üyeleri","Filter tags":"Filtre etiketleri","Filter:":"Filtre:","Folder":"Klasör","Folder already exists":"Klasör zaten mevcut","Folders":"Klasörler","Found %{totalResults}, showing the %{itemCount} best matching results":"%{totalResults} sonuç bulundu, en iyi eşleşen %{itemCount} tanesi gösteriliyor","Go to »Personal« page":"»Kişisel« sayfasına git","Go to »Spaces Overview«":"»Alanlara Genel Bakış«'a git","Group":"Grup","Guest user":"Misafir kullanıcı","Hide":"Gizle","How to edit indirect links":"Dolaylı bağlantılar nasıl düzenlenir","If you share a folder, all of its contents and subfolders will be shared as well.":"Bir klasörü paylaşırsanız, tüm içeriği ve alt klasörleri de paylaşılacaktır.","Incognito":"Gizli","Indirect links are links giving access by a parent folder.":"Dolaylı bağlantılar, bir üst klasör tarafından erişim sağlayan bağlantılardır.","Internal":"Dahili","Invited by":"Davet eden:","Last modified":"Son değiştirme","Link name":"Bağlantı adı","Link name cannot exceed 255 characters":"Bağlantı adı 255 karakterden uzun olamaz","Link was deleted successfully":"Bağlantı başarıyla silindi","Link was updated successfully":"Bağlantı başarıyla güncellendi","Loading list of shares":"Paylaşım listesi yükleniyor","Member capabilities":"Üye yetenekleri","Members":"Üyeler","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Üyeler, bu alana kimlerin erişimi olduğunu görebilir ve bu alandaki tüm dosyalara erişebilir. Bir rol atanarak okuma veya yazma izinleri ayarlanabilir.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Yönetici rolüne sahip üyeler, üye ekleme veya kaldırma, üye olmayanlarla alt klasör paylaşma veya paylaşım için bağlantılar oluşturma gibi bir Alanın tüm özelliklerini ve içeriğini düzenleyebilir.","Merge":"Birleştir","Name":"İsim","Navigate to '%{folder}'":"'%{folder}''e yönlendir","New":"Yeni","New folder":"Yeni klasör","New Folder":"Yeni Klasör","no":"yok","No activities":"Aktivite yok","No information to display":"Gösterilecek bilgi yok","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Giriş gerekmez. Bağlantıya sahip olan herkes erişebilir. Bu bağlantıyı \"Davet edilen kişiler\" listesindeki kişilerle paylaşırsanız, kendilerine atanan bireysel izinlerin geçerli olabilmesi için giriş yapmaları gerekir. Oturum açmamışlarsa, bağlantının izinleri geçerli olur.","No resources found":"Kaynaklar bulunamadı","No results found":"Sonuç bulunamadı","No users or groups found.":"Kullanıcılar veya gruplar bulunamadı.","Notification":"Bildirim","Open context menu and show members":"İçerik menüsünü aç ve üyeleri göster","Overview of the information about the selected file":"Seçilen dosya hakkındaki bilgilere genel bakış","Overview of the information about the selected files":"Seçilen klasör hakkındaki bilgilere genel bakış","Owner":"Sahip","Password":"Parola","Paste here":"Buraya yapıştır","People you share resources with can not see who else has access.":"Kaynakları paylaştığınız kişiler, başka kimlerin erişime sahip olduğunu göremez.","People you share resources with will be notified via email or in-app notification.":"Kaynak paylaştığınız kişiler, e-posta veya uygulama içi bildirim yoluyla bilgilendirilir.","Person was added":"Kişi eklendi","Personal":"Kişisel","Please wait until all imports have finished":"Lütfen tüm içe aktarma işlemleri bitene kadar bekleyin","Public files":"Herkese açık dosyalar","Public link":"Herkese açık bağlantı","Reload public link":"Herkese açık bağlantıyı yeniden yükle","Remove":"Kaldır","Remove expiration date":"Son kullanma tarihini kaldır","Remove member":"Üyeyi kaldır","Remove password":"Parolayı kaldır","Remove share":"Paylaşımı kaldır","Rename":"Yeniden adlandır","Replace":"Yer değiştir","Resource not found":"Kaynak bulunamadı","Restore":"Geri yükle","Save":"Kaydet","Search":"Ara","Search for files":"Dosyalarda ara","Search for service or secondary Account":"Servis veya ikincil Hesap ara","Search results for \"%{searchTerm}\"":"\"%{searchTerm}\" için arama sonuçları","See all versions":"Tüm sürümleri gör","Select permission":"İzin seç","Select role for the invitation":"Davet için rol seç","Set expiration date":"Son kullanma tarihini ayarla","Share":"Paylaş","Share expires %{ expiryDateRelative } (%{ expiryDate })":"%{ expiryDateRelative } (%{ expiryDate }) tarihinde paylaşım süresi doluyor","Share receiver name: %{ displayName }":"Alıcı adını paylaş: %{ displayName }","Share receivers":"Alıcıları paylaş","Share successfully changed":"Paylaşım başarıyla değiştirildi","Share was added successfully":"Paylaşım başarıyla eklendi","Share was removed successfully":"Paylaşım başarıyla kaldırıldı","Share with people":"Kişilerle paylaş","Shared by":"Paylaşıldı","Shared on":"Şurada paylaşıldı:","Shared via":"Paylaşıldı:","Shared via link":"Bağlantı aracılığıyla paylaşıldı","Shared with":"Paylaşlaşılmış","Shared with me":"Benimle paylaşıldı","Shared with others":"Diğerleri ile paylaşılmış","Shares":"Paylaşımlar","Shares pages navigation":"Paylaşımlar sayfa yönlendirmesi","Show":"Göster","Show context menu":"İçerik menüsünü göster","Show less":"Daha az göster","Show members":"Üyeleri göster","Show more":"Daha fazla göster","Show more actions":"Daha fazla eylem göster","Showing up to %{searchLimit} results":"%{searchLimit} adede kadar sonuç gösteriliyor","Size":"Boyut","Space has no deleted files":"Alanda silinmiş dosya yok","Space image was uploaded successfully":"Alan resmi başarıyla yüklendi","Space manager capabilities":"Alan yöneticisi yetenekleri","Space members":"Alan üyeleri","Spaces":"Alanlar","Subfolders":"Alt klasörler","Switch to condensed table view":"Yoğunlaştırılmış tablo görünümüne geç","Switch to default table view":"Varsayılan tablo görünümüne geç","Switch to tiles view":"Karo görünümüne geç","Tag must not consist of blanks only":"Etiket yalnızca boşluklardan oluşmamalıdır","Tags":"Etiketler","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"Erişim zaten bir üst klasör aracılığıyla verilmişse, bir paylaşımın yanında \"klasör aracılığıyla\" gösterilir. Paylaşımı üst klasöründe düzenlemek için “klasör aracılığıyla” tıklayın.","The file type is unsupported":"Bu dosya türü desteklenmiyor","The link \"%{linkName}\" has been copied to your clipboard.":"\"%{linkName}\" bağlantısı panonuza kopyalandı.","The link has been copied to your clipboard.":"Bağlantı panonuza kopyalandı.","There are no resources marked as favorite":"Favori olarak işaretlenmiş kaynak yok","This file has been shared.":"Bu dosya paylaşıldı.","This folder contains %{ amount } item.":["Bu klasör %{ amount } öge içeriyor.","Bu klasör %{ amount } öge içeriyor."],"This folder has been shared.":"Bu klasör paylaşıldı.","This folder has no content.":"Bu klasörde içerik yok.","This link is password-protected":"Bu bağlantı parola korumalı","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Hizmet veya ikincil hesapları aramak için kullanıcı adının önüne \"a:\" (\"a:doe\" gibi) ve misafir hesapları için kullanıcı adının önüne \"l:\" (\"l:doe\" gibi) gelir.","Type":"Tür","Unrestricted":"Sınırsız","Upload":{"":"Yükle","The label of the upload button in secret file upload view":"Yükle"},"Upload files or folders":"Dosyaları veya klasörleri yükle","Use the input field to search for users and groups. Select them to share the item.":"Kullanıcıları ve grupları aramak için giriş alanını kullanın. Ögeyi paylaşmak için onları seçin.","User":"Kullanıcı","Versions":"Sürümler","We went looking everywhere, but were unable to find the selected resource.":"Her yere baktık, ancak seçilen kaynağı bulamadık.","What are indirect links?":"Dolaylı bağlantılar nedir?","Who can view tags?":"Etiketleri kim görebilir?","You don't have access to any spaces":"Hiçbir alana erişiminiz yok","You don't have access to any trashbins":"Herhangi bir çöp kutusuna erişiminiz yok","You don't have permission to share this file.":"Bu dosyayı paylaşmak için izniniz yok.","You don't have permission to share this folder.":"Bu klasörü paylaşmak için izniniz yok.","You have no deleted files":"Silinen dosyanız yok","You have no permission to create new files!":"Yeni dosyalar oluşturmak için izniniz yok!","You have no permission to upload!":"Yükleme için izniniz yok!","You have not shared any resource via link.":"Bağlantı aracılığıyla herhangi bir kaynak paylaşmadınız.","You have not shared any resources with other people.":"Diğer kişiler aracılığıyla herhangi bir kaynak paylaşmadınız.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} yüklemeden önce bu klasörü sizinle paylaştı"}},"uk":{"“via folder”":"«через папку»","(me)":"(я)","%{ itemCount } item selected":["%{ itemCount } item selected","%{ itemCount } items selected","%{ itemCount } items selected","Вибрано %{ itemCount } елементів"],"%{collaboratorName} (me)":"%{collaboratorName} (я)","%{count} member":["%{count} member","%{count} members","%{count} members","%{count} учасників"],"%{shareType} cannot access %{resourceName}":"%{shareType} не може отримати доступ до %{resourceName}","%{spaceCount} matching spaces":"%{spaceCount} відповідних Просторів","%{spaceCount} matching trashes":"%{spaceCount} відповідних Кошиків","%{spaceCount} spaces in total":"Усього %{spaceCount} Просторів","%{spaceCount} spaces in total (including %{disabledSpaceCount} disabled)":"Усього %{spaceCount} Просторів (включно з вимкненими %{disabledSpaceCount})","%{spaceCount} trashes in total":"Загально %{spaceCount} кошиків ","%{spaceName} (disabled)":"%{spaceName} (вимкнено)","A Space can have multiple Managers. Each Space has at least one Manager.":"Простір може мати кілька Менеджерів. Кожен Простір має принаймні одного Менеджера.","Access denied":"Доступ заборонено","Access details":"Деталі доступу","Access expires":"Термін доступу спливає","Access was denied successfully":"У доступі відмовлено","Access was granted successfully":"Успішно надано доступ ","Account type":"Тип аккаунту","Actions":"Дії","Activities":"Активність","Add":"Додати","Add link":"Додайте посилання","Add members":"Додати учасників","Add members to this Space":"Додайте учасників до цього простору","Add password":"Додайте пароль","Album":"Альбом","An error occurred while loading the public link":"Під час завантаження загальнодоступного посилання сталася помилка","Archive":"Архів","Are you sure you want to delete this link? Recreating the same link again is not possible.":"Ви впевнені, що хочете видалити це посилання? Повторне створення того самого посилання неможливе.","Are you sure you want to remove this member?":"Ви впевнені, що хочете видалити цього учасника?","Are you sure you want to remove this share?":"Ви впевнені, що хочете видалити спільний доступ?","Are you sure you want to send a reminder about this share?":"Ви впевнені, що бажаєте надіслати нагадування про цей спільний доступ?","Attach as copy":"Прикріпити як копію","Audio":"Аудіо","Audio Info":"Аудіо інформація","Authors":"Автори","Cancel":"Скасувати","Choose":"Вибрати","Choose how access is granted":"Виберіть спосіб надання доступу","Close filter":"Закрити фільтр","Confirm":"Підтвердити","Context menu of the share":"Контекстне меню спільного доступу","Copy link to clipboard":"Копіювати посилання в буфер обміну","Copy location to clipboard":"Копіювати розташування в буфер обміну","Copy the link to point your team to this item. Works only for people with existing access.":"Скопіюйте посилання, щоб вказати вашій команді на цей елемент. Працює тільки для людей з існуючим доступом.","Create new files or folders":"Створити нові файли або папки","Custom permissions":"Користувацькі дозволи","Dear user, please replace this legacy role with one of the currently available roles":"Шановний користуваче, будь ласка, замініть цю застарілу роль на одну з доступних на даний момент","Delete":"Видалити","Delete link":"Видалити посилання","Deleted at":"Видалено","Deleted files":"Видалені файли","Deny access":"Відмовити у доступі","Deselect %{label}":"Скасувати вибір %{label}","Deselect %{name}":"Скасувати вибір %{name}","Details":"Деталі","Device make":"Марка пристрою","Device model":"Модель пристрою","Dimensions":"Розміри","Disabled":"Вимкнено","Disc":"Диск","Document":"Документ","Domain":"Домен","Download":"Завантажити","Drag files and folders here or use the \"New\" or \"Upload\" buttons to add files":"Перетягніть файли та папки сюди або скористайтеся кнопками «Додати» або «Відвантажити», щоб додати файли","Drop files here to upload or use the 'Upload' button.":"Перетягніть файли сюди для завантаження або скористайтеся кнопкою 'Відвантажити'.","Duration":"Тривалість","Edit description":"Редагувати опис","Edit expiration date":"Редагувати термін дії","Edit image":"Редагувати зображення","Edit name":"Редагувати назву","Edit password":"Змінити пароль","Edit permission":"Дозвіл на редагування","Enabled":"Увімкнено","Enter a name to add people or groups as members to this Space.":"Введіть ім’я особи або групи, щоб додати їх до цього Простору.","Enter text to create a Tag":"Введіть текст, щоб створити Тег","Error while editing the share.":"Помилка під час редагування спільного доступу.","Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.":"Кожен, хто може переглядати файл, може переглядати його теги. Аналогічно, кожен, хто може редагувати файл, може редагувати його теги.","Expiration date":"Дата закінчення терміну дії","Expires %{timeToExpiry} (%{expiryDate})":"Термін дії спливає %{timeToExpiry} (%{expiryDate})","Exposure time":"Витримка","External":"Зовнішній","External user":"Зовнішній користувач","External user, registered with another organization’s account but granted access to your resources. External users can only have “view” or “edit” permission.":"Зовнішній користувач, зареєстрований під обліковим записом іншої організації, але має доступ до ваших ресурсів. Зовнішні користувачі можуть мати лише права «перегляд» або «редагування».","External users":"Зовнішні користувачі","F number":"F-число","Failed to add share for \"%{displayName}\"":"Не вдалося додати спільний доступ для \"%{displayName}\"","Failed to apply expiration date":"Не вдалося застосувати термін придатності","Failed to apply new permissions":"Не вдалося застосувати нові дозволи","Failed to delete link":"Не вдалося видалити посилання","Failed to deny access":"Не вдалося заборонити доступ","Failed to edit tags":"Не вдалося редагувати теги","Failed to grant access":"Не вдалося надати доступ","Failed to remove share":"Не вдалося видалити спільний доступ","Failed to update link":"Не вдалося оновити посилання","Failed to upload space image":"Не вдалося завантажити зображення Простору","Favorites":"Обрані","File":"Файл","File already exists":"Файл уже існує","File name":"Ім'я файлу","Files":"Файли","Filter members":"Фільтрувати учасників","Filter share types":"Типи спільних фільтрів","Filter shared by":"Фільтр спільного доступу за","Filter tags":"Теги фільтрів","Filter:":"Фільтр:","Focal length":"Фокусна відстань","Folder":"Папка","Folder already exists":"Папка вже існує","Folders":"Папки","Found %{totalResults}, showing the %{itemCount} best matching results":"Знайдено %{totalResults}, що показує %{itemCount} найкращих результатів","Genre":"Жанр","Go to »Personal« page":"Перейдіть на сторінку «Особисті».","Go to »Spaces Overview«":"Перейдіть до »Огляду Просторів«","Group":"Група","Guest user":"Гість користувач","Hidden Shares":"Приховані ресурси","Hide":"Сховати","How to edit indirect links":"Як редагувати непрямі посилання","If you share a folder, all of its contents and subfolders will be shared as well.":"Якщо ви надаєте спільний доступ до папки, весь її вміст і вкладені папки також будуть доступні.","Image":"Зображення","Image Info":"Інформація про зображення","Include disabled":"У тому числі вимкнені","Incognito":"Інкогніто","Indirect (%{ count })":"Непрямі (%{ count })","Indirect links are links giving access by a parent folder.":"Непрямі посилання – це посилання, які дають доступ через батьківську папку.","Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.":"Непрямі посилання можна редагувати лише в їхній батьківській папці. Натисніть значок папки під посиланням, щоб перейти до батьківської папки.","Insufficient quota":"Недостатня квота","Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files":"Недостатня квота на %{spaceName}. Вам потрібно додатково %{missingSpace}, щоб відвантажити ці файли","Internal":"Внутрішній","Internal users":"Внутрішні користувачі","Invited by":"Запрошено участником","ISO":"ISO","last 30 days":"останні 30 днів","last 7 days":"останні 7 днів","Last modified":"Востаннє змінено","Last Modified":"Остання зміна","last month":"минулого місяця","last week":"минулого тижня","last year":"минулого року","Learn about spaces":"Дізнайтеся про Простори","Learn more about ownCloud":"Дізнайтеся більше про ownCloud","Link name":"Назва посилання","Link name cannot exceed 255 characters":"Назва посилання не може перевищувати 255 символів","Link was deleted successfully":"Посилання успішно видалено","Link was updated successfully":"Посилання успішно оновлено","Loading list of shares":"Завантаження списку спільного доступу","Loading members failed. Try again later.":"Не вдалося завантажити учасників. Спробуйте пізніше.","Loading shares failed. Try again later.":"Не вдалося завантажити спільні ресурси. Спробуйте пізніше.","Loading users and groups":"Завантаження користувачів і груп","Location":"Місцезнаходження","Locked via":"Заблоковано через","Member capabilities":"Можливості учасників","Members":"Учасники","Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.":"Учасники можуть бачити, хто має доступ до цього Простору, і мати доступ до всіх файлів у цьому Просторі. Дозволи на читання або запис можна встановити шляхом призначення ролі.","Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.":"Учасники з роллю менеджера можуть редагувати всі властивості та вміст Простору, наприклад додавати або видаляти учасників, ділитися підпапками з особами, які не є учасниками, або створювати посилання для спільного доступу.","Members with the Manager role can add or remove other members from the Space.":"Учасники з роллю Менеджера можуть додавати або видаляти інших учасників з Простору.","Merge":"Об’єднати","More options":"Більше параметрів","Name":"Ім'я","Navigate to '%{folder}'":"Перейдіть до '%{folder}'","Navigate to parent":"Перейдіть до батьківського","New":"Новий","New folder":"Нова папка","New Folder":"Нова Папка","no":"відсутній","No activities":"Жодних дій","No external users found.":"Зовнішніх користувачів не знайдено.","No hidden shares":"Відсутні приховані спільні ресурси","No information to display":"Немає інформації для відображення","No login required. Everyone with the link can access. If you share this link with people from the list \"Invited people\", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.":"Логін не потрібен. Усі, хто має посилання, можуть отримати доступ. Якщо ви поділитеся цим посиланням з особами зі списку «Запрошені», їм потрібно буде ввійти, щоб їхні індивідуальні призначені дозволи могли набути чинності. Якщо вони не ввійшли в систему, дозволи за посиланням набувають чинності.","No resources found":"Ресурси не знайдено","No results found":"Нічого не знайдено","No shares":"Немає спільного доступу","No users or groups found.":"Користувачів або груп не знайдено.","No versions available for this file":"Немає доступних версій для цього файлу","Notification":"Сповіщення","Notify via mail":"Повідомити електронною поштою","Open context menu and show members":"Відкрити контекстне меню та показати учасників","Open context menu with share editing options":"Відкрити контекстне меню з параметрами спільного редагування","Orientation":"Орієнтація","Overview of the information about the selected file":"Огляд інформації про вибраний файл","Overview of the information about the selected files":"Огляд інформації про вибрані файли","Owner":"Власник","Password":"Пароль","Paste here":"Вставте сюди","PDF":"PDF","People you share resources with can not see who else has access.":"Особи, з якими ви ділитеся спільними ресурсами, не бачать, хто ще має доступ.","People you share resources with will be notified via email or in-app notification.":"Особи, з якими ви ділитеся ресурсами, отримають сповіщення електронною поштою або через сповіщення в програмі.","Permanent link":"Постійне посилання","Permanent link copied":"Постійне посилання скопійовано","Person was added":"Додано особу","Personal":"Особисті","Please wait until all imports have finished":"Будь ласка, зачекайте, доки всі імпорти завершаться","Presentation":"Презентація","Public files":"Публічні файли","Public link":"Загальнодоступне посилання","Public links":"Загальнодоступні посилання","Reload public link":"Перезавантажити загальнодоступне посилання","Remove":"Видалити","Remove expiration date":"Видалити термін дії","Remove member":"Видалити учасника","Remove password":"Видалити пароль","Remove share":"Видалити спільний доступ","Rename":"Перейменувати","Replace":"Замінити","Resource is temporarily locked, unable to manage share":"Ресурс тимчасово заблоковано, неможливо керувати спільним доступом","Resource not found":"Ресурс не знайдено","Restore":"Відновлення","Save":"Зберегти","Search":"Пошук","Search for files":"Пошук файлів","Search for service or secondary Account":"Знайдіть службу або додатковий обліковий запис","Search results for \"%{searchTerm}\"":"Результати пошуку для \"%{searchTerm}\"","See all versions":"Переглянути всі версії","Select a file or folder to view details":"Виберіть файл або папку, щоб переглянути деталі","Select a trash to view details":"Виберіть кошик, щоб переглянути деталі","Select permission":"Виберіть дозвіл","Select role for the invitation":"Виберіть роль для запрошення","Send":"Надіслати","Send a reminder":"Надіслати нагадування","Set expiration date":"Встановіть термін дії","Share":"Поділитися","Share expires %{ expiryDateRelative } (%{ expiryDate })":"Термін дії спільного доступу спливає %{ expiryDateRelative } (%{ expiryDate })","Share link(s)":"Поділитися посиланням(ами)","Share receiver name: %{ displayName }":"Назва одержувача для спільного доступу: %{ displayName }","Share receivers":"Спільні отримувачі","Share successfully changed":"Спільний доступ успішно змінено","Share Type":"Тип спільного доступу","Share was added successfully":"Спільний доступ успішно додано","Share was removed successfully":"Спільний доступ успішно видалено","Share with people":"Спільний доступ з людьми","Shared by":"Спільний доступ від","Shared By":"Спільний доступ від","Shared on":"Поділилися","Shared via":"Поділився через","Shared via link":"Поділитися за посиланням","Shared via the parent folder \"%{sharedParentDir}\"":"Надано доступ через батьківську папку \"%{sharedParentDir}\"","Shared with":"Спільний доступ з","Shared with me":"Спільний доступ зі мною","Shared with others":"Спільний доступ з іншими","Shares":"Спільний доступ","Shares pages navigation":"Навігація по сторінках","Shortcut":"Ярлик","Show":"Показати","Show context menu":"Показати контекстне меню","Show less":"Показувати менше","Show members":"Показати учасників","Show more":"Показати більше","Show more actions":"Показати більше дій","Showing %{activitiesCount} activity":["Відображено %{activitiesCount} активність","Відображено %{activitiesCount} активності","Відображено %{activitiesCount} активностей","Відображено %{activitiesCount} активностей"],"Showing up to %{searchLimit} results":"Показано до %{searchLimit} результатів","Size":"Розмір","Space has no deleted files":"У Просторі немає видалених файлів","Space image was uploaded successfully":"Зображення Простору успішно відвантажено","Space manager capabilities":"Можливості менеджера Простору","Space members":"Учасники Простору","Space not found":"Простір не знайдено","Spaces":"Простори","Spaces are special folders for making files accessible to a team.":"Простори — це спеціальні папки для надання доступу до файлів команді.","Spaces belong to a team and not to a single person. Even if members are removed, the files remain in the Space so that the team can continue to work on the files.":"Простори належать команді, а не одній людині. Навіть якщо учасники видаляються, файли залишаються у Просторі, тож команда може продовжувати працювати над ними.","Spreadsheet":"Електронна таблиця","Subfolders":"Вкладені папки","Switch to condensed table view":"Перейти до перегляду згорнутої таблиці","Switch to default table view":"Обрати перегляд у вигляді таблиці за замовчуванням","Switch to tiles view":"Переключитися на режим плитки","Synced with your devices":"Синхронізовано з вашими пристроями","Tag must not consist of blanks only":"Тег не повинен складатися лише з пробілів","Tags":"Теги","Tags must not be longer than %{max} characters":"Теги не повинні містити більше %{max} символів","Taken time":"Витрачений час","The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.":"«Через папку» відображається поруч із спільним доступом, якщо доступ уже надано через батьківську папку. Натисніть «через папку», щоб редагувати спільний доступ у його батьківській папці.","The file type is unsupported":"Тип файлу не підтримується","The link \"%{linkName}\" has been copied to your clipboard.":"Посилання \"%{linkName}\" було скопійовано до буфера обміну.","The link has been copied to your clipboard.":"Посилання скопійовано до буфера обміну.","The location has been copied to your clipboard.":"Розташування скопійовано в буфер обміну.","The permanent link has been copied to your clipboard.":"Постійне посилання скопійовано до вашого буферу обміну.","There are no resources marked as favorite":"Відсутні ресурси, позначених як обрані","This feature is brought to you by ownCloud":"Цю функцію надає вам ownCloud","This file has been shared.":"До цього файлу надано спільний доступ.","This file has no public link.":"Цей файл не має публічного посилання.","This folder contains %{ amount } item.":["This folder contains %{ amount } item.","This folder contains %{ amount } items.","This folder contains %{ amount } items.","Ця папка містить %{ сума } елементів."],"This folder has been shared.":"До цієї папки надано спільний доступ.","This folder has no content.":"Ця папка не має вмісту.","This folder has no public link.":"Ця папка не має публічного посилання.","This link is password-protected":"Це посилання захищене паролем","this month":"цього місяця","This space has no public links.":"Цей простір не має публічних посилань.","this week":"цього тижня","this year":"цього року","Title":"Назва","To search for service or secondary accounts prefix the username with \"a:\" (like \"a:doe\") and for guest accounts prefix the username with \"l:\" (like \"l:doe\").":"Для пошуку службових або додаткових префіксів до імені користувача, додайте префікс «a:» (наприклад, «a:doe»), а для облікових записів гостей — «l:» (наприклад, «l:doe»).","today":"сьогодні","Track":"Трек","Type":"Тип","Unrestricted":"Без обмежень","Upload":{"":"Відвантажити","The label of the upload button in secret file upload view":"Відвантажити"},"Upload files or folders":"Відвантажте файли або папки","Use the input field to search for users and groups. Select them to share the item.":"Використовуйте поле введення для пошуку користувачів і груп. Виберіть їх, щоб поділитися елементом.","User":"Користувач","Versions":"Версії","Video":"Відео","We went looking everywhere, but were unable to find the selected resource.":"Ми шукали всюди, але не змогли знайти вибраний ресурс.","What are indirect links?":"Що таке непрямі посилання?","Who can view tags?":"Хто може переглядати теги?","Year recorded":"Рік запису","yesterday":"вчора","You cannot cut and paste resources into the same folder.":"Ви не можете вирізати і вставляти ресурси в одну папку.","You do not have permission to create public links.":"У вас немає дозволу на створення публічних посилань.","You don't have access to any spaces":"Ви не маєте доступу до жодного Простору","You don't have access to any trashbins":"Ви не маєте доступу до жодного Кошику","You don't have permission to share this file.":"У вас немає дозволу на поширення цього файлу.","You don't have permission to share this folder.":"У вас немає дозволу на поширення цієї папки.","You have no deleted files":"У вас відсутні видалені файли","You have no permission to create new files!":"У вас немає дозволу на створення нових файлів!","You have no permission to paste files here.":"У вас немає дозволу вставляти сюди файли.","You have no permission to upload!":"У вас немає дозволу на відвантаження!","You have not shared any resource via link.":"Ви не поділилися жодним ресурсом за посиланням.","You have not shared any resources with other people.":"Ви не ділилися ресурсами з іншими людьми.","%{owner} shared this folder with you for uploading":{"A message explaining who shared a folder with secret file upload role to the receiving user":"%{owner} надав вам доступ до цієї папки для відвантаження"},"Everyone who has read permission to any parent folder can see the content.":{"A note explaining that existing content in secure file drop share is not revealed to anyone else than the owner of the share.":"Усі, хто має дозвіл на читання будь-якої батьківської папки, можуть бачити її вміст."},"Transfer of nested folder structures is not possible. Instead, all files from the subfolders will be uploaded individually.":{"A note explaining that uploading nested folder structures is not possible in secret file upload.":"Перенесення вкладених структур папок неможливе. Натомість усі файли з підпапок будуть відвантажені окремо."},"Full Text Search":{"Label of a search page filter used to search for resources with the search term in their name and content.":"Повнотекстовий пошук"},"Title only":{"Label of a search page filter used to search only for resources with the search term in their name.":"Лише заголовок"}}} \ No newline at end of file diff --git a/packages/web-app-files/package.json b/packages/web-app-files/package.json deleted file mode 100644 index 810ce2e2d29..00000000000 --- a/packages/web-app-files/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "web-app-files", - "version": "0.0.0", - "private": true, - "description": "ownCloud web files", - "license": "AGPL-3.0", - "scripts": { - "test:unit": "NODE_OPTIONS=--unhandled-rejections=throw vitest" - }, - "devDependencies": { - "@ownclouders/web-test-helpers": "workspace:*" - }, - "peerDependencies": { - "@ownclouders/design-system": "workspace:^", - "@ownclouders/web-client": "workspace:*", - "@ownclouders/web-pkg": "workspace:*", - "@uppy/core": "5.1.0", - "@vueuse/core": "^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", - "axios": "1.13.1", - "email-validator": "^2.0.4", - "fuse.js": "7.1.0", - "lodash-es": "4.17.21", - "luxon": "3.7.2", - "mark.js": "^8.11.1", - "p-queue": "^9.0.0", - "pinia": "3.0.3", - "qs": "6.14.0", - "uuid": "13.0.0", - "vue-concurrency": "5.0.3", - "vue-router": "4.6.3", - "vue3-gettext": "2.4.0", - "web-app-search": "workspace:*" - } -} diff --git a/packages/web-app-files/src/App.vue b/packages/web-app-files/src/App.vue deleted file mode 100644 index 3fe0c64c1f1..00000000000 --- a/packages/web-app-files/src/App.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/HandleUpload.ts b/packages/web-app-files/src/HandleUpload.ts deleted file mode 100644 index 19e5c13dbfa..00000000000 --- a/packages/web-app-files/src/HandleUpload.ts +++ /dev/null @@ -1,450 +0,0 @@ -import Uppy, { BasePlugin } from '@uppy/core' -import { basename, dirname, join } from 'path' -import { v4 as uuidV4 } from 'uuid' -import { Language } from 'vue3-gettext' -import { Ref, unref } from 'vue' -import { RouteLocationNormalizedLoaded } from 'vue-router' -import { Resource, SpaceResource } from '@ownclouders/web-client' -import { urlJoin } from '@ownclouders/web-client' -import { UploadResourceConflict } from './helpers/resource' -import { - MessageStore, - ResourcesStore, - SpacesStore, - UserStore, - locationPublicLink, - formatFileSize, - OcUppyFile, - OcUppyMeta, - OcUppyBody -} from '@ownclouders/web-pkg' -import { locationSpacesGeneric, UppyService } from '@ownclouders/web-pkg' -import { isPersonalSpaceResource, isShareSpaceResource } from '@ownclouders/web-client' -import { ClientService, queryItemAsString } from '@ownclouders/web-pkg' -import { PluginOpts } from '@uppy/core' - -export interface HandleUploadOptions { - clientService: ClientService - language: Language - route: Ref - userStore: UserStore - messageStore: MessageStore - spacesStore: SpacesStore - resourcesStore: ResourcesStore - uppyService: UppyService - id?: string - space?: Ref - quotaCheckEnabled?: boolean - directoryTreeCreateEnabled?: boolean - conflictHandlingEnabled?: boolean -} - -/** - * Plugin to handle the file upload with uppy. The process goes through the following steps: - * - * 1. convert input files to uppy resources - * 2. check quota if spaces are enabled - * 3. handle potential naming conflicts - * 4. create directory tree if needed - * 5. start upload - */ -export class HandleUpload extends BasePlugin { - clientService: ClientService - language: Language - route: Ref - space: Ref - userStore: UserStore - messageStore: MessageStore - spacesStore: SpacesStore - resourcesStore: ResourcesStore - uppyService: UppyService - quotaCheckEnabled: boolean - directoryTreeCreateEnabled: boolean - conflictHandlingEnabled: boolean - - constructor(uppy: Uppy, opts: HandleUploadOptions) { - super(uppy, opts) - this.id = opts.id || 'HandleUpload' - this.type = 'modifier' - this.uppy = uppy - - this.clientService = opts.clientService - this.language = opts.language - this.route = opts.route - this.space = opts.space - this.userStore = opts.userStore - this.messageStore = opts.messageStore - this.spacesStore = opts.spacesStore - this.resourcesStore = opts.resourcesStore - this.uppyService = opts.uppyService - - this.quotaCheckEnabled = opts.quotaCheckEnabled ?? true - this.directoryTreeCreateEnabled = opts.directoryTreeCreateEnabled ?? true - this.conflictHandlingEnabled = opts.conflictHandlingEnabled ?? true - - this.handleUpload = this.handleUpload.bind(this) - } - - removeFilesFromUpload(filesToUpload: OcUppyFile[]) { - for (const file of filesToUpload) { - this.uppy.removeFile(file.id) - } - } - - getUploadPluginName() { - return this.uppy.getPlugin('Tus') ? 'tus' : 'xhrUpload' - } - - getUploadFolder(uploadId: string): Resource { - // check if an upload folder has been set for this upload id - if (uploadId && this.uppyService.uploadFolderMap[uploadId]) { - return this.uppyService.uploadFolderMap[uploadId] - } - - // fall back to current folder - return this.resourcesStore.currentFolder - } - - /** - * Converts the input files type UppyResources and updates the uppy upload queue - */ - prepareFiles(files: OcUppyFile[], uploadFolder: Resource): OcUppyFile[] { - const filesToUpload: Record = {} - - if (!this.resourcesStore.currentFolder && unref(this.route)?.params?.token) { - // public file drop - const publicLinkToken = queryItemAsString(unref(this.route).params.token) - let endpoint = urlJoin( - this.clientService.webdav.getPublicFileUrl(unref(this.space), publicLinkToken), - { trailingSlash: true } - ) - - for (const file of files) { - if (!this.uppy.getPlugin('Tus')) { - endpoint = urlJoin(endpoint, encodeURIComponent(file.name)) - } - - file[this.getUploadPluginName()] = { endpoint } - file.meta = { - ...file.meta, - tusEndpoint: endpoint, - uploadId: uuidV4() - } - - filesToUpload[file.id] = file - } - this.uppy.setState({ files: { ...this.uppy.getState().files, ...filesToUpload } }) - return Object.values(filesToUpload) - } - const { id: currentFolderId, path: currentFolderPath } = uploadFolder - - const { name, params, query } = unref(this.route) - const topLevelFolderIds: Record = {} - - for (const file of files) { - const relativeFilePath = file.meta.relativePath - // Directory without filename - const directory = - !relativeFilePath || dirname(relativeFilePath) === '.' ? '' : dirname(relativeFilePath) - - let topLevelFolderId: string - if (relativeFilePath) { - const topLevelDirectory = relativeFilePath.split('/').filter(Boolean)[0] - if (!topLevelFolderIds[topLevelDirectory]) { - topLevelFolderIds[topLevelDirectory] = uuidV4() - } - topLevelFolderId = topLevelFolderIds[topLevelDirectory] - } - - const webDavUrl = unref(this.space).getWebDavUrl({ - path: currentFolderPath.split('/').map(encodeURIComponent).join('/') - }) - - let endpoint = urlJoin(webDavUrl, directory.split('/').map(encodeURIComponent).join('/')) - if (!this.uppy.getPlugin('Tus')) { - endpoint = urlJoin(endpoint, encodeURIComponent(file.name)) - } - - file[this.getUploadPluginName()] = { endpoint } - file.meta = { - ...file.meta, - // file data - name: file.name, - mtime: (file.data as File).lastModified / 1000, - // current path & space - spaceId: unref(this.space).id, - spaceName: unref(this.space).name, - driveAlias: unref(this.space).driveAlias, - driveType: unref(this.space).driveType, - currentFolder: currentFolderPath, - currentFolderId, - // upload data - uppyId: this.uppyService.generateUploadId(file), - relativeFolder: directory, - tusEndpoint: endpoint, - uploadId: uuidV4(), - topLevelFolderId, - // route data - routeName: name as string, - routeDriveAliasAndItem: queryItemAsString(params?.driveAliasAndItem) || '', - routeShareId: queryItemAsString(query?.shareId) || '' - } - - filesToUpload[file.id] = file - } - - this.uppy.setState({ files: { ...this.uppy.getState().files, ...filesToUpload } }) - return Object.values(filesToUpload) - } - - checkQuotaExceeded(filesToUpload: OcUppyFile[]): boolean { - let quotaExceeded = false - - const uploadSizeSpaceMapping = filesToUpload.reduce((acc, uppyFile) => { - let targetUploadSpace: SpaceResource - - if (uppyFile.meta.routeName === locationPublicLink.name) { - return acc - } - - if (uppyFile.meta.routeName === locationSpacesGeneric.name) { - targetUploadSpace = this.spacesStore.spaces.find(({ id }) => id === uppyFile.meta.spaceId) - } - - if ( - !targetUploadSpace || - isShareSpaceResource(targetUploadSpace) || - (isPersonalSpaceResource(targetUploadSpace) && - !targetUploadSpace.isOwner(this.userStore.user)) - ) { - return acc - } - - const existingFile = this.resourcesStore.resources.find( - (c) => !uppyFile.meta.relativeFolder && c.name === uppyFile.name - ) - const existingFileSize = existingFile ? Number(existingFile.size) : 0 - - const matchingMappingRecord = acc.find( - (mappingRecord) => mappingRecord.space.id === targetUploadSpace.id - ) - - if (!matchingMappingRecord) { - acc.push({ - space: targetUploadSpace, - uploadSize: uppyFile.data.size - existingFileSize - }) - return acc - } - - matchingMappingRecord.uploadSize = uppyFile.data.size - existingFileSize - - return acc - }, []) - - const { $gettext } = this.language - uploadSizeSpaceMapping.forEach(({ space, uploadSize }) => { - if (space.spaceQuota.remaining && space.spaceQuota.remaining < uploadSize) { - let spaceName = space.name - - if (space.driveType === 'personal') { - spaceName = $gettext('Personal') - } - - this.messageStore.showErrorMessage({ - title: $gettext('Insufficient quota'), - desc: $gettext( - 'Insufficient quota on %{spaceName}. You need additional %{missingSpace} to upload these files', - { - spaceName, - missingSpace: formatFileSize( - (space.spaceQuota.remaining - uploadSize) * -1, - this.language.current - ) - } - ) - }) - - quotaExceeded = true - } - }) - - return quotaExceeded - } - - /** - * Creates the directory tree and removes files of failed directories from the upload queue. - */ - async createDirectoryTree( - filesToUpload: OcUppyFile[], - uploadFolder: Resource - ): Promise { - const { webdav } = this.clientService - const space = unref(this.space) - const { id: currentFolderId, path: currentFolderPath } = uploadFolder - - const routeName = filesToUpload[0].meta.routeName - const routeDriveAliasAndItem = filesToUpload[0].meta.routeDriveAliasAndItem - const routeShareId = filesToUpload[0].meta.routeShareId - - const failedFolders: string[] = [] - const directoryTree: Record = {} - const topLevelIds: Record = {} - - for (const file of filesToUpload.filter(({ meta }) => !!meta.relativeFolder)) { - const folders = file.meta.relativeFolder.split('/').filter(Boolean) - let current = directoryTree - // first folder is always top level - topLevelIds[urlJoin(folders[0])] = file.meta.topLevelFolderId - for (const folder of folders) { - current[folder] = current[folder] || {} - current = current[folder] - } - } - - const createDirectoryLevel = async (current: Record, path = '') => { - if (path) { - const isRoot = path.split('/').length <= 1 - path = urlJoin(path, { leadingSlash: true }) - const uploadId = !isRoot ? uuidV4() : topLevelIds[path] - const relativeFolder = dirname(path) === '/' ? '' : dirname(path) - - const uppyFile = { - id: uuidV4(), - name: basename(path), - isFolder: true, - type: 'folder', - meta: { - spaceId: space.id, - spaceName: space.name, - driveAlias: space.driveAlias, - driveType: space.driveType, - currentFolder: currentFolderPath, - currentFolderId, - relativeFolder, - uploadId, - routeName, - routeDriveAliasAndItem, - routeShareId - } - } - - if (failedFolders.includes(relativeFolder)) { - // return if top level folder failed to create - return - } - - this.uppyService.publish('addedForUpload', [uppyFile]) - - try { - const folder = await webdav.createFolder(space, { - path: urlJoin(currentFolderPath, path), - fetchFolder: isRoot - }) - this.uppyService.publish('uploadSuccess', { - ...uppyFile, - meta: { ...uppyFile.meta, fileId: folder?.fileId } - }) - } catch (error) { - if (error.statusCode !== 405) { - console.error(error) - failedFolders.push(path) - this.uppyService.publish('uploadError', { file: uppyFile, error }) - } - } - } - - const foldersToBeCreated = Object.keys(current) - const promises: Promise[] = [] - for (const folder of foldersToBeCreated) { - promises.push(createDirectoryLevel(current[folder], join(path, folder))) - } - return Promise.allSettled(promises) - } - - await createDirectoryLevel(directoryTree) - - let filesToRemove: string[] = [] - if (failedFolders.length) { - // remove files of folders that could not be created - filesToRemove = filesToUpload - .filter((f) => failedFolders.some((r) => f.meta.relativeFolder.startsWith(r))) - .map(({ id }) => id) - for (const fileId of filesToRemove) { - this.uppy.removeFile(fileId) - } - } - - return filesToUpload.filter(({ id }) => !filesToRemove.includes(id)) - } - - /** - * The handler that prepares all files to be uploaded and goes through all necessary steps. - * Eventually triggers to upload in Uppy. - */ - async handleUpload(files: OcUppyFile[]) { - if (!files.length) { - return - } - - const uploadId = files[0].meta?.uploadId - const uploadFolder = this.getUploadFolder(uploadId) - let filesToUpload = this.prepareFiles(files, uploadFolder) - - // quota check - if (this.quotaCheckEnabled) { - const quotaExceeded = this.checkQuotaExceeded(filesToUpload) - if (quotaExceeded) { - this.removeFilesFromUpload(filesToUpload) - return this.uppyService.clearInputs() - } - } - - // name conflict handling - if (this.conflictHandlingEnabled) { - const conflictHandler = new UploadResourceConflict(this.resourcesStore, this.language) - const conflicts = conflictHandler.getConflicts(filesToUpload) - if (conflicts.length) { - const dashboard = document.getElementsByClassName('uppy-Dashboard') - if (dashboard.length) { - ;(dashboard[0] as HTMLElement).style.display = 'none' - } - - const result = await conflictHandler.displayOverwriteDialog(filesToUpload, conflicts) - if (result.length === 0) { - this.removeFilesFromUpload(filesToUpload) - return this.uppyService.clearInputs() - } - - filesToUpload = result - const conflictMap = result.reduce>((acc, file) => { - acc[file.id] = file - return acc - }, {}) - this.uppy.setState({ files: { ...this.uppy.getState().files, ...conflictMap } }) - } - } - - this.uppyService.publish('uploadStarted') - if (this.directoryTreeCreateEnabled) { - filesToUpload = await this.createDirectoryTree(filesToUpload, uploadFolder) - } - - if (!filesToUpload.length) { - this.uppyService.publish('uploadCompleted', { successful: [] }) - return this.uppyService.clearInputs() - } - - this.uppyService.publish('addedForUpload', filesToUpload) - this.uppyService.uploadFiles() - this.uppyService.removeUploadFolder(uploadId) - } - - install() { - this.uppy.on('files-added', this.handleUpload) - } - - uninstall() { - this.uppy.off('files-added', this.handleUpload) - } -} diff --git a/packages/web-app-files/src/components/AppBar/CreateAndUpload.vue b/packages/web-app-files/src/components/AppBar/CreateAndUpload.vue deleted file mode 100644 index 9c94a045fe1..00000000000 --- a/packages/web-app-files/src/components/AppBar/CreateAndUpload.vue +++ /dev/null @@ -1,534 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/AppBar/SharesNavigation.vue b/packages/web-app-files/src/components/AppBar/SharesNavigation.vue deleted file mode 100644 index 8e83942cdbc..00000000000 --- a/packages/web-app-files/src/components/AppBar/SharesNavigation.vue +++ /dev/null @@ -1,132 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue b/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue deleted file mode 100644 index 87ede08263f..00000000000 --- a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/EmbedActions/EmbedActions.vue b/packages/web-app-files/src/components/EmbedActions/EmbedActions.vue deleted file mode 100644 index 73201e0b831..00000000000 --- a/packages/web-app-files/src/components/EmbedActions/EmbedActions.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/FilesList/ListInfo.vue b/packages/web-app-files/src/components/FilesList/ListInfo.vue deleted file mode 100644 index 22bc8dde678..00000000000 --- a/packages/web-app-files/src/components/FilesList/ListInfo.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/FilesList/NotFoundMessage.vue b/packages/web-app-files/src/components/FilesList/NotFoundMessage.vue deleted file mode 100644 index 44a77201277..00000000000 --- a/packages/web-app-files/src/components/FilesList/NotFoundMessage.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/FilesList/QuickActions.vue b/packages/web-app-files/src/components/FilesList/QuickActions.vue deleted file mode 100644 index 000a4e518fa..00000000000 --- a/packages/web-app-files/src/components/FilesList/QuickActions.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/FilesList/ResourceDetails.vue b/packages/web-app-files/src/components/FilesList/ResourceDetails.vue deleted file mode 100644 index 7bbb2fcb029..00000000000 --- a/packages/web-app-files/src/components/FilesList/ResourceDetails.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/FilesViewWrapper.vue b/packages/web-app-files/src/components/FilesViewWrapper.vue deleted file mode 100644 index 5ac54f6f8e9..00000000000 --- a/packages/web-app-files/src/components/FilesViewWrapper.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/Modals/DatePickerModal.vue b/packages/web-app-files/src/components/Modals/DatePickerModal.vue deleted file mode 100644 index 02dae33cf70..00000000000 --- a/packages/web-app-files/src/components/Modals/DatePickerModal.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/Modals/SetLinkPasswordModal.vue b/packages/web-app-files/src/components/Modals/SetLinkPasswordModal.vue deleted file mode 100644 index 300fbca703c..00000000000 --- a/packages/web-app-files/src/components/Modals/SetLinkPasswordModal.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/Search/List.vue b/packages/web-app-files/src/components/Search/List.vue deleted file mode 100644 index 0ffcead3d98..00000000000 --- a/packages/web-app-files/src/components/Search/List.vue +++ /dev/null @@ -1,504 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/Shares/CopyPrivateLink.vue b/packages/web-app-files/src/components/Shares/CopyPrivateLink.vue deleted file mode 100644 index aed42b682b5..00000000000 --- a/packages/web-app-files/src/components/Shares/CopyPrivateLink.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/Shares/SharedWithMeSection.vue b/packages/web-app-files/src/components/Shares/SharedWithMeSection.vue deleted file mode 100644 index 83504d41baf..00000000000 --- a/packages/web-app-files/src/components/Shares/SharedWithMeSection.vue +++ /dev/null @@ -1,203 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue b/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue deleted file mode 100644 index 36681d46220..00000000000 --- a/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue b/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue deleted file mode 100644 index dff6116351b..00000000000 --- a/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/ActivitiesPanel.vue b/packages/web-app-files/src/components/SideBar/ActivitiesPanel.vue deleted file mode 100644 index 9787772df6e..00000000000 --- a/packages/web-app-files/src/components/SideBar/ActivitiesPanel.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Audio/AudioMetaPanel.vue b/packages/web-app-files/src/components/SideBar/Audio/AudioMetaPanel.vue deleted file mode 100644 index a52f3c41a61..00000000000 --- a/packages/web-app-files/src/components/SideBar/Audio/AudioMetaPanel.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue deleted file mode 100644 index ccb5bdd8d5e..00000000000 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ /dev/null @@ -1,384 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetailsMultiple.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetailsMultiple.vue deleted file mode 100644 index 845912c4955..00000000000 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetailsMultiple.vue +++ /dev/null @@ -1,128 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Details/TagsSelect.vue b/packages/web-app-files/src/components/SideBar/Details/TagsSelect.vue deleted file mode 100644 index 5a1efb68402..00000000000 --- a/packages/web-app-files/src/components/SideBar/Details/TagsSelect.vue +++ /dev/null @@ -1,296 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Exif/ExifPanel.vue b/packages/web-app-files/src/components/SideBar/Exif/ExifPanel.vue deleted file mode 100644 index 4c628afa7ce..00000000000 --- a/packages/web-app-files/src/components/SideBar/Exif/ExifPanel.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/NoSelection.vue b/packages/web-app-files/src/components/SideBar/NoSelection.vue deleted file mode 100644 index 8ca9dc741a7..00000000000 --- a/packages/web-app-files/src/components/SideBar/NoSelection.vue +++ /dev/null @@ -1,13 +0,0 @@ - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ContextMenuItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ContextMenuItem.vue deleted file mode 100644 index f7cf586028c..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ContextMenuItem.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/EditDropdown.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/EditDropdown.vue deleted file mode 100644 index 6c10f5695a2..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/EditDropdown.vue +++ /dev/null @@ -1,281 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/AutocompleteItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/AutocompleteItem.vue deleted file mode 100644 index 75f4a9a9e26..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/AutocompleteItem.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/ExpirationDatepicker.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/ExpirationDatepicker.vue deleted file mode 100644 index b028bafbe46..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/ExpirationDatepicker.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue deleted file mode 100644 index b1d9a4ec255..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue +++ /dev/null @@ -1,597 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/RecipientContainer.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/RecipientContainer.vue deleted file mode 100644 index 2112e5ef142..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/RecipientContainer.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue deleted file mode 100644 index 207650650a7..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue +++ /dev/null @@ -1,415 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue deleted file mode 100644 index d664d17e2c2..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue +++ /dev/null @@ -1,301 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/ExpirationDateIndicator.vue b/packages/web-app-files/src/components/SideBar/Shares/ExpirationDateIndicator.vue deleted file mode 100644 index 835ced75258..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/ExpirationDateIndicator.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue b/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue deleted file mode 100644 index 09cd3decb61..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue +++ /dev/null @@ -1,316 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue b/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue deleted file mode 100644 index 8b85a4b2fea..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue +++ /dev/null @@ -1,424 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Links/ContextMenuItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Links/ContextMenuItem.vue deleted file mode 100644 index c42223f1af3..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Links/ContextMenuItem.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Links/CopyLink.vue b/packages/web-app-files/src/components/SideBar/Shares/Links/CopyLink.vue deleted file mode 100644 index b8a897bb1f2..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Links/CopyLink.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Links/EditDropdown.vue b/packages/web-app-files/src/components/SideBar/Shares/Links/EditDropdown.vue deleted file mode 100644 index 0ea0622ce10..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Links/EditDropdown.vue +++ /dev/null @@ -1,278 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Links/ListItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Links/ListItem.vue deleted file mode 100644 index a2bb78d947e..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Links/ListItem.vue +++ /dev/null @@ -1,145 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/Shared/RoleItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Shared/RoleItem.vue deleted file mode 100644 index 5c50670e8f0..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/Shared/RoleItem.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/SharesPanel.vue b/packages/web-app-files/src/components/SideBar/Shares/SharesPanel.vue deleted file mode 100644 index 6e8cb7a606c..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/SharesPanel.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue b/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue deleted file mode 100644 index 6fda4e6f840..00000000000 --- a/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue +++ /dev/null @@ -1,284 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/SideBar/TrashNoSelection.vue b/packages/web-app-files/src/components/SideBar/TrashNoSelection.vue deleted file mode 100644 index d5d47a99e70..00000000000 --- a/packages/web-app-files/src/components/SideBar/TrashNoSelection.vue +++ /dev/null @@ -1,13 +0,0 @@ - - diff --git a/packages/web-app-files/src/components/SideBar/Versions/FileVersions.vue b/packages/web-app-files/src/components/SideBar/Versions/FileVersions.vue deleted file mode 100644 index ffbc363b2ca..00000000000 --- a/packages/web-app-files/src/components/SideBar/Versions/FileVersions.vue +++ /dev/null @@ -1,171 +0,0 @@ - - - - diff --git a/packages/web-app-files/src/components/Spaces/SpaceContextActions.vue b/packages/web-app-files/src/components/Spaces/SpaceContextActions.vue deleted file mode 100644 index 958da986f49..00000000000 --- a/packages/web-app-files/src/components/Spaces/SpaceContextActions.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/Spaces/SpaceHeader.vue b/packages/web-app-files/src/components/Spaces/SpaceHeader.vue deleted file mode 100644 index b093783c1d2..00000000000 --- a/packages/web-app-files/src/components/Spaces/SpaceHeader.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/components/Spaces/WhitespaceContextMenu.vue b/packages/web-app-files/src/components/Spaces/WhitespaceContextMenu.vue deleted file mode 100644 index df50ed8092a..00000000000 --- a/packages/web-app-files/src/components/Spaces/WhitespaceContextMenu.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/composables/actions/index.ts b/packages/web-app-files/src/composables/actions/index.ts deleted file mode 100644 index 415cb195166..00000000000 --- a/packages/web-app-files/src/composables/actions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './spaces' diff --git a/packages/web-app-files/src/composables/actions/spaces/index.ts b/packages/web-app-files/src/composables/actions/spaces/index.ts deleted file mode 100644 index 5a9d99da905..00000000000 --- a/packages/web-app-files/src/composables/actions/spaces/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useSpaceActionsUploadImage' diff --git a/packages/web-app-files/src/composables/actions/spaces/useSpaceActionsUploadImage.ts b/packages/web-app-files/src/composables/actions/spaces/useSpaceActionsUploadImage.ts deleted file mode 100644 index 9b390a9f58c..00000000000 --- a/packages/web-app-files/src/composables/actions/spaces/useSpaceActionsUploadImage.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { computed, unref, VNodeRef } from 'vue' -import { SpaceResource } from '@ownclouders/web-client' -import { - useClientService, - useLoadingService, - usePreviewService, - useUserStore, - useMessages, - useSpacesStore, - useSpaceHelpers, - useSharesStore -} from '@ownclouders/web-pkg' -import { eventBus } from '@ownclouders/web-pkg' -import { useGettext } from 'vue3-gettext' -import { SpaceAction, SpaceActionOptions } from '@ownclouders/web-pkg' -import { useCreateSpace } from '@ownclouders/web-pkg' - -export const useSpaceActionsUploadImage = ({ spaceImageInput }: { spaceImageInput: VNodeRef }) => { - const userStore = useUserStore() - const { showMessage, showErrorMessage } = useMessages() - const { $gettext } = useGettext() - const clientService = useClientService() - const loadingService = useLoadingService() - const previewService = usePreviewService() - const spacesStore = useSpacesStore() - const sharesStore = useSharesStore() - const { createDefaultMetaFolder } = useCreateSpace() - const { getDefaultMetaFolder } = useSpaceHelpers() - - let selectedSpace: SpaceResource = null - const handler = ({ resources }: SpaceActionOptions) => { - if (resources.length !== 1) { - return - } - - selectedSpace = resources[0] as SpaceResource - unref(spaceImageInput)?.click() - } - - const uploadImageSpace = async (ev: Event) => { - const graphClient = clientService.graphAuthenticated - const file = (ev.currentTarget as HTMLInputElement).files[0] - - if (!file) { - return - } - - if (!previewService.isMimetypeSupported(file.type, true)) { - return showErrorMessage({ title: $gettext('The file type is unsupported') }) - } - - let metaFolder = await getDefaultMetaFolder(selectedSpace) - if (!metaFolder) { - metaFolder = await createDefaultMetaFolder(selectedSpace) - } - - return loadingService.addTask(async () => { - // overwriting the content-type header only works if the provided content is not of type object, - // therefore it has to be converted to a ArrayBuffer which allows the overwrite. - // - // https://github.com/perry-mitchell/webdav-client/blob/dd8d0dcc319297edc70077abd74b935361bc2412/source/tools/body.ts#L18 - const content = await file.arrayBuffer() - const headers: Record = { - 'Content-Type': 'application/offset+octet-stream' - } - - if (file.lastModified) { - headers['X-OC-Mtime'] = '' + file.lastModified / 1000 - } - - try { - const { fileId } = await clientService.webdav.putFileContents(selectedSpace, { - parentFolderId: metaFolder.id, - fileName: file.name, - content, - headers, - overwrite: true - }) - - const updatedSpace = await graphClient.drives.updateDrive( - selectedSpace.id, - { - name: selectedSpace.name, - special: [{ specialFolder: { name: 'image' }, id: fileId }] - }, - sharesStore.graphRoles - ) - - spacesStore.updateSpaceField({ - id: selectedSpace.id, - field: 'spaceImageData', - value: updatedSpace.spaceImageData - }) - showMessage({ title: $gettext('Space image was uploaded successfully') }) - eventBus.publish('app.files.spaces.uploaded-image', updatedSpace) - } catch (error) { - console.error(error) - showErrorMessage({ - title: $gettext('Failed to upload space image'), - errors: [error] - }) - } - }) - } - - const actions = computed((): SpaceAction[] => [ - { - name: 'upload-space-image', - icon: 'image-add', - handler, - label: () => { - return $gettext('Edit image') - }, - isVisible: ({ resources }) => { - if (resources.length !== 1) { - return false - } - - return resources[0].canEditImage({ user: userStore.user }) - }, - class: 'oc-files-actions-upload-space-image-trigger' - } - ]) - - return { - actions, - uploadImageSpace - } -} diff --git a/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts b/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts deleted file mode 100644 index eb35e11defe..00000000000 --- a/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { computed } from 'vue' -import { omit } from 'lodash-es' -import { ContextualHelperData } from '@ownclouders/design-system/helpers' -import { useConfigStore } from '@ownclouders/web-pkg' -import { useGettext } from 'vue3-gettext' - -export const useContextualHelpers = () => { - const { $gettext } = useGettext() - const configStore = useConfigStore() - - const filterContextHelper = (data: ContextualHelperData): ContextualHelperData => { - if (configStore.options.contextHelpersReadMore === false) { - return omit(data, 'readMoreLink') - } - return data - } - - const shareInviteCollaboratorHelp = computed(() => - filterContextHelper({ - title: $gettext('Share with people'), - text: $gettext( - 'Use the input field to search for users and groups. Select them to share the item.' - ), - list: [ - { text: $gettext('Subfolders'), headline: true }, - { - text: $gettext( - 'If you share a folder, all of its contents and subfolders will be shared as well.' - ) - }, - { text: $gettext('Notification'), headline: true }, - { - text: $gettext( - 'People you share resources with will be notified via email or in-app notification.' - ) - }, - { text: $gettext('Incognito'), headline: true }, - { - text: $gettext('People you share resources with can not see who else has access.') - }, - { text: $gettext('"via folder"'), headline: true }, - { - text: $gettext( - 'The "via folder" is shown next to a share, if access has already been given via a parent folder. Click on the "via folder" to edit the share on its parent folder.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }) - ) - - const shareInviteCollaboratorHelpCern = computed(() => - filterContextHelper({ - title: '', - list: [ - { text: $gettext('Search for service or secondary Account'), headline: true }, - { - text: $gettext( - 'To search for service or secondary accounts prefix the username with "a:" (like "a:doe") and for guest accounts prefix the username with "l:" (like "l:doe").' - ) - } - ] - }) - ) - - const shareSpaceAddMemberHelp = computed(() => - filterContextHelper({ - title: $gettext('Add members to this Space'), - text: $gettext('Enter a name to add people or groups as members to this Space.'), - list: [ - { text: $gettext('Member capabilities'), headline: true }, - { - text: $gettext( - 'Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.' - ) - }, - { text: $gettext('Space manager capabilities'), headline: true }, - { - text: $gettext( - 'Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }) - ) - - const shareViaLinkHelp = computed(() => - filterContextHelper({ - title: $gettext('Choose how access is granted'), - list: [ - { - text: $gettext( - 'No login required. Everyone with the link can access. If you share this link with people from the list "Invited people", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }) - ) - - const shareViaIndirectLinkHelp = computed(() => - filterContextHelper({ - title: $gettext('What are indirect links?'), - text: $gettext('Indirect links are links giving access by a parent folder.'), - list: [ - { - text: $gettext('How to edit indirect links'), - headline: true - }, - { - text: $gettext( - 'Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }) - ) - - const tagsHelper = computed(() => - filterContextHelper({ - title: $gettext('Who can view tags?'), - list: [ - { - text: $gettext( - 'Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.' - ) - } - ] - }) - ) - - return { - shareInviteCollaboratorHelp, - shareInviteCollaboratorHelpCern, - shareSpaceAddMemberHelp, - shareViaLinkHelp, - shareViaIndirectLinkHelp, - tagsHelper - } -} diff --git a/packages/web-app-files/src/composables/extensions/useFileActions.ts b/packages/web-app-files/src/composables/extensions/useFileActions.ts deleted file mode 100644 index 29f5867cf94..00000000000 --- a/packages/web-app-files/src/composables/extensions/useFileActions.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - ActionExtension, - useFileActionsCopyPermanentLink, - useFileActionsOpenShortcut, - useFileActionsShowShares -} from '@ownclouders/web-pkg' -import { - contextActionsExtensionPoint, - defaultActionsExtensionPoint, - quickActionsExtensionPoint -} from '../../extensionPoints' -import { unref } from 'vue' - -export const useFileActions = (): ActionExtension[] => { - const { actions: openShortcutActions } = useFileActionsOpenShortcut() - const { actions: showSharesActions } = useFileActionsShowShares() - const { actions: permanentLinkActions } = useFileActionsCopyPermanentLink() - - return [ - { - id: 'com.github.owncloud.web.files.context-action.open-shortcut', - extensionPointIds: [contextActionsExtensionPoint.id, defaultActionsExtensionPoint.id], - type: 'action', - action: unref(openShortcutActions)[0] - }, - { - id: 'com.github.owncloud.web.files.quick-action.collaborator', - extensionPointIds: [quickActionsExtensionPoint.id], - type: 'action', - action: unref(showSharesActions)[0] - }, - { - id: 'com.github.owncloud.web.files.quick-action.quicklink', - extensionPointIds: [quickActionsExtensionPoint.id], - type: 'action', - action: unref(permanentLinkActions)[0] - } - ] -} diff --git a/packages/web-app-files/src/composables/extensions/useFileSideBars.ts b/packages/web-app-files/src/composables/extensions/useFileSideBars.ts deleted file mode 100644 index b8f086f3502..00000000000 --- a/packages/web-app-files/src/composables/extensions/useFileSideBars.ts +++ /dev/null @@ -1,373 +0,0 @@ -import FileDetails from '../../components/SideBar/Details/FileDetails.vue' -import FileDetailsMultiple from '../../components/SideBar/Details/FileDetailsMultiple.vue' -import ExifPanel from '../../components/SideBar/Exif/ExifPanel.vue' -import FileActions from '../../components/SideBar/Actions/FileActions.vue' -import FileVersions from '../../components/SideBar/Versions/FileVersions.vue' -import SharesPanel from '../../components/SideBar/Shares/SharesPanel.vue' -import NoSelection from '../../components/SideBar/NoSelection.vue' -import TrashNoSelection from '../../components/SideBar/TrashNoSelection.vue' -import SpaceActions from '../../components/SideBar/Actions/SpaceActions.vue' -import ActivitiesPanel from '../../components/SideBar/ActivitiesPanel.vue' -import { - SpaceDetails, - SpaceDetailsMultiple, - SpaceNoSelection, - isLocationTrashActive, - isLocationSpacesActive, - isLocationSharesActive, - useRouter, - SidebarPanelExtension, - useIsFilesAppActive, - useGetMatchingSpace, - useCapabilityStore, - useCanListShares, - useCanListVersions -} from '@ownclouders/web-pkg' -import { isProjectSpaceResource, SpaceResource } from '@ownclouders/web-client' -import { Resource } from '@ownclouders/web-client' -import { useGettext } from 'vue3-gettext' -import { unref } from 'vue' -import { fileSideBarExtensionPoint } from '../../extensionPoints' -import AudioMetaPanel from '../../components/SideBar/Audio/AudioMetaPanel.vue' -import { isEmpty } from 'lodash-es' - -export const useSideBarPanels = (): SidebarPanelExtension[] => { - const router = useRouter() - const capabilityStore = useCapabilityStore() - const { $gettext } = useGettext() - const isFilesAppActive = useIsFilesAppActive() - const { isPersonalSpaceRoot } = useGetMatchingSpace() - const { canListShares } = useCanListShares() - const { canListVersions } = useCanListVersions() - - return [ - { - id: 'com.github.owncloud.web.files.sidebar-panel.no-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'no-selection', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: NoSelection, - isRoot: () => true, - isVisible: ({ parent, items }) => { - if (isLocationTrashActive(router, 'files-trash-overview')) { - // trash overview has its own "no selection" panel - return false - } - if (isLocationSpacesActive(router, 'files-spaces-projects')) { - // project spaces overview has its own "no selection" panel - return false - } - if (items?.length > 0) { - return false - } - // empty selection in a project space root shows a "details" panel for the space itself - return !isProjectSpaceResource(parent) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.trash-no-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'no-selection', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: TrashNoSelection, - isRoot: () => true, - isVisible: () => { - return isLocationTrashActive(router, 'files-trash-overview') - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.details-single-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'details', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: FileDetails, - componentAttrs: ({ items }) => ({ - previewEnabled: unref(isFilesAppActive), - tagsEnabled: - !isPersonalSpaceRoot(items[0]) && !isLocationTrashActive(router, 'files-trash-generic'), - versionsEnabled: !isLocationTrashActive(router, 'files-trash-generic') - }), - isRoot: () => true, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - // project spaces have their own "details" panel - return !isProjectSpaceResource(items[0]) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.details-multi-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'details-multiple', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: FileDetailsMultiple, - componentAttrs: () => ({ - get showSpaceCount() { - return ( - !isLocationSpacesActive(router, 'files-spaces-generic') && - !isLocationSharesActive(router, 'files-shares-with-me') && - !isLocationTrashActive(router, 'files-trash-generic') - ) - } - }), - isRoot: () => true, - isVisible: ({ items }) => { - if (isLocationSpacesActive(router, 'files-spaces-projects')) { - // project spaces overview has its own "no selection" panel - return false - } - return items?.length > 1 - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.exif', - type: 'sidebarPanel', - extensionPointIds: ['global.files.sidebar'], - panel: { - name: 'exif', - icon: 'image', - title: () => $gettext('Image Info'), - component: ExifPanel, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - const item = items[0] - if (item.type !== 'file') { - return false - } - return !isEmpty(item.image) || !isEmpty(item.photo) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.audio-meta', - type: 'sidebarPanel', - extensionPointIds: ['global.files.sidebar'], - panel: { - name: 'audio-meta', - icon: 'music', - title: () => $gettext('Audio Info'), - component: AudioMetaPanel, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - const item = items[0] - if (item.type !== 'file') { - return false - } - return !isEmpty(item.audio) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.actions', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'actions', - icon: 'play-circle', - iconFillType: 'line', - title: () => $gettext('Actions'), - component: FileActions, - isRoot: () => false, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - if (isPersonalSpaceRoot(items[0])) { - // actions panel is not available on the personal space root for now ;-) - return false - } - // project spaces have their own "actions" panel - return !isProjectSpaceResource(items[0]) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.sharing', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'sharing', - icon: 'user-add', - iconFillType: 'line', - title: () => $gettext('Shares'), - component: SharesPanel, - componentAttrs: () => ({ - showSpaceMembers: false, - get showLinks() { - return capabilityStore.sharingPublicEnabled - } - }), - isVisible: ({ items, root }) => { - if (items?.length !== 1) { - return false - } - if (isProjectSpaceResource(items[0])) { - // project space roots have their own "sharing" panel (= space members) - return false - } - return canListShares({ space: root, resource: items[0] }) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.versions', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'versions', - icon: 'git-branch', - title: () => $gettext('Versions'), - component: FileVersions, - componentAttrs: () => ({ - isReadOnly: !unref(isFilesAppActive) - }), - isVisible: ({ items, root }) => { - if (items?.length !== 1) { - return false - } - return canListVersions({ space: root, resource: items[0] }) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.projects.no-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'no-selection', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: SpaceNoSelection, - isRoot: () => true, - isVisible: ({ items }) => { - if (!isLocationSpacesActive(router, 'files-spaces-projects')) { - // only for project spaces overview - return false - } - return items?.length === 0 - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.projects.details-single-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'details-space', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: SpaceDetails, - isRoot: () => true, - isVisible: ({ items }) => { - return items?.length === 1 && isProjectSpaceResource(items[0]) - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.projects.details-multi-selection', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'details-space-multiple', - icon: 'questionnaire-line', - title: () => $gettext('Details'), - component: SpaceDetailsMultiple, - componentAttrs: ({ items }) => ({ - selectedSpaces: items - }), - isRoot: () => true, - isVisible: ({ items }) => { - return items?.length > 1 && isLocationSpacesActive(router, 'files-spaces-projects') - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.projects.actions', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'space-actions', - icon: 'play-circle', - iconFillType: 'line', - title: () => $gettext('Actions'), - component: SpaceActions, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - if (!isProjectSpaceResource(items[0])) { - return false - } - if ( - !isLocationSpacesActive(router, 'files-spaces-projects') && - !isLocationSpacesActive(router, 'files-spaces-generic') - ) { - return false - } - return true - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.projects.sharing', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'space-share', - icon: 'group', - title: () => $gettext('Members'), - component: SharesPanel, - componentAttrs: () => ({ - showSpaceMembers: true, - get showLinks() { - return capabilityStore.sharingPublicEnabled - } - }), - isVisible: ({ items }) => { - return items?.length === 1 && isProjectSpaceResource(items[0]) && !items[0].disabled - } - } - }, - { - id: 'com.github.owncloud.web.files.sidebar-panel.activities', - type: 'sidebarPanel', - extensionPointIds: [fileSideBarExtensionPoint.id], - panel: { - name: 'activities', - icon: 'pulse', - title: () => $gettext('Activities'), - component: ActivitiesPanel, - isVisible: ({ items }) => { - if (items?.length !== 1) { - return false - } - if (isLocationTrashActive(router, 'files-trash-generic')) { - return false - } - return true - } - } - } - ] -} diff --git a/packages/web-app-files/src/composables/extensions/useFolderViews.ts b/packages/web-app-files/src/composables/extensions/useFolderViews.ts deleted file mode 100644 index 563f3258d0d..00000000000 --- a/packages/web-app-files/src/composables/extensions/useFolderViews.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { FolderViewExtension, ResourceTable, ResourceTiles } from '@ownclouders/web-pkg' -import { useGettext } from 'vue3-gettext' -import { - folderViewsFavoritesExtensionPoint, - folderViewsFolderExtensionPoint, - folderViewsProjectSpacesExtensionPoint -} from '../../extensionPoints' - -export const useFolderViews = (): FolderViewExtension[] => { - const { $gettext } = useGettext() - - return [ - { - id: 'com.github.owncloud.web.files.folder-view.resource-table', - type: 'folderView', - extensionPointIds: [ - folderViewsFolderExtensionPoint.id, - folderViewsProjectSpacesExtensionPoint.id, - folderViewsFavoritesExtensionPoint.id - ], - folderView: { - name: 'resource-table', - label: $gettext('Switch to default table view'), - icon: { - name: 'menu-line', - fillType: 'none' - }, - component: ResourceTable - } - }, - { - id: 'com.github.owncloud.web.files.folder-view.resource-table-condensed', - type: 'folderView', - extensionPointIds: [folderViewsFolderExtensionPoint.id], - folderView: { - name: 'resource-table-condensed', - label: $gettext('Switch to condensed table view'), - icon: { - name: 'menu-line-condensed', - fillType: 'none' - }, - component: ResourceTable - } - }, - { - id: 'com.github.owncloud.web.files.folder-view.resource-tiles', - type: 'folderView', - extensionPointIds: [ - folderViewsFolderExtensionPoint.id, - folderViewsProjectSpacesExtensionPoint.id, - folderViewsFavoritesExtensionPoint.id - ], - folderView: { - name: 'resource-tiles', - label: $gettext('Switch to tiles view'), - icon: { - name: 'apps-2', - fillType: 'line' - }, - component: ResourceTiles - } - } - ] -} diff --git a/packages/web-app-files/src/composables/index.ts b/packages/web-app-files/src/composables/index.ts deleted file mode 100644 index 38b2d94befe..00000000000 --- a/packages/web-app-files/src/composables/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './actions' -export * from './resourcesViewDefaults' diff --git a/packages/web-app-files/src/composables/keyboardActions/index.ts b/packages/web-app-files/src/composables/keyboardActions/index.ts deleted file mode 100644 index b61746f8681..00000000000 --- a/packages/web-app-files/src/composables/keyboardActions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './useKeyboardTableNavigation' -export * from './useKeyboardTableMouseActions' -export * from './useKeyboardTableActions' -export * from './useKeyboardTableSpaceActions' diff --git a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableActions.ts b/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableActions.ts deleted file mode 100644 index 3e1043f56d0..00000000000 --- a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableActions.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - Key, - KeyboardActions, - Modifier, - useClipboardStore, - useResourcesStore -} from '@ownclouders/web-pkg' - -export const useKeyboardTableActions = (keyActions: KeyboardActions) => { - const resourcesStore = useResourcesStore() - const { copyResources } = useClipboardStore() - - keyActions.bindKeyAction({ modifier: Modifier.Ctrl, primary: Key.C }, () => { - copyResources(resourcesStore.selectedResources) - }) -} diff --git a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableMouseActions.ts b/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableMouseActions.ts deleted file mode 100644 index 5ee84e597a8..00000000000 --- a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableMouseActions.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { onBeforeUnmount, onMounted, unref, Ref, watchEffect } from 'vue' -import { QueryValue, FolderViewModeConstants, useResourcesStore } from '@ownclouders/web-pkg' -import { eventBus } from '@ownclouders/web-pkg' -import { KeyboardActions } from '@ownclouders/web-pkg' -import { Resource } from '@ownclouders/web-client' -import { findIndex } from 'lodash-es' -import { storeToRefs } from 'pinia' - -export const useKeyboardTableMouseActions = ( - keyActions: KeyboardActions, - viewMode: Ref -) => { - const resourcesStore = useResourcesStore() - const { latestSelectedId } = storeToRefs(resourcesStore) - - let fileListClickedEvent: string - let fileListClickedMetaEvent: string - let fileListClickedShiftEvent: string - - const handleCtrlClickAction = (resource: Resource) => { - resourcesStore.toggleSelection(resource.id) - } - - const handleShiftClickAction = ({ - resource, - skipTargetSelection - }: { - resource: Resource - skipTargetSelection: boolean - }) => { - const parent = document.querySelectorAll(`[data-item-id='${resource.id}']`)[0] - const resourceNodes = Object.values(parent.parentNode.children) - const latestNode = resourceNodes.find( - (r) => r.getAttribute('data-item-id') === unref(latestSelectedId) - ) - const clickedNode = resourceNodes.find((r) => r.getAttribute('data-item-id') === resource.id) - - let latestNodeIndex = resourceNodes.indexOf(latestNode) - latestNodeIndex = latestNodeIndex === -1 ? 0 : latestNodeIndex - - const clickedNodeIndex = resourceNodes.indexOf(clickedNode) - const minIndex = Math.min(latestNodeIndex, clickedNodeIndex) - const maxIndex = Math.max(latestNodeIndex, clickedNodeIndex) - - for (let i = minIndex; i <= maxIndex; i++) { - const nodeId = resourceNodes[i].getAttribute('data-item-id') - const isDisabled = resourceNodes[i].classList.contains('oc-table-disabled') - if ((skipTargetSelection && nodeId === resource.id) || isDisabled) { - continue - } - resourcesStore.addSelection(nodeId) - } - resourcesStore.setLastSelectedId(resource.id) - } - - const handleTilesShiftClickAction = ({ - resource, - skipTargetSelection - }: { - resource: Resource - skipTargetSelection: boolean - }) => { - const tilesListCard = document.querySelectorAll('#tiles-view > ul > li > div') - const startIndex = findIndex( - tilesListCard, - (r) => r.getAttribute('data-item-id') === resource.id - ) - const endIndex = findIndex( - tilesListCard, - (r) => r.getAttribute('data-item-id') === unref(latestSelectedId) - ) - const minIndex = Math.min(endIndex, startIndex) - const maxIndex = Math.max(endIndex, startIndex) - - for (let i = minIndex; i <= maxIndex; i++) { - const nodeId = tilesListCard[i].getAttribute('data-item-id') - const isDisabled = tilesListCard[i].classList.contains('oc-tile-card-disabled') - - if ((skipTargetSelection && nodeId === resource.id) || isDisabled) { - continue - } - resourcesStore.addSelection(nodeId) - } - resourcesStore.setLastSelectedId(resource.id) - } - - onMounted(() => { - fileListClickedEvent = eventBus.subscribe( - 'app.files.list.clicked', - keyActions.resetSelectionCursor - ) - fileListClickedMetaEvent = eventBus.subscribe( - 'app.files.list.clicked.meta', - handleCtrlClickAction - ) - }) - - onBeforeUnmount(() => { - eventBus.unsubscribe('app.files.list.clicked', fileListClickedEvent) - eventBus.unsubscribe('app.files.list.clicked.meta', fileListClickedMetaEvent) - eventBus.unsubscribe('app.files.list.clicked.shift', fileListClickedShiftEvent) - }) - watchEffect(() => { - eventBus.unsubscribe('app.files.list.clicked.shift', fileListClickedShiftEvent) - fileListClickedShiftEvent = eventBus.subscribe( - 'app.files.list.clicked.shift', - FolderViewModeConstants.name.tiles === viewMode.value - ? handleTilesShiftClickAction - : handleShiftClickAction - ) - }) -} diff --git a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableNavigation.ts b/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableNavigation.ts deleted file mode 100644 index 12a9d99eb65..00000000000 --- a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableNavigation.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { QueryValue, useResourcesStore, FolderViewModeConstants } from '@ownclouders/web-pkg' -import { useScrollTo } from '@ownclouders/web-pkg' -import { Ref, ref, unref, nextTick, watchEffect } from 'vue' -import { Key, KeyboardActions, Modifier, focusCheckbox } from '@ownclouders/web-pkg' -import { Resource } from '@ownclouders/web-client' -import { findIndex } from 'lodash-es' -import { storeToRefs } from 'pinia' - -const enum Direction { - LEFT = 'left', - RIGHT = 'right' -} -export const useKeyboardTableNavigation = ( - keyActions: KeyboardActions, - paginatedResources: Ref, - viewMode: Ref -) => { - const { scrollToResource } = useScrollTo() - const resourcesStore = useResourcesStore() - const { latestSelectedId } = storeToRefs(resourcesStore) - - const bindKeyActionsIds: Ref = ref([]) - const tileViewStart = ref(null) - const tileViewDirection = ref(null) - - keyActions.bindKeyAction({ modifier: Modifier.Ctrl, primary: Key.A }, () => - handleSelectAllAction() - ) - - keyActions.bindKeyAction({ primary: Key.Space }, () => { - resourcesStore.toggleSelection(unref(latestSelectedId)) - }) - - keyActions.bindKeyAction({ primary: Key.Esc }, () => { - keyActions.resetSelectionCursor() - tileViewStart.value = null - resourcesStore.resetSelection() - }) - - const bindTilesViewKeyActions = () => { - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowLeft }, () => handleNavigateAction(true)) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowRight }, () => handleNavigateAction()) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowUp }, async () => { - const elementsInRow = getElementsInRow() - if (elementsInRow === -1) { - return - } - await handleNavigateAction(true, elementsInRow) - }) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowDown }, async () => { - const elementsInRow = getElementsInRow() - if (elementsInRow === -1) { - return - } - await handleNavigateAction(false, elementsInRow) - }) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowLeft }, () => - handleTilesShiftHorizontalAction(Direction.LEFT) - ) - ) - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowRight }, () => - handleTilesShiftHorizontalAction(Direction.RIGHT) - ) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowUp }, () => { - handleTilesShiftUpAction() - }) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowDown }, () => { - handleTilesShiftDownAction() - }) - ) - } - - const bindTableViewKeyActions = () => { - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowUp }, () => handleNavigateAction(true)) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ primary: Key.ArrowDown }, () => handleNavigateAction()) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowUp }, () => - handleShiftUpAction() - ) - ) - - bindKeyActionsIds.value.push( - keyActions.bindKeyAction({ modifier: Modifier.Shift, primary: Key.ArrowDown }, () => - handleShiftDownAction() - ) - ) - } - - const handleNavigateAction = async (up = false, moveBy = 1) => { - const nextId = !unref(latestSelectedId) ? getFirstResourceId() : getNextResourceId(up, moveBy) - if (nextId === -1) { - return - } - keyActions.resetSelectionCursor() - tileViewStart.value = null - resourcesStore.resetSelection() - await nextTick() - resourcesStore.addSelection(nextId) - await nextTick() - focusCheckbox(nextId) - scrollToResource(nextId, { topbarElement: 'files-app-bar' }) - } - - const getNextResourceId = (previous = false, movedBy = 1) => { - const latestSelectedResourceIndex = paginatedResources.value.findIndex( - (resource) => resource.id === latestSelectedId.value - ) - if (latestSelectedResourceIndex === -1) { - return -1 - } - - const step = previous ? -movedBy : movedBy - let nextResourceIndex = latestSelectedResourceIndex + step - - while (nextResourceIndex >= 0 && nextResourceIndex < paginatedResources.value.length) { - if (paginatedResources.value[nextResourceIndex].processing !== true) { - return paginatedResources.value[nextResourceIndex].id - } - nextResourceIndex += step - } - - if (nextResourceIndex < 0 || nextResourceIndex >= paginatedResources.value.length) { - return -1 - } - return paginatedResources.value[nextResourceIndex].id - } - - const getFirstResourceId = () => { - return paginatedResources.value.length ? paginatedResources.value[0].id : -1 - } - - const getElementsInRow = () => { - const tilesListCard = document.querySelectorAll('#tiles-view > ul > li > div') - if (tilesListCard.length === 0) { - return -1 - } - const firstElement = Math.floor(tilesListCard[0].getBoundingClientRect().x) - let elementsInRow = 1 - - for (let i = 1; i < tilesListCard.length; i++) { - if (Math.floor(tilesListCard[i].getBoundingClientRect().x) !== firstElement) { - elementsInRow++ - } else { - break - } - } - return elementsInRow - } - - const handleSelectAllAction = () => { - keyActions.resetSelectionCursor() - resourcesStore.setSelection( - unref(paginatedResources) - .filter((resource) => resource.processing !== true) - .map(({ id }) => id) - ) - } - - const getVerticalProperties = (viewDirection: Direction) => { - const elementsInRow = getElementsInRow() - if (elementsInRow === -1) { - return {} - } - - if (!unref(tileViewStart)) { - tileViewStart.value = latestSelectedId.value - tileViewDirection.value = viewDirection - } - - const tilesListCard = document.querySelectorAll('#tiles-view > ul > li > div') - - const currentResourceIndex = findIndex( - tilesListCard, - (tile) => tile.getAttribute('data-item-id') === unref(latestSelectedId).toString() - ) - - const tileViewStartIndex = findIndex(tilesListCard, (tile) => { - return tile.getAttribute('data-item-id') === unref(tileViewStart).toString() - }) - - const nextIndex = - viewDirection === Direction.LEFT - ? currentResourceIndex - elementsInRow - : currentResourceIndex + elementsInRow - - if (!tilesListCard[nextIndex]) { - return {} - } - - const lastSelectedFileId = tilesListCard[nextIndex].getAttribute('data-item-id') - - return { - currentResourceIndex, - nextIndex, - tilesListCard, - tileViewStartIndex, - lastSelectedFileId - } - } - - const handleTilesShiftUpAction = () => { - const vp = getVerticalProperties(Direction.LEFT) - if (Object.keys(vp).length === 0) { - return - } - for (let i = vp.currentResourceIndex; i >= vp.nextIndex; i--) { - if (i === vp.tileViewStartIndex) { - continue - } - const id = vp.tilesListCard[i].getAttribute('data-item-id') - i < vp.tileViewStartIndex - ? resourcesStore.addSelection(id) - : resourcesStore.removeSelection(id) - } - focusCheckbox(vp.lastSelectedFileId) - resourcesStore.setLastSelectedId(vp.lastSelectedFileId) - } - const handleTilesShiftDownAction = () => { - const vp = getVerticalProperties(Direction.RIGHT) - if (Object.keys(vp).length === 0) { - return - } - - for (let i = vp.currentResourceIndex; i <= vp.nextIndex; i++) { - if (i === vp.tileViewStartIndex) { - continue - } - const id = vp.tilesListCard[i].getAttribute('data-item-id') - i > vp.tileViewStartIndex - ? resourcesStore.addSelection(id) - : resourcesStore.removeSelection(id) - } - focusCheckbox(vp.lastSelectedFileId) - resourcesStore.setLastSelectedId(vp.lastSelectedFileId) - } - - const handleTilesShiftHorizontalAction = (direction: Direction) => { - const nextResourceId = !unref(latestSelectedId) - ? getFirstResourceId() - : getNextResourceId(direction === Direction.LEFT, 1) - if (nextResourceId === -1) { - return - } - - if (unref(latestSelectedId) === unref(tileViewStart)) { - tileViewStart.value = unref(latestSelectedId) - tileViewDirection.value = direction - } - - if (!unref(tileViewStart)) { - tileViewStart.value = latestSelectedId.value - tileViewDirection.value = direction - } - if (tileViewDirection.value !== direction && tileViewDirection.value !== null) { - resourcesStore.toggleSelection(unref(latestSelectedId)) - resourcesStore.setLastSelectedId(nextResourceId) - } - if (tileViewDirection.value === direction) { - resourcesStore.addSelection(nextResourceId) - } - focusCheckbox(nextResourceId) - } - - const handleShiftUpAction = (movedBy = 1) => { - const nextResourceId = getNextResourceId(true, movedBy) - if (nextResourceId === -1) { - return - } - if (unref(keyActions.selectionCursor) > 0) { - resourcesStore.toggleSelection(unref(latestSelectedId)) - resourcesStore.setLastSelectedId(nextResourceId) - } else { - resourcesStore.addSelection(nextResourceId) - } - focusCheckbox(nextResourceId) - scrollToResource(nextResourceId, { topbarElement: 'files-app-bar' }) - keyActions.selectionCursor.value = unref(keyActions.selectionCursor) - 1 - } - const handleShiftDownAction = (movedBy = 1) => { - const nextResourceId = getNextResourceId(false, movedBy) - if (nextResourceId === -1) { - return - } - if (unref(keyActions.selectionCursor) < 0) { - resourcesStore.toggleSelection(unref(latestSelectedId)) - resourcesStore.setLastSelectedId(nextResourceId) - } else { - resourcesStore.addSelection(nextResourceId) - } - focusCheckbox(nextResourceId) - scrollToResource(nextResourceId, { topbarElement: 'files-app-bar' }) - keyActions.selectionCursor.value = unref(keyActions.selectionCursor) + 1 - } - - watchEffect(() => { - bindKeyActionsIds.value.forEach((id) => keyActions.removeKeyAction(id)) - bindKeyActionsIds.value = [] - FolderViewModeConstants.name.tiles === viewMode.value - ? bindTilesViewKeyActions() - : bindTableViewKeyActions() - }) -} diff --git a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableSpaceActions.ts b/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableSpaceActions.ts deleted file mode 100644 index c67ad24e66e..00000000000 --- a/packages/web-app-files/src/composables/keyboardActions/useKeyboardTableSpaceActions.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - Key, - KeyboardActions, - Modifier, - useClipboardStore, - useResourcesStore -} from '@ownclouders/web-pkg' -import { SpaceResource } from '@ownclouders/web-client' -import { Ref, unref } from 'vue' -import { useFileActionsPaste } from '@ownclouders/web-pkg' - -export const useKeyboardTableSpaceActions = ( - keyActions: KeyboardActions, - space: Ref -) => { - const { copyResources, cutResources } = useClipboardStore() - const resourcesStore = useResourcesStore() - - const { actions: pasteFileActions } = useFileActionsPaste() - const pasteFileAction = unref(pasteFileActions)[0].handler - - keyActions.bindKeyAction({ modifier: Modifier.Ctrl, primary: Key.C }, () => { - copyResources(resourcesStore.selectedResources) - }) - - keyActions.bindKeyAction({ modifier: Modifier.Ctrl, primary: Key.V }, () => { - pasteFileAction({ space: unref(space) }) - }) - - keyActions.bindKeyAction({ modifier: Modifier.Ctrl, primary: Key.X }, () => { - cutResources(resourcesStore.selectedResources) - }) -} diff --git a/packages/web-app-files/src/composables/resourcesViewDefaults/index.ts b/packages/web-app-files/src/composables/resourcesViewDefaults/index.ts deleted file mode 100644 index 45cac086e8f..00000000000 --- a/packages/web-app-files/src/composables/resourcesViewDefaults/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useResourcesViewDefaults' diff --git a/packages/web-app-files/src/composables/resourcesViewDefaults/useResourcesViewDefaults.ts b/packages/web-app-files/src/composables/resourcesViewDefaults/useResourcesViewDefaults.ts deleted file mode 100644 index 9985e96bc23..00000000000 --- a/packages/web-app-files/src/composables/resourcesViewDefaults/useResourcesViewDefaults.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { nextTick, computed, unref, Ref } from 'vue' -import { fileList } from '../../helpers/ui' -import { - usePagination, - useSort, - SortDir, - SortField, - useRouteName, - useResourcesStore, - folderService -} from '@ownclouders/web-pkg' -import { useSideBar } from '@ownclouders/web-pkg' -import { queryItemAsString, useRouteQuery } from '@ownclouders/web-pkg' -import { - determineResourceTableSortFields, - determineResourceTilesSortFields, - translateSortFields -} from '@ownclouders/web-pkg' -import { Task } from 'vue-concurrency' -import { Resource } from '@ownclouders/web-client' -import { useSelectedResources, SelectedResourcesResult } from '@ownclouders/web-pkg' -import { ReadOnlyRef } from '@ownclouders/web-pkg' -import { - useFileListHeaderPosition, - useViewMode, - useViewSize, - FolderViewModeConstants -} from '@ownclouders/web-pkg' - -import { ScrollToResult, useScrollTo } from '@ownclouders/web-pkg' -import { useGettext } from 'vue3-gettext' - -interface ResourcesViewDefaultsOptions { - loadResourcesTask?: Task -} - -type ResourcesViewDefaultsResult = { - fileListHeaderY: Ref - refreshFileListHeaderPosition(): void - loadResourcesTask: Task - areResourcesLoading: ReadOnlyRef - storeItems: ReadOnlyRef - sortFields: ReadOnlyRef - paginatedResources: Ref - paginationPages: ReadOnlyRef - paginationPage: ReadOnlyRef - handleSort({ sortBy, sortDir }: { sortBy: string; sortDir: SortDir }): void - sortBy: ReadOnlyRef - sortDir: ReadOnlyRef - viewMode: ReadOnlyRef - viewSize: ReadOnlyRef - selectedResources: Ref - selectedResourcesIds: Ref - isResourceInSelection(resource: Resource): boolean - - isSideBarOpen: Ref - sideBarActivePanel: Ref -} & SelectedResourcesResult & - ScrollToResult - -export const useResourcesViewDefaults = ( - options: ResourcesViewDefaultsOptions = {} -): ResourcesViewDefaultsResult => { - const loadResourcesTask = options.loadResourcesTask || folderService.getTask() - const areResourcesLoading = computed(() => { - return loadResourcesTask.isRunning || !loadResourcesTask.last - }) - - const language = useGettext() - const resourcesStore = useResourcesStore() - const storeItems = computed(() => resourcesStore.activeResources) as unknown as Ref - - const { refresh: refreshFileListHeaderPosition, y: fileListHeaderY } = useFileListHeaderPosition() - - const currentRoute = useRouteName() - const currentViewModeQuery = useRouteQuery( - `${unref(currentRoute)}-${FolderViewModeConstants.queryName}`, - FolderViewModeConstants.defaultModeName - ) - const currentViewMode = computed((): string => queryItemAsString(currentViewModeQuery.value)) - const viewMode = useViewMode(currentViewMode) - - const currentTilesSizeQuery = useRouteQuery('tiles-size', '1') - const currentTilesSize = computed((): string => String(currentTilesSizeQuery.value)) - const viewSize = useViewSize(currentTilesSize) - - const sortFields = computed((): SortField[] => { - if (unref(viewMode) === FolderViewModeConstants.name.tiles) { - return translateSortFields(determineResourceTilesSortFields(unref(storeItems)[0]), language) - } - return determineResourceTableSortFields(unref(storeItems)[0]) - }) - - const { sortBy, sortDir, items, handleSort } = useSort({ - items: storeItems, - fields: sortFields - }) - const { - items: paginatedResources, - total: paginationPages, - page: paginationPage - } = usePagination({ items, perPageStoragePrefix: 'files' }) - - const accentuateItem = async (id: string) => { - await nextTick() - fileList.accentuateItem(id) - } - resourcesStore.$onAction((action) => { - if (action.name === 'upsertResource') { - accentuateItem(action.args[0].id) - } - }) - - return { - fileListHeaderY, - refreshFileListHeaderPosition, - loadResourcesTask, - areResourcesLoading, - storeItems, - sortFields, - viewMode, - viewSize, - paginatedResources, - paginationPages, - paginationPage, - handleSort, - sortBy, - sortDir, - ...useSelectedResources(), - ...useSideBar(), - ...useScrollTo() - } -} diff --git a/packages/web-app-files/src/extensionPoints.ts b/packages/web-app-files/src/extensionPoints.ts deleted file mode 100644 index d44a16e71ea..00000000000 --- a/packages/web-app-files/src/extensionPoints.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - ActionExtension, - ExtensionPoint, - FolderViewExtension, - SidebarPanelExtension -} from '@ownclouders/web-pkg' -import { computed } from 'vue' - -export const uploadMenuExtensionPoint: ExtensionPoint = { - id: 'app.files.upload-menu', - extensionType: 'action', - multiple: true -} -export const quickActionsExtensionPoint: ExtensionPoint = { - id: 'app.files.quick-actions', - extensionType: 'action', - multiple: true -} -export const batchActionsExtensionPoint: ExtensionPoint = { - id: 'global.files.batch-actions', - extensionType: 'action', - multiple: true -} -export const contextActionsExtensionPoint: ExtensionPoint = { - id: 'global.files.context-actions', - extensionType: 'action', - multiple: true -} -export const defaultActionsExtensionPoint: ExtensionPoint = { - id: 'global.files.default-actions', - extensionType: 'action', - multiple: true -} -export const fileSideBarExtensionPoint: ExtensionPoint> = { - id: 'global.files.sidebar', - extensionType: 'sidebarPanel', - multiple: true -} -export const folderViewsFolderExtensionPoint: ExtensionPoint = { - id: 'app.files.folder-views.folder', - extensionType: 'folderView' -} -export const folderViewsFavoritesExtensionPoint: ExtensionPoint = { - id: 'app.files.folder-views.favorites', - extensionType: 'folderView' -} -export const folderViewsProjectSpacesExtensionPoint: ExtensionPoint = { - id: 'app.files.folder-views.project-spaces', - extensionType: 'folderView' -} - -export const extensionPoints = () => { - return computed[]>(() => { - return [ - uploadMenuExtensionPoint, - quickActionsExtensionPoint, - batchActionsExtensionPoint, - contextActionsExtensionPoint, - defaultActionsExtensionPoint, - fileSideBarExtensionPoint, - folderViewsFolderExtensionPoint, - folderViewsFavoritesExtensionPoint, - folderViewsProjectSpacesExtensionPoint - ] - }) -} diff --git a/packages/web-app-files/src/extensions.ts b/packages/web-app-files/src/extensions.ts deleted file mode 100644 index 6341a1b846c..00000000000 --- a/packages/web-app-files/src/extensions.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - ApplicationInformation, - Extension, - useCapabilityStore, - useConfigStore, - useRouter, - useSearch, - useUserStore -} from '@ownclouders/web-pkg' -import { computed } from 'vue' -import { SDKSearch } from './search' -import { useSideBarPanels } from './composables/extensions/useFileSideBars' -import { useFolderViews } from './composables/extensions/useFolderViews' -import { useFileActions } from './composables/extensions/useFileActions' -import { urlJoin } from '@ownclouders/web-client' - -export const extensions = (appInfo: ApplicationInformation) => { - const capabilityStore = useCapabilityStore() - const configStore = useConfigStore() - const userStore = useUserStore() - const router = useRouter() - const { search: searchFunction } = useSearch() - - const fileActionExtensions = useFileActions() - const folderViewExtensions = useFolderViews() - const sideBarPanelExtensions = useSideBarPanels() - - return computed(() => [ - ...fileActionExtensions, - ...folderViewExtensions, - ...sideBarPanelExtensions, - { - id: 'com.github.owncloud.web.files.search', - extensionPointIds: ['app.search.provider'], - type: 'search', - searchProvider: new SDKSearch(capabilityStore, router, searchFunction, configStore) - }, - ...((userStore.user && [ - { - id: `app.${appInfo.id}.menuItem`, - type: 'appMenuItem', - label: () => appInfo.name, - color: appInfo.color, - icon: appInfo.icon, - priority: 10, - path: urlJoin(appInfo.id) - } - ]) || - []) - ]) -} diff --git a/packages/web-app-files/src/helpers/contextualHelpers.ts b/packages/web-app-files/src/helpers/contextualHelpers.ts deleted file mode 100644 index 470960e00ac..00000000000 --- a/packages/web-app-files/src/helpers/contextualHelpers.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { omit } from 'lodash-es' -import { ContextualHelperData } from '@ownclouders/design-system/helpers' -import { ConfigStore } from '@ownclouders/web-pkg' - -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} - -interface ContextualHelperOptions { - configStore: ConfigStore -} - -export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('Share with people'), - text: $gettext( - 'Use the input field to search for users and groups. Select them to share the item.' - ), - list: [ - { text: $gettext('Subfolders'), headline: true }, - { - text: $gettext( - 'If you share a folder, all of its contents and subfolders will be shared as well.' - ) - }, - { text: $gettext('Notification'), headline: true }, - { - text: $gettext( - 'People you share resources with will be notified via email or in-app notification.' - ) - }, - { text: $gettext('Incognito'), headline: true }, - { - text: $gettext('People you share resources with can not see who else has access.') - }, - { text: $gettext('“via folder”'), headline: true }, - { - text: $gettext( - 'The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }, - options - ) - -export const shareInviteCollaboratorHelpCern = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: '', - list: [ - { text: $gettext('Search for service or secondary Account'), headline: true }, - { - text: $gettext( - 'To search for service or secondary accounts prefix the username with "a:" (like "a:doe") and for guest accounts prefix the username with "l:" (like "l:doe").' - ) - } - ] - }, - options - ) - -export const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('Add members to this Space'), - text: $gettext('Enter a name to add people or groups as members to this Space.'), - list: [ - { text: $gettext('Member capabilities'), headline: true }, - { - text: $gettext( - 'Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.' - ) - }, - { text: $gettext('Space manager capabilities'), headline: true }, - { - text: $gettext( - 'Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }, - options - ) -export const shareViaLinkHelp = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('Choose how access is granted'), - list: [ - { - text: $gettext( - 'No login required. Everyone with the link can access. If you share this link with people from the list "Invited people", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }, - options - ) -export const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('What are indirect links?'), - text: $gettext('Indirect links are links giving access by a parent folder.'), - list: [ - { - text: $gettext('How to edit indirect links'), - headline: true - }, - { - text: $gettext( - 'Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.' - ) - } - ], - readMoreLink: 'https://doc.owncloud.com/go?to=webui-users-sharing' - }, - options - ) - -const filterContextHelper = ( - data: ContextualHelperData, - options?: ContextualHelperOptions -): ContextualHelperData => { - if (options.configStore.options.contextHelpersReadMore === false) { - return omit(data, 'readMoreLink') - } - return data -} - -export const tagsHelper = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('Who can view tags?'), - list: [ - { - text: $gettext( - 'Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.' - ) - } - ] - }, - options - ) diff --git a/packages/web-app-files/src/helpers/resource/actions/index.ts b/packages/web-app-files/src/helpers/resource/actions/index.ts deleted file mode 100644 index 116d6e0e1b7..00000000000 --- a/packages/web-app-files/src/helpers/resource/actions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './upload' diff --git a/packages/web-app-files/src/helpers/resource/actions/upload.ts b/packages/web-app-files/src/helpers/resource/actions/upload.ts deleted file mode 100644 index f3575dc2c33..00000000000 --- a/packages/web-app-files/src/helpers/resource/actions/upload.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { Language } from 'vue3-gettext' -import { Resource } from '@ownclouders/web-client' -import { extractExtensionFromFile } from '@ownclouders/web-client' -import { - ConflictDialog, - OcUppyFile, - ResolveConflict, - resolveFileNameDuplicate, - ResolveStrategy, - ResourceConflictModal, - ResourcesStore, - useModals -} from '@ownclouders/web-pkg' - -interface ConflictedResource { - name: string - type: string -} - -export class UploadResourceConflict extends ConflictDialog { - resourcesStore: ResourcesStore - - constructor(resourcesStore: ResourcesStore, language: Language) { - const { $gettext, $ngettext } = language - super($gettext, $ngettext) - - this.resourcesStore = resourcesStore - } - - resolveFileExists( - resource: Resource, - conflictCount: number, - suggestMerge = false, - separateSkipHandling = false // separate skip-handling between files and folders - ): Promise { - const { dispatchModal } = useModals() - - return new Promise((resolve) => { - dispatchModal({ - variation: 'danger', - title: resource.isFolder - ? this.$gettext('Folder already exists') - : this.$gettext('File already exists'), - hideActions: true, - customComponent: ResourceConflictModal, - customComponentAttrs: () => ({ - confirmSecondaryTextOverwrite: resource.isFolder - ? this.$gettext('Merge') - : this.$gettext('Replace'), - resource, - conflictCount, - suggestMerge, - separateSkipHandling, - callbackFn: (conflict: ResolveConflict) => { - resolve(conflict) - } - }) - }) - }) - } - - getConflicts(files: OcUppyFile[]): ConflictedResource[] { - const conflicts: ConflictedResource[] = [] - for (const file of files) { - const relativeFilePath = file.meta.relativePath - if (relativeFilePath) { - // Logic for folders, applies to all files inside folder and subfolders - const rootFolder = relativeFilePath.replace(/^\/+/, '').split('/')[0] - const exists = this.resourcesStore.resources.find((f) => f.name === rootFolder) - if (exists) { - if (conflicts.some((conflict) => conflict.name === rootFolder)) { - continue - } - conflicts.push({ name: rootFolder, type: 'folder' }) - continue - } - } - // Logic for files - const exists = this.resourcesStore.resources.find( - (f) => f.name === file.name && !file.meta.relativeFolder - ) - if (exists) { - conflicts.push({ name: file.name, type: 'file' }) - } - } - return conflicts - } - - async displayOverwriteDialog( - files: OcUppyFile[], - conflicts: ConflictedResource[] - ): Promise { - let fileCount = 0 - let folderCount = 0 - const resolvedFileConflicts: { name: string; strategy: ResolveStrategy }[] = [] - const resolvedFolderConflicts: { name: string; strategy: ResolveStrategy }[] = [] - let doForAllConflicts = false - let allConflictsStrategy - let doForAllConflictsFolders = false - let allConflictsStrategyFolders - - for (const conflict of conflicts) { - const isFolder = conflict.type === 'folder' - const conflictArray = isFolder ? resolvedFolderConflicts : resolvedFileConflicts - - if (doForAllConflicts && !isFolder) { - conflictArray.push({ - name: conflict.name, - strategy: allConflictsStrategy - }) - continue - } - if (doForAllConflictsFolders && isFolder) { - conflictArray.push({ - name: conflict.name, - strategy: allConflictsStrategyFolders - }) - continue - } - - const conflictsLeft = - conflicts.filter((c) => c.type === conflict.type).length - - (isFolder ? folderCount : fileCount) - - const resolvedConflict: ResolveConflict = await this.resolveFileExists( - { name: conflict.name, isFolder } as Resource, - conflictsLeft, - isFolder, - true - ) - isFolder ? folderCount++ : fileCount++ - if (resolvedConflict.doForAllConflicts) { - if (isFolder) { - doForAllConflictsFolders = true - allConflictsStrategyFolders = resolvedConflict.strategy - } else { - doForAllConflicts = true - allConflictsStrategy = resolvedConflict.strategy - } - } - - conflictArray.push({ - name: conflict.name, - strategy: resolvedConflict.strategy - }) - } - const filesToSkip = resolvedFileConflicts - .filter((e) => e.strategy === ResolveStrategy.SKIP) - .map((e) => e.name) - const foldersToSkip = resolvedFolderConflicts - .filter((e) => e.strategy === ResolveStrategy.SKIP) - .map((e) => e.name) - - files = files.filter((e) => !filesToSkip.includes(e.name)) - files = files.filter( - (file) => - !foldersToSkip.some((folderName) => file.meta.relativeFolder.split('/')[1] === folderName) - ) - - const filesToKeepBoth = resolvedFileConflicts - .filter((e) => e.strategy === ResolveStrategy.KEEP_BOTH) - .map((e) => e.name) - const foldersToKeepBoth = resolvedFolderConflicts - .filter((e) => e.strategy === ResolveStrategy.KEEP_BOTH) - .map((e) => e.name) - - for (const fileName of filesToKeepBoth) { - const file = files.find((e) => e.name === fileName && !e.meta.relativeFolder) - const extension = extractExtensionFromFile({ name: fileName } as Resource) - file.name = resolveFileNameDuplicate(fileName, extension, this.resourcesStore.resources) - file.meta.name = file.name - if (file.xhrUpload?.endpoint) { - const endpoint = - typeof file.xhrUpload.endpoint === 'function' - ? await file.xhrUpload.endpoint(file) - : file.xhrUpload.endpoint - - file.xhrUpload.endpoint = endpoint.replace( - new RegExp(`/${encodeURIComponent(fileName)}`), - `/${encodeURIComponent(file.name)}` - ) - } - } - for (const folder of foldersToKeepBoth) { - const filesInFolder = files.filter((e) => e.meta.relativeFolder.split('/')[1] === folder) - for (const file of filesInFolder) { - const newFolderName = resolveFileNameDuplicate(folder, '', this.resourcesStore.resources) - file.meta.relativeFolder = file.meta.relativeFolder.replace( - new RegExp(`/${folder}`), - `/${newFolderName}` - ) - file.meta.relativePath = file.meta.relativePath.replace( - new RegExp(`/${folder}/`), - `/${newFolderName}/` - ) - file.meta.tusEndpoint = file.meta.tusEndpoint.replace( - new RegExp(`/${encodeURIComponent(folder)}$`), - `/${encodeURIComponent(newFolderName)}` - ) - if (file.xhrUpload?.endpoint) { - const endpoint = - typeof file.xhrUpload.endpoint === 'function' - ? await file.xhrUpload.endpoint(file) - : file.xhrUpload.endpoint - - file.xhrUpload.endpoint = endpoint.replace( - new RegExp(`/${encodeURIComponent(folder)}$`), - `/${encodeURIComponent(newFolderName)}` - ) - } - if (file.tus?.endpoint) { - file.tus.endpoint = file.tus.endpoint.replace( - new RegExp(`/${encodeURIComponent(folder)}$`), - `/${encodeURIComponent(newFolderName)}` - ) - } - } - } - return files - } -} diff --git a/packages/web-app-files/src/helpers/resource/index.ts b/packages/web-app-files/src/helpers/resource/index.ts deleted file mode 100644 index 9fef387da76..00000000000 --- a/packages/web-app-files/src/helpers/resource/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './actions' diff --git a/packages/web-app-files/src/helpers/textUtils.ts b/packages/web-app-files/src/helpers/textUtils.ts deleted file mode 100644 index 98d4e4785b7..00000000000 --- a/packages/web-app-files/src/helpers/textUtils.ts +++ /dev/null @@ -1,60 +0,0 @@ -function _chunkify(t: string) { - // Adapted from http://my.opera.com/GreyWyvern/blog/show.dml/1671288 - const tz = [] - let x = 0 - let y = -1 - let n: number | boolean = 0 - let c: string - - while (x < t.length) { - c = t.charAt(x) - // only include the dot in strings - const m: boolean = (!n && c === '.') || (c >= '0' && c <= '9') - if (m !== n) { - // next chunk - y++ - tz[y] = '' - n = m - } - tz[y] += c - x++ - } - return tz -} - -/** - * Compare two strings to provide a natural sort - * @param a first string to compare - * @param b second string to compare - * @return number Negative integer if b comes before a, positive integer if a comes before b - * or 0 if the strings are identical - */ -function naturalSortCompare(a: string, b: string) { - const aa = _chunkify(a) - const bb = _chunkify(b) - let x: number, aNum: any, bNum: any - - for (x = 0; aa[x] && bb[x]; x++) { - if (aa[x] !== bb[x]) { - aNum = Number(aa[x]) - bNum = Number(bb[x]) - // note: == is correct here - - if (aNum == aa[x] && bNum == bb[x]) { - return aNum - bNum - } else { - // Forcing 'en' locale to match the server-side locale which is - // always 'en'. - // - // Note: This setting isn't supported by all browsers but for the ones - // that do there will be more consistency between client-server sorting - return aa[x].localeCompare(bb[x], 'en') - } - } - } - return aa.length - bb.length -} - -export const textUtils = { - naturalSortCompare -} diff --git a/packages/web-app-files/src/helpers/ui/filesList.ts b/packages/web-app-files/src/helpers/ui/filesList.ts deleted file mode 100644 index 87538d24e91..00000000000 --- a/packages/web-app-files/src/helpers/ui/filesList.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const accentuateItem = (id: string, clearTimeout = 3500): void => { - const item = document.querySelectorAll(`[data-item-id='${id}']`)[0] - - if (!item) { - return - } - - item.classList.add('oc-table-accentuated') - setTimeout(() => { - item.classList.remove('oc-table-accentuated') - }, clearTimeout) -} diff --git a/packages/web-app-files/src/helpers/ui/index.ts b/packages/web-app-files/src/helpers/ui/index.ts deleted file mode 100644 index 10d773d27d5..00000000000 --- a/packages/web-app-files/src/helpers/ui/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as fileList from './filesList' diff --git a/packages/web-app-files/src/helpers/user/avatarUrl.ts b/packages/web-app-files/src/helpers/user/avatarUrl.ts deleted file mode 100644 index a8aa0f37a28..00000000000 --- a/packages/web-app-files/src/helpers/user/avatarUrl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { cacheService, ClientService } from '@ownclouders/web-pkg' -import { ImageDimension } from '@ownclouders/web-pkg' - -interface AvatarUrlOptions { - clientService: ClientService - server: string - username: string - size?: number -} - -export const avatarUrl = async (options: AvatarUrlOptions, cached = false): Promise => { - const size = options.size || ImageDimension.Avatar - - if (cached) { - return cacheFactory({ ...options, size }) - } - - const url = [options.server, 'dav/avatars/', options.username, `/${size}.png`].join('') - - const { status, statusText } = await options.clientService.httpAuthenticated.head(url) - - if (status !== 200) { - throw new Error(statusText) - } - - return options.clientService.ocs.signUrl({ url, username: options.username }) -} - -const cacheFactory = async (options: AvatarUrlOptions): Promise => { - const hit = cacheService.avatarUrl.get(options.username) - if (hit && hit.size === options.size) { - return hit.src - } - - try { - const src = await avatarUrl(options) - return cacheService.avatarUrl.set(options.username, { src, size: options.size }, 0).src - } catch {} -} diff --git a/packages/web-app-files/src/helpers/user/index.ts b/packages/web-app-files/src/helpers/user/index.ts deleted file mode 100644 index 3f5f92a465c..00000000000 --- a/packages/web-app-files/src/helpers/user/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './avatarUrl' diff --git a/packages/web-app-files/src/index.ts b/packages/web-app-files/src/index.ts deleted file mode 100644 index 1a4988a2d07..00000000000 --- a/packages/web-app-files/src/index.ts +++ /dev/null @@ -1,162 +0,0 @@ -import App from './App.vue' -import Favorites from './views/Favorites.vue' -import FilesDrop from './views/FilesDrop.vue' -import SharedWithMe from './views/shares/SharedWithMe.vue' -import SharedWithOthers from './views/shares/SharedWithOthers.vue' -import SharedViaLink from './views/shares/SharedViaLink.vue' -import SpaceDriveResolver from './views/spaces/DriveResolver.vue' -import SpaceProjects from './views/spaces/Projects.vue' -import TrashOverview from './views/trash/Overview.vue' -import translations from '../l10n/translations.json' -import { - ApplicationInformation, - defineWebApplication, - useCapabilityStore, - useEmbedMode, - useSpacesStore, - useUserStore -} from '@ownclouders/web-pkg' -import { extensions } from './extensions' -import { buildRoutes } from '@ownclouders/web-pkg' -import { AppNavigationItem } from '@ownclouders/web-pkg' - -// dirty: importing view from other extension within project -import SearchResults from '../../web-app-search/src/views/List.vue' -import { isPersonalSpaceResource, isShareSpaceResource } from '@ownclouders/web-client' -import { ComponentCustomProperties, unref } from 'vue' -import { extensionPoints } from './extensionPoints' - -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} - -const appInfo: ApplicationInformation = { - name: $gettext('Files'), - id: 'files', - icon: 'resource-type-folder', - color: 'var(--oc-color-swatch-primary-muted)', - extensions: [] -} - -export const navItems = (context: ComponentCustomProperties): AppNavigationItem[] => { - const spacesStores = useSpacesStore() - const userStore = useUserStore() - const capabilityStore = useCapabilityStore() - const { isEnabled: isEmbedModeEnabled } = useEmbedMode() - - return [ - { - name() { - return $gettext('Personal') - }, - icon: appInfo.icon, - route: { - path: `/${appInfo.id}/spaces/personal` - }, - isActive: () => { - return !spacesStores.currentSpace || spacesStores.currentSpace?.isOwner(userStore.user) - }, - isVisible() { - if (!spacesStores.spacesInitialized) { - return true - } - - return !!spacesStores.spaces.find( - (drive) => isPersonalSpaceResource(drive) && drive.isOwner(userStore.user) - ) - }, - priority: 10 - }, - { - name: $gettext('Favorites'), - icon: 'star', - route: { - path: `/${appInfo.id}/favorites` - }, - isVisible() { - return capabilityStore.filesFavorites && context.$ability.can('read', 'Favorite') - }, - priority: 20 - }, - { - name: $gettext('Shares'), - icon: 'share-forward', - route: { - path: `/${appInfo.id}/shares` - }, - isActive: () => { - const space = spacesStores.currentSpace - // last check is when fullShareOwnerPaths is enabled - return !space || isShareSpaceResource(space) || !space?.isOwner(userStore.user) - }, - activeFor: [ - { path: `/${appInfo.id}/spaces/share` }, - { path: `/${appInfo.id}/spaces/ocm-share` }, - { path: `/${appInfo.id}/spaces/personal` } - ], - isVisible() { - return capabilityStore.sharingApiEnabled !== false - }, - priority: 30 - }, - { - name: $gettext('Spaces'), - icon: 'layout-grid', - route: { - path: `/${appInfo.id}/spaces/projects` - }, - activeFor: [{ path: `/${appInfo.id}/spaces/project` }], - isVisible() { - return capabilityStore.spacesProjects - }, - priority: 40 - }, - { - name: $gettext('Deleted files'), - icon: 'delete-bin-5', - route: { - path: `/${appInfo.id}/trash/overview` - }, - activeFor: [{ path: `/${appInfo.id}/trash` }], - isVisible() { - return ( - capabilityStore.davTrashbin === '1.0' && - capabilityStore.filesUndelete && - !unref(isEmbedModeEnabled) - ) - }, - priority: 50 - } - ] -} - -export default defineWebApplication({ - setup() { - return { - appInfo, - routes: buildRoutes({ - App, - Favorites, - FilesDrop, - SearchResults, - Shares: { - SharedViaLink, - SharedWithMe, - SharedWithOthers - }, - Spaces: { - DriveResolver: SpaceDriveResolver, - Projects: SpaceProjects - }, - Trash: { - Overview: TrashOverview - } - }), - navItems, - translations, - extensions: extensions(appInfo), - extensionPoints: extensionPoints() - } - } -}) diff --git a/packages/web-app-files/src/search/index.ts b/packages/web-app-files/src/search/index.ts deleted file mode 100644 index 514195a3906..00000000000 --- a/packages/web-app-files/src/search/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as SDKSearch } from './sdk' diff --git a/packages/web-app-files/src/search/sdk/index.ts b/packages/web-app-files/src/search/sdk/index.ts deleted file mode 100644 index 0d21decd567..00000000000 --- a/packages/web-app-files/src/search/sdk/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Preview from './preview' -import List from './list' -import { Router } from 'vue-router' -import { - CapabilityStore, - ConfigStore, - SearchFunction, - SearchList, - SearchPreview, - SearchProvider -} from '@ownclouders/web-pkg' - -function $gettext(msg: string) { - return msg -} - -export default class Provider implements SearchProvider { - public readonly id: string - public readonly displayName: string - public readonly previewSearch: SearchPreview - public readonly listSearch: SearchList - private readonly capabilityStore: CapabilityStore - - constructor( - capabilityStore: CapabilityStore, - router: Router, - searchFunction: SearchFunction, - configStore: ConfigStore - ) { - this.id = 'files.sdk' - this.displayName = $gettext('Files') - this.previewSearch = new Preview(router, searchFunction, configStore) - this.listSearch = new List(searchFunction) - this.capabilityStore = capabilityStore - } - - public get available(): boolean { - return this.capabilityStore.davReports.includes('search-files') - } -} diff --git a/packages/web-app-files/src/search/sdk/list.ts b/packages/web-app-files/src/search/sdk/list.ts deleted file mode 100644 index 7e354cce727..00000000000 --- a/packages/web-app-files/src/search/sdk/list.ts +++ /dev/null @@ -1,19 +0,0 @@ -import ListComponent from '../../components/Search/List.vue' -import { SearchFunction, SearchList, SearchResult } from '@ownclouders/web-pkg' -import { Component } from 'vue' - -export const searchLimit = 200 - -export default class List implements SearchList { - public readonly component: Component - private readonly searchFunction: SearchFunction - - constructor(searchFunction: SearchFunction) { - this.component = ListComponent - this.searchFunction = searchFunction - } - - public search(term: string): Promise { - return this.searchFunction(term, searchLimit) - } -} diff --git a/packages/web-app-files/src/search/sdk/preview.ts b/packages/web-app-files/src/search/sdk/preview.ts deleted file mode 100644 index 9a46b77279a..00000000000 --- a/packages/web-app-files/src/search/sdk/preview.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ConfigStore, SearchFunction, SearchPreview, SearchResult } from '@ownclouders/web-pkg' -import { Component, unref } from 'vue' -import { Router } from 'vue-router' -import { ResourcePreview } from '@ownclouders/web-pkg' - -export const previewSearchLimit = 8 - -export default class Preview implements SearchPreview { - public readonly component: Component - private readonly router: Router - private readonly searchFunction: SearchFunction - private readonly configStore: ConfigStore - - constructor(router: Router, searchFunction: SearchFunction, configStore: ConfigStore) { - this.component = ResourcePreview - this.router = router - this.searchFunction = searchFunction - this.configStore = configStore - } - - public search(term: string): Promise { - return this.searchFunction(term, previewSearchLimit) - } - - public get available(): boolean { - return ( - unref(this.router.currentRoute).name !== 'search-provider-list' && - !this.configStore.options?.embed?.enabled - ) - } -} diff --git a/packages/web-app-files/src/services/index.ts b/packages/web-app-files/src/services/index.ts deleted file mode 100644 index 292d80a6bd3..00000000000 --- a/packages/web-app-files/src/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Registry } from './registry' diff --git a/packages/web-app-files/src/services/registry.ts b/packages/web-app-files/src/services/registry.ts deleted file mode 100644 index 7ccea22453d..00000000000 --- a/packages/web-app-files/src/services/registry.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SDKSearch } from '../search' - -export default class Registry { - static sdkSearch: SDKSearch -} diff --git a/packages/web-app-files/src/views/Favorites.vue b/packages/web-app-files/src/views/Favorites.vue deleted file mode 100644 index a0694dbfdbc..00000000000 --- a/packages/web-app-files/src/views/Favorites.vue +++ /dev/null @@ -1,174 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/FilesDrop.vue b/packages/web-app-files/src/views/FilesDrop.vue deleted file mode 100644 index 528c2034ea0..00000000000 --- a/packages/web-app-files/src/views/FilesDrop.vue +++ /dev/null @@ -1,400 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/views/shares/SharedViaLink.vue b/packages/web-app-files/src/views/shares/SharedViaLink.vue deleted file mode 100644 index 657b8b88a2d..00000000000 --- a/packages/web-app-files/src/views/shares/SharedViaLink.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/shares/SharedWithMe.vue b/packages/web-app-files/src/views/shares/SharedWithMe.vue deleted file mode 100644 index 7f0d696cf57..00000000000 --- a/packages/web-app-files/src/views/shares/SharedWithMe.vue +++ /dev/null @@ -1,278 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/views/shares/SharedWithOthers.vue b/packages/web-app-files/src/views/shares/SharedWithOthers.vue deleted file mode 100644 index 151c186460d..00000000000 --- a/packages/web-app-files/src/views/shares/SharedWithOthers.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/spaces/DriveRedirect.vue b/packages/web-app-files/src/views/spaces/DriveRedirect.vue deleted file mode 100644 index 009144f14d7..00000000000 --- a/packages/web-app-files/src/views/spaces/DriveRedirect.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/spaces/DriveResolver.vue b/packages/web-app-files/src/views/spaces/DriveResolver.vue deleted file mode 100644 index cd3d0f01ad7..00000000000 --- a/packages/web-app-files/src/views/spaces/DriveResolver.vue +++ /dev/null @@ -1,165 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/spaces/GenericSpace.vue b/packages/web-app-files/src/views/spaces/GenericSpace.vue deleted file mode 100644 index 85c256f2d88..00000000000 --- a/packages/web-app-files/src/views/spaces/GenericSpace.vue +++ /dev/null @@ -1,574 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/spaces/GenericTrash.vue b/packages/web-app-files/src/views/spaces/GenericTrash.vue deleted file mode 100644 index 1d42646c750..00000000000 --- a/packages/web-app-files/src/views/spaces/GenericTrash.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - diff --git a/packages/web-app-files/src/views/spaces/Projects.vue b/packages/web-app-files/src/views/spaces/Projects.vue deleted file mode 100644 index 5462cdc40af..00000000000 --- a/packages/web-app-files/src/views/spaces/Projects.vue +++ /dev/null @@ -1,492 +0,0 @@ - - - - - diff --git a/packages/web-app-files/src/views/trash/Overview.vue b/packages/web-app-files/src/views/trash/Overview.vue deleted file mode 100644 index 9836cff8b7e..00000000000 --- a/packages/web-app-files/src/views/trash/Overview.vue +++ /dev/null @@ -1,258 +0,0 @@ - - - - - diff --git a/packages/web-app-files/tests/mocks/useBreadcrumbsFromPathMock.ts b/packages/web-app-files/tests/mocks/useBreadcrumbsFromPathMock.ts deleted file mode 100644 index 6235d7d8676..00000000000 --- a/packages/web-app-files/tests/mocks/useBreadcrumbsFromPathMock.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useBreadcrumbsFromPath } from '@ownclouders/web-pkg' - -export const useBreadcrumbsFromPathMock = ( - options: Partial> = {} -): ReturnType => { - return { - breadcrumbsFromPath: vi.fn(() => []), - concatBreadcrumbs: vi.fn((...args) => args), - ...options - } -} diff --git a/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts b/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts deleted file mode 100644 index 955a1f8e717..00000000000 --- a/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useResourcesViewDefaults } from '../../src/composables' -import { readonly, ref } from 'vue' -import { mock, mockDeep } from 'vitest-mock-extended' -import { Task } from 'vue-concurrency' -import { SpaceResource } from '@ownclouders/web-client' - -export const useResourcesViewDefaultsMock = ( - options: Partial> = {} -): ReturnType> => { - return { - fileListHeaderY: ref(0), - refreshFileListHeaderPosition: vi.fn(), - loadResourcesTask: mockDeep>({ - isRunning: false - }), - areResourcesLoading: ref(false), - storeItems: ref([]), - sortFields: ref([]), - paginatedResources: ref([]), - paginationPages: readonly(ref(0)), - paginationPage: readonly(ref(0)), - handleSort: vi.fn(), - sortBy: readonly(ref('name')), - sortDir: undefined, - selectedResources: ref([]), - selectedResourcesIds: ref([]), - selectedResourceSpace: ref(mock()), - isResourceInSelection: vi.fn(() => false), - isSideBarOpen: ref(false), - sideBarActivePanel: ref(''), - scrollToResource: vi.fn(), - scrollToResourceFromRoute: vi.fn(), - viewMode: ref('resource-table'), - viewSize: ref(1), - ...options - } -} diff --git a/packages/web-app-files/tests/mocks/useScrollToMock.ts b/packages/web-app-files/tests/mocks/useScrollToMock.ts deleted file mode 100644 index eb7a45c5700..00000000000 --- a/packages/web-app-files/tests/mocks/useScrollToMock.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useScrollTo } from '@ownclouders/web-pkg' - -export const useScrollToMock = ( - options: Partial> = {} -): ReturnType => { - return { - scrollToResource: vi.fn(), - scrollToResourceFromRoute: vi.fn(), - ...options - } -} diff --git a/packages/web-app-files/tests/mocks/useSortMock.ts b/packages/web-app-files/tests/mocks/useSortMock.ts deleted file mode 100644 index 0016ecb250a..00000000000 --- a/packages/web-app-files/tests/mocks/useSortMock.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useSort } from '@ownclouders/web-pkg' -import { ref } from 'vue' - -export const useSortMock = ( - options: Partial> = {} -): ReturnType> => { - return { - items: ref([]), - sortBy: ref('name'), - sortDir: undefined, - handleSort: vi.fn(), - ...options - } -} diff --git a/packages/web-app-files/tests/unit/HandleUpload.spec.ts b/packages/web-app-files/tests/unit/HandleUpload.spec.ts deleted file mode 100644 index 1ef4ddc8312..00000000000 --- a/packages/web-app-files/tests/unit/HandleUpload.spec.ts +++ /dev/null @@ -1,306 +0,0 @@ -import Uppy, { State, UnknownPlugin } from '@uppy/core' -import { HandleUpload } from '../../src/HandleUpload' -import { mock, mockDeep } from 'vitest-mock-extended' -import { Resource, SpaceResource } from '@ownclouders/web-client' -import { RouteLocationNormalizedLoaded } from 'vue-router' -import { computed, ref, unref } from 'vue' -import { - ClientService, - UppyService, - locationSpacesGeneric, - useUserStore, - useMessages, - useSpacesStore, - useResourcesStore, - OcUppyFile, - OcUppyMeta, - OcUppyBody -} from '@ownclouders/web-pkg' -import { Language } from 'vue3-gettext' -import { UploadResourceConflict } from '../../src/helpers/resource/actions' -import { createTestingPinia } from '@ownclouders/web-test-helpers' - -vi.mock('../../src/helpers/resource/actions') - -type UppyPlugin = UnknownPlugin> - -describe('HandleUpload', () => { - it('installs the handleUpload callback when files are being added', () => { - const { instance, mocks } = getWrapper() - instance.install() - expect(mocks.uppy.on).toHaveBeenCalledWith('files-added', instance.handleUpload) - }) - it('uninstalls the handleUpload callback when files are being added', () => { - const { instance, mocks } = getWrapper() - instance.uninstall() - expect(mocks.uppy.off).toHaveBeenCalledWith('files-added', instance.handleUpload) - }) - it('removes files from the uppy upload queue', () => { - const { instance, mocks } = getWrapper() - const fileToRemove = mock() - instance.removeFilesFromUpload([fileToRemove]) - expect(mocks.uppy.removeFile).toHaveBeenCalledWith(fileToRemove.id) - }) - it('correctly prepares all files that need to be uploaded', () => { - const { instance, mocks } = getWrapper() - mocks.uppy.getPlugin.mockReturnValue(mock()) - const fileToUpload = mock({ name: 'name' }) - const uploadFolder = mock({ id: '1', path: '/' }) - const processedFiles = instance.prepareFiles([fileToUpload], uploadFolder) - - const route = unref(mocks.opts.route) - - expect(processedFiles[0].tus.endpoint).toEqual('/') - expect(processedFiles[0].meta.name).toEqual(fileToUpload.name) - expect(processedFiles[0].meta.spaceId).toEqual(unref(mocks.opts.space).id) - expect(processedFiles[0].meta.spaceName).toEqual(unref(mocks.opts.space).name) - expect(processedFiles[0].meta.driveAlias).toEqual(unref(mocks.opts.space).driveAlias) - expect(processedFiles[0].meta.driveType).toEqual(unref(mocks.opts.space).driveType) - expect(processedFiles[0].meta.currentFolder).toEqual(uploadFolder.path) - expect(processedFiles[0].meta.currentFolderId).toEqual(uploadFolder.id) - expect(processedFiles[0].meta.tusEndpoint).toEqual(uploadFolder.path) - expect(processedFiles[0].meta.relativeFolder).toEqual('') - expect(processedFiles[0].meta.routeName).toEqual(route.name) - expect(processedFiles[0].meta.routeDriveAliasAndItem).toEqual(route.params.driveAliasAndItem) - expect(processedFiles[0].meta.routeShareId).toEqual(route.query.shareId) - }) - describe('method createDirectoryTree', () => { - it('creates a directory for a single file with a relative folder given', async () => { - const { instance, mocks } = getWrapper() - mocks.uppy.getPlugin.mockReturnValue(mock()) - const relativeFolder = '/relativeFolder' - const fileToUpload = mock({ name: 'name', meta: { relativeFolder } }) - const createdFolder = mock() - mocks.opts.clientService.webdav.createFolder.mockResolvedValue(createdFolder) - - const uploadFolder = mock({ id: '1', path: '/' }) - const result = await instance.createDirectoryTree([fileToUpload], uploadFolder) - - expect(mocks.opts.uppyService.publish).toHaveBeenCalledWith( - 'uploadSuccess', - expect.objectContaining({ - name: relativeFolder.split('/')[1], - isFolder: true, - type: 'folder', - meta: expect.objectContaining({ - spaceId: unref(mocks.opts.space).id, - spaceName: unref(mocks.opts.space).name, - driveAlias: unref(mocks.opts.space).driveAlias, - driveType: unref(mocks.opts.space).driveType, - currentFolder: uploadFolder.path, - currentFolderId: uploadFolder.id, - relativeFolder: '', - routeName: fileToUpload.meta.routeName, - routeDriveAliasAndItem: fileToUpload.meta.routeDriveAliasAndItem, - routeShareId: fileToUpload.meta.routeShareId, - fileId: createdFolder.fileId - }) - }) - ) - expect(mocks.opts.clientService.webdav.createFolder).toHaveBeenCalledTimes(1) - expect(mocks.opts.clientService.webdav.createFolder).toHaveBeenCalledWith( - unref(mocks.opts.space), - { - path: relativeFolder, - fetchFolder: true - } - ) - expect(result.length).toBe(1) - }) - it('filters out files whose folders could not be created', async () => { - vi.spyOn(console, 'error').mockImplementation(() => undefined) - - const { instance, mocks } = getWrapper() - mocks.uppy.getPlugin.mockReturnValue(mock()) - const relativeFolder = '/relativeFolder' - const fileToUpload = mock({ name: 'name', meta: { relativeFolder } }) - mocks.opts.clientService.webdav.createFolder.mockRejectedValue({}) - - const result = await instance.createDirectoryTree([fileToUpload], mock()) - - expect(mocks.opts.uppyService.publish).toHaveBeenCalledWith('uploadError', expect.anything()) - expect(mocks.uppy.removeFile).toHaveBeenCalled() - expect(result.length).toBe(0) - }) - }) - describe('method handleUpload', () => { - it('prepares files and eventually triggers the upload in uppy', async () => { - const { instance, mocks } = getWrapper() - const prepareFilesSpy = vi.spyOn(instance, 'prepareFiles') - await instance.handleUpload([mock({ name: 'name' })]) - expect(prepareFilesSpy).toHaveBeenCalledTimes(1) - expect(mocks.opts.uppyService.publish).toHaveBeenCalledWith( - 'addedForUpload', - expect.anything() - ) - expect(mocks.opts.uppyService.uploadFiles).toHaveBeenCalledTimes(1) - }) - describe('quota check', () => { - it('checks quota if check enabled', async () => { - const { instance } = getWrapper() - const checkQuotaExceededSpy = vi.spyOn(instance, 'checkQuotaExceeded') - await instance.handleUpload([mock({ name: 'name' })]) - expect(checkQuotaExceededSpy).toHaveBeenCalled() - }) - it('does not check quota if check disabled', async () => { - const { instance } = getWrapper({ quotaCheckEnabled: false }) - const checkQuotaExceededSpy = vi.spyOn(instance, 'checkQuotaExceeded') - await instance.handleUpload([mock({ name: 'name' })]) - expect(checkQuotaExceededSpy).not.toHaveBeenCalled() - }) - it.each([ - { size: 100, remaining: 90, driveType: 'project', quotaExceeded: true }, - { size: 10, remaining: 90, driveType: 'project', quotaExceeded: false }, - { size: 100, remaining: 90, driveType: 'personal', quotaExceeded: true }, - { size: 10, remaining: 90, driveType: 'personal', quotaExceeded: false } - ])( - 'returns a correct result after quota has been checked for own personal and project spaces', - async ({ size, remaining, driveType, quotaExceeded }) => { - const space = mock({ - driveType, - id: '1', - spaceQuota: { remaining }, - isOwner: () => true - }) - const { instance } = getWrapper({ spaces: [space] }) - const result = await instance.checkQuotaExceeded([ - mock({ - name: 'name', - meta: { spaceId: '1', routeName: locationSpacesGeneric.name as string }, - data: { size } as Blob - }) - ]) - expect(result).toBe(quotaExceeded) - } - ) - it('does not check quota for share spaces', async () => { - const size = 100 - const remaining = 90 - const space = mock({ - driveType: 'share', - id: '1', - spaceQuota: { remaining } - }) - const { instance } = getWrapper({ spaces: [space] }) - const result = await instance.checkQuotaExceeded([ - mock({ - name: 'name', - meta: { spaceId: '1', routeName: locationSpacesGeneric.name as string }, - data: { size } as Blob - }) - ]) - expect(result).toBeFalsy() - }) - it("does not check quota for other's personal spaces", async () => { - const size = 100 - const remaining = 90 - const space = mock({ - driveType: 'personal', - id: '1', - spaceQuota: { remaining }, - isOwner: () => false - }) - const { instance } = getWrapper({ spaces: [space] }) - const result = await instance.checkQuotaExceeded([ - mock({ - name: 'name', - meta: { spaceId: '1', routeName: locationSpacesGeneric.name as string }, - data: { size } as Blob - }) - ]) - expect(result).toBeFalsy() - }) - }) - describe('conflict handling check', () => { - it('checks for conflicts if check enabled', async () => { - const { instance, mocks } = getWrapper() - await instance.handleUpload([mock({ name: 'name' })]) - expect(mocks.resourceConflict.getConflicts).toHaveBeenCalled() - }) - it('does not check for conflicts if check disabled', async () => { - const { instance, mocks } = getWrapper({ conflictHandlingEnabled: false }) - await instance.handleUpload([mock({ name: 'name' })]) - expect(mocks.resourceConflict.getConflicts).not.toHaveBeenCalled() - }) - it('does not start upload if all files were skipped in conflict handling', async () => { - const { instance, mocks } = getWrapper({ conflicts: [{}], conflictHandlerResult: [] }) - const removeFilesFromUploadSpy = vi.spyOn(instance, 'removeFilesFromUpload') - - await instance.handleUpload([mock({ name: 'name' })]) - expect(mocks.opts.uppyService.uploadFiles).not.toHaveBeenCalled() - expect(mocks.opts.uppyService.clearInputs).toHaveBeenCalled() - expect(removeFilesFromUploadSpy).toHaveBeenCalled() - }) - it('sets the result of the conflict handler as uppy file state', async () => { - const conflictHandlerResult = [mock({ id: '1' })] - const { instance, mocks } = getWrapper({ conflicts: [{}], conflictHandlerResult }) - await instance.handleUpload([mock(), mock()]) - - expect(mocks.uppy.setState).toHaveBeenCalledWith({ - files: { [conflictHandlerResult[0].id]: conflictHandlerResult[0] } - }) - }) - }) - describe('create directory tree', () => { - it('creates the directly tree if enabled', async () => { - const { instance } = getWrapper() - const createDirectoryTreeSpy = vi.spyOn(instance, 'createDirectoryTree') - await instance.handleUpload([mock({ name: 'name' })]) - expect(createDirectoryTreeSpy).toHaveBeenCalled() - }) - it('does not create the directly tree if disabled', async () => { - const { instance } = getWrapper({ directoryTreeCreateEnabled: false }) - const createDirectoryTreeSpy = vi.spyOn(instance, 'createDirectoryTree') - await instance.handleUpload([mock({ name: 'name' })]) - expect(createDirectoryTreeSpy).not.toHaveBeenCalled() - }) - }) - }) -}) - -const getWrapper = ({ - conflictHandlingEnabled = true, - directoryTreeCreateEnabled = true, - quotaCheckEnabled = true, - conflicts = [], - conflictHandlerResult = [], - spaces = [] -} = {}) => { - const resourceConflict = mock() - resourceConflict.getConflicts.mockReturnValue(conflicts) - resourceConflict.displayOverwriteDialog.mockResolvedValue(conflictHandlerResult) - vi.mocked(UploadResourceConflict).mockImplementation(() => resourceConflict) - - const route = mock() - route.params.driveAliasAndItem = '1' - route.query.shareId = '1' - - const uppy = mockDeep>() - uppy.getState.mockReturnValue(mock>({ files: {} })) - - createTestingPinia({ - initialState: { - spaces: { spaces }, - resources: { currentFolder: mock({ path: '/' }), resources: [mock()] } - } - }) - - const opts = { - clientService: mockDeep(), - language: mock({ current: 'en' }), - route: computed(() => route), - userStore: useUserStore(), - messageStore: useMessages(), - spacesStore: useSpacesStore(), - resourcesStore: useResourcesStore(), - space: ref(mock()), - uppyService: mock(), - conflictHandlingEnabled, - directoryTreeCreateEnabled, - quotaCheckEnabled - } - - const mocks = { uppy, opts, resourceConflict } - const instance = new HandleUpload(uppy, opts) - return { instance, mocks } -} diff --git a/packages/web-app-files/tests/unit/components/AppBar/CreateAndUpload.spec.ts b/packages/web-app-files/tests/unit/components/AppBar/CreateAndUpload.spec.ts deleted file mode 100644 index 8285a7263c1..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/CreateAndUpload.spec.ts +++ /dev/null @@ -1,277 +0,0 @@ -import CreateAndUpload from '../../../../src/components/AppBar/CreateAndUpload.vue' -import { mock } from 'vitest-mock-extended' -import { Resource, SpaceResource } from '@ownclouders/web-client' -import { - FileAction, - useFileActionsCreateNewFile, - useRequest, - useSpacesStore, - CapabilityStore, - useClipboardStore, - useFileActionsPaste, - useExtensionRegistry, - OcUppyFile -} from '@ownclouders/web-pkg' -import { eventBus } from '@ownclouders/web-pkg' -import { defaultPlugins, shallowMount, defaultComponentMocks } from '@ownclouders/web-test-helpers' -import { RouteLocation } from 'vue-router' -import { computed, ref } from 'vue' -import { OcButton } from '@ownclouders/design-system/components' - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - useRequest: vi.fn(), - useFileActionsCreateNewFile: vi.fn(), - useFileActions: vi.fn(), - useFileActionsPaste: vi.fn() -})) - -const elSelector = { - component: '#create-and-upload-actions', - newFileButton: '#new-file-menu-btn', - uploadBtn: '#upload-menu-btn', - resourceUpload: 'resource-upload-stub', - newFolderBtn: '#new-folder-btn', - clipboardBtns: '#clipboard-btns', - pasteFilesBtn: '.paste-files-btn', - clearClipboardBtn: '.clear-clipboard-btn' -} - -describe('CreateAndUpload component', () => { - describe('action buttons', () => { - it('should show and be enabled if file creation is possible', () => { - const { wrapper } = getWrapper() - expect( - wrapper.findComponent(elSelector.uploadBtn).props().disabled - ).toBeFalsy() - expect( - wrapper.findComponent(elSelector.newFolderBtn).props().disabled - ).toBeFalsy() - expect(wrapper.html()).toMatchSnapshot() - }) - it('should be disabled if file creation is not possible', () => { - const currentFolder = mock({ canUpload: () => false }) - const { wrapper } = getWrapper({ currentFolder, createActions: [] }) - expect( - wrapper.findComponent(elSelector.uploadBtn).props().disabled - ).toBeTruthy() - expect( - wrapper.findComponent(elSelector.newFolderBtn).props().disabled - ).toBeTruthy() - }) - it('should not be visible if file creation is not possible on a public page', () => { - const currentFolder = mock({ canUpload: () => false }) - const { wrapper } = getWrapper({ currentFolder, currentRouteName: 'files-public-link' }) - expect(wrapper.find(elSelector.component).exists()).toBeFalsy() - }) - }) - describe('file handlers', () => { - it('should always show for uploading files and folders', () => { - const { wrapper } = getWrapper() - expect(wrapper.findAll(elSelector.resourceUpload).length).toBe(2) - }) - it('should show entries for all new file handlers', () => { - const { wrapper } = getWrapper() - expect(wrapper.html()).toMatchSnapshot() - }) - }) - describe('clipboard buttons', () => { - it('should show if clipboard is empty', () => { - const { wrapper } = getWrapper() - expect( - wrapper - .findComponent(`${elSelector.clipboardBtns} oc-button-stub`) - .exists() - ).toBeFalsy() - }) - it('should show if clipboard is not empty', () => { - const { wrapper } = getWrapper({ clipboardResources: [mock()] }) - expect(wrapper.findAll(`${elSelector.clipboardBtns} .oc-button`).length).toBe(2) - }) - it('call the "paste files"-action', async () => { - const { wrapper, mocks } = getWrapper({ - clipboardResources: [ - mock({ - remoteItemPath: undefined - }) - ] - }) - await wrapper.find(elSelector.pasteFilesBtn).trigger('click') - expect(mocks.pasteActionHandler).toHaveBeenCalled() - }) - it('call "clear clipboard"-action', async () => { - const { wrapper } = getWrapper({ clipboardResources: [mock()] }) - await wrapper.find(elSelector.clearClipboardBtn).trigger('click') - const clipboardStore = useClipboardStore() - expect(clipboardStore.clearClipboard).toHaveBeenCalled() - }) - it('should disable the "paste files"-action when clipboardResources are from same folder', () => { - const { wrapper } = getWrapper({ - isCuttingAndPastingIntoSameFolder: true, - clipboardResources: [mock({ parentFolderId: 'current-folder' })], - currentFolder: mock({ - id: 'current-folder', - canUpload: vi.fn().mockReturnValue(true) - }) - }) - - expect( - wrapper.findComponent(elSelector.pasteFilesBtn).vm.disabled - ).toStrictEqual(true) - }) - - it('should not disable the "paste files"-action when at least one clipboardResources is not from same folder', () => { - const { wrapper } = getWrapper({ - clipboardResources: [ - mock({ parentFolderId: 'current-folder' }), - mock({ parentFolderId: 'another-folder' }) - ], - currentFolder: mock({ - id: 'current-folder', - canUpload: vi.fn().mockReturnValue(true) - }) - }) - expect( - wrapper.findComponent(elSelector.pasteFilesBtn).vm.disabled - ).toStrictEqual(false) - }) - }) - describe('method "onUploadComplete"', () => { - it.each([ - { driveType: 'personal', updated: 1 }, - { driveType: 'project', updated: 1 }, - { driveType: 'share', updated: 0 }, - { driveType: 'public', updated: 0 } - ])('updates the space quota for supported drive types: %s', async ({ driveType, updated }) => { - const file = mock({ meta: { driveType, spaceId: '1' } }) - const spaces = [ - mock({ id: file.meta.spaceId, isOwner: () => driveType === 'personal' }) - ] - const { wrapper, mocks } = getWrapper({ spaces }) - const graphMock = mocks.$clientService.graphAuthenticated - graphMock.drives.getDrive.mockResolvedValue(mock()) - await (wrapper.vm as any).onUploadComplete({ successful: [file], failed: [] }) - const spacesStore = useSpacesStore() - expect(spacesStore.updateSpaceField).toHaveBeenCalledTimes(updated) - }) - it('reloads the file list if files were uploaded to the current path', async () => { - const eventSpy = vi.spyOn(eventBus, 'publish') - const itemId = 'itemId' - const space = mock({ id: '1' }) - const { wrapper, mocks } = getWrapper({ itemId, space }) - const file = mock({ - meta: { driveType: 'project', spaceId: space.id, currentFolderId: itemId } - }) - const graphMock = mocks.$clientService.graphAuthenticated - graphMock.drives.getDrive.mockResolvedValue(mock()) - await (wrapper.vm as any).onUploadComplete({ successful: [file], failed: [] }) - expect(eventSpy).toHaveBeenCalled() - }) - }) - describe('drop target', () => { - it('is being initialized when user can upload', () => { - document.getElementById = vi.fn().mockReturnValue(document.createElement('div')) - - const { mocks } = getWrapper() - expect(mocks.$uppyService.useDropTarget).toHaveBeenCalled() - }) - it('is not being initialized when user can not upload', () => { - const currentFolder = mock({ canUpload: () => false }) - const { mocks } = getWrapper({ currentFolder }) - expect(mocks.$uppyService.useDropTarget).not.toHaveBeenCalled() - }) - it('should not be initialized when the files view element is not found', () => { - document.getElementById = vi.fn().mockReturnValue(null) - - const { mocks } = getWrapper() - expect(document.getElementById).toHaveBeenCalledWith('files-view') - expect(mocks.$uppyService.useDropTarget).not.toHaveBeenCalled() - }) - }) -}) - -function getWrapper({ - clipboardResources = [], - files = [], - currentFolder = mock({ canUpload: () => true }), - currentRouteName = 'files-spaces-generic', - space = mock(), - spaces = [], - itemId = undefined, - newFileAction = false, - areFileExtensionsShown = false, - isCuttingAndPastingIntoSameFolder = false, - createActions = [ - mock({ label: () => 'Plain text file', ext: 'txt' }), - mock({ label: () => 'Mark-down file', ext: 'md' }), - mock({ label: () => 'Draw.io document', ext: 'drawio' }) - ] -}: { - clipboardResources?: Resource[] - files?: Resource[] - currentFolder?: Resource - currentRouteName?: string - space?: SpaceResource - spaces?: SpaceResource[] - itemId?: string - newFileAction?: boolean - areFileExtensionsShown?: boolean - createActions?: FileAction[] - isCuttingAndPastingIntoSameFolder?: boolean -} = {}) { - const capabilities = { - spaces: { enabled: true }, - files: { app_providers: [{ new_url: '/' }] } - } satisfies Partial - - const plugins = defaultPlugins({ - piniaOptions: { - spacesState: { spaces }, - capabilityState: { capabilities }, - clipboardState: { resources: clipboardResources }, - resourcesStore: { areFileExtensionsShown, currentFolder, resources: files } - } - }) - - vi.mocked(useRequest).mockImplementation(() => ({ - makeRequest: vi.fn().mockResolvedValue({ status: 200 }) - })) - const { requestExtensions } = useExtensionRegistry() - vi.mocked(requestExtensions).mockReturnValue([]) - - const useFileActionsCreateNewFileMock = mock>() - useFileActionsCreateNewFileMock.actions = computed(() => createActions) - vi.mocked(useFileActionsCreateNewFile).mockReturnValue(useFileActionsCreateNewFileMock) - - const pasteActionHandler = vi.fn() - vi.mocked(useFileActionsPaste).mockReturnValue( - mock>({ - isCuttingAndPastingIntoSameFolder: ref(isCuttingAndPastingIntoSameFolder), - actions: ref([ - mock({ - handler: pasteActionHandler - }) - ]) - }) - ) - - const mocks = { - ...defaultComponentMocks({ currentRoute: mock({ name: currentRouteName }) }), - pasteActionHandler - } - - return { - mocks, - wrapper: shallowMount(CreateAndUpload, { - data: () => ({ newFileAction }), - props: { space: space, itemId }, - global: { - stubs: { OcButton: false }, - renderStubDefaultSlot: true, - mocks, - provide: mocks, - plugins - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/AppBar/SharesNavigation.spec.ts b/packages/web-app-files/tests/unit/components/AppBar/SharesNavigation.spec.ts deleted file mode 100644 index 2122b7eadd1..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/SharesNavigation.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import SharesNavigation from '../../../../src/components/AppBar/SharesNavigation.vue' -import { locationSharesWithMe } from '@ownclouders/web-pkg' -import { mock } from 'vitest-mock-extended' -import { RouteRecordNormalized } from 'vue-router' -import { - defaultPlugins, - defaultStubs, - shallowMount, - defaultComponentMocks, - RouteLocation -} from '@ownclouders/web-test-helpers' - -const routes = [ - mock({ - path: '/files/shares/with-me/', - name: 'files-shares-with-me' - }), - mock({ - path: '/files/shares/with-others/', - name: 'files-shares-with-others' - }), - mock({ - path: '/files/shares/via-link/', - name: 'files-shares-via-link' - }) -] - -describe('SharesNavigation component', () => { - it('renders a shares navigation for both mobile and a desktop viewports', () => { - const { wrapper } = getWrapper() - expect(wrapper.html()).toMatchSnapshot() - }) -}) - -function getWrapper({ currentRouteName = locationSharesWithMe.name } = {}) { - const mocks = defaultComponentMocks({ - currentRoute: mock({ name: currentRouteName }) - }) - mocks.$router.getRoutes.mockImplementation(() => routes) - return { - mocks, - wrapper: shallowMount(SharesNavigation, { - global: { - stubs: defaultStubs, - renderStubDefaultSlot: true, - mocks, - provide: mocks, - plugins: [...defaultPlugins()] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/AppBar/Upload/ResourceUpload.spec.ts b/packages/web-app-files/tests/unit/components/AppBar/Upload/ResourceUpload.spec.ts deleted file mode 100644 index e743d633007..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/Upload/ResourceUpload.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { mockDeep } from 'vitest-mock-extended' -import ResourceUpload from '../../../../../src/components/AppBar/Upload/ResourceUpload.vue' -import { - defaultComponentMocks, - defaultPlugins, - defaultStubs, - mount -} from '@ownclouders/web-test-helpers' -import { UppyService } from '@ownclouders/web-pkg' -import { OcButton } from '@ownclouders/design-system/components' - -describe('Resource Upload Component', () => { - describe('file upload', () => { - it('should render component', () => { - const { wrapper } = getWrapper() - expect(wrapper.exists()).toBeTruthy() - expect(wrapper.html()).toMatchSnapshot() - }) - }) - - describe('folder upload', () => { - it('should render component', () => { - const { wrapper } = getWrapper({ isFolder: true }) - expect(wrapper.exists()).toBeTruthy() - expect(wrapper.html()).toMatchSnapshot() - }) - }) - - describe('when upload file button is clicked', () => { - it('should call "triggerUpload"', async () => { - const { wrapper } = getWrapper() - - const spyTriggerUpload = vi.spyOn(wrapper.vm, 'triggerUpload') - const uploadButton = wrapper.find('button') - const fileUploadInput = wrapper.find('#files-file-upload-input') - - ;(fileUploadInput.element as HTMLElement).click = vi.fn() - await wrapper.vm.$forceUpdate() - - await uploadButton.trigger('click') - - expect(spyTriggerUpload).toHaveBeenCalledTimes(1) - expect((fileUploadInput.element as HTMLElement).click).toHaveBeenCalledTimes(1) - }) - }) - - it('should be disabled when a remote upload is running', () => { - const uppyService = mockDeep() - uppyService.isRemoteUploadInProgress.mockReturnValue(true) - const { wrapper } = getWrapper({ isFolder: true }, uppyService) - expect(wrapper.findComponent('button').props('disabled')).toBeTruthy() - }) -}) - -function getWrapper(props = {}, uppyService = mockDeep()) { - const mocks = { - ...defaultComponentMocks(), - $uppyService: uppyService - } - return { - mocks, - wrapper: mount(ResourceUpload, { - props, - global: { - mocks, - stubs: defaultStubs, - provide: mocks, - plugins: [...defaultPlugins()] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/AppBar/Upload/__snapshots__/ResourceUpload.spec.ts.snap b/packages/web-app-files/tests/unit/components/AppBar/Upload/__snapshots__/ResourceUpload.spec.ts.snap deleted file mode 100644 index 8d88f84e9ed..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/Upload/__snapshots__/ResourceUpload.spec.ts.snap +++ /dev/null @@ -1,15 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Resource Upload Component > file upload > should render component 1`] = ` -"
" -`; - -exports[`Resource Upload Component > folder upload > should render component 1`] = ` -"
" -`; diff --git a/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/CreateAndUpload.spec.ts.snap b/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/CreateAndUpload.spec.ts.snap deleted file mode 100644 index b48dc70ff9c..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/CreateAndUpload.spec.ts.snap +++ /dev/null @@ -1,35 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`CreateAndUpload component > action buttons > should show and be enabled if file creation is possible 1`] = ` -"
- - -
  • - -
  • -
  • - -
  • -
    - -
    - -
    " -`; - -exports[`CreateAndUpload component > file handlers > should show entries for all new file handlers 1`] = ` -"
    - - -
  • - -
  • -
  • - -
  • -
    - -
    - -
    " -`; diff --git a/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/SharesNavigation.spec.ts.snap b/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/SharesNavigation.spec.ts.snap deleted file mode 100644 index f3a5da919f0..00000000000 --- a/packages/web-app-files/tests/unit/components/AppBar/__snapshots__/SharesNavigation.spec.ts.snap +++ /dev/null @@ -1,41 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`SharesNavigation component > renders a shares navigation for both mobile and a desktop viewports 1`] = ` -"" -`; diff --git a/packages/web-app-files/tests/unit/components/EmbedActions/EmbedActions.spec.ts b/packages/web-app-files/tests/unit/components/EmbedActions/EmbedActions.spec.ts deleted file mode 100644 index 59500b8eecf..00000000000 --- a/packages/web-app-files/tests/unit/components/EmbedActions/EmbedActions.spec.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { - defaultComponentMocks, - defaultPlugins, - RouteLocation, - shallowMount -} from '@ownclouders/web-test-helpers' -import EmbedActions from '../../../../src/components/EmbedActions/EmbedActions.vue' -import { FileAction, useEmbedMode, useFileActionsCreateLink } from '@ownclouders/web-pkg' -import { mock } from 'vitest-mock-extended' -import { ref } from 'vue' -import { Resource } from '@ownclouders/web-client' - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - useFileActionsCreateLink: vi.fn(), - useEmbedMode: vi.fn() -})) - -const selectors = Object.freeze({ - btnSelect: '[data-testid="button-select"]', - btnCancel: '[data-testid="button-cancel"]', - btnShare: '[data-testid="button-share"]', - fileNameInput: '.files-embed-actions-file-name' -}) - -describe('EmbedActions', () => { - describe('select action', () => { - it('should hide select action when embedTarget is set to file', () => { - const { wrapper } = getWrapper({ isFilePicker: true }) - - expect(wrapper.find(selectors.btnSelect).exists()).toBe(false) - }) - it('should disable select action when no resources are selected', () => { - const { wrapper } = getWrapper() - - expect(wrapper.find(selectors.btnSelect).attributes()).toHaveProperty('disabled') - }) - - it('should enable select action when at least one resource is selected', () => { - const { wrapper } = getWrapper({ selectedIds: ['1'] }) - - expect(wrapper.find(selectors.btnSelect).attributes()).not.toHaveProperty('disabled') - }) - - it('should emit select event when the select action is triggered', async () => { - const { wrapper, mocks } = getWrapper({ selectedIds: ['1'] }) - - await wrapper.find(selectors.btnSelect).trigger('click') - - expect(mocks.postMessageMock).toHaveBeenCalledWith('owncloud-embed:select', [{ id: '1' }]) - }) - - it('should enable select action when embedTarget is set to location', () => { - const { wrapper } = getWrapper({ isLocationPicker: true }) - - expect(wrapper.find(selectors.btnSelect).attributes()).not.toHaveProperty('disabled') - }) - - it('should emit select event with currentFolder as selected resource when select action is triggered', async () => { - const { wrapper, mocks } = getWrapper({ - currentFolder: { id: '1' } as Resource, - isLocationPicker: true - }) - - await wrapper.find(selectors.btnSelect).trigger('click') - - expect(mocks.postMessageMock).toHaveBeenCalledWith('owncloud-embed:select', [{ id: '1' }]) - }) - it('should display the file name input when chooseFileName is configured', () => { - const { wrapper } = getWrapper({ - currentFolder: { id: '1' } as Resource, - isLocationPicker: true, - chooseFileName: true - }) - - expect(wrapper.find(selectors.fileNameInput).exists()).toBe(true) - }) - it('should hide the file name input when chooseFileName is not configured', () => { - const { wrapper } = getWrapper({ - currentFolder: { id: '1' } as Resource, - isLocationPicker: true - }) - - expect(wrapper.find(selectors.fileNameInput).exists()).toBe(false) - }) - it('should emit select event with currentFolder as selected resource and fileName when select action is triggered and chooseFileName is configured', async () => { - const { wrapper, mocks } = getWrapper({ - currentFolder: { id: '1' } as Resource, - isLocationPicker: true, - chooseFileName: true - }) - - await wrapper.find(selectors.btnSelect).trigger('click') - - expect(mocks.postMessageMock).toHaveBeenCalledWith('owncloud-embed:select', { - fileName: 'file.txt', - resources: [{ id: '1' }], - locationQuery: { - contextRouteName: 'files-spaces-generic', - contextRouteQuery: {} - } - }) - }) - }) - - describe('cancel action', () => { - it('should emit cancel event when the cancel action is triggered', async () => { - const { wrapper, mocks } = getWrapper({ selectedIds: ['1'] }) - - await wrapper.find(selectors.btnCancel).trigger('click') - - expect(mocks.postMessageMock).toHaveBeenCalledWith('owncloud-embed:cancel', null) - }) - }) - - describe('share action', () => { - it('should disable share action when no resources are selected', () => { - const { wrapper } = getWrapper() - - expect(wrapper.find(selectors.btnShare).attributes()).toHaveProperty('disabled') - }) - - it('should disable share action when the "Create Link"-action is disabled', () => { - const { wrapper } = getWrapper({ - selectedIds: ['1'], - createLinksActionEnabled: false - }) - expect(wrapper.find(selectors.btnShare).attributes()).toHaveProperty('disabled') - }) - - it('should enable share action when at least one resource is selected and link creation is enabled', () => { - const { wrapper } = getWrapper({ selectedIds: ['1'] }) - expect(wrapper.find(selectors.btnShare).attributes()).not.toHaveProperty('disabled') - }) - - it('should hide share action when embedTarget is set to location', () => { - const { wrapper } = getWrapper({ isLocationPicker: true }) - - expect(wrapper.find(selectors.btnShare).exists()).toBe(false) - }) - - it('should hide share action when embedTarget is set to file', () => { - const { wrapper } = getWrapper({ isFilePicker: true }) - - expect(wrapper.find(selectors.btnShare).exists()).toBe(false) - }) - - it('should call the handler of the "Create Link"-action', async () => { - const { wrapper, mocks } = getWrapper({ selectedIds: ['1'] }) - await wrapper.find(selectors.btnShare).trigger('click') - expect(mocks.createLinkHandlerMock).toHaveBeenCalledTimes(1) - }) - }) -}) - -function getWrapper( - { - selectedIds = [], - currentFolder = undefined, - createLinksActionEnabled = true, - isLocationPicker = false, - isFilePicker = false, - chooseFileName = false - }: { - selectedIds?: string[] - currentFolder?: Resource - createLinksActionEnabled?: boolean - isLocationPicker?: boolean - isFilePicker?: boolean - chooseFileName?: boolean - } = { - selectedIds: [] - } -) { - const postMessageMock = vi.fn() - vi.mocked(useEmbedMode).mockReturnValue( - mock>({ - isLocationPicker: ref(isLocationPicker), - isFilePicker: ref(isFilePicker), - chooseFileName: ref(chooseFileName), - chooseFileNameSuggestion: ref('file.txt'), - postMessage: postMessageMock - }) - ) - - const createLinkHandlerMock = vi.fn() - vi.mocked(useFileActionsCreateLink).mockReturnValue( - mock>({ - actions: ref([ - mock({ - isVisible: () => createLinksActionEnabled, - handler: createLinkHandlerMock - }) - ]) - }) - ) - - const resources = selectedIds.map((id) => ({ id })) as Resource[] - const mocks = { - ...defaultComponentMocks({ - currentRoute: mock({ - name: 'files-spaces-generic', - path: '/files/spaces/personal/admin' - }) - }), - createLinkHandlerMock, - postMessageMock - } - - return { - mocks, - wrapper: shallowMount(EmbedActions, { - global: { - mocks, - provide: mocks, - stubs: { OcButton: false }, - plugins: [ - ...defaultPlugins({ - piniaOptions: { resourcesStore: { currentFolder, selectedIds, resources } } - }) - ] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/FilesList/ListInfo.spec.ts b/packages/web-app-files/tests/unit/components/FilesList/ListInfo.spec.ts deleted file mode 100644 index 03faf38b49d..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesList/ListInfo.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import ListInfo from '../../../../src/components/FilesList/ListInfo.vue' -import { defaultComponentMocks, defaultPlugins, shallowMount } from '@ownclouders/web-test-helpers' -import { mock } from 'vitest-mock-extended' -import { Resource } from '@ownclouders/web-client' - -describe('ListInfo', () => { - it('it renders content summary correctly', () => { - const wrapper = getWrapper() - expect(wrapper.html()).toMatchSnapshot() - }) -}) - -function getWrapper() { - const resources = [ - mock({ - isFolder: false, - size: 10000, - type: 'file', - name: 'file1' - }), - mock({ - isFolder: false, - size: 5, - type: 'file', - name: 'file2' - }), - mock({ - isFolder: true, - size: 40000, - type: 'folder', - name: 'folder1' - }), - mock({ - isFolder: true, - size: 0, - type: 'folder', - name: 'folder2' - }) - ] - const mocks = { - ...defaultComponentMocks() - } - - return shallowMount(ListInfo, { - global: { - mocks, - plugins: [...defaultPlugins({ piniaOptions: { resourcesStore: { resources } } })], - provide: mocks - } - }) -} diff --git a/packages/web-app-files/tests/unit/components/FilesList/NotFoundMessage.spec.ts b/packages/web-app-files/tests/unit/components/FilesList/NotFoundMessage.spec.ts deleted file mode 100644 index 3cc7a8194d9..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesList/NotFoundMessage.spec.ts +++ /dev/null @@ -1,105 +0,0 @@ -import NotFoundMessage from '../../../../src/components/FilesList/NotFoundMessage.vue' -import { PublicSpaceResource, SpaceResource, Resource } from '@ownclouders/web-client' -import { MockProxy, mock } from 'vitest-mock-extended' -import { join } from 'path' -import { defaultComponentMocks, defaultPlugins, shallowMount } from '@ownclouders/web-test-helpers' -import { OcButton } from '@ownclouders/design-system/components' -import { RouteLocationNamedRaw, RouteLocationNormalizedLoaded } from 'vue-router' - -const selectors = { - homeButton: '#files-list-not-found-button-go-home', - reloadLinkButton: '#files-list-not-found-button-reload-link' -} - -const spacesLocation = mock({ name: 'files-spaces-generic' }) -const publicLocation = mock({ name: 'files-public-link' }) - -describe('NotFoundMessage', () => { - describe('when user on personal route', () => { - let space: MockProxy - beforeEach(() => { - space = mock({ - driveType: 'personal' - }) - }) - - it('should show home button', () => { - const { wrapper } = getWrapper(space, spacesLocation) - const homeButton = wrapper.find(selectors.homeButton) - - expect(homeButton.exists()).toBeTruthy() - expect(homeButton.find('span')).toBeTruthy() - expect(homeButton.find('span').text()).toBe('Go to »Personal« page') - }) - - it('should not show reload public link button', () => { - const { wrapper } = getWrapper(space, spacesLocation) - const reloadLinkButton = wrapper.find(selectors.reloadLinkButton) - - expect(reloadLinkButton.exists()).toBeFalsy() - }) - - it('should have property route to personal space', () => { - const { wrapper } = getWrapper(space, spacesLocation) - const homeButton = wrapper.findComponent(selectors.homeButton) - - const routeLocation = homeButton.props('to') as RouteLocationNamedRaw - expect(routeLocation.name).toBe(spacesLocation.name) - expect(routeLocation.params.driveAliasAndItem).toBe('personal') - }) - }) - - describe('when user on public link route', () => { - let space: MockProxy - beforeEach(() => { - space = mock({ - driveType: 'public' - }) - space.getDriveAliasAndItem.mockImplementation((resource) => - join('public/1234', resource.path) - ) - }) - - it('should show reload link button', () => { - const { wrapper } = getWrapper(space, publicLocation) - const reloadLinkButton = wrapper.find(selectors.reloadLinkButton) - - expect(reloadLinkButton.exists()).toBeTruthy() - expect(reloadLinkButton.find('span')).toBeTruthy() - expect(reloadLinkButton.find('span').text()).toBe('Reload public link') - }) - - it('should not show home button', () => { - const { wrapper } = getWrapper(space, publicLocation) - const homeButton = wrapper.find(selectors.homeButton) - - expect(homeButton.exists()).toBeFalsy() - }) - - it('should have property route to files public list', () => { - const { wrapper } = getWrapper(space, publicLocation) - const reloadLinkButton = wrapper.findComponent(selectors.reloadLinkButton) - - const routeLocation = reloadLinkButton.props('to') as RouteLocationNamedRaw - expect(routeLocation.name).toBe(publicLocation.name) - expect(routeLocation.params.driveAliasAndItem).toBe( - space.getDriveAliasAndItem({ path: '' } as Resource) - ) - }) - }) -}) - -function getWrapper(space: SpaceResource, route: RouteLocationNormalizedLoaded) { - const mocks = defaultComponentMocks({ currentRoute: route }) - return { - wrapper: shallowMount(NotFoundMessage, { - props: { space }, - global: { - renderStubDefaultSlot: true, - mocks, - provide: mocks, - plugins: [...defaultPlugins()] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/FilesList/QuickActions.spec.ts b/packages/web-app-files/tests/unit/components/FilesList/QuickActions.spec.ts deleted file mode 100644 index d55c51b411b..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesList/QuickActions.spec.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { ActionExtension, useEmbedMode } from '@ownclouders/web-pkg' -import QuickActions from '../../../../src/components/FilesList/QuickActions.vue' -import { defaultComponentMocks, defaultPlugins, shallowMount } from '@ownclouders/web-test-helpers' -import { useExtensionRegistry } from '@ownclouders/web-pkg' -import { mock } from 'vitest-mock-extended' -import { ref } from 'vue' -import { Resource } from '@ownclouders/web-client' -import { quickActionsExtensionPoint } from '../../../../src/extensionPoints' - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - useEmbedMode: vi.fn() -})) - -const collaboratorAction = { - isVisible: vi.fn(() => true), - handler: vi.fn(), - icon: 'group-add', - id: 'collaborators', - name: 'show-shares', - label: () => 'Add people' -} - -const permanentLinkAction = { - isVisible: vi.fn(() => false), - handler: vi.fn(), - icon: 'link-add', - id: 'permanent-link', - name: 'copy-permanent-link', - label: () => 'Copy permanent link' -} - -const testItem = { - id: '1', - icon: 'file', - name: 'lorem.txt', - path: '/lorem.txt', - size: '12220' -} as Resource - -describe('QuickActions', () => { - describe('when multiple actions are provided', () => { - const { wrapper } = getWrapper() - - it('should display all action buttons where "displayed" is set to true', () => { - const actionButtons = wrapper.findAll('.oc-button') - // there are two items provided as actions, with only one item set to display - expect(actionButtons.length).toBe(1) - - const actionButton = actionButtons.at(0) - const iconEl = actionButton.find('oc-icon-stub') - - expect(actionButton.exists()).toBeTruthy() - expect(actionButton.attributes().class).toContain('files-quick-action-show-shares') - expect(iconEl.exists()).toBeTruthy() - expect(iconEl.attributes().name).toBe('group-add') - expect(actionButton.attributes('aria-label')).toBe('Add people') - }) - - it('should not display action buttons where "displayed" is set to false', () => { - const linkActionButton = wrapper.find('.files-quick-action-copy-permanent-link') - - expect(linkActionButton.exists()).toBeFalsy() - }) - }) - - describe('action handler', () => { - it('should call action handler on click', async () => { - const { wrapper } = getWrapper() - const handlerAction = collaboratorAction.handler.mockImplementation(() => undefined) - - const actionButton = wrapper.find('.oc-button') - await actionButton.trigger('click') - expect(handlerAction).toHaveBeenCalledTimes(1) - }) - }) - - it('does not show actions in embed mode', () => { - const { wrapper } = getWrapper({ embedModeEnabled: true }) - expect(wrapper.findAll('.oc-button').length).toBe(0) - }) -}) - -function getWrapper({ embedModeEnabled = false } = {}) { - const plugins = defaultPlugins() - - vi.mocked(useEmbedMode).mockReturnValue( - mock>({ isEnabled: ref(embedModeEnabled) }) - ) - - const { requestExtensions } = useExtensionRegistry() - vi.mocked(requestExtensions).mockReturnValue([ - mock({ - extensionPointIds: [quickActionsExtensionPoint.id], - action: collaboratorAction - }), - mock({ - extensionPointIds: [quickActionsExtensionPoint.id], - action: permanentLinkAction - }) - ]) - - return { - wrapper: shallowMount(QuickActions, { - props: { - item: testItem - }, - global: { - stubs: { OcButton: false }, - mocks: { ...defaultComponentMocks() }, - plugins - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/FilesList/ResourceDetails.spec.ts b/packages/web-app-files/tests/unit/components/FilesList/ResourceDetails.spec.ts deleted file mode 100644 index 0de18a79abe..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesList/ResourceDetails.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - defaultComponentMocks, - defaultPlugins, - RouteLocation, - shallowMount -} from '@ownclouders/web-test-helpers' -import ResourceDetails from '../../../../src/components/FilesList/ResourceDetails.vue' -import { mock } from 'vitest-mock-extended' -import { Resource, SpaceResource } from '@ownclouders/web-client' -import { useOpenWithDefaultApp, useRouteQuery } from '@ownclouders/web-pkg' -import { ref } from 'vue' - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - getIndicators: vi.fn(() => []), - useRouteQuery: vi.fn(), - useOpenWithDefaultApp: vi.fn() -})) - -describe('ResourceDetails component', () => { - describe('open with default actions', () => { - it("doesn't open default action if query param 'openWithDefaultApp' isn't set true", () => { - const { mocks } = getWrapper() - expect(mocks.openWithDefaultAppMock).not.toHaveBeenCalled() - }) - it("opens default action if query param 'openWithDefaultApp' is set true", () => { - vi.mocked(useRouteQuery).mockImplementationOnce(() => ref('true')) - const { mocks } = getWrapper() - expect(mocks.openWithDefaultAppMock).toHaveBeenCalled() - }) - }) - - function getWrapper(isFolder = false) { - const openWithDefaultAppMock = vi.fn() - vi.mocked(useOpenWithDefaultApp).mockReturnValue({ - openWithDefaultApp: openWithDefaultAppMock - }) - - const mocks = { - ...defaultComponentMocks({ - currentRoute: mock({ - name: 'files-public-link', - query: { openWithDefaultAppQuery: 'true' } - }) - }), - openWithDefaultAppMock - } - - const file = { - id: '0', - name: 'image.jpg', - path: '/image.jpg', - size: 24064, - mdate: 'Wed, 21 Oct 2015 07:28:00 GMT', - mimeType: 'image/jpg', - isFolder, - owner: { - id: '1', - displayName: 'admin' - } - } as Resource - const space = mock() - - return { - mocks, - wrapper: shallowMount(ResourceDetails, { - props: { - space, - singleResource: file - }, - global: { - mocks, - plugins: [ - ...defaultPlugins({ - piniaOptions: { resourcesStore: { currentFolder: mock() } } - }) - ], - provide: { - ...mocks, - space, - resource: file, - versions: [] - } - } - }) - } - } -}) diff --git a/packages/web-app-files/tests/unit/components/FilesList/__snapshots__/ListInfo.spec.ts.snap b/packages/web-app-files/tests/unit/components/FilesList/__snapshots__/ListInfo.spec.ts.snap deleted file mode 100644 index b8b5e2a0a4b..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesList/__snapshots__/ListInfo.spec.ts.snap +++ /dev/null @@ -1,7 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`ListInfo > it renders content summary correctly 1`] = ` -"
    -

    4 items with 50 kB in total (2 files, 2 folders)

    -
    " -`; diff --git a/packages/web-app-files/tests/unit/components/FilesViewWrapper.spec.ts b/packages/web-app-files/tests/unit/components/FilesViewWrapper.spec.ts deleted file mode 100644 index 1f19cb600ba..00000000000 --- a/packages/web-app-files/tests/unit/components/FilesViewWrapper.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import FilesViewWrapper from '../../../src/components/FilesViewWrapper.vue' -import { defaultComponentMocks, defaultPlugins, RouteLocation } from '@ownclouders/web-test-helpers' -import { mock } from 'vitest-mock-extended' -import { shallowMount } from '@vue/test-utils' -import { computed } from 'vue' - -const selectors = { - embedActionsStub: 'embed-actions-stub' -} - -const mockUseEmbedMode = vi.fn().mockReturnValue({ - isEnabled: computed(() => false) -}) - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - useRoute: vi.fn().mockReturnValue({ query: {} }), - useEmbedMode: vi.fn().mockImplementation(() => mockUseEmbedMode()) -})) - -describe('FilesViewWrapper', () => { - describe('embed actions', () => { - it('renders when embed mode is enabled', () => { - mockUseEmbedMode.mockReturnValue({ - isEnabled: computed(() => true) - }) - const { wrapper } = getWrapper() - expect(wrapper.findComponent(selectors.embedActionsStub).exists()).toBeTruthy() - }) - it('does not render when embed mode is disabled', () => { - mockUseEmbedMode.mockReturnValue({ - isEnabled: computed(() => false) - }) - const { wrapper } = getWrapper() - expect(wrapper.findComponent(selectors.embedActionsStub).exists()).toBeFalsy() - }) - }) -}) - -function getWrapper() { - const mocks = defaultComponentMocks({ currentRoute: mock({ path: '/files' }) }) - return { - wrapper: shallowMount(FilesViewWrapper, { - global: { - mocks, - provide: mocks, - plugins: [...defaultPlugins({})] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/Modals/SetLinkPasswordModal.spec.ts b/packages/web-app-files/tests/unit/components/Modals/SetLinkPasswordModal.spec.ts deleted file mode 100644 index 7dc639a074b..00000000000 --- a/packages/web-app-files/tests/unit/components/Modals/SetLinkPasswordModal.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { mock } from 'vitest-mock-extended' -import SetLinkPasswordModal from '../../../../src/components/Modals/SetLinkPasswordModal.vue' -import { defaultComponentMocks, defaultPlugins, shallowMount } from '@ownclouders/web-test-helpers' -import { Modal, useMessages, useSharesStore } from '@ownclouders/web-pkg' -import { Resource, LinkShare, SpaceResource } from '@ownclouders/web-client' - -describe('SetLinkPasswordModal', () => { - it('should render a text input field for the password', () => { - const { wrapper } = getWrapper() - - expect(wrapper.find('oc-text-input-stub').exists()).toBeTruthy() - }) - describe('method "onConfirm"', () => { - it('updates the link', async () => { - const { wrapper } = getWrapper() - await wrapper.vm.onConfirm() - - const sharesStore = useSharesStore() - expect(sharesStore.updateLink).toHaveBeenCalled() - const { showMessage } = useMessages() - expect(showMessage).toHaveBeenCalled() - }) - it('shows an error message on error', async () => { - const { wrapper } = getWrapper() - const sharesStore = useSharesStore() - vi.mocked(sharesStore.updateLink).mockRejectedValue(new Error('')) - await wrapper.vm.onConfirm() - - const { showErrorMessage } = useMessages() - expect(showErrorMessage).toHaveBeenCalled() - }) - }) -}) - -function getWrapper() { - const mocks = { ...defaultComponentMocks() } - - return { - mocks, - wrapper: shallowMount(SetLinkPasswordModal, { - props: { - modal: mock(), - link: mock(), - space: mock(), - resource: mock() - }, - global: { - plugins: [...defaultPlugins()], - mocks, - provide: mocks - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/Search/List.spec.ts b/packages/web-app-files/tests/unit/components/Search/List.spec.ts deleted file mode 100644 index 7a60ed6afdc..00000000000 --- a/packages/web-app-files/tests/unit/components/Search/List.spec.ts +++ /dev/null @@ -1,275 +0,0 @@ -import { shallowMount } from '@vue/test-utils' -import { merge } from 'lodash-es' -import { ResourceTable } from '@ownclouders/web-pkg' -import List from '../../../../src/components/Search/List.vue' -import { useResourcesViewDefaults } from '../../../../src/composables' -import { useResourcesViewDefaultsMock } from '../../../../tests/mocks/useResourcesViewDefaultsMock' -import { createRouter, createMemoryHistory } from 'vue-router' - -import { defaultComponentMocks, defaultPlugins } from '@ownclouders/web-test-helpers' -import { AppBar, ItemFilter, queryItemAsString, useResourcesStore } from '@ownclouders/web-pkg' -import { ref } from 'vue' -import { Resource } from '@ownclouders/web-client' -import { mock } from 'vitest-mock-extended' -import { Capabilities } from '@ownclouders/web-client/ocs' - -vi.mock('../../../../src/composables') -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - queryItemAsString: vi.fn(), - useAppDefaults: vi.fn(), - useFileActions: vi.fn(() => ({ - triggerDefaultAction: vi.fn() - })) -})) - -const selectors = { - noContentMessageStub: 'no-content-message-stub', - resourceTableStub: 'resource-table-stub', - tagFilter: '.files-search-filter-tags', - lastModifiedFilter: '.files-search-filter-last-modified', - titleOnlyFilter: '.files-search-filter-title-only', - filter: '.files-search-result-filter' -} - -describe('List component', () => { - it('should render no-content-message if no resources found', () => { - const { wrapper } = getWrapper() - expect(wrapper.find(selectors.noContentMessageStub).exists()).toBeTruthy() - }) - it('should render resource table if resources found', () => { - const { wrapper } = getWrapper({ resources: [mock()] }) - expect(wrapper.find(selectors.resourceTableStub).exists()).toBeTruthy() - }) - it('resets the initial store file state', () => { - getWrapper({ resources: [mock()] }) - - const { clearResourceList } = useResourcesStore() - expect(clearResourceList).toHaveBeenCalled() - }) - it('should emit search event on mount', async () => { - const { wrapper } = getWrapper() - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.emitted('search').length).toBeGreaterThan(0) - }) - it('should emit search only if one of the queries changes', async () => { - const $router = createRouter({ - routes: [{ name: 'files-common-search', path: '/files-common-search', redirect: null }], - history: createMemoryHistory() - }) - - const { wrapper } = getWrapper({ - mocks: { $router } - }) - - let replacementCounter = 0 - const queries = [{}, {}, {}, {}, {}, {}, {}, {}, { q_tags: 'foo' }, {}, {}, {}, {}] - for (const query of queries) { - await $router.replace({ - name: 'files-common-search', - query: merge( - { - q_titleOnly: 'q_titleOnly', - q_tags: 'q_tags', - q_lastModified: 'q_lastModified', - useScope: 'useScope' - }, - query - ) - }) - - replacementCounter++ - } - - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(replacementCounter).toBe(queries.length) - expect(wrapper.emitted('search').length).toBe(4) - }) - describe('breadcrumbs', () => { - it('show "Search" when no search term given', () => { - const { wrapper } = getWrapper() - const appBar = wrapper.findComponent('app-bar-stub') - expect(appBar.props('breadcrumbs')[0].text).toEqual('Search') - }) - it('include the search term if given', () => { - const searchTerm = 'term' - const { wrapper } = getWrapper({ searchTerm }) - const appBar = wrapper.findComponent('app-bar-stub') - expect(appBar.props('breadcrumbs')[0].text).toEqual(`Search results for "${searchTerm}"`) - }) - }) - describe('filter', () => { - describe('general', () => { - it('should not be rendered if no filtering is available', async () => { - const { wrapper } = getWrapper({ fullTextSearchEnabled: false, availableTags: [] }) - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.find(selectors.filter).exists()).toBeFalsy() - }) - }) - describe('tags', () => { - it('should show all available tags', async () => { - const tag = 'tag1' - const { wrapper } = getWrapper({ availableTags: [tag] }) - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.find(selectors.tagFilter).exists()).toBeTruthy() - expect( - wrapper.findComponent(selectors.tagFilter).props('items') - ).toEqual([{ label: tag, id: tag }]) - }) - it('should set initial filter when tags are given via query param', async () => { - const searchTerm = 'term' - const availableTags = ['tag1', 'tag2'] - const { wrapper } = getWrapper({ - availableTags, - searchTerm, - tagFilterQuery: availableTags.join('+') - }) - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.emitted('search')[0][0]).toEqual( - `(name:"*${searchTerm}*" OR content:"${searchTerm}") AND tag:("${availableTags[0]}" OR "${availableTags[1]}")` - ) - }) - }) - - describe('last modified', () => { - it('should show available last modified values', async () => { - const expectation = [ - { label: 'today', id: 'today' }, - { label: 'yesterday', id: 'yesterday' }, - { label: 'this week', id: 'this week' }, - { label: 'last week', id: 'last week' }, - { label: 'last 7 days', id: 'last 7 days' }, - { label: 'this month', id: 'this month' }, - { label: 'last month', id: 'last month' }, - { label: 'last 30 days', id: 'last 30 days' }, - { label: 'this year', id: 'this year' }, - { label: 'last year', id: 'last year' } - ] - const lastModifiedValues = { - keywords: [ - 'today', - 'yesterday', - 'this week', - 'last week', - 'last 7 days', - 'this month', - 'last month', - 'last 30 days', - 'this year', - 'last year' - ] - } - const { wrapper } = getWrapper({ - availableLastModifiedValues: lastModifiedValues, - availableTags: ['tag'] - }) - await (wrapper.vm as any).loadAvailableTagsTask.last - - expect(wrapper.find(selectors.lastModifiedFilter).exists()).toBeTruthy() - expect( - wrapper.findComponent(selectors.lastModifiedFilter).props('items') - ).toEqual(expectation) - }) - it('should set initial filter when last modified is given via query param', async () => { - const searchTerm = 'Screenshot' - const lastModifiedFilterQuery = 'today' - const { wrapper } = getWrapper({ - searchTerm, - lastModifiedFilterQuery - }) - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.emitted('search')[0][0]).toEqual( - `(name:"*${searchTerm}*" OR content:"${searchTerm}") AND mtime:${lastModifiedFilterQuery}` - ) - }) - }) - - describe('titleOnly', () => { - it('should render filter if enabled via capabilities', () => { - const { wrapper } = getWrapper({ fullTextSearchEnabled: true }) - expect(wrapper.find(selectors.titleOnlyFilter).exists()).toBeTruthy() - }) - it('should not render filter if not enabled via capabilities', () => { - const { wrapper } = getWrapper({ fullTextSearchEnabled: false }) - expect(wrapper.find(selectors.titleOnlyFilter).exists()).toBeFalsy() - }) - it('should set initial filter when titleOnly is set active via query param', async () => { - const searchTerm = 'term' - const { wrapper } = getWrapper({ - searchTerm, - titleOnlyFilterQuery: 'true', - fullTextSearchEnabled: true - }) - await (wrapper.vm as any).loadAvailableTagsTask.last - expect(wrapper.emitted('search')[0][0]).toEqual(`name:"*${searchTerm}*"`) - }) - }) - }) -}) - -function getWrapper({ - availableTags = [], - resources = [], - searchTerm = '', - tagFilterQuery = null, - titleOnlyFilterQuery = null, - fullTextSearchEnabled = true, - availableLastModifiedValues = {}, - lastModifiedFilterQuery = null, - mocks = {} -}: { - availableTags?: string[] - resources?: Resource[] - searchTerm?: string - tagFilterQuery?: string - titleOnlyFilterQuery?: string - fullTextSearchEnabled?: boolean - availableLastModifiedValues?: Record - lastModifiedFilterQuery?: string - mocks?: Record -} = {}) { - vi.mocked(queryItemAsString).mockImplementationOnce(() => searchTerm) - vi.mocked(queryItemAsString).mockImplementationOnce(() => titleOnlyFilterQuery) - vi.mocked(queryItemAsString).mockImplementationOnce(() => tagFilterQuery) - vi.mocked(queryItemAsString).mockImplementationOnce(() => lastModifiedFilterQuery) - - const resourcesViewDetailsMock = useResourcesViewDefaultsMock({ - paginatedResources: ref(resources) - }) - vi.mocked(useResourcesViewDefaults).mockImplementation(() => resourcesViewDetailsMock) - - const localMocks = { - ...defaultComponentMocks(), - ...mocks - } - localMocks.$clientService.graphAuthenticated.tags.listTags.mockResolvedValue(availableTags) - - const capabilities = { - files: { tags: true }, - search: { - property: { - mtime: availableLastModifiedValues, - content: { enabled: fullTextSearchEnabled }, - tags: { enabled: true } - } - } - } satisfies Partial - - return { - mocks: localMocks, - wrapper: shallowMount(List, { - global: { - components: { - ResourceTable, - AppBar - }, - mocks: localMocks, - provide: localMocks, - stubs: { - FilesViewWrapper: false - }, - plugins: [...defaultPlugins({ piniaOptions: { capabilityState: { capabilities } } })] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/Shares/CopyPrivateLink.spec.ts b/packages/web-app-files/tests/unit/components/Shares/CopyPrivateLink.spec.ts deleted file mode 100644 index fc401b037bc..00000000000 --- a/packages/web-app-files/tests/unit/components/Shares/CopyPrivateLink.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { mock } from 'vitest-mock-extended' -import { Resource } from '@ownclouders/web-client' -import { defaultPlugins, mount } from '@ownclouders/web-test-helpers' -import CopyPrivateLink from '../../../../src/components/Shares/CopyPrivateLink.vue' -import { useMessages } from '@ownclouders/web-pkg' -import { useClipboard } from '@vueuse/core' -import { ref } from 'vue' - -const resource = mock({ - type: 'folder', - owner: { - id: 'marie', - displayName: 'Marie' - }, - mdate: 'Wed, 21 Oct 2015 07:28:00 GMT', - size: '740', - name: 'lorem.txt', - privateLink: 'https://example.com/fake-private-link' -}) - -vi.mock('@vueuse/core', () => ({ - useClipboard: vi.fn(() => ({ - copy: vi.fn(), - copied: false, - isSupported: true - })) -})) - -describe('CopyPrivateLink', () => { - it('should render a button', () => { - const { wrapper } = getWrapper() - expect(wrapper.html()).toMatchSnapshot() - }) - it('upon clicking it should copy the private link to the clipboard button, render a success message and change icon for half a second', async () => { - const copyMock = vi.fn() - vi.mocked(useClipboard).mockReturnValue( - mock>({ copy: copyMock, copied: ref(true) }) - ) - - const { wrapper } = getWrapper() - const { showMessage } = useMessages() - expect(showMessage).not.toHaveBeenCalled() - - await wrapper.find('button').trigger('click') - expect(copyMock).toHaveBeenCalledTimes(1) - expect(showMessage).toHaveBeenCalledTimes(1) - }) -}) - -function getWrapper() { - return { - wrapper: mount(CopyPrivateLink, { - props: { - resource - }, - global: { - plugins: [...defaultPlugins()] - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/Shares/__snapshots__/CopyPrivateLink.spec.ts.snap b/packages/web-app-files/tests/unit/components/Shares/__snapshots__/CopyPrivateLink.spec.ts.snap deleted file mode 100644 index 4c22687051f..00000000000 --- a/packages/web-app-files/tests/unit/components/Shares/__snapshots__/CopyPrivateLink.spec.ts.snap +++ /dev/null @@ -1,8 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`CopyPrivateLink > should render a button 1`] = ` -"" -`; diff --git a/packages/web-app-files/tests/unit/components/SideBar/Actions/FileActions.spec.ts b/packages/web-app-files/tests/unit/components/SideBar/Actions/FileActions.spec.ts deleted file mode 100644 index 081d044b9f3..00000000000 --- a/packages/web-app-files/tests/unit/components/SideBar/Actions/FileActions.spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import FileActions from '../../../../../src/components/SideBar/Actions/FileActions.vue' -import { Resource, SpaceResource } from '@ownclouders/web-client' -import { mock } from 'vitest-mock-extended' -import { - defaultPlugins, - defaultStubs, - mount, - defaultComponentMocks, - RouteLocation -} from '@ownclouders/web-test-helpers' -import { useFileActions } from '@ownclouders/web-pkg' -import { Action } from '@ownclouders/web-pkg' - -vi.mock('@ownclouders/web-pkg', async (importOriginal) => ({ - ...(await importOriginal()), - useFileActions: vi.fn() -})) - -type ActionWithSelector = Action & { selector: string } -const fileActions: Record = { - copy: mock({ - handler: vi.fn(), - label: () => 'Copy', - class: 'oc-files-actions-copy-trigger', - selector: '.oc-files-actions-copy-trigger' - }), - move: mock({ - handler: vi.fn(), - label: () => 'Move', - class: 'oc-files-actions-move-trigger', - selector: '.oc-files-actions-move-trigger' - }), - download: mock({ - handler: vi.fn(), - label: () => 'Download', - class: 'oc-files-actions-download-file-trigger', - selector: '.oc-files-actions-download-file-trigger' - }), - 'text-editor': mock({ - handler: vi.fn(), - label: () => 'Open in Text Editor', - class: 'oc-files-actions-text-editor-trigger', - selector: '.oc-files-actions-text-editor-trigger' - }) -} - -describe('FileActions', () => { - describe('when user is on personal route', () => { - describe('action handlers', () => { - it('renders action handlers as clickable elements', async () => { - vi.mocked(useFileActions).mockImplementation(() => - mock>({ - getAllAvailableActions: () => Object.values(fileActions) - }) - ) - - const actions = ['copy', 'move', 'download', 'text-editor'] - const { wrapper } = getWrapper() - - for (const button of actions) { - const action = fileActions[button] - - const buttonElement = wrapper.find(action.selector) - expect(buttonElement.exists()).toBeTruthy() - - await buttonElement.trigger('click.stop') - expect(action.handler).toHaveBeenCalledTimes(1) - } - }) - }) - - describe('menu items', () => { - it('renders a list of actions', () => { - const { wrapper } = getWrapper() - for (const action of ['copy', 'text-editor']) { - expect(wrapper.find(fileActions[action].selector).exists()).toBeTruthy() - } - }) - }) - }) -}) - -function getWrapper() { - return { - wrapper: mount(FileActions, { - global: { - plugins: [...defaultPlugins()], - mocks: defaultComponentMocks({ - currentRoute: mock({ - name: 'files-spaces-generic', - path: '/files/spaces/personal/admin' - }) - }), - stubs: { ...defaultStubs, OcButton: false }, - provide: { - space: mock(), - resource: mock({ - extension: 'md' - }) - } - } - }) - } -} diff --git a/packages/web-app-files/tests/unit/components/SideBar/ActivitiesPanel.spec.ts b/packages/web-app-files/tests/unit/components/SideBar/ActivitiesPanel.spec.ts deleted file mode 100644 index 7f7bf9b9eed..00000000000 --- a/packages/web-app-files/tests/unit/components/SideBar/ActivitiesPanel.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import ActivitiesPanel from '../../../../src/components/SideBar/ActivitiesPanel.vue' -import { defaultComponentMocks, defaultPlugins, mount } from '@ownclouders/web-test-helpers' -import { Resource } from '@ownclouders/web-client' -import { mock } from 'vitest-mock-extended' -import { nextTick } from 'vue' - -const defaultActivities = [ - { - id: '5380e156-d65e-4024-9691-0f0c1f2796e4', - times: { - recordedTime: '2024-07-29T18:34:40Z' - }, - template: { - message: '{user} created {resource}.', - variables: { - user: { - id: '71f9de60-8b24-4cfe-9378-87d47aef0d04', - displayName: 'Marie Curie' - }, - resource: { - id: '7f92b0a9-06ad-49dc-890f-0e0a6eb4dea6$e9f01ca3-577f-4d1d-acd4-1cc44149ac25!5fb9f87c-a317-467b-9882-eb9f171564ac', - name: 'new folder' - } - } - } - }, - { - id: '5380e156-d65e-4024-9691-0f0c1f2796e4', - times: { - recordedTime: '2023-07-29T18:34:40Z' - }, - template: { - message: '{user} moved {resource}.', - variables: { - user: { - id: '71f9de60-8b24-4cfe-9378-87d47aef0d04', - displayName: 'Albert Einstein' - }, - resource: { - id: '7f92b0a9-06ad-49dc-890f-0e0a6eb4dea6$e9f01ca3-577f-4d1d-acd4-1cc44149ac25!5fb9f87c-a317-467b-9882-eb9f171564ac', - name: 'textfile.txt' - } - } - } - }, - { - id: '5380e156-d65e-4024-9691-0f0c1f2796e4', - times: { - recordedTime: '2022-07-29T18:34:40Z' - }, - template: { - message: '{user} deleted {resource}.', - variables: { - user: { - id: '71f9de60-8b24-4cfe-9378-87d47aef0d04', - displayName: 'Robert Oppenheimer' - }, - resource: { - id: '7f92b0a9-06ad-49dc-890f-0e0a6eb4dea6$e9f01ca3-577f-4d1d-acd4-1cc44149ac25!5fb9f87c-a317-467b-9882-eb9f171564ac', - name: 'atom plans.pdf' - } - } - } - }, - { - id: '5380e156-d65e-4024-9691-0f0c1f2796e4', - times: { - recordedTime: '2021-07-29T18:34:40Z' - }, - template: { - message: '{user} removed {resource}.', - variables: { - user: { - id: '71f9de60-8b24-4cfe-9378-87d47aef0d04', - displayName: 'Albert Schweitzer' - }, - resource: { - id: '7f92b0a9-06ad-49dc-890f-0e0a6eb4dea6$e9f01ca3-577f-4d1d-acd4-1cc44149ac25!5fb9f87c-a317-467b-9882-eb9f171564ac', - name: 'Selfie.png' - } - } - } - } -] -describe('ActivitiesPanel', () => { - it('should show no activities message if there is no data', async () => { - const { wrapper } = getMountedWrapper({ activities: [] }) - ;(wrapper.vm as any).isVisible = true - await nextTick() - await (wrapper.vm as any).loadActivitiesTask.last - expect(wrapper.html()).toContain('No activities') - }) - it('should show loading spinner when fetching data', async () => { - const { wrapper } = getMountedWrapper() - ;(wrapper.vm as any).isVisible = true - await nextTick() - expect(wrapper.find('#app-loading-spinner').exists()).toBeTruthy() - }) - it('should render a list of activities when data is present', async () => { - const { wrapper } = getMountedWrapper() - ;(wrapper.vm as any).isVisible = true - await nextTick() - await (wrapper.vm as any).loadActivitiesTask.last - expect(wrapper.html()).toMatchSnapshot() - }) -}) - -function getMountedWrapper({ - activities = defaultActivities -}: { - activities?: any[] -} = {}) { - const mocks = { - ...defaultComponentMocks() - } - mocks.$clientService.graphAuthenticated.activities.listActivities.mockResolvedValue(activities) - - return { - wrapper: mount(ActivitiesPanel, { - global: { - mocks, - plugins: [...defaultPlugins()], - provide: { ...mocks, resource: mock } - } - }), - mocks - } -} diff --git a/packages/web-app-files/tests/unit/components/SideBar/Audio/AudioMetaPanel.spec.ts b/packages/web-app-files/tests/unit/components/SideBar/Audio/AudioMetaPanel.spec.ts deleted file mode 100644 index 581bfb4fe15..00000000000 --- a/packages/web-app-files/tests/unit/components/SideBar/Audio/AudioMetaPanel.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Resource } from '@ownclouders/web-client' -import { defaultPlugins, shallowMount } from '@ownclouders/web-test-helpers' -import AudioMetaPanel from '../../../../../src/components/SideBar/Audio/AudioMetaPanel.vue' -import { mock } from 'vitest-mock-extended' -import { Audio } from '@ownclouders/web-client/graph/generated' - -describe('AudioMeta SideBar Panel', () => { - const keys = ['title', 'duration', 'artist', 'album', 'genre', 'year', 'track', 'disc'] - it.each(keys)('shows value in panel for key "%s"', (key) => { - const resource = mock({ - audio: mock